MySQL笔记
MySQL笔记
LvemiX⁹MySQL基本操作
”[ ]
“中的意思可选项
数据库
DCL
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
创建用户
1 | CREATE USER '用户名'@'host' IDENTIFIED BY '密码'; |
赋予权限
1 | GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost'; //赋予全部权限 |
查看所有用户
1 | select * from 数据库名字.user; 查看所有用户 |
增删改查数据库
功能 | SQL |
---|---|
创建数据库 | create database [if not exists] 数据库名字 |
删除数据库 | drop database 数据库名字 |
修改数据库 | alter database 数据库名字 |
查询数据库 | show databases |
选择数据库 | use 数据库名字 |
修改数据库编码 | alter database 数据库名字 character set uft8 |
有中文字符数据库得属性字符集得uft8
表
DDL
DDL英文全称是Data Definition Language(数据定义语言)在MySQL中用于定义数据库、表、字段等结构相关的操作
创建表
1 | CREATE TABLE [if not exists] 表名( |
1 | CREATE TABLE 表名( |
功能 | SQL |
---|---|
查看当前数据库的所有表名称 | show tales |
查看指定某个表的创建语句 | show create table 表名 |
查看表结构 | desc 表名 |
删除表 | drop table 表名 |
数据类型
数值类型
数值类型 | 大小 | 有符号存储范围 | 无符号存储范围 | 含义 |
---|---|---|---|---|
tinyint | 1字节 | (-128,127) | (0,255) | 小整数值 |
smalint | 2字节 | (-32768,32762) | (0,65535) | 大整数值 |
mediumint | 3字节 | (-8388608,8388607) | (0,16777215) | 大整数值 |
int或integer | 4字节 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
bigint | 8字节 | (-9233372036854775808,9223372036854775807) | (0,18446744073709551615) | 极大整数值 |
float | 4字节 | (-3.402823466E+38,3.402823466E+38) | 0,(1.175494351E-383.402 823 466 E+38) | 单精度浮点数值 |
double | 8字节 | (-1.7976931348623157E+308,1.7976931348623157E+308) | 0(2.2250738585072014E-308,1.7976931348623157E+308) | 双精度浮点数值 |
decimal | 依赖于M和D的值 | 依赖于M和D的值 | 依赖于M和D的值 | 定点数值 |
字符类型
类型 | 大小 | 用途 |
---|---|---|
char | 0-255字节 | 定长字符串 |
varchar | 0-65535字节 | 变长字符串 |
tinyblob | 0-255字节 | 不超过 255个字符的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65535字节 | 二进制形式的长文本数据 |
text | 0-65535字节 | 长文本数据 |
mediumblob | 0-16777215字节 | 二进制形式的中等长度文本数据 |
mediumtext | 0-16777215字节 | 中等长度文本数据 |
longblob | 0-4294960295字节 | 二进制形式的极大文本数据 |
longtext | 0-4294960295字节 | 极大文本数据 |
日期类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 | ‘-838:59:59’’838:59:59 | HH:MM:SS | 时间值或持续时间 |
year | 1 | 1901/2155 | YYYY | 年份值 |
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DDHH:MM:SS | 混合日期和时间值 |
timestamp | 4 | 1970-01-01 00:00:00/2038 结束时间是第2147483647秒,北京时间2038-1-1911:14:07,格林尼治时间2038年1月19日凌晨03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
表的结构操作
功能 | SQL |
---|---|
添加字段 | alter table 表名 add 字段 类型(长度) [约束]; |
修改字段 | alter table 表名 change 旧字段 新字段 类型(长度) [约束]; |
删除字段 | alter table 表名 drop 字段; |
复制表 | create table 新表名 like 旧表名; // 仅复制结构,不复制数据 |
修改表名 | rename table 表名 to 新表名; |
DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行更新。
插入数据
1 | insert into 表名(字段1,字段2,字段3,字段4...) values (值1,值2,值3,值4); // 有几个字段就有几个值,一个字段对应一个值 |
修改数据
1 | update 表名 set 字段=值,字段=值...; |
删除数据
1 | delete from 表名 where 判断条件; // 只有条件范围内修改数据 |
delete 和 truncate 原理不同, delete 只删除内容,而 truncate 类似于 drop table , 可以理解为是将整个表删除,然后再创建该表
约束
表只有一个主键,为字段添加主键这该字段列不能重复和空,表示唯一性。
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指主键
单例主键
1 | create table 表名( |
1 | create table 表名( |
联合主键
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
1.当主键是由多个字段组成时,不能直接在字段名后面声明主键约束
2.一张表只能有一个主键,联合主键也是一个主键
联合主键不能为NULL,所选的字段为主键,只要其中一个数据不一样都是允许
1 | create table 表名( |
1 | -- 创建表之后 |
删除主键
1 | alter table 表名 drop primary key; // 会删除该表的单例主键或联合主键 |
自增长约束
在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加auto_increment属性来实现主键自增长
1 | -- 创建表时 |
默认情况下,auto_increment的初始值是1,每新增一条记录,字段值自动加1。
一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引l,以避免序号重复(即为主键或主键的一部分)。
- auto_increment约束的字段必须具备NOTNULL属性。
- auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT)等。
- auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
1 | -- 创建表时 |
delete和truncate在删除后自增列的变化
delete 数据之后自动增长从断点开始
truncate 数据之后自动增长从初始值开始
非空约束
MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
1 | -- 创建表时 |
唯一约束
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现(可以为NULL)。例如,为id字段加上唯一性约束后,每条记录的id值都是唯一的,不能出现重复的情况。
1 | -- 创建表时 |
在MySQL中 NULL和任何值都不相同,甚至连自己都不相同
默认约束
MySQL默认值约束用来指定某列的默认值。
1 | -- 创建表时 |
零填充约束
- 入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
- zerofill 默认为int(10)
- 当使用 zerofill 时,默认会自动加unsigned(无符号)属性,使用 unsigned 属性后,数值范围是原值的2倍,例如,有符号为-128
+127,无符号为0256。
1 | -- 创建表时 |
zerofill 只是显示效果,当删除零填充约束,补零并没有存储只是显示
无符号
unsigned
使用属性后无符号范围在0-256
DQL
DQL英文全称是Data Query Language(数据查询语言)是数据库领域中用来查询数据的语言
- 数据库管理系统一个重要功能就是数据查询数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
- MySQL提供了功能强大、灵活的语句来实现这些操作。
- MySQL数据库使用select语句来查询数据。
1 | -- 语法格式 |
1 | -- 查询表的所有数据 |
运算符
算数运算符
算术运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ 或 DIV | 除法运算,返回商 |
% 或 MOD | 求余运算,返回余数 |
比较运算符
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
<>或!= | 不等于 |
is null 或 ISNULL | 判断一个值是否为NULL |
is not null | 判断一个值是否不为NULL |
least | 当有两个或多个参数时,返回最小值 (如果参数有NULL则不比较,结果返回NULL) |
greatest | 当有两个或多个参数时,返回最大值 (如果参数有NULL则不比较,结果返回NULL) |
between and | 判断一个值是否落在两个值之间 |
in | 判断一个值时in列表中的任意一个值 |
not in | 判断一个值不是in列表中的任意一个值 |
like | 通配符匹配 (例: ‘%三%’ ,%用来表示匹配任意字符,%在最前,表示匹配 ‘三’ 为结尾。’_ 三%’,_匹配单个字符,表示第二个字为 ‘三’ ) |
regexp | 正则表达式匹配 |
逻辑运算符
逻辑运算符 | 说明 |
---|---|
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
位运算符
位运算符 | 说明 |
---|---|
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
查询
排序查询
如果我们需要对读取的数据进行排序,我们就可以使用MySQL的order by子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
1 | select |
- asc代表升序,desc代表降序如果不写默认升序
- order by用于子句中可以支持单个字段,,多个字段,表达式,函数,别名
- order by子句,放在查询语句的最后面。LIMIT子句除外
- order by后边跟一个字段,则只会按照该字段的值进行排序该字段必须为数值类型或者英文和数字、字符串类型或者时间
- 如果order by后边跟多个字段,先安第一个字段来排序,如果第一个字段相同,则按照第二字段来排
聚合查询
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数; |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
count函数对null值的处理
如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
sum和avg函数对null值的处理
这两个函数忽略null值的存在,就好象该条记录不存在一样。
max和min函数对null值的处理
max和min两个函数同样忽略null值的存在。
分组查询
group by
分组查询是指使用group by字句对查询信息进行分组。
1 | select 字段1,字段2... from 表名 group by 分组字段; |
如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现:
having
- 分组之后对统计结果进行筛选的话必须使用having,不能使用where
- where子句用来筛选FROM子句中指定的操作所产生的行
- group by 子句用来分组 WHERE 子句的输出。
- having子句用来从分组的结果中筛选行
1 | select 字段1,字段2... from 表名 group by 分组字段 having 分组条件; |
分页查询
limit
分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
1 | select 字段1,字段2... from 表名 limit n; |
insert into seleect
将一张表的数据导入到另一张表中,可以使用该语句
1 | insert into 表名(字段1,字段2...) select 字段1,字段2... from 表名; |
要求目标表(左边)必须存在
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除”\n”之外的任何单个字符。 |
[…] | 字符集合。匹配所包含的任意一个字符。例如,’[ abc ]’可以匹配“plain”中的’a’。 |
[^…] | 负值字符集合。匹配未包含的任意字符。例如,’[ ^abc ]’ 可以匹配”plain”中的’p’。 |
p1|p2|p3 | 匹配p1 或p2 或p3。例如,‘z|food’能匹配”z”或”food”。”(z|f)ood’则匹配”zood”或”food”。 |
* | 匹配前面的子表达式零次或多次。例如,zo*能匹配”z”以及”zoo”。等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’能匹配”zo”以及”zoo”,但不能匹配”z”。+等价于{1,}]。 |
{n} | n 是一个非负整数。匹配确定的n次。例如,‘o{2}’不能匹配”Bob”中的’o’,但是能匹配”food” 中的两个o。 |
{n,m} | m 和n 均为非负整数,其中n<= m。最少匹配n次且最多匹配m 次。 |
多表操作
关系:
MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多
外键约束
MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
特点
- 主表必须已经存在于数据库中,或者是当前正在创建的表。
- 必须为主表定义主键。
- 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
- 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
- 外键中列的数目必须和主表的主键中列的数目相同。
- 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
创建外键约束
在创建表时设置外键约束,通过foreign key
关键词字来指定外键,语法如下:
1 | [constraint <外键名>] foreign key(字段名[,字段名1,字段名2...]) references <主表名>(主键列[,主键列1,主键列2...]); |
外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。
1 | alter table <数据表名> add constraint <外键名> foreign key(字段名[,字段名1,字段名2...]) references <主表名>(主键列[,主键列1,主键列2...]); |
- 数据插入
- 必须先给主表添加数据
- 给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
- 删除数据
- 主表的数据被从表依赖时,不能删除,否者可以删除
- 从表的数据可以随便删除
删除外键约束
当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系
1 | alter table <表名> drop foreign key <外键约束名>; |
多表联合查询
交叉连接查询
- 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
- 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
- 假如A表有m行数据,B表有n行数据,则返回m*n行数据
- 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选
1 | select * from 表1,表2...; |
内连接查询
内连接查询求多张表的交集
1 | 隐式内连接(SQL92标准): select * from 表名1,表名2 where 条件; |
外连接查询
外连接分为左外连接(left outer join)、右外连接(right outer join),满外连接(full outer join)
oracle里面有full join,可是在MySQL对full join支持的不好。我们可以使用union来达到目的。
1 | 左外连接: |
多表连接查询
from 子句可以指定多个数据源,实现多表连接,继而实现从多个表中检索数据
例(以三个表为例):
1 | select a.字段, b.字段, c.字段 from 表名1 a |