MySQL DQL 查询语法速查手册
MySQL DQL 查询速查 的完整教学讲解。
SELECT 基础
单行写法:查询所有列
SELECT * FROM <表名>;
-- 查询所有用户
SELECT * FROM users;
单行写法:查询指定列
SELECT <列1>, <列2> FROM <表名>;
-- 查询用户名和邮箱
SELECT username, email FROM users;
单行写法:列别名
SELECT <列> AS <别名> FROM <表名>;
-- 给列起别名
SELECT username AS 用户名, email AS 邮箱 FROM users;
单行写法:去重查询
SELECT DISTINCT <列> FROM <表名>;
-- 查询不重复的城市
SELECT DISTINCT city FROM users;
单行写法:限制列数预览
SELECT * FROM <表名> LIMIT <数量>;
-- 仅查看前 5 行
SELECT * FROM users LIMIT 5;
WHERE 条件
单行写法:等值条件
SELECT * FROM <表名> WHERE <列>=<值>;
-- 查询状态为 1 的用户
SELECT * FROM users WHERE status = 1;
单行写法:多条件 AND
SELECT * FROM <表名> WHERE <条件1> AND <条件2>;
-- 查询活跃且成年的用户
SELECT * FROM users WHERE status = 1 AND age >= 18;
单行写法:多条件 OR
SELECT * FROM <表名> WHERE <条件1> OR <条件2>;
-- 查询北京或上海的用户
SELECT * FROM users WHERE city = '北京' OR city = '上海';
单行写法:IN 范围查询
SELECT * FROM <表名> WHERE <列> IN (<值1>, <值2>);
-- 查询指定状态的用户
SELECT * FROM users WHERE status IN (1, 2, 3);
单行写法:BETWEEN 范围查询
SELECT * FROM <表名> WHERE <列> BETWEEN <起> AND <止>;
-- 查询年龄在 18 到 30 之间的用户
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
单行写法:LIKE 模糊查询
SELECT * FROM <表名> WHERE <列> LIKE '<模式>';
-- 查询姓张的用户
SELECT * FROM users WHERE username LIKE '张%';
单行写法:IS NULL 空值查询
SELECT * FROM <表名> WHERE <列> IS NULL;
-- 查询手机号为空的用户
SELECT * FROM users WHERE phone IS NULL;
单行写法:IS NOT NULL 非空查询
SELECT * FROM <表名> WHERE <列> IS NOT NULL;
-- 查询已填写邮箱的用户
SELECT * FROM users WHERE email IS NOT NULL;
单行写法:NOT IN 反向查询
SELECT * FROM <表名> WHERE <列> NOT IN (<值1>, <值2>);
-- 查询非指定状态的用户
SELECT * FROM users WHERE status NOT IN (0, 9);
ORDER BY 排序
单行写法:升序排序
SELECT * FROM <表名> ORDER BY <列> ASC;
-- 按年龄升序排列
SELECT * FROM users ORDER BY age ASC;
单行写法:降序排序
SELECT * FROM <表名> ORDER BY <列> DESC;
-- 按创建时间降序排列
SELECT * FROM users ORDER BY created_at DESC;
单行写法:多列排序
SELECT * FROM <表名> ORDER BY <列1> DESC, <列2> ASC;
-- 先按状态降序,再按年龄升序
SELECT * FROM users ORDER BY status DESC, age ASC;
单行写法:按表达式排序
SELECT * FROM <表名> ORDER BY <表达式>;
-- 按余额绝对值排序
SELECT * FROM accounts ORDER BY ABS(balance);
LIMIT 分页
单行写法:限制返回行数
SELECT * FROM <表名> LIMIT <数量>;
-- 仅返回前 10 条
SELECT * FROM users LIMIT 10;
单行写法:分页查询
SELECT * FROM <表名> LIMIT <偏移量>, <数量>;
-- 查询第 3 页每页 10 条
SELECT * FROM users LIMIT 20, 10;
单行写法:OFFSET 写法
SELECT * FROM <表名> LIMIT <数量> OFFSET <偏移量>;
-- 使用 OFFSET 关键字分页
SELECT * FROM users LIMIT 10 OFFSET 20;
换行写法:深度分页优化
SELECT * FROM <表名> WHERE <主键> > <上次最大值> ORDER BY <主键> LIMIT <数量>;
-- 基于主键游标分页避免深度分页性能问题
SELECT id, username FROM users WHERE id > 10000 ORDER BY id LIMIT 10;
运算符与函数
单行写法:算术运算
SELECT <列1> + <列2> AS <别名> FROM <表名>;
-- 计算总价
SELECT price * quantity AS total FROM order_items;
单行写法:日期比较
SELECT * FROM <表名> WHERE <日期列> > <日期值>;
-- 查询 2024 年后的订单
SELECT * FROM orders WHERE created_at > '2024-01-01';
单行写法:字符串拼接
SELECT CONCAT(<列1>, <列2>) AS <别名> FROM <表名>;
-- 拼接用户姓名
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
单行写法:使用 IF 函数
SELECT IF(<条件>, <真值>, <假值>) FROM <表名>;
-- 根据状态返回文本
SELECT username, IF(status = 1, '活跃', '禁用') AS state FROM users;
换行写法:CASE 表达式
CASE WHEN <条件> THEN <结果> ELSE <默认> END
-- 多条件分支判断
SELECT username,
CASE
WHEN age < 18 THEN '未成年'
WHEN age < 60 THEN '成年'
ELSE '老年'
END AS age_group
FROM users;
子查询
单行写法:标量子查询
SELECT * FROM <表名> WHERE <列> = (SELECT <列> FROM <表名> WHERE <条件>);
-- 查询年龄大于平均年龄的用户
SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users);
单行写法:IN 子查询
SELECT * FROM <表名> WHERE <列> IN (SELECT <列> FROM <表名>);
-- 查询有订单的用户
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);
单行写法:EXISTS 子查询
SELECT * FROM <表1> WHERE EXISTS (SELECT 1 FROM <表2> WHERE <条件>);
-- 查询存在订单的用户
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
换行写法:NOT EXISTS 子查询
SELECT * FROM <表1> WHERE NOT EXISTS (SELECT 1 FROM <表2> WHERE <条件>);
-- 查询没有订单的用户
SELECT * FROM users u WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);