1. 语法
- SQL语句不区分大小写
- 以;分隔
- 忽略空格
- 支持三种注释
## 注释1 -- 注释2 /* 注释3 */
2.SQL语句分类
类型 | 功能 | 核心指令 |
数据定义语言(DDL) | 定义数据库对象 | CREATE 、ALTER 、DROP、USE |
数据操纵语言(DML) | 访问数据 | INSERT 、UPDATE 、DELETE 、SELECT |
事务控制语言(TCL) | 管理数据库中的事务 | COMMIT 、ROLLBACK |
数据控制语言(DCL) | 控制用户的访问权限 | GRANT 、REVOKE |
3.插入insert into
insert into语句用于向表中插入新记录,可以插入查询出来的结果
INSERT INTO user(username)
SELECT name
FROM account;
4.分组 group by
- group by 为每一组返回一条记录
- 通常伴随聚合函数的使用,如
count
,max
,sum
,avg等。
- 可以对一列或者多列进行分组
- having用于对group by 汇总结果进行过滤
4.1 having 和 where的区别
- where是用于过滤行的,后面不能使用聚合函数,需要在group by之前出现
- having过滤分组,不能单独使用,在group by之后出现
5.子查询
功能 | 位置 | 返回数据 |
作为数据来源,实现多表联合查询 | from子句之后 | 一般返回多行多列数据,通常为该临时表起别名 |
作为判断条件 | where子句之后 | 单行单列、多行单列、单行多列 |
5.1 规则
- 内部查询首先在其父查询之前执行
- 子查询需要放在括号
( )
内。
6.连接join
- 连接表将不同表的记录合并起来形成一张新表。这张新表只是临时的,仅存在于本次查询期间。
- 使用on运算符将两个或更多查询的结果组合起来作为连接条件
6.1 连接中 on 和where
on后面是连接条件,决定临时表的生成,而where在临时表生成以后,对临时表中的数据进行过滤,生成最终的结果集。
7.组合union
- 运算符将两个或更多查询的结果组合起来
- 所有查询的列数和列顺序必须相同
- 数据类型必须相同或兼容
- 返回的列名通常取自第一个查询
- union会去重数据,如果允许重复的值,需要使用 union all
7.1 union vs join
要求 | 结果 | |
union | 列数和列顺序必须相同,数据类型必须相同或兼容 | 垂直放置 |
join | 满足on后面的连接条件 | 水平放置,构成一个笛卡尔积 |
8.函数
- soundex() 函数用于查找在发音上相似的字符串
SELECT * FROM mytable WHERE SOUNDEX(col1) = SOUNDEX('apple')
-
avg(column name)会忽略null行
-
count(column name)会忽略null行,但count(*)不会
9.视图
- 视图是基于sql语句结果集可视化的表
- 是虚拟的表,不能进行索引操作
- 可以只使用实际表中的一部分数据
- 通过只给用户访问视图的权限,可以保证数据的安全性
- 可以更改数据格式和表示
10.索引
索引是一种用于快速查询和检索数据的数据结构,可以大大加快 数据的检索速度。但创建索引和维护索引也需要耗费许多时间和空间。
10.1索引一定能提高查询性能吗?
大多数情况下,索引查询能提高查询性能,但如果数据库的数据量不大,使用索引也不一定能够带来很大提升。
11.事务处理
- 通过
set autocommit=0
可以取消自动提交,直到set autocommit=1
才会提交;autocommit
标记是针对每个连接而不是针对服务器的 - savepoint指令用于创建保留点
- rollback to 用于回滚到指定的保留点,若没有设置保留点,则回退到事务的起始点。
-- 开始事务 start transaction; -- 插入操作 A insert into `user` values (1, 'root1', 'root1', 'xxxx@163.com'); -- 创建保留点 insertA savepoint insertA; -- 插入操作 B insert into `user` values (1, 'root2', 'root2', 'xxxx@163.com'); -- 回滚到保留点 insertA rollback to insertA; -- 提交事务,只有操作 A 生效 commit;
12.存储过程
存储过程可以是对一系列 SQL 操作的批处理。但阿里巴巴《Java 开发手册》强制禁止使用存储过程。因为存储过程难以调试和扩展,更没有移植性。
12.1 规则
- 创建存储过程需要自定义分隔符,因为命令行是以;为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符
- 包含
in
、out
和inout
三种参数 - 每次只能给一个变量赋值,不支持集合的操作
- 给变量赋值使用
select/set
语句drop procedure if exists `proc_adder`; delimiter ;; create definer=`root`@`localhost` procedure `proc_adder`(in a int, in b int, out sum int) begin declare c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set sum = a + b; end ;; delimiter ; --使用存储过程 set @b=5; call proc_adder(2,@b,@s); select @s as sum;
-
在存储过程中使用游标(相当于指针)可以对一个结果集进行移动遍历
-
触发器是一种特殊类型的存储过程,在特定的数据库事件发生时自动执行