目录
一、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基础的内容,进阶的内容会在后续更新