MySQL DQL 查询语法速查手册

2 min入门

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