作者:小啊小二饼(iconfont)

🌑

Spaghetti.ink

Appreciation, Modesty, Persistence


SQL01-DQL02

分组查询:

SELECT 分组函数, 列(要求出现在 GROUP BY 之后)
FROM[WHERE CONDITION] # 分组前的筛选-数据来源于原始表
GROUP BY 分组的列表1, 分组的列表2 ... # (多字段分组无先后顺序)
[HAVING CONDITION] # 分组后的筛选-数据来源于分组后的临时表
ORDER BY 子句
  1. 一般分组条件作为条件,一定是用HAVING。
  2. 优先使用分组前筛选。

连接查询:

笛卡尔积:X * Y

  • sql92 语法

    SELECT COLUMNS
    FROM TABLE 别名, TABLE 别名
    WHERE 筛选条件 AND 连接条件 AND 连接条件
  • sql99 语法
    可读性比sql92要高一些

    SELECT COLUMNS
    FROM TABLE 别名 # 注意满足连接条件的先后顺序
    [连接类型] JOIN TABLE 别名 ON 连接条件
    [连接类型] JOIN TABLE 别名 ON 连接条件
    WHERE 筛选条件

内连接

  • 查询交集
  • [INNER JOIN | JOIN 默认为内连接]
    等值连接: WHERE a.name = b.name
      1. 表于表的交集部分
      2. 表的顺序没有要求
      3. 表可以使用别名
      4. n个表的连接需要n-1个条件
    
    非等值连接:无非是 = 变成了表达式
    自连接:自己(表)连接自己(表)

外连接:

  1. 查询结果为主表中的所有记录,如果从表匹配则显示,不匹配则显示 NULL
  2. 外连接结果 = 内连接结果 + 主表中为匹配的记录
  • [OUTER JOIN]
    左外连接:[LEFT JOIN] 左为主表
    右外连接:[RIGHT JOIN] 右为主表
    全外连接:MYSQL 不支持 = [LEFT JOIN] UNION [RIGHT JOIN]
    交叉连接:[CROSS JOIN] 笛卡尔积
    SELECT * FROM A CROSS JOIN B;

子查询

出现在其他语句中的 SELECT 语句(嵌套查询)

  • 外部的查询叫 主查询 或 外查询
  • 子查询查不到时,返回NULL

子查询分类:

  • 位置:
    • SELECT
      • 标量子查询 (一行一列)
        SELECT (
            SELECT department_name
            FROM departments
            WHERE department_id = e.department_id
        ) AS 部门名
        FROM employees e
        WHERE e.employee_id = 102;
    • FROM
      • 表子查询 (多行多列)[相当于生产了临时表,必须起别名 !!!]
    • WHERE or HAVING **
      • 标量子查询 (一行一列)
      • 列子查询 (一列多行)
      • 行字查询 (一行多列)
    • EXISTS
      • 表子查询
      • 结果: 1 或 0
  • 结果集:

    • 标量子查询 (一行一列)
    • 列子查询 (一列多行)
    • 行字查询 (一行多列)
      # 查询员工编号最小且工资最高的员工信息
      SELECT *
      FROM employees
      WHERE (employee_id, salary) = ( # 同时操作两个子查询
          SELECT MIN(employee_id), MAX(salary)
          FROM employees
      )
      
      # 等价于
      SELECT *
      FROM employees
      WHERE employee_id = (
          SELECT MIN(employee_id)
          FROM employees
      ) AND salary = (
          SELECT MAX(salary)
          FROM employees
      )
    • 表子查询 (多行多列)

      子查询的特点:

      1. 在括号()内
      2. 标量子查询一般配合 单行操作符 使用
        >, <, =, >=, <=
      3. 列子查询一般配合 多行操作符 使用
        IN, NOT IN, ANY/SOME (any 与 some 等价,所以还是用some比较符合正常逻辑), ALL <>ALL, = ANY, > or < ANY or ALL (不存在 = ALL 和 != ANY) IN 可以兼容 =
      4. 子查询总是优先于主查询,因为主查询需要使用到子查询的结果
      5. 效率比较低,一般能用连接查询 绝不用 子查询

分页查询:

SELECT 查询列表
FROMLIMIT [OFFSET,] SIZE;
	
	LIMIT 后不能跟 运算符,只能跟常量!!!

- OFFSET: 起始索引
- SIZE: 大小

如果使用传统的第几页的形式:
假设一页有Size条记录,那么

SELECT 查询列表
FROMLIMIT [(Page-1)*Size,] SIZE;

联合查询:

查询1
    UNION [ALL]
查询2
    ...

特点:

  1. 表不同也可以联合
  2. 查询的列数必须一致
  3. 建议查询每一列的 数据类型 一致
  4. 会去掉输出重复的记录 使用 UNION ALL 避免去重

查询顺序:

SELECT 查询列表										#6.
FROM#1.
[连接类型 JOIN TABLE_2 ON CONDITION]	                #2.
[WHERE CONDITION]									#3.
[GROUP BY FIELDS]								    #4.
[HAVING CONDITION]									#5.
[ORDER BY FIELDS]									#7.
[LIMIT OFFSET, SIZE]								#8.

本文由 Frank采用 署名 4.0 国际 (CC BY 4.0)许可

— 2021年9月19日

本文总阅读量

SQL
Previous posts SQL01-DQL01

本站总访问量