精读笔记 · 第21章 SQL 操作语言(DML 增删改 + DQL 查询)
大约 3 分钟
精读笔记 · 第21章 SQL 操作语言(DML 增删改 + DQL 查询)
精读整理自 RHCE9 随堂讲义(原文字版 14 页)|同名视频约 12 节(第02套) 关联知识文件:
分章笔记/02-Oracle(SQL 通用)、04-SpringBoot(JDBC/MyBatis 层 SQL 基础)
一、DML 增删改
- 插入 INSERT:完整插入
INSERT INTO 表名 VALUES(值1,值2,...);;部分插入INSERT INTO 表名(列1,列2) VALUES(值1,值2);(其余列用默认值/自动增长)。 - 更新 UPDATE:
UPDATE 表名 SET 列=值 WHERE 条件;例update t6 set name='cc' where id=2;——不加 WHERE 会把整表改掉。 - 删除 DELETE:
DELETE FROM 表名 WHERE 条件;——不加 WHERE 清空全表(需谨慎)。 - 改 root 密码(8.0 语法):
alter user 'root'@'localhost' identified by '新密码';+flush privileges;。
二、DQL 准备(练习表 employee5)
- 经典员工表:id 主键自增、name、sex enum、hire_date、post(岗位)、job_description、salary double(15,2)、office、dep_id。
- 简单查询:
SELECT * FROM 表;(全部列)、SELECT 列1,列2 FROM 表;(部分列)、四则运算SELECT name,salary*14 FROM employee5;(算年薪)。 - 条件查询 WHERE: | 关键字 | 示例含义 | | --- | --- | |
AND/OR| 且/或:post='hr' AND salary>1000| |BETWEEN x AND y/NOT BETWEEN| 范围含边界:salary BETWEEN 5000 AND 15000 | |IN (..)/NOT IN (..)| 集合匹配(比多个 OR 简洁高效) | |IS NULL/IS NOT NULL| 判空(NULL 不能用 = 比较) | |LIKE 'al%'/LIKE 'al___'| 模糊:%多个任意字符、_一个任意字符(不是 shell 的 * ?) | - 排序与限量:
ORDER BY 列 ASC|DESC;取前几名ORDER BY salary DESC LIMIT 5;(LIMIT 从 0 开始)。
三、多表连接查询
| 类型 | 特点 | 语法要点 |
|---|---|---|
| 交叉连接 | 笛卡尔积(A×B 全部组合,无匹配条件) | from info,department |
| 内连接 | 只显示两表匹配的行 | from 表1,表2 where 表1.列=表2.列 |
| 左连接 left join | 左表全显示,右表不匹配补 NULL | from 左表 left join 右表 on 条件 |
| 右连接 right join | 右表全显示,左表不匹配补 NULL | from 左表 right join 右表 on 条件 |
- 例:查每位员工所属部门(含无部门员工)用左连接;显示所有部门(含无员工部门)用右连接;on 条件后可再接
AND age>25、ORDER BY age。 - 注意内连接会丢掉没有 dep_num 的员工(如 sunba 的 NULL)。
四、子查询
- 定义:父查询依赖子查询结果;可用关键字 IN/NOT IN/ANY/ALL/EXISTS/NOT EXISTS 与比较符 =、!=、>、<。
- 带 IN:查“年龄≥25 的员工所在部门”:
select dep_num,dep_name from department where dep_num in (select distinct dep_num from info where age>=25); - 带 EXISTS:内层只返回真假值——为 True 外层执行、False 不执行:
select * from info where exists (select * from department where dep_num=102);(102 存在→返回全部员工)
五、命令速查表
| 场景 | SQL |
|---|---|
| 插入 | insert into 表(列...) values(值...); |
| 更新 | update 表 set 列=新值 where 条件; |
| 删除 | delete from 表 where 条件; |
| 改密码 | alter user 'root'@'localhost' identified by '...'; flush privileges; |
| 条件查询 | where 列=值 and/or ... between ... and ... in(..) like 'a%' is null |
| 排序/限量 | order by 列 desc limit 5; |
| 内连接 | select 别名.列 from 表1,表2 where 表1.key=表2.key; |
| 左/右连接 | from A left/right join B on A.key=B.key |
| 子查询 IN | where 列 in (select ...) |
| 子查询 EXISTS | where exists (select ...) |
六、易错点
- UPDATE/DELETE 忘写 WHERE = 全表更新/清空,生产事故高发点(先 SELECT 验证条件)。
- 判断 NULL 只能用
IS NULL/IS NOT NULL,= NULL或= ''都查不到 NULL(空串是另一回事)。 - LIKE 通配符是
%_,不是*?。 - 内连接会丢 NULL key 的行;要保留主表全部行必须用 left/right join。
- 多表查列名冲突要写
表名.列名(可加别名简写)。 - 子查询 IN 内层结果注意去重(distinct);EXISTS 性能常优于 IN(只判断存在性)。
七、实操清单
建 employee5 并插 10 条数据 → 练简单/四则/条件(AND/OR/BETWEEN/IN/IS NULL/LIKE)→ ORDER BY+LIMIT → 建 info+department 做交叉/内/左/右连接对比(观察 sunba、空部门行)→ IN 与 EXISTS 子查询各一例。
八、本章自测
- UPDATE/DELETE 忘加 WHERE 会怎样?2. LIKE 两个通配符含义?3. NULL 怎么判断?4. 内/左/右连接区别与丢行规则?5. IN 与 EXISTS 子查询适用场景?6. 取工资最高的前 5 名怎么写?
