MySQL笔记

MySQL基本操作

[ ]“中的意思可选项

数据库

DCL

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。

创建用户

1
2
3
CREATE USER  '用户名'@'host' IDENTIFIED BY '密码';
// host值设置为 localhost 表示该用户只能在本机登录
// host值设置为 % 表示该用户可以进行远程登录

赋予权限

1
2
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost'; //赋予全部权限
FLUSH PRIVILEGES; //刷新权限

查看所有用户

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
2
3
4
5
6
CREATE TABLE [if not exists] 表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
// …………
)[表的一些设置];
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE 表名(
age int comment '年龄', // 属性名1 数据类型 备注,
height decimal(5,2) comment '身高', // 属性名2 数据类型 备注,
id char(8) comment '学号',
name char(128) comment '姓名',
birthday date comment '出生日期',
nowtime datetime comment '数据日期',
sex enum('男','女'),
hobby set('唱歌','跳舞','打游戏') comment '爱好' // 最后一个数据不要写逗号
// …………
);
功能SQL
查看当前数据库的所有表名称show tales
查看指定某个表的创建语句show create table 表名
查看表结构desc 表名
删除表drop table 表名

数据类型

数值类型
数值类型大小有符号存储范围无符号存储范围含义
tinyint1字节(-128,127)(0,255)小整数值
smalint2字节(-32768,32762)(0,65535)大整数值
mediumint3字节(-8388608,8388607)(0,16777215)大整数值
int或integer4字节(-2147483648,2147483647)(0,4294967295)大整数值
bigint8字节(-9233372036854775808,9223372036854775807)(0,18446744073709551615)极大整数值
float4字节(-3.402823466E+38,3.402823466E+38)0,(1.175494351E-383.402 823 466 E+38)单精度浮点数值
double8字节(-1.7976931348623157E+308,1.7976931348623157E+308)0(2.2250738585072014E-308,1.7976931348623157E+308)双精度浮点数值
decimal依赖于M和D的值依赖于M和D的值依赖于M和D的值定点数值
字符类型
类型大小用途
char0-255字节定长字符串
varchar0-65535字节变长字符串
tinyblob0-255字节不超过 255个字符的二进制字符串
tinytext0-255字节短文本字符串
blob0-65535字节二进制形式的长文本数据
text0-65535字节长文本数据
mediumblob0-16777215字节二进制形式的中等长度文本数据
mediumtext0-16777215字节中等长度文本数据
longblob0-4294960295字节二进制形式的极大文本数据
longtext0-4294960295字节极大文本数据
日期类型
类型大小范围格式用途
date31000-01-01/9999-12-31YYYY-MM-DD日期值
time3‘-838:59:59’’838:59:59HH:MM:SS时间值或持续时间
year11901/2155YYYY年份值
datetime81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DDHH:MM:SS混合日期和时间值
timestamp41970-01-01 00:00:00/2038 结束时间是第2147483647秒,北京时间2038-1-1911:14:07,格林尼治时间2038年1月19日凌晨03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

表的结构操作

功能SQL
添加字段alter table 表名 add 字段 类型(长度) [约束];
修改字段alter table 表名 change 旧字段 新字段 类型(长度) [约束];
删除字段alter table 表名 drop 字段;
复制表create table 新表名 like 旧表名; // 仅复制结构,不复制数据
修改表名rename table 表名 to 新表名;

DML

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行更新。

插入数据

1
2
3
4
5
6
7
8
9
10
insert into 表名(字段1,字段2,字段3,字段4...) values (值1,值2,值3,值4); // 有几个字段就有几个值,一个字段对应一个值
insert into 表名(字段1,字段2,字段3,字段4...)
values (值1,值2,值3,值4),
(值1,值2,值3,值4),
(值1,值2,值3,值4)...;

insert into 表名 values (值1,值2,值3,值4); // 插入所有字段
insert into 表名 values (值1,值2,值3,值4),
(值1,值2,值3,值4),
(值1,值2,值3,值4)...;

修改数据

1
2
3
update 表名 set 字段=值,字段=值...;
update 表名 set 字段=值,字段=值... where 条件表达式; // 只有条件范围内修改数据
-- 例如 update stu set sid = 0001 where age > 18

删除数据

1
2
3
4
delete from 表名 where 判断条件; // 只有条件范围内修改数据
delete from 表名; // 删除该表所有数据
truncate table 表名;
truncate 表名;

deletetruncate 原理不同, delete 只删除内容,而 truncate 类似于 drop table , 可以理解为是将整个表删除,然后再创建该表

约束

表只有一个主键,为字段添加主键这该字段列不能重复和空,表示唯一性。

创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指主键

单例主键
1
2
3
4
create table 表名(
字段名 数据类型 primary key,
...
);
1
2
3
4
create table 表名(
...
[constraint <约束名>] primary key(字段)
);
联合主键

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。

1.当主键是由多个字段组成时,不能直接在字段名后面声明主键约束
2.一张表只能有一个主键,联合主键也是一个主键

联合主键不能为NULL,所选的字段为主键,只要其中一个数据不一样都是允许

1
2
3
4
create table 表名(
...
primary key (字段1,字段2,字段3...)
);
1
2
-- 创建表之后
alter table 表名 add primary key(字段1,字段2...); // 也可以之后等表创建完了,再添加主键
删除主键
1
alter table 表名 drop primary key; // 会删除该表的单例主键或联合主键
自增长约束

在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

通过给字段添加auto_increment属性来实现主键自增长

1
2
-- 创建表时
字段名 数据类型 primary key auto_increment;

默认情况下,auto_increment的初始值是1,每新增一条记录,字段值自动加1。

一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引l,以避免序号重复(即为主键或主键的一部分)。

  1. auto_increment约束的字段必须具备NOTNULL属性。
  2. auto_increment约束的字段只能是整数类型(TINYINTSMALLINTINTBIGINT)等。
  3. auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
1
2
3
4
5
6
7
8
9
10
11
12
-- 创建表时
create table 表名(
字段 数据类型 primary key auto_increment
...
)auto_increment = 初始值 ; // 那么会从初始值开始+1

-- 创建表之后
create table 表名(
字段 数据类型 primary key auto_increment
...
);
alter table 表名 auto_increment = 初始值 ;
  • deletetruncate在删除后自增列的变化

  • delete 数据之后自动增长从断点开始

  • truncate 数据之后自动增长从初始值开始

非空约束

MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。

1
2
3
4
5
6
7
8
-- 创建表时
字段名 数据类型 not null

-- 创建表之后
alter table 表名 modify 字段 数据类型 not null;

-- 删除非空约束
alter table 表名 modify 字段 数据类型;
唯一约束

唯一约束(Unique Key)是指所有记录中字段的值不能重复出现(可以为NULL)。例如,为id字段加上唯一性约束后,每条记录的id值都是唯一的,不能出现重复的情况。

1
2
3
4
5
6
7
8
-- 创建表时
字段名 数据类型 unique

-- 创建表之后
alter table 表名 add constraint 约束名 unique(字段);

-- 删除唯一约束
alter table 表名 drop index 唯一约束名 ;// 创建表时没有约束名,默认用字段名

在MySQL中 NULL和任何值都不相同,甚至连自己都不相同

默认约束

MySQL默认值约束用来指定某列的默认值。

1
2
3
4
5
6
7
8
-- 创建表时
字段名 数据类型 default 默认值

-- 创建表之后
alter table 表名 modify 字段 类型 default 默认值;

-- 删除默认约束
alter table 表名 modify 字段 类型 default null;
零填充约束
  1. 入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
  2. zerofill 默认为int(10)
  3. 当使用 zerofill 时,默认会自动加unsigned(无符号)属性,使用 unsigned 属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256。
1
2
3
4
5
6
-- 创建表时
字段名 数据类型 zerofill
// zerofill 默认int(10),当插入 1 的时候就会自动在前面补9个零(0000000001)

-- 删除零填充约束
alter table 表名 modify 字段 类型;

zerofill 只是显示效果,当删除零填充约束,补零并没有存储只是显示

无符号

unsigned

使用属性后无符号范围在0-256

DQL

DQL英文全称是Data Query Language(数据查询语言)是数据库领域中用来查询数据的语言

  1. 数据库管理系统一个重要功能就是数据查询数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
  2. MySQL提供了功能强大、灵活的语句来实现这些操作。
  3. MySQL数据库使用select语句来查询数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 语法格式
select
[all|distinct]
<目标字段的表达式1> [别名],
<目标字段的表达式2> [别名]...
from <表名或视图名> [别名],<表名或视图名> [别名]...
[where <条件表达式>]
[group by <字段>]
[having <条件表达式>]
[order by <字段> [asc|desc]]
[limit <数字或者列表>];

-- 简化版语法
select * 或 字段 fromwhere 条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 查询表的所有数据
select * from 表名;

-- 查询某字段或多个
select 字段1.字段2... from 表名;

-- 别名查询,使用的关键字是 as(as可以省略). // 在以后多个表查询可以用别名来区分,更简化代码
-- 表别名
select * from 表名 [as] 别名;

-- 列别名
select 字段 [as] 别名 from 表名;

-- 去掉重复值
select distinct 字段 from 表名;

-- 查询结果是表达式(运算查询)
select 字段1+10,字段2... from 表名; // 将某字段数据+10

运算符

算数运算符
算术运算符说明
+加法运算
-减法运算
*乘法运算
/ 或 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逻辑异或

位运算符

位运算符说明
|按位或
&按位与
^按位异或
<<按位左移
>>按位右移
~按位取反,反转所有比特

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

查询

排序查询

如果我们需要对读取的数据进行排序,我们就可以使用MySQLorder by子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

1
2
3
4
select
字段1,字段2,...
from 表名
order by 字段1 [asc|desc],字段2 [asc|desc] ...
  1. asc代表升序,desc代表降序如果不写默认升序
  2. order by用于子句中可以支持单个字段,,多个字段,表达式,函数,别名
  3. order by子句,放在查询语句的最后面。LIMIT子句除外
  4. order by后边跟一个字段,则只会按照该字段的值进行排序该字段必须为数值类型或者英文和数字、字符串类型或者时间
  5. 如果order by后边跟多个字段,先安第一个字段来排序,如果第一个字段相同,则按照第二字段来排
聚合查询

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

聚合函数作用
count()统计指定列不为NULL的记录行数;
sum()计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
max()计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min()计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
  1. count函数对null值的处理

    如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。

  2. sum和avg函数对null值的处理

    这两个函数忽略null值的存在,就好象该条记录不存在一样。

  3. max和min函数对null值的处理

    max和min两个函数同样忽略null值的存在。

分组查询
group by

分组查询是指使用group by字句对查询信息进行分组。

1
select 字段1,字段2... from 表名 group by 分组字段;

如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现:

having
  1. 分组之后对统计结果进行筛选的话必须使用having,不能使用where
  2. where子句用来筛选FROM子句中指定的操作所产生的行
  3. group by 子句用来分组 WHERE 子句的输出。
  4. having子句用来从分组的结果中筛选行
1
select 字段1,字段2... from 表名 group by 分组字段 having 分组条件;
分页查询
limit

分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。

1
2
3
4
select 字段1,字段2... from 表名 limit n;
select 字段1,字段2... from 表名 limit m,n;
m:整数,表示从第几条索引开始,计算方式(当前页-1)*每页显示条数
n:整数,表示查询多少条数据
insert into seleect

将一张表的数据导入到另一张表中,可以使用该语句

1
2
3
insert into 表名(字段1,字段2...) select 字段1,字段2... from 表名;
insert into 表名 select * 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. 数据插入
    • 必须先给主表添加数据
    • 给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
  2. 删除数据
    • 主表的数据被从表依赖时,不能删除,否者可以删除
    • 从表的数据可以随便删除
删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系

1
alter table <表名> drop foreign key <外键约束名>;

多表联合查询

交叉连接查询
  • 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
  • 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
  • 假如A表有m行数据,B表有n行数据,则返回m*n行数据
  • 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选
1
select * from1,表2...;
内连接查询

内连接查询求多张表的交集

1
2
隐式内连接(SQL92标准):  select * from 表名1,表名2 where 条件;
显示内连接(SQL99标准): select * from 表名1 [inner] join 表名2 on 条件;
外连接查询

外连接分为左外连接(left outer join)、右外连接(right outer join),满外连接(full outer join)

oracle里面有full join,可是在MySQL对full join支持的不好。我们可以使用union来达到目的。

1
2
3
4
5
6
左外连接:
left outer join select * from 表名1 left outer join 表名2 on 条件;
右外连接:
right outer join select * from 表名1 right outer join 表名2 on 条件;
满外连接:
full outer join select * from 表名1 full outer join 表名2 on 条件;

多表连接查询

​ from 子句可以指定多个数据源,实现多表连接,继而实现从多个表中检索数据

例(以三个表为例):

1
2
3
select a.字段, b.字段, c.字段 from 表名1 a 
[连接类型] join 表名2 b on a.字段=b.字段
[连接类型] join 表名3 c on b.字段=c.字段