文章目录
- 概述
- 等值连接
- 两表连接(❤)
- 三个表连接
- 不等值连接
- 外连接
- SQL99
- using连接
- 自然连接
- 多表连接
- on子句(❤)
- 自连接
- 练习
概述
- SQL中的表对应Java中的类,从而多个表对应多个类
- 内连接:内点积,不匹配的行滤除
- 外连接:外点积
等值连接
- 不添加过滤条件,会产生笛卡尔积错误
- 例如:下图若无where条件,则每个员工信息和部门表匹配,左边100条员工记录,右边按理只对应相同部门号的部门名,但没有where条件,右边每个部门名都来匹配
两表连接(❤)
- 上图未简写
- 下图为简写形式
- 若该列为一表独有,不需要指明,若该列是两表共有,即作为桥梁列,则要显式指明哪个表的这个列
- 内连接时,若左表在右表中找不到对应的内容,则该项纪录被剔除,如员工属于某部门(左表),部门有部门名(右表),当某员工的部门为null时,则右表找不到,该项记录则被剔除
三个表连接
不等值连接
- 使用between and语句
外连接
- 同理可得右外连接
- 这种方式不能实现全连接
- 左表中多了一个数据记录,右表中找不到部门ID与之对应,则少的表(右表)添加“+”,形成左外连接
- 左外连接:除了两表中都满足的条件输出(内连接)外,额外返回左表中不满足条件的记录
- 左外连接右边补加号,使得行数相同
SQL99
using连接
- using局限性在于列名要一样,数据类型也要一样
- 如下例所示,两个表中的对应列名都叫department_id且数据类型相同才行
自然连接
- 所有列名一样来连接,即有多个连接条件(两表中的共有列名都相同作为条件来连接)
多表连接
- 多个join和on配套使用,类比添加where过滤条件
- 好处在于join可修改,如下文
on子句(❤)
- 左外连接:left join
- 右外连接:right join
- 满外连接:full join
自连接
- 看成特殊的多表连接方式,理解为复制了多份自己的表
- 用法参照多表等值连接(有无前缀由列名是否共有决定)
练习
- 注意第26点
- -
- 强行左外连接
- 三个表的连接
- 隐式三表连接(虽然查询的列名两个表就有,但过滤条件在第三个表中)