SQL 是管理关系型数据库的标准化语言,核心是面向集合的声明式设计——只需描述"要什么数据",无需关心"如何获取"。
语法体系概览
| 分类 | 说明 | 核心语句 |
|---|
| DQL | 数据查询 | SELECT |
| DML | 数据操纵 | INSERT/UPDATE/DELETE |
| DDL | 数据定义 | CREATE/ALTER/DROP |
| DCL | 数据控制 | GRANT/REVOKE |
DQL:数据查询
基础结构
1
2
3
4
5
6
7
8
| SELECT 列名
FROM 表名
[JOIN 关联表 ON 关联条件]
WHERE 过滤条件
GROUP BY 分组列
HAVING 分组过滤
ORDER BY 排序列
LIMIT 限制条数;
|
执行顺序:FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
常用查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| -- 条件过滤
SELECT name, age FROM student WHERE class_id = 1 AND age > 18;
-- 模糊匹配(% 任意字符,_ 单字符)
SELECT name FROM student WHERE name LIKE '张%';
-- 聚合分组
SELECT class_id, COUNT(id) AS cnt
FROM student
GROUP BY class_id
HAVING cnt >= 20;
-- 多表关联
SELECT s.name, c.class_name
FROM student s
INNER JOIN class c ON s.class_id = c.id;
|
窗口函数
分组内排序,无需聚合:
1
2
3
| SELECT name, class_id, age,
ROW_NUMBER() OVER (PARTITION BY class_id ORDER BY age DESC) AS rn
FROM student;
|
DML:数据操纵
1
2
3
4
5
6
7
8
9
| -- 插入
INSERT INTO student (name, age, class_id) VALUES
('张三', 18, 1), ('李四', 19, 2);
-- 更新(务必加 WHERE)
UPDATE student SET age = 19 WHERE id = 1;
-- 删除(务必加 WHERE)
DELETE FROM student WHERE age < 16;
|
DDL:数据定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| -- 创建表
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT CHECK (age > 0),
class_id INT,
FOREIGN KEY (class_id) REFERENCES class(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 修改表
ALTER TABLE student ADD COLUMN gender CHAR(1) DEFAULT '男';
-- 删除表
DROP TABLE IF EXISTS student;
|
DCL:权限控制
1
2
3
| CREATE USER 'dev'@'localhost' IDENTIFIED BY '123456';
GRANT SELECT, INSERT ON school.* TO 'dev'@'localhost';
REVOKE INSERT ON school.* FROM 'dev'@'localhost';
|
索引优化
索引本质是 B+ 树等有序数据结构,加速数据定位。
适用场景:WHERE、JOIN、ORDER BY 涉及的列
优化原则:
- 避免在索引列使用函数(导致索引失效)
- 用
EXPLAIN 分析执行计划,type=ALL 表示全表扫描
子查询示例
1
2
3
4
5
6
7
| -- 查询比班级平均年龄大的学生
SELECT name, age, class_id
FROM student s1
WHERE age > (
SELECT AVG(age) FROM student s2
WHERE s2.class_id = s1.class_id
);
|
学习资源
- 文档:MySQL、PostgreSQL
- 书籍:《SQL 必知必会》《高性能 MySQL》
- 实战:LeetCode 数据库题库、HackerRank SQL
方言差异
| 数据库 | 分页语法 | 特色功能 |
|---|
| MySQL | LIMIT n | JSON 函数 |
| PostgreSQL | LIMIT n | JSONB、数组类型 |
| Oracle | ROWNUM | 分区表、PL/SQL |
| SQL Server | TOP n | T-SQL |
Comments