Back to VNotes

Database / SQL

MySQL 与 SQL 基础(六)

记录 MySQL 启动方式、SQL 分类、DDL、DML、DQL、DCL 和表结构操作。

多表查询概述

合并查询(笛卡尔积,会展示表1与表2数据的所有组合结果)

SELECT * FROM 表1, 表2;

消除无效笛卡尔积

SELECT * FROM 表1, 表2 WHERE 表1.字段 = 表2.字段;

内连接

查询两张表交集的部分

隐式内连接

SELECT 字段列表 FROM 表1, 表2 WHERE 条件...;

显示内连接

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;

显示的性能高于隐式

可以有多个join来连接多张表

外连接

左外连接:

查询左表所有数据,以及两张表交集部分数据

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;

相当于查询表1的所有数据,包括表1和表2交集部分数据

右外连接:

查询右表所有数据,以及两张表交集部分数据

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;

左连接可以查询到条件中相应字段在右表中没有数据的行,右连接可以查询到相应字段在左表中没有数据的行

自连接

当前表与自身连接查询,自连接必须使用表别名

语法

SELECT 字段列表 表A 别名A JOIN 表A 别名B ON 条件;

自连接查询可以是内连接也可以是外连接

联合查询

把多次查询的结果合并,形成一个新的查询集

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;

注意事项

  • UNION ALL会有重复结果,UNION不会
  • 联合查询比使用OR效率高,不会使索引失效
  • 联合查询的多张表的列数必须保持一致,字段类型也需要保持一致

子查询

概念

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果的不同,可分为:

  • 标量子查询(返回的结果为单个值)
  • 列子查询(返回的结果为一列)
  • 行子查询(返回的结果为一行)
  • 表子查询(返回的结果为多行多列)

根据子查询位置的不同,可分为:

  • WHERE之后
  • FROM之后
  • SELECT之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等)

常用操作符:= <> > >= < <=

例:

SELECT * FROM table1 WHERE column1 = (SELECT column2 FROM table2);

列子查询

子查询返回的结果是1列n行

常用操作符:

操作符描述
IN在指定的集合范围内,多选一
NOT IN不在指定的集合范围内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以使用ANY
ALL子查询返回列表的所有值都必须满足

例:

SELECT * FROM table1 WHERE column1 > ALL (SELECT column2 FROM table2 WHERE 条件1 OR 条件2);