蝶儿导读
本文系统梳理了SQL语言的核心操作,涵盖增删改查四类基本语法,重点解析SELECT查询中的条件筛选、分组聚合、多表连接与子查询等难点。文章区分DML与DDL语句,强调WHERE与HAVING差异,并提供可套用的完整语法模板。同时提醒INSERT、UPDATE、DELETE操作的风险及工程实践中的注意事项,适用于数据库初学者期末复习与实际应用参考。
— 此摘要由蝶儿创作,她也可能会犯错。
以下内容由深度学习程序修改或创作,可能存在谬误、争议,请注意辨别。
马上期末考试了,请 ChatGPT 出手整理了一下 SQL 语句速通合集:
下面按数据库课程 + 实际工程都通用的方式,系统、严谨地把 SQL 中的 增(INSERT)删(DELETE)改(UPDATE)查(SELECT) 全部情况拆解说明。
我会先给出分类与语义,再给出典型与边界用法,最后给你一份尽可能完整、可直接套用的 SQL 模板总表。
一、总体框架(先建立全局认知)
SQL 对关系表(Relation,关系型数据表)的基本操作,本质上只有四类:
| 操作 | 英文 | 本质 |
|---|---|---|
| 查 | SELECT | 产生结果集(不改变原表) |
| 增 | INSERT | 向表中加入元组(行) |
| 改 | UPDATE | 修改已有元组的属性值 |
| 删 | DELETE | 移除元组 |
注意
- DDL(CREATE / DROP / ALTER)不属于增删改查
- 增删改查属于 DML(Data Manipulation Language,数据操纵语言)
二、查(SELECT)——最复杂、考点最多
2.1 最基本的 SELECT
SELECT 列1, 列2
FROM 表名;
SQL含义:
- 从关系
表名中 - 投影(Projection)出指定列
2.2 查询全部列
SELECT *
FROM Student;
SQL* 表示 当前表的所有属性
⚠️ 工程中不推荐滥用,但考试中合法
2.3 条件查询(WHERE)
SELECT *
FROM Student
WHERE Ssex = '男';
SQLWHERE 是 选择(Selection)条件,在逻辑上先于 SELECT 执行。
常见条件形式
| 类型 | 示例 |
|---|---|
| 比较 | = <> < > <= >= |
| 范围 | BETWEEN 60 AND 90 |
| 枚举 | IN ('男','女') |
| 模式 | LIKE '刘__' |
| 空值 | IS NULL / IS NOT NULL |
| 逻辑 | AND / OR / NOT |
2.4 模糊查询(LIKE)
WHERE Sname LIKE '刘%'
WHERE Sname LIKE '_明'
WHERE Sname LIKE '刘__'
SQL%:任意长度字符串_:单个字符
2.5 排序(ORDER BY)
SELECT *
FROM Student
ORDER BY Sage DESC, Sno ASC;
SQL- 默认:
ASC(升序) DESC:降序- ORDER BY 永远最后执行
2.6 去重(DISTINCT)
SELECT DISTINCT Ssex
FROM Student;
SQL去重的是:整行投影结果
2.7 聚集函数(非常重要)
常见聚集函数(Aggregate Function)
| 函数 | 含义 |
|---|---|
COUNT(*) | 行数 |
COUNT(列) | 非 NULL 个数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() / MIN() | 最大 / 最小 |
SELECT COUNT(*), AVG(Sage)
FROM Student;
SQL2.8 分组查询(GROUP BY)
SELECT Ssex, COUNT(*)
FROM Student
GROUP BY Ssex;
SQL逻辑含义:
- 按
Ssex分组 - 每组生成一行结果
2.9 分组条件(HAVING)
SELECT Ssex, COUNT(*)
FROM Student
GROUP BY Ssex
HAVING COUNT(*) > 10;
SQLWHERE vs HAVING(必考)
| 项目 | WHERE | HAVING |
|---|---|---|
| 作用对象 | 原始行 | 分组结果 |
| 是否可用聚集函数 | ❌ | ✅ |
2.10 多表查询(连接)
① 内连接(INNER JOIN)
SELECT S.Sname, C.Cname
FROM Student S
JOIN SC ON S.Sno = SC.Sno
JOIN Course C ON SC.Cno = C.Cno;
SQL只保留匹配成功的记录。
② 外连接(LEFT / RIGHT)
SELECT *
FROM Student
LEFT JOIN SC ON Student.Sno = SC.Sno;
SQL2.11 子查询(嵌套查询)
SELECT *
FROM Student
WHERE Sno IN (
SELECT Sno
FROM SC
WHERE Grade >= 90
);
SQL子查询可以出现在:
WHEREFROMSELECT
三、增(INSERT)——向表中加入数据
3.1 插入一行(指定列)
INSERT INTO Student (Sno, Sname, Ssex)
VALUES ('001', '刘强', '男');
SQL最安全、最推荐写法。
3.2 插入一行(不指定列)
INSERT INTO Student
VALUES ('001', '刘强', '男', 20);
SQL⚠️ 要求:
- 列顺序必须完全一致
- 实务中风险较高
3.3 插入多行
INSERT INTO Student (Sno, Sname, Ssex)
VALUES
('002','张三','男'),
('003','李四','女');
SQL3.4 插入查询结果(非常重要)
INSERT INTO Student_Backup
SELECT *
FROM Student
WHERE Ssex = '女';
SQL3.5 创建表并插入(SELECT INTO)
SELECT *
INTO Student_Copy
FROM Student;
SQL四、改(UPDATE)——修改已有数据
4.1 修改所有行(危险)
UPDATE Student
SET Ssex = '男';
SQL⚠️ 无 WHERE = 全表更新
4.2 条件修改(最常见)
UPDATE Student
SET Sage = 21
WHERE Sno = '001';
SQL4.3 修改多个列
UPDATE Student
SET Sage = 22,
Ssex = '女'
WHERE Sname = '刘强';
SQL4.4 基于子查询修改
UPDATE Student
SET Sage = Sage + 1
WHERE Sno IN (
SELECT Sno
FROM SC
WHERE Grade < 60
);
SQL五、删(DELETE)——删除数据
5.1 删除全部数据(结构保留)
DELETE FROM Student;
SQL⚠️ 表还在,只是空了
5.2 条件删除
DELETE FROM Student
WHERE Sage < 18;
SQL5.3 子查询删除
DELETE FROM Student
WHERE Sno NOT IN (
SELECT Sno
FROM SC
);
SQL5.4 DELETE vs DROP(必考)
| 操作 | DELETE | DROP |
|---|---|---|
| 删除内容 | 行 | 表结构 |
| 是否可回滚 | 有可能 | 不可 |
| 表是否存在 | ✅ | ❌ |
六、终极 SQL 模板(尽可能全)
下面这个模板不是让你一次性全写,而是告诉你 SQL 的“理论完整形态”:
SELECT [DISTINCT] 列1, 列2, 聚集函数
FROM 表名1
[JOIN 表名2 ON 连接条件]
[JOIN 表名3 ON 连接条件]
WHERE 行级条件
GROUP BY 分组列
HAVING 分组条件
ORDER BY 排序列 [ASC|DESC];
SQLINSERT 模板
INSERT INTO 表名 (列1, 列2, ...)
VALUES (...);
SQLINSERT INTO 表名
SELECT ...
FROM ...
WHERE ...;
SQLUPDATE 模板
UPDATE 表名
SET 列1 = 值1,
列2 = 值2
WHERE 条件;
SQLDELETE 模板
DELETE FROM 表名
WHERE 条件;
SQL七、学习建议
- SELECT 是 SQL 的 70% 难度
- 真正拉开水平的,是:
GROUP BY + HAVING- 子查询
- 多表 JOIN
- 增删改 逻辑简单但风险最高