多表连接查询
什么是连接
连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据,语法:
image.png
连接分类
1.按连接条件:等值连接和非等值连接
2.按其他连接方法:外部连接和内部连接
多表连接的写法:(主要介绍两种)
1.基本写法:绝大多数符合sql标准,其他关系型数据库也是用
2.ANNSI 99写法:ANSI标准提供的写法,所有关系型数据库都必须支持
笛卡尔积现象
第一个表中所有行,与被连接表中所有行的数据都发生了链接 列:一表14条 二表4条数据 连接后有14*4=56条数据
发生条件:
1、连接条件被省略(未写表连接)
2、连接条件无效
为了避免笛卡尔积的产生,通常需要在where子句中包含一个有效的连接条件
等值连接
即两个表中有相同的列名以及数据(外键关联)
在多表连接时可以用表别名来简化查询代码:
多于两个表的连接
用and来连接表的关联关系
非等值连接:between and
image.png多表连接的写法思路
1.分析查询列来源的表,构成from子句
2.分析表的关联关系,如两个表之间无直接关联关系,而是通过另一个中间表关联,则也要在from子句中补充中间关联表
3.在where子句中补充表之间的关联关系,N个表一般要N-1个关联关系
4.分析是否需要其他限制条件补充到where子句的表关联关系之后,作为限制条件
5.根据要求补充select子句
6.分析是否要求排序,如要且涉及其他表就要再次执行2.3.4步
自连接
自身连接,即在一个表内通过某种条件和本身连接的一种方式(如同多表连接一样),如下图 设置表别名来区分 也设置了列别名
image.png
ANNSI SQL:标准的连接语法
交叉连接
使用cross join子句:同笛卡尔积现象
image.png
自然连接
1.是对两个表之间相同名字和数据类型的列进行的等值连接
2.如相同列的数据类型不同,回报错
3.使用natural join子句来完成
image.png
USING子句
使用using子句可以指定用某个或某几个相同名字和数据类型的列作为连接条件
image.png
ON子句
用于指定任意连接条件,或指定要连接的列
可以将连接条件和其他检索条件分开,其他检索条件写在where子句中
可以提高代码的可读性
image.png
外连接
image.pngimage.png
image.png
总结
连接方式
基本写法:等值连接 非等值连接 自连接
SQL-99写法:
交叉连接 cross join
自然连接 natural join 用on(using)子句指定限制条件
左外连接 left outer join...on...
右外连接 right outer join...on...