MySQL的SELECT语句是数据库查询的核心,基础的单表查询只能满足简单的数据提取需求,实际业务中往往需要用到进阶的SELECT语法来处理复杂场景。这些语法可以大幅提升查询的灵活性和效率,适配更多样的业务需求。

多表关联查询
当需要从多张表中提取关联数据时,就需要用到多表关联查询,常用的关联方式有内连接、左连接、右连接。
内连接INNER JOIN
内连接会返回两张表中匹配关联条件的记录,不匹配的记录会被过滤掉。
-- 查询用户表和订单表中匹配的用户订单信息 SELECT u.user_id, u.user_name, o.order_id, o.order_amount FROM user u INNER JOIN order_table o ON u.user_id = o.user_id;
左连接LEFT JOIN
左连接会返回左表的所有记录,右表没有匹配的记录时对应字段显示为NULL。
-- 查询所有用户及其订单信息,没有订单的用户也会显示 SELECT u.user_id, u.user_name, o.order_id, o.order_amount FROM user u LEFT JOIN order_table o ON u.user_id = o.user_id;
子查询
子查询是指在一个查询语句中嵌套另一个查询语句,嵌套的查询会作为外层查询的条件或者数据源。
作为条件的子查询
子查询返回单个值或者一组值,作为外层查询的筛选条件。
-- 查询订单金额大于平均订单金额的所有订单 SELECT order_id, order_amount FROM order_table WHERE order_amount > (SELECT AVG(order_amount) FROM order_table);
作为数据源的子查询
子查询返回一个临时结果集,外层查询直接对这个临时结果集做查询操作。
-- 先查询出每个用户的订单总金额,再筛选出总金额大于1000的用户
SELECT user_id, total_amount
FROM (
SELECT user_id, SUM(order_amount) AS total_amount
FROM order_table
GROUP BY user_id
) t
WHERE t.total_amount > 1000;
聚合函数与分组筛选
聚合函数可以对一组数据进行统计计算,搭配GROUP BY做分组,再结合HAVING做分组后的筛选,能完成很多统计类需求。
常用的聚合函数有COUNT()、SUM()、AVG()、MAX()、MIN(),这些函数调用时不需要转义标签形式。
-- 统计每个用户的订单数量,并且只显示订单数量大于等于3的用户 SELECT user_id, COUNT(order_id) AS order_count FROM order_table GROUP BY user_id HAVING COUNT(order_id) >= 3;
条件判断查询
MySQL提供了CASE WHEN语法,可以在查询过程中做条件判断,对字段值做转换处理。
-- 根据订单金额给订单打标签,金额大于500为大额订单,否则为普通订单
SELECT order_id, order_amount,
CASE
WHEN order_amount > 500 THEN '大额订单'
ELSE '普通订单'
END AS order_label
FROM order_table;
注意事项
- 多表关联时尽量给表起简短的别名,提升语句可读性,同时关联字段建议建立索引,提升查询效率。
- 子查询如果返回的数据量较大,可能会影响查询性能,这类场景可以考虑用关联查询替代。
- HAVING子句只能搭配GROUP BY使用,用来筛选分组后的结果,不能替代WHERE子句做行级筛选。
- 使用
CASE WHEN时,THEN后面的返回值类型尽量保持一致,避免出现类型转换问题。