Mysql常见的查询总结

发布于:2025-08-18 ⋅ 阅读:(13) ⋅ 点赞:(0)

基础查询(单表查询)

最常用的方式,从单个数据表中查询数据。时SELECT语法的基础使用。

  1. 简单查询
select name,age from user;
select DISTINCT name from user; 去重后的数据

注意:不推荐使用 select * …。

  1. 条件查询(WHERE):用于过滤符合特定条件的数据,支持多种运算符:
    • 比较运算符:=(等于)、!=/<>(不等于)、>、<、>=、<=。
    • 范围运算符:BETWEEN … AND …(在范围内)、IN(在列表中)。
    • 模糊匹配:LIKE(配合 % 通配符,% 表示任意字符)。
    • 空值判断:IS NULL/IS NOT NULL。
-- 查询年龄大于18且职业为"学生"的用户
SELECT name, age FROM user WHERE age > 18 AND profession = '学生';

-- 查询年龄在20到30之间的用户
SELECT name FROM user WHERE age BETWEEN 20 AND 30;

-- 查询姓名以"张"开头的用户
SELECT name FROM user WHERE name LIKE '张%';
  1. 排序查询(ORDER BY):
    语法:SELECT 字段名 FROM 表名 ORDER BY 排序字段 [ASC|DESC];
    • ASC:升序(默认,可省略)。
    • DESC:降序。
  2. 限制查询(LIMIT)
    语法:SELECT 字段名 FROM 表名 LIMIT 偏移量, 行数;
    用于分页或取前N条数据(偏移量从0开始)。
SELECT name FROM user LIMIT 10, 10; -- 偏移10条,取10条

聚合查询(GROUP BY和聚合函数)

对数据进行统计分析,结合聚合函数(如求和、计数等)和GROUP By分组操作。

  1. 常用聚合函数
    2. COUNT():计数(count(*)所有行,count(字段)非空值,count(1) *和一致) 。
    3. SUM();求和(针对数值型)
    4. AGV():求平均。
    5. MAX()/MIN():求最大值/最小值。
-- 统计用户总数
SELECT COUNT(*) AS total_users FROM user;

-- 计算所有用户的平均年龄
SELECT AVG(age) AS avg_age FROM user;
  1. 分组查询()GROUP BY):按指定字段分组,对每组数据单独应用聚合函数。
    语法:SELECT 分组字段, 聚合函数 FROM 表名 GROUP BY 分组字段;
SELECT profession, COUNT(*) AS user_count FROM user GROUP BY profession;
  1. 分组后过滤(HAVING):WHERE 用于分组前过滤,HAVING 用于分组后过滤(可使用聚合函数)。
    WHERE 用于分组前过滤,HAVING 用于分组后过滤(可使用聚合函数)。
SELECT profession, COUNT(*) AS user_count 
FROM user 
GROUP BY profession 
HAVING user_count > 10;

多表查询(JOIN)

当数据分布在多个表中时,通过JOIN关联表查询(关键是 简练表之间的关联字段。保证关联字段存在索引提高效率)

  1. 内连接(INNER JOIN):返回关联表中 符合条件的行(交集)
    语法:SELECT 字段名 FROM 表1 INNER JOIN 表2 ON 关联条件;
例:查询用户及其所属部门的信息(用户表 user 和部门表 dept 通过 dept_id 关联)
	SELECT u.name, d.dept_name 
	FROM user u 
	INNER JOIN dept d 
	ON u.dept_id = d.id;
  1. 左连接(LEFT JOIN):返回左表中所有数据,右表中没有匹配数据则返回NULL
例:查询所有用户,包括未分配部门的用户
	SELECT u.name, d.dept_name 
	FROM user u 
	LEFT JOIN dept d 
	ON u.dept_id = d.id;
  1. 右连接(RIGHT JOIN):返回右表中所有数据,左表中没有匹配的数据则返回NULL
例:查询所有部门,包括没有用户的部门
	SELECT u.name, d.dept_name 
	FROM user u 
	RIGHT JOIN dept d 
	ON u.dept_id = d.id;
  1. 全连接(FULL JOIN):返回两表中所有行(没有匹配则返回NULL),Mysql不支持,可以通过左右连接实现。

子查询

在 SELECT、WHERE 或 FROM 子句中嵌套另一个 SELECT 语句,用于复杂条件的查询。

  1. Where中的子查询:子查询返回单个值或列表,作为外层查询的条件。
例:查询年龄大于平均年龄的用户
SELECT name, age FROM user 
WHERE age > (SELECT AVG(age) FROM user);
  1. 在FROM中的子查询:子查询作为临时表(需要指定别名),供外层查询使用。
例:查询每个部门的平均年龄,并筛选平均年龄大于 30 的部门
SELECT dept_name, avg_age 
FROM (
  SELECT d.dept_name, AVG(u.age) AS avg_age 
  FROM user u 
  LEFT JOIN dept d ON u.dept_id = d.id 
  GROUP BY d.dept_name
) AS dept_age 
WHERE avg_age > 30;
  1. EXISTS子查询:用于判断子查询是否返回结构(返回TURE或FALSE),效率高于IN(尤其子查询结果集大)
例:查询存在订单的用户
SELECT name FROM user u 
WHERE EXISTS (
  SELECT 1 FROM order o WHERE o.user_id = u.id
);

联合查询(UNION/UNION ALL)

用于合并多个SELECT语句的结果集(要求各语句返回的字段数和类型一致)。

  • UNION:合并后去重(性能较低)。
  • UNION ALL:直接合并,保留重复行。(性能高)
查询年龄小于 20 或大于 50 的用户,合并结果
SELECT name, age FROM user WHERE age < 20
UNION ALL
SELECT name, age FROM user WHERE age > 50;

特殊查询

  • 递归查询(WITH RECURSIVE)
    用于查询层级结构数据(如部门树、评论回复),Mysql8.0+支持。
查询所有部门及其子部门(假设部门表 dept 有 id 和 parent_id 字段)
WITH RECURSIVE dept_tree AS (
  -- 基础查询:顶级部门(parent_id 为 NULL)
  SELECT id, dept_name, parent_id 
  FROM dept 
  WHERE parent_id IS NULL
  UNION ALL
  -- 递归查询:子部门
  SELECT d.id, d.dept_name, d.parent_id 
  FROM dept d 
  INNER JOIN dept_tree dt ON d.parent_id = dt.id
)
SELECT * FROM dept_tree;
  • 窗口函数查询
    MySQL 8.0+ 支持窗口函数,用于在一组行中计算聚合值(类似 GROUP BY,但不合并行),常见函数:ROW_NUMBER()、RANK()、DENSE_RANK() 等。
例:按部门分组,查询每个部门的用户及其年龄排名
SELECT 
  name, dept_id, age,
  RANK() OVER (PARTITION BY dept_id ORDER BY age DESC) AS age_rank
FROM user;

SQL查询简单到复杂

基础查询(单表、条件、排序、分页)→ 聚合查询(分组统计)→ 多表连接(JOIN)→ 子查询(嵌套逻辑)→ 联合查询(结果合并)→ 特殊查询(递归、窗口函数)。

  • 连接查询(JOIN):尤其是内连接、左连接,逻辑清晰且性能较好,适合大部分关联场景。
  • 子查询:适合复杂条件的嵌套逻辑(如 “查询满足某个子条件的主表数据”)。
  • 联合查询(UNION):适合合并多个独立查询的结果(非关联关系的表)。

网站公告

今日签到

点亮在社区的每一天
去签到