当前位置: 首页 > news >正文

Mysql常见的查询总结

基础查询(单表查询)

最常用的方式,从单个数据表中查询数据。时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 NULLUNION 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):适合合并多个独立查询的结果(非关联关系的表)。
http://www.dtcms.com/a/336185.html

相关文章:

  • Golang database/sql 包深度解析(二):连接池实现原理
  • 快速掌握Hardhat与Solidity智能合约开发
  • Rust Web 全栈开发(十三):发布
  • 实时视频延迟优化实战:RTSP与RTMP播放器哪个延迟更低?
  • 数据结构初阶(19)外排序·文件归并排序的实现
  • 博士招生 | 麻省理工学院 招收化学+人工智能方向 博士/博士后
  • 【编程实践】关于S3DIS数据集的问题
  • Docker+飞算JavaAI=未来:全流程容器化AI开发实战
  • Python注解
  • 【leetcode】14. 最长公共前缀
  • 构建经典PyTorch框架卷积神经网络参数demo
  • WPF真入门教程35--手搓WPF出真汁【蜀味正道CS版】
  • 中国三大主粮作物(水稻、小麦、玉米)空间分布数据集
  • Python开发环境
  • 密码学系列 - 零知识证明(ZKP) - 多种承诺方案
  • Windows Server SDN智能流量管理方案
  • 网络通信的基本概念与设备
  • 【力扣热题100】双指针—— 接雨水
  • Ubuntu22系统docker部署Dify【教程】
  • go资料汇总
  • 上网行为组网方案
  • 图论水题4
  • 隐私屏软件(支持win10以上系统)
  • Python异常、模块与包(五分钟小白从入门)
  • Android面试指南(二)
  • 工具测试 - marker (Convert PDF to markdown + JSON quickly with high accuracy)
  • JavaScript 中constructor 属性的指向异常问题
  • Python实现区域生长和RANSAC聚类
  • 线程基本API
  • 输入坐标移动