概述
1.介绍
多表查询就是指从多张表中查询数据。
原来查询单表数据,执行的SQL形式为:select * from 表名;
那么我们要执行多表查询,就只需要使用逗号分隔多张表即可,如: select * from 表1, 表2 ;
(但是这样查询结果中包含了表1,表2的所有组合情况,这种现象称之为笛卡尔积)
而在多表查询中,我们是需要消除无效的笛卡尔积的,只保留两张表关联部分的数据。
在SQL语句中,如何来去除无效的笛卡尔积呢?
我们可以给多表查询加上连接查询的条件即可。
select * from 表1 , 表2 where 表1.外键 = 表2.主键;
2.分类
连接查询
(1)内连接
(2)外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
内连接
语法
(1)隐式内连接
select 字段列表 from 表1 , 表2 where 条件 ... ;
(2)显式内连接
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;
外连接
语法
(1)左外连接
select 字段列表 from 表1 left [ outer ] join 表2 on 条件 ... ;
(2)右外连接
select 字段列表 from 表1 right [ outer ] join 表2 on 条件 ... ;
注意事项
左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。
子查询
1.介绍
(1)概念:
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个
(2)分类
根据子查询结果不同,分为:
A. 标量子查询(子查询结果为单个值)
B. 列子查询(子查询结果为一列)
C. 行子查询(子查询结果为一行)
D. 表子查询(子查询结果为多行多列)
根据子查询位置,分为:
A. WHERE之后
B. FROM之后
C. SELECT之后
2.标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=
3.列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:IN 、NOT IN
操作符 | 描述 |
IN | 在指定的集合范围之内,多选一 |
NOT IN | 不在指定的集合范围之内 |
4.行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= 、<> 、IN 、NOT IN
5.表子查询
子查询返回的结果是多行多列,常作为临时表,这种子查询称为表子查询。
常用的操作符:IN