文档格式有点问题,可以下载pdf:
链接:https://pan.baidu.com/s/1R8qSPt2cMnzJqjCmox9h0A?pwd=WHY6
提取码:WHY6或者跳转以下链接:MySQL操作语句总结 - 掘金
目录
DDL(数据定义语言)基础操作
数据库操作
- 连接数据库:
mysql -uroot -p;
然后输入密码 - 查看数据库列表:
show databases;
- 创建数据库:
create databases 数据库名称;
- 删除数据库:
drop database 数据库名称;
- 修改数据库:
alter database 数据库名称 charset=编码格式;
- 查看数据库中的表:
show tables;
表操作
- 创建表:
create table if not exists 表名(列名,列类型,[约束])
:如果表不存在就创建
-
- 常见约束:
-
-
- 非空约束:NOT NULL,不允许某列的内容为空;
- 设置列的默认值:DEFAULT;
- 唯一约束:UNIQUE,该表中,该列的内容必须唯一;
- 主键约束:PRIMARY KEY,非空且唯一;
- 主键自增长:AUTO_INCREMENT,从1开始,步长为1;、
- 外键约束:FOREIGN KEY,A表中的外键列。A表中的外键列的值必须参照于B表中的某一列(B表主键)
-
- 删除表:
drop table 表名;
- 描述表结构:
desc table 表名;
- 修改表结构:
alter table <表名> add|drop <列名><列类型>
DML(数据操作语言)基础操作
- 修改:
update 表名 set col1=value1,col2=value2...... where[条件]
-
- 实体完整性约束:修改主键值时,对外键值级联更新,或拒绝修改主键值的操作
- 参照完整性约束:外键表中的外键信息不允许被修改:
- 插入:
insert into 表名 (col1,col2,......) value (value11,value12,......),(value21,value22,......);
-
- 从别的表中查询后插入该表:
insert into 表1(col1,col2,......) select col1,col2,...... from 表2 where[条件];
- 插入时的完整性约束:
- 从别的表中查询后插入该表:
-
-
- 实体完整性:是否插入了主键相同的元组
- 参照完整性:当外键表插入新元组时,新元组的外键值是否在主键表中存在
- 用户定义的完整性,如
not null
的约束;unique
的约束等等;
-
- 删除:
delete from 表名 where [条件];
DQL(数据查询语言)基础操作
1.distinct去重
作用:对列值进行去重操作
sql示例:select distinct col1,col2 from 表名;
- distinct的作用范围是所有目标列,如上,只有当col1和col2的组合重复时才去重
- distinct不能放在第一列之后
2.常见的列值操作
- 算术运算-(+,-,*,/):
select col1 operator col2 from 表名;
-
- 优先级与在数学运算中相同
- 设置列表达式的别名-as:
select col1 as 别名 from 表名;
-
- as也可以不写:
select col1 别名 from 表名;
- as也可以不写:
- lower/upper/trim:
select lower(col1) as 别名 from 表名;
-
- lower:将列值转化为小写
- upper:将列值转化为大写
- trim:过滤指定的字符串:
-
-
- trim:去除首尾字符串:
select trim(col1) from 表名;
- ltrim:去除左边的字符串
- rtrim:去除右边的字符串
- trim:去除首尾字符串:
-
3.常见的运算符
- 比较运算符:
=, >, >=, <, <=, !=,<>
-
- 其中
<>
就相当于!=
- 其中
- 逻辑运算符:
and,or,not
4.where条件查询
between...and...
:在....之间like
:字符匹配;通配符%
代替0或多个字符,通配符_
仅代替一个字符escape
:用于转义;当用户要查询的字符串本身含有%或者_
时,需要使用escape '<换码字符>'
短语对通配符进行转义;
-
- 示例:
select * from 表名 where col1 like 'AB_%C_' escape ''
,含义就是在该表中查询满足col1的值以AB_
开头,且倒数第二个字符是C
的所有行;
- 示例:
in (not in)
:⽤来查找属性值属于(不属于)指定集合的元组
-
- 示例:
select * from 表名 where col1 in (value1,value2);
- 也就相当于:
select * from 表名 where col1 = value1 or col1 = value2;
- 示例:
is null(is not null)
:判断列的值是否是空值
-
- 示例:
select * from 表名 where col1 is null;
,查询出col1这一列的值为null的所有行的信息; - 使用
is null
判断的是列值是否是空值,而不是判断是否是空字符串,如果要判断是否是空字符串,使用== ""
;
- 示例:
5.order by排序
- 升序:
order by col1 asc;
- 降序:
order by col1 desc;
order by
通常出现于select
语句的末尾,不指定排序规则的话,默认是升序;
6.聚集函数
count
:计数
-
count(*)
:计算由查询汇总from子句和where子句所创建的关系中的元组个数count([distinct|all] col1)
:统计一列中值的个数(空值不计入统计)
sum([distinct|all] col1)
:计算一列值的总和avg([distinct|all] col1)
:计算一列值的平均值max([distinct|all] col1)
:计算一列值的最大值min([distinct|all] col1)
:计算一列值的最小值
7.group by分组操作
作用:细化聚集函数的作用对象
未对查询结果分组时,聚集函数作用于整个查询结果;分组之后,聚集函数分别作用于每组
sql示例:select count(*),col1 from 表名 group by col1;
- 根据col1这一列的列值进行分组,值相等的为一组
- 使用
group by
子句之后,select
子句的列名列表中只能出现分组属性和聚集函数 group by
子句的作用对象是查询的中间结果表
having条件筛选
作用:筛选出分组后满足条件的最终结果
sql示例:select max(col1),col1 from 表名 group by col1 having max(col1) > 1000;
分组之后,只有列中最大值大于1000的列才会被筛选出;
having和where的区别:作用对象不同
- where子句作用于基表或视图,从中选择满足条件的元组
- having短语作用于分组,从中选择满足条件的分组
较为复杂的查询操作
1.连接查询
join on
:连接操作,R join S on <连接条件>
-
- 示例:
select col1 from table1 join table2 on table1.col1 = table2.col1;
- 示例:
natural join
:自然连接
-
- 示例:
select col1 from table1 natural join table2 ;
- 作用:通过⾃然连接去除重复的列属性,如上示例,表1和表2中都有
col1
这一属性,自然连接得到的新表中只保留一个col1
属性;
- 示例:
outer join
:外连接,保留指定关系中未通过连接匹配的元组;
-
- 示例:
select * from table1 outer join table2 on table1.col1 = table2.col
- 左外连接:
left outer join
:保留左表中的记录,缺省值用null填充 - 右外连接:
right outer join
:保留右表中的记录,缺省值用null填充
- 示例:
inner join
:内连接,inner可以省略不写;
对外连接和内连接的区别的说明:
学生信息表:
id | name |
---|---|
001 | 张三 |
002 | 李四 |
003 | 王五 |
004 | 赵六 |
学生课程表
id | course |
---|---|
001 | 数学 |
002 | 语文 |
003 | 英语 |
005 | 物理 |
做内连接:
id | name | course |
---|---|---|
001 | 张三 | 数学 |
002 | 李四 | 语文 |
003 | 王五 | 英语 |
做外连接
id | name | course |
---|---|---|
001 | 张三 | 数学 |
002 | 李四 | 语文 |
003 | 王五 | 英语 |
004 | 赵六 | |
005 | 物理 |
做左外连接:
id | name | course |
---|---|---|
001 | 张三 | 数学 |
002 | 李四 | 语文 |
003 | 王五 | 英语 |
004 | 赵六 |
做右外连接:
id | name | course |
---|---|---|
001 | 张三 | 数学 |
002 | 李四 | 语文 |
003 | 王五 | 英语 |
005 | 物理 |
2.嵌套查询
查询块 :⼀个 SELECT-FROM-WHERE
语句称为⼀个查询块
嵌套查询 :将⼀个查询块嵌套在另⼀个查询块的WHERE⼦句或HAVING短语的条件中的查询称为嵌套查询
sql示例:select col1 from table1 where col2 in (select col2 from table2 where col3=value);
在嵌套查询中,有一些常用的子查询:
- 带有
in
谓词的子查询(示例中已经出现) - 带有比较运算符的子查询:
<,>,=,......
-
- 示例:
select col1 from table1 where col2 = (select col2 from table2 where col3=value);
- 注意,子查询一定要在比较运算符的后面
- 示例:
- 带有
any
或all
谓词的子查询:
-
- 示例:
select col1 from table1 where col2 > any (select col2 from table2 where col3=value);
- 含义:
- 示例:
- 带有
exists
谓词的子查询:存在量词;
-
- 示例:
select col1 from table1 where exists (select * from table2 where col2=value);
- 使用存在量词后,若内层查询结果非空,则外层的where子句返回真值,否则返回假值;
- 示例:
from
子句中的子查询:
-
- 示例:
select col1,avg_col2 from (select col1,avg(col3) as avg_col2) as temp_table;
- 注意:每个派生出来的表都必须有一个自己的别名,所以子查询的结果必须通过
as
设置别名,才能用于父查询,否则会报错:Error Code: 1248. Every derived table must have its own alias
- 示例:
- 带有
with
子句的子查询:定义临时关系,⽤于嵌套查询
-
- 示例:
with temp_table as (select col1,avg(col2)_as avg_col2) select col1,avg_col2 from table1,temp_table;
- 示例:
3.集合查询
- 并UNION:
select * from table1 where col1=value1 union select * from table1 where col2=value2;
-
- 相当于
where
子句中进行or
操作
- 相当于
- 交INTERSECT:
select * from table1 where col1=value1 intersect select * from table1 where col2=value2;
-
- 相当于
where
子句中进行and
操作
- 相当于
- 差EXCEPT:
select * from table1 where col1=value1 except select * from table1 where col2=value2;
-
- 满足条件1且不满足条件2
注意:参加集合操作的各个结果表的列数必须相同,对应的数据类型也必须相同,系统会自动地在并、交、差操作之前去掉输入的重复行;而去重操作是⾮常费时的,去重的时间往往超过查询时间