SQL 查询语法笔记

SQL 查询语法笔记

一、基础查询
  1. 查询所有列

    sql 复制代码
    SELECT * FROM t_student;  
  2. 指定列查询

    sql 复制代码
    SELECT id, stu_id, name, pinyin, sex, birthday FROM t_student;  
  3. 列与表别名

    • 列别名:AS 可省略
    • 表别名:用于简化前缀(无歧义时可省略表名前缀)
    sql 复制代码
    SELECT  
      t.id AS 编号,  
      t.stu_id AS 学号,  
      t.name 姓名,  -- 省略AS  
      t.pinyin 拼音  
    FROM t_student t;  -- 表别名  
  4. 列运算

    sql 复制代码
    SELECT id, stu_id, name, height + 10 AS 修正身高, weight - 10 AS 修正体重  
    FROM t_student;  
  5. 分页查询(LIMIT)

    sql 复制代码
    -- 前10条  
    SELECT * FROM t_student LIMIT 10;  
    
    -- 从第10行开始取10条(行号从0开始)  
    SELECT * FROM t_student LIMIT 10, 10;  
    -- 等效写法  
    SELECT * FROM t_student LIMIT 10 OFFSET 10;  
  6. 条件筛选(WHERE)

    • 比较运算符 :=, <>, !=, >, >=, <, <=

      sql 复制代码
      SELECT * FROM t_student WHERE id > 5;  
      SELECT * FROM t_student WHERE birthday > '2000-01-01';  -- MySQL支持日期比较  
    • 逻辑运算符 :AND, OR, NOT

      sql 复制代码
      SELECT * FROM t_student WHERE height >= 175 AND sex = '女';  
    • 空值判断 :

      sql 复制代码
      SELECT * FROM t_student WHERE class_id IS NULL;  -- 空值  
      SELECT * FROM t_student WHERE class_id IS NOT NULL;  -- 非空  
    • 模糊查询(LIKE) :

      • %:匹配0个或多个字符
      • _:匹配1个字符
      sql 复制代码
      SELECT * FROM t_student WHERE name LIKE '张%';  -- 姓张  
      SELECT * FROM t_student WHERE name LIKE '%晓%';  -- 包含"晓"  
      SELECT * FROM t_student WHERE name LIKE '张__';  -- 姓张且3个字  
    • 正则查询 :

      sql 复制代码
      SELECT * FROM t_student WHERE name REGEXP '\\w{4,}';  -- 匹配4+位字符  
      SELECT * FROM t_student WHERE wechat NOT RLIKE '\\d{11}';  -- 非11位数字  
  7. 结果去重(DISTINCT)

    sql 复制代码
    SELECT DISTINCT sex FROM t_student;  -- 慎用(影响性能)  
  8. 结果排序(ORDER BY)

    • ASC:升序(默认),DESC:降序
    sql 复制代码
    SELECT * FROM t_student ORDER BY height;  -- 身高升序  
    SELECT * FROM t_student ORDER BY weight DESC;  -- 体重降序  
    -- 多列排序:先按身高升序,再按体重降序  
    SELECT * FROM t_student ORDER BY height ASC, weight DESC;  

二、分组查询(GROUP BY)
  1. 基本分组

    sql 复制代码
    SELECT sex, AVG(height) FROM t_student GROUP BY sex;  
    SELECT class_id, MAX(height), MIN(weight), COUNT(*) FROM t_student GROUP BY class_id;  
  2. 多列分组

    sql 复制代码
    SELECT class_id, sex, MAX(height), MAX(weight)  
    FROM t_student  
    GROUP BY class_id, sex;  
  3. 聚合函数注意事项

    • COUNT(*):统计所有行(包括NULL)
    • COUNT(列名):统计非NULL值
    • COUNT(DISTINCT 列名):去重统计
    sql 复制代码
    SELECT COUNT(*) FROM t_student;  -- 总行数  
    SELECT COUNT(class_id) FROM t_student;  -- 非NULL的class_id数量  
    SELECT COUNT(DISTINCT class_id) FROM t_student;  -- 去重统计  
  4. 分组后筛选(HAVING)

    • WHERE:分组前筛选
    • HAVING:分组后筛选(可引用聚合结果)
    sql 复制代码
    SELECT class_id, sex, MAX(height) AS max_height  
    FROM t_student  
    WHERE height > 180  -- 分组前条件  
    GROUP BY class_id, sex  
    HAVING max_height > 183;  -- 分组后条件  

三、子查询
  1. 标量子查询(SELECT子句)

    sql 复制代码
    SELECT id, name, (SELECT class_name FROM t_class WHERE id = t_student.class_id)  
    FROM t_student;  
  2. 表子查询(FROM子句)

    sql 复制代码
    SELECT *  
    FROM (SELECT * FROM t_student WHERE sex = '女') AS women_students;  -- 必须起别名  
  3. WHERE子查询

    • 单值比较 :

      sql 复制代码
      SELECT * FROM t_student  
      WHERE class_id = (SELECT id FROM t_class WHERE class_name = '080503-JAVA');  
    • 多值比较 :

      sql 复制代码
      -- 大于所有子查询结果(> ALL)  
      SELECT * FROM t_student  
      WHERE class_id > ALL(SELECT id FROM t_class WHERE class_name LIKE '%JAVA%');  
      
      -- 大于任意子查询结果(> ANY)  
      SELECT * FROM t_student  
      WHERE class_id > ANY(SELECT id FROM t_class WHERE class_name LIKE '%JAVA%');  
    • 成员判断(IN/NOT IN) :

      sql 复制代码
      SELECT * FROM t_student WHERE id IN (1, 2, 3);  
      SELECT * FROM t_student  
      WHERE class_id IN (SELECT id FROM t_class WHERE class_name LIKE '%JAVA%');  
    • 存在性判断(EXISTS) :

      sql 复制代码
      SELECT * FROM t_student  
      WHERE EXISTS (SELECT 1 FROM t_class WHERE class_name LIKE '%JAVA%');  
  4. 相关子查询

    sql 复制代码
    -- 查询身高高于班级平均身高的学生  
    SELECT *  
    FROM t_student t1  
    WHERE height > (  
      SELECT AVG(height)  
      FROM t_student t2  
      WHERE t2.class_id = t1.class_id  -- 引用外层表字段  
    );  

四、表连接
  1. 内连接(INNER JOIN)

    • 仅返回匹配的行
    sql 复制代码
    SELECT s.id, s.name, c.class_name  
    FROM t_student s  
    INNER JOIN t_class c ON s.class_id = c.id;  
  2. 左外连接(LEFT JOIN)

    • 左表全部显示 + 右表匹配(不匹配则为NULL)
    sql 复制代码
    SELECT s.id, s.name, c.class_name  
    FROM t_student s  
    LEFT JOIN t_class c ON s.class_id = c.id;  
  3. 右外连接(RIGHT JOIN)

    • 右表全部显示 + 左表匹配(不匹配则为NULL)
    sql 复制代码
    SELECT s.id, s.name, c.class_name  
    FROM t_student s  
    RIGHT JOIN t_class c ON s.class_id = c.id;  
  4. 全外连接(MySQL通过UNION实现)

    sql 复制代码
    (SELECT * FROM t_student s LEFT JOIN t_class c ON s.class_id = c.id)  
    UNION  
    (SELECT * FROM t_student s RIGHT JOIN t_class c ON s.class_id = c.id);  

五、联合查询(UNION)
  • 注意事项 :
    1. 各查询的列数必须一致
    2. 数据类型需兼容
    3. UNION 去重,UNION ALL 不去重
sql 复制代码
-- 合并男学生记录(去重)  
SELECT id, name FROM t_student WHERE sex = '男'  
UNION  
SELECT id, name FROM t_student WHERE sex = '男';  

-- 合并男学生记录(不去重)  
SELECT id, name FROM t_student WHERE sex = '男'  
UNION ALL  
SELECT id, name FROM t_student WHERE sex = '男';  
相关推荐
AllData公司负责人4 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
xixingzhe25 小时前
数据库备份的分类与特点
数据库
Rabitebla8 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
时间的拾荒人8 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
隔窗听雨眠9 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__10 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
笃行35011 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
坤坤子吖13 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
星恒随风14 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
无奈笑天下15 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库