一篇搞定mysql数据库基础

目录

一、MySQL具体的特点

1.关系型数据库(RDBMS):

2.MySQL是一个“客户端-服务器”结构的程序

Q1:服务器能不能知道客户端什么时候发请求??

Q2:服务器是只给一个客户端提供服务吗??

二、MySQL数据库基础

1.数据库的操作

1.1显示当前的数据库

1.2创建数据库

1.3使用数据库

1.4删除数据库

2.常用的数据类型

2.1整形和浮点型

2.2字符串类型

2.3日期类型

3.数据库表的操作

3.1列出单曲当前数据库的表

3.2创建表

3.3查看表结构

3.4删除表

三.MySQL表的增删改查(基础)

1.CRUD

2.新增:

2.1语法

2.2指定列插入

2.3一次性插入多行数据

2.4插入时间

3.查询

3.1全列查询:

3.2指定列查询

3.3表达式查询

3.4去重查询

3.5带有排序的查询

多列排序

3.7条件查询

比较运算符:

理解上述带有where的select:

范围查询:

模糊匹配

关于null的比较

逻辑运算符

3.8分页查询

4.修改(update)

对于提示信息:

也可以一次修改多个值.

也可以写成计算表达式:

修改操作也可以搭配order by 和limit  

5.删除

 6.总结


一、MySQL具体的特点

1.关系型数据库(RDBMS):

是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

大体上可以认为是通过“表格”这样的方式来组织的,每一行都是一条数据,每一行中都包含很多列,每个列中还有不同的类型

数据库中的所有数据,列数/类型/含义 都要能够匹配

2.MySQL是一个“客户端-服务器”结构的程序

客户端:"client":主动发起请求的一方

请求:"request"客户端主动发给服务器的数据

服务器:"server" 被动接受请求的一方

响应:"response"服务器给客户端返回的数据

在多个场景中,是需要多个程序相互配合完成一系列工作的,这个过程中,往往会使用"网络"进行通信

客户端和服务器是两个程序,可以安装在同一个机器上,但是更多的是安装在不同的主机上,通过网络进行通信

这里有几个关于客户端和服务器比较常见的问题:

Q1:服务器能不能知道客户端什么时候发请求??

不能!! 所以一个专业的服务器是7*24小时来运行,来随时达到客户端的请求.但是我们的服务器并不是这么稳定,所以通常会有多个机器,即分布式

Q2:服务器是只给一个客户端提供服务吗??

不是!!大部分的服务器都是可以给多个客户端提供服务

二、MySQL数据库基础

1.数据库的操作

1.1显示当前的数据库

show databases;

这几个是MySQL自带的数据库

1.2创建数据库

creat database "数据库名";

注意:(1)创建一个数据库,database没有s!!

(2)数据库名不能和MySQL里面的关键字重复,如果非要重复,那么就要用``引起来

在创建数据库的时候,还可以指定字符集

create database "数据库名" charset 字符集名;

我们推荐使用utf8,但是实际上mysql的utf8不是完全体,比标准的utf8少了一些东西(主要是emoji)

为了解决上述问题,mysql提供了utf8mb4这样的字符集(是mysql独有的),即完整的utf8

1.3使用数据库

use 数据库名;

接下来的操作都是针对这个被选中的数据库来操作的

1.4删除数据库

drop database "数据库名";

2.常用的数据类型

2.1整形和浮点型

数据类型             大小

bit[(M)]           M指定位数,默认为1

tinyint                 1字节

smallint              2字节

int                       4字节

bigint                  8字节

float(M,D)           4字节

double(M,D)        8字节

decimal(M,D)      M/D最大值 + 2

numeric(M,D)     M/D最大值 + 2

对于上述类型的几点解释:

(1)对于浮点型后面的(M,D),如float(3,1).表示小数的长度是3,小数点后面保留1位

即99.5 10.0 而100.0 , 1.25是非法的

(2)这里的float和double其他方面都采用了和JAVA类似的,也包括采用了IEEE754标准的格式来表示的

因此我们在使用浮点型时,要谨慎使用浮点型比较相等

即0.1 + 0.2 == 0.3 => false

但是在实际工程中,使用float和double也是完全可行的

对于上述问题,使用decimal 和 numeric就能解决,即精确地存储小数

但是要想要有更高的精度,一定是要付出一定代价的,相比于float和double ,decimal存储需要消耗更多的空间,计算也需要更多的时间

2.2字符串类型

数据类型              大小

varchar             0 - 65,535字节

text                   0 - 65,535字节

mediumtext      0 - 16777215字节

blob                  0 - 65,535字节

对于上述类型的几点解释: 

(1)varchar表示可变长的字符串类型,参数表示能存储的最大长度

即size为26,此时不是固定占26,只是比26少,但是不会超过26

(2)text类型的长度是自适应的,比较依赖扩容的.实际开发中,很多时候为了明确数据存储的上限,会谨慎使用text,更多使用varchar

(3)后面的参数数字,单位是'字符' 而不是'字节',一个汉字就是一个字符,但是可能是若干个字节

(3)mediumtext:要想存储更长的文本就可以考虑使用这个类型,但是还是要慎重使用,因为针对长文本进行一些增删改查的时候,操作效率就可能会比较低

(4)blob是存储二进制数据,此处所说的二进制其实指的是,当前存储的这些数据在对于码表上无法查到的,如图片,音频,视频,可执行程序,.class文件

但是在实际使用也要慎重,因为针对这样的二进制列进行操作,也可能是比较低效的

一般在数据库中存储此类文件时,存储的是硬盘上的路径,而路劲用字符串表示

2.3日期类型

数据类型           大小

datetime           8字节

timestamp        4字节

 datetime范围从1000到9999年,不会进行时区的检索及转换;

timestamp范围从1970到2038年,自动进行时区的检索及转换;

现在不太推荐使用timestamp类型了,要用都是datatime  

3.数据库表的操作

 在后续表操作之前,一定要先use选中数据库

3.1列出单曲当前数据库的表

show tables;

3.2创建表

create table 表名(列名 类型,列名 类型,列名 类型...);

 

注意:(1)列名在前,类型在后;

(2)同一数据库表名不能重复,但是不同数据库就可以

(3)创建表的时候,可以用comment增加字段说明

这种注释只能在创建表的时候,作为声明列的注释,更推荐是使用#作为注释或者--  (两个减号一个空格)作为注释

注释写了以后,不会存储到数据库中,注释起到的作用就是解释说明,如果直接在命令行输入SQL,注释意义不大,输入完了就没了,未来工作中更多的是把注释写在文件中,让sql批量运行,此时注释就非常有意义了

3.3查看表结构

desc 表名;

Field:列,也可以叫字段

int(11),表示在控制台中显示这一列的数值的时候,最多占11个这样的字符(位宽)

数据库中的NULL和java中的NULL有点类似,数据库中的null表示的是"这个单元格没填"

3.4删除表

drop table 表名;

删除表是一个比删除库还危险的操作,删除数据库,程序第一时间就瘫痪了,第一时间就能发现问题,但是删除表,很可能你的程序在带伤运行,在时间的累计下,这样的错误会非常严重

三.MySQL表的增删改查(基础)

1.CRUD

CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写

2.新增:

2.1语法

insert into 表名 value(值,值...);

值里面的数量,类型,含义都要和表格中定义的表头的结构匹配

注意:在SQL中,字符串可以使用' ' 或者" " 引用

2.2指定列插入

在使用insert的时候.,可以指定列插入,在默认情况下是必须把这一行的所有列都插入

insert into 表名 (列名,列名...) values (值,值...);

注意,这里的列名个数和顺序就不需要和表头保持一致,但是要确保你的表名在表中是存在的

 

2.3一次性插入多行数据

insert into 表名 values (值,值...),(值,值...),(值,值...)...;

\

注意:一次性插入多条数据往往比一次性插入单条数据效率要更高

客户端中执行的每一个操作都会通过网络请求发生给服务器,服务器返回一个相应内容

发一次请求的效率,大概率要比发三次请求高很多.

但发送一次请求包含3条数据,请求的体积不是更大吗?? ->>>实际上,3次请求的网络开销是更大的

 

在一次插入多行数据的时候也可以指定列:

2.4插入时间

 有的时候需要插入指定的时间,就是当前的系统时间,mysql中有提供专门的函数 now()来获取

3.查询

3.1全列查询:

select * from 表名;

实际上在未来工作中,select *也是个危险操作,在生产环境下要谨慎使用

如果你的数据库里面没啥东西,那就无所谓,但是如果你的数据量很大,这个select*就很危险了

我们在select *的时候,服务器就会进行大量的硬盘IO操作,同时把得到的结果通过网络返回,触发大量的网络IO操作(I -> input O -> output)

硬盘,网卡,同一时刻能够处理的数据量都是有限的,进行了select * 就可能把硬盘/网卡的带宽给吃满了,此时其他普通用户针对数据库进行的操作,就可能被卡住了.导致类似于出现堵车,用户的视角看起来就是访问系统,无法加载数据,引起严重的bug

3.2指定列查询

select 列名, 列名...from 表名;

 

 注意:还是要确保列名是合法的,即在表中是存在的

3.3表达式查询

查询结果不仅仅是列,而是可以把列带入到表达式里面进行运算

 对于此处的表达式,对于加减乘除都是可以的,但是如果需要位运算,可能要java中的一些业务代码来实现了

在查询的时候也可以给要计算的列加上别名:

mysql是一个"客户端-服务器"结构的程序,此时数据是存储在服务器的硬盘上的,上述的表达式查询,只是针对服务器响应得到的临时结果进行了计算,不影响硬盘上存储的数据本体.即此处算出的结果只是返回给客户端,显示在客户端的界面上.不会保存在服务器的硬盘上

不只是这个例子,对于select中的所有用法,都不会影响到数据库服务器硬盘上存储的数据

我们在前面定义的成绩类型为decimal(3,1),但是这里的数字都达到了4位,更说明了这里实际上是一个临时表,不是硬盘上存储保存的本体

3.4去重查询

针对查询结果进行去重.存在重复数据,就会把重复的行合并成一列

 

注意:当两行的两个列都相同的时候,才算重复

 

3.5带有排序的查询

select的查询结果.默认是无序的

mysql不做出任何关于结果以某种规则来排列;在代码中如果对默认的顺序产生依赖,大概率是不靠谱的

要想让查询结果有序就必须手动使用 order by语句,主动让mysql排序

select * from 表名 order by 列名/表达式;

此处的排序默认是按照升序排列,如果要降序,还需要加上desc关键字

select * from 表名 order by 列名/表达式 desc;

 

注意:NULL在order by的时候默认是视为'最小值',如果存在多个null,多个null之间的顺序是不确定的

按照总成绩排序:

注意:sql在进行算术运算的时候,如果其中某个操作数结果是null,那么最后的结果也就是null

多列排序

order by也可以指定多个列排序,通过多个列排序约定更复杂的比较规则

select * from 表名 order by 列名desc,列名desc.....;

这里的比较规则是:

先按照第一列排序;

第一列相同的就按第二列......以此类推

3.7条件查询

select * 列名/表达式/去重... from 表名 where 条件;
比较运算符:

运算符                     说明

>,>=,<,<=             大于,大于等于,小于,小于等于

=                          等于,NULL不安全,例如 NULL=NULL 的结果是 NULL

<=>                      等于,NULL安全,例如 NULL<=>NULL的结果是 TRUE(1)

!=, <>                   不等于

between a and b  范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE

in(a,b....)               如果是 a,b.... 中的任意一个,返回 TRUE

is null                    是 NULL

is not null              不是NULL

like                        模糊匹配。%表示任意多个(包括0个)任意字符;_表示任意一个字符

注意:

(1)null与其他的值进行关系运算结果也是null,在sql中理解为false,但是null <=> null 结果是true

理解上述带有where的select:

数据库服务器收到这个SQL后,就会遍历表中的每一行数据,取出当前的行,带入到条件中,如果条件成立,当前这一行的数据就会进入到结果集合中,如果不成立就跳过  

注意:

这种情况是不行的,因为一个sql的执行顺序为:

1.遍历表

2.带入条件

3.计算列名中的表达式(别名也在这个阶段)

4.排序/聚合 等操作

因此条件执行的时机要比定义别名要靠前

 

范围查询:

between

in 

上述查询中,就可以理解成按照条件进行'筛选',如果select没有where,所有的数据都要被选中

模糊匹配

= 是精确查询,要求查询的结果和条件中指定的内容完全一致

like是模糊查询,只要求一部分一致即可

此处也需要引入通配符来描述匹配规则

注意: like有自己的通配符:

% 匹配任意个字符:

以孙开头:

以孙结尾的  

包含孙  

-匹配一个任意字符:

注意:like这种模糊匹配,在SQL中要慎用,这样的操作,开销实际上是很大的,性能非常低

关于null的比较

明明有id = null这一行,为什么还是空? 

在SQL中,null = null => null (false)条件不成立  

用下面两种就可以筛选

 实际上 <=>比 is null范围更广,可以用于两个列的比较

 

逻辑运算符

注意:and的优先级大于 or

先执行and为真,那么or左边不执行

但是虽然代码优先级存在,实际上写代码的时候还是最好多写( )

 

 

3.8分页查询

有时候,虽然是条件查询,但是查询到的结果仍然会非常多,如果把内容显示出来,也不一定合适

如果返回的结果太多,用户看不过来,对于网络/对于浏览器来说都是一定的压力

limit关键字来进行描述的.限制了这次查询最多返回多少记录

搭配offset关键字(偏移量)  

那么我们在进行分页展示的时候,假设一页显示10条记录,那么

第一页 limit 10 offset 0;

第二页 limit 10 offset 10;

.....

分页查询的另一种形式: 

当然,分页查询也可以搭配 条件查询之类的

前三名

4.修改(update)

 

update 表名 set 列名 = 值 where ...;

update会修改服务器上存储的数据

对于提示信息:

原则上说,匹配到的行都要修改但是有的时候,比如,修改的值是非法的,修改失败.此时,修改成功的行数(changed) 就会少于匹配的行数(matched)

也可以一次修改多个值.

set后面写2多组列,分别进行 = 赋值即可  

也可以写成计算表达式:

注意:在修改时,同样不能超过前面设定的范围:  (decimal(3,1))

修改操作也可以搭配order by 和limit  

注意如果update的时候,不指定任何条件,相当于条件永远为true,所有的数据都会被修改

因此,修改也是个非常危险的操作,一定要确保你指定的条件是合理的,正确的,否则就可能不小心把其他的数据影响到

 

5.删除

delet from 表名 where 条件;

删除都是以行为维度进行删除的

一旦数据数据删除就没有了

如果不加条件,默认是true,删完后表的内容是空的,表本身是空的

但是drop table 删除的是整个表,内容和表都没了

 6.总结

以上就是关于mysql基础的内容,进阶的内容会在后续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 80.删除有序数组中的重复项 II

目录标题 删除有序数组中的重复项 II题目解题思路实现代码代码讲解总结删除有序数组中的重复项 II 题目 解题思路 慢指针指向满足条件的数字的末尾,快指针遍历原数组。 并且用一个变量记录当前末尾数字出现了几次,防止超过两次。最后返回维护慢指针的结果+1即可。 实现代…

ChatGPT用不了,发了没反应,终于解决了!

大概在几天前的早上&#xff0c;ChatGPT突然就用不了。 这完全打乱了我的工作节奏&#xff01;&#xff01;&#xff01;&#xff08;所以&#xff0c;我就去玩了&#xff09; 用不了的具体表现是&#xff0c;你输入内容之后&#xff0c;内容消失&#xff0c;按钮变灰&#xff…

上位机图像处理和嵌入式模块部署(qmacvisual条形码识别)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到过&#xff0c;qmacvisual提供功能的方式主要就是插件导入。目前&#xff0c;大家如果能正确地把qmacvisual编译出来的话&#xff0c;…

Constrained Iterative LQR 自动驾驶中使用的经典控制算法

Motion planning 运动规划在自动驾驶领域是一个比较有挑战的部分。它既要接受来自上层的行为理解和决策的输出,也要考虑一个包含道路结构和感知所检测到的所有障碍物状态的动态世界模型。最终生成一个满足安全性和可行性约束并且具有理想驾驶体验的轨迹。 通常,motion plann…

快速入门:JS对象/BOM/DOM/事件监听

本贴介绍JS相对进阶的知识&#xff0c;对于JavaScript的基础语法&#xff0c;本文不再赘述~ 一.JavaScript对象 1.Array数组对象 定义 var arr new Array(1,2,3); var arr[1,2,3]; 访问 arr[0]1; Js数组类似Java中的集合&#xff0c;长度&#xff0c;类型都可以改变。 如…

【Qt学习笔记】(二)--第一个程序“Hello World”(学习Qt中程序的运行、发布、编译过程)

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。    因为我个人对Qt也是有一些需求&#xff0c;所以开设本专栏进行学习&#xff0c;希望大家可以一起学习&#xff0c;共同进步。   这篇博客将从一个 He…

【数据库系统概论】第2章:关系数据库

文章目录 0. 前言2.1 关系数据结构及形式化定义2.1.1关系2.1.2 关系模式 2.2 关系操作2.3 关系的完整性2.4 关系代数 0. 前言 关系数据库系统是支持关系模型的数据库系统。第一章初步介绍了关系模型及其基本术语。本章将深入介绍关系模型。 按照数据模型的三个要素&#xff0c;…

开发知识点-python-Tornado框架

介绍 Tornado是一个基于Python语言的高性能Web框架和异步网络库&#xff0c;它专注于提供快速、可扩展和易于使用的网络服务。由于其出色的性能和灵活的设计&#xff0c;Tornado被广泛用于构建高性能的Web应用程序、实时Web服务、长连接的实时通信以及网络爬虫等领域。 Torna…

使用Windows API实现一个简单的串口助手

使用Windows API实现一个简单的串口助手 目录 使用window API开发一个具有字符串收发功能的串口助手 开发环境串口设备相关的API步骤实现代码收发测试图 使用window API开发一个具有字符串收发功能的串口助手 开发环境 Visual Studio 2015 串口设备相关的API CreateFile 参…

如何提高内存和cpu使用率呢?-Linux类资源

最近公司项目上线时&#xff0c;红蓝线巡检时&#xff0c;部分服务器因配置高但使用率低而需要降级。 为了避免降级&#xff0c;如何增加内存和CPU使用率&#xff1f; 这可以通过脚本来实现。 当前服务器操作系统版本&#xff1a;-7_5。 连接服务器后&#xff0c;登录账号。 …

如何安装和激活Fl Studio21.2.3.4004破解补丁(附激活教程)

盼望着盼望着&#xff0c;FL Studio21带这它的版本号2.3.4004来了&#xff0c;是最新版Fl Studio21.2.3.4004 FL Studio v21.2.3.4004 中文破解版链接: 百度网盘-链接不存在 提取码: hpa2 FL Studio 21 Win-安装包&#xff1a;https://souurl.cn/r0j6ET FL Studio 21 Mac-安装包…

Leo赠书活动-19期 《Elasticsearch 通过索引阻塞实现数据保护深入解析》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

Docker进阶:深入理解 Dockerfile

Docker进阶&#xff1a;深入理解 Dockerfile 一、Dockerfile 概述二、为什么要学习Dockerfile三、Dockerfile 编写规则四、Dockerfile 中常用的指令1、FROM2、LABEL3、RUN4、CMD5、ENTRYPOINT6、COPY7、ADD8、WORKDIR9、 ENV10、EXPOSE11、VOLUME12、USER13、注释14、ONBUILD 命…

TimescaleDB 开源时序数据库

文章目录 1.TimescaleDB介绍2.Hypertable 和 chunk3.Hypertable4.Hypertable操作 开源中间件 # TimescaleDBhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/timescale/timescale-summary/1.TimescaleDB介绍 TimescaleDB是基于PostgreSQL数据…

Excel生成 chart 混合图表

在开发中有这样一个需求&#xff0c;邮件预警的时候&#xff0c;要求邮件主体内容是一个Chart 图表&#xff08;生成后的img&#xff09;&#xff0c;邮件需要有附件&#xff0c;且附件是Excel列表加图表&#xff0c;图表类型是混合图。 回顾&#xff1a;在之前一篇讲到如何使用…

SQL 多表查询

文章目录 多表查询的分类等值连接非等值连接自连接非自连接内连接外连接左外连接右外连接满外连接 SQL连接 JOINSQL99 语法新特性 自然连接 NATURAL JOIN & USING 多表查询的分类 等值连接 VS 非等值连接自连接 VS 非自连接内连接 VS 外连接 等值连接 关联的表有连接字段…

【c语言 】 函数入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

MySQl基础入门⑦

上一章知识内容 分析数据且区分数据类型 看下表分析数据的特征&#xff0c;根据其特征确定相应的数据类型。 分析以上表格特征&#xff0c;确定数据类型&#xff0c;并对数据进行分类。分析数据后按固定长度字符串、可变长度字符串、整数、固定精度小数和日期时间数据类型对数…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

keepalived原理以及lvs、nginx跟keeplived的运用

keepalived基础 keepalived的原理是根据vrrp协议&#xff08;主备模式&#xff09;去设定的 vrrp技术相关原理 状态机&#xff1b; 优先级0~255 心跳线1秒 vrrp工作模式 双主双备模式 VRRP负载分担过程 vrrp安全认证&#xff1a;使用共享密匙 keepalived工具介绍 keepal…