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);