张芷铭的个人博客

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
);

学习资源

  • 文档:MySQLPostgreSQL
  • 书籍:《SQL 必知必会》《高性能 MySQL》
  • 实战:LeetCode 数据库题库、HackerRank SQL

方言差异

数据库分页语法特色功能
MySQLLIMIT nJSON 函数
PostgreSQLLIMIT nJSONB、数组类型
OracleROWNUM分区表、PL/SQL
SQL ServerTOP nT-SQL

Comments