不多说,是在下孤陋寡闻了,今天才知道SQL分为92和99两个版本,也解除了我一直以来的疑惑,为啥我学习等值连接的时候会有两个版本。
ps: 92版本及1992年的版本,99类似
92版本
这里就介绍一下多表连接的区别哈
笛卡尔积
首先是知道啥是笛卡尔积哈,如果看图不明白,直接任意门哈→SQL 笛卡尔积现象
- 求所有员工及其部门的信息
SELECt d.name,e.name
FROM department d,employee e;
(结果如上图)这样的情况不是我们想要的,所以需要连接操作来消除笛卡尔积现象
等值连接
在92版本是这样写的,也是我一直用的
SELECt
d.name 部门,e.name 员工
FROM
department d,employee e
WHERe
e.department_id=d.id;
1.
d.name 部门
是别名的写法,后面类似,省略了AS
2.后面的等值条件消除了笛卡尔积现象,得到我想要的结果
非等值连接
在where后的条件为非等值条件 , 例如:> , < , >= , <= 等
- 查询部门id>1的所有员工(这里好像有点问题,感觉这个案例不好测试非等值连接)
SELECt
d.id 部门id, d.name 部门,e.name 员工
FROM
department d,employee e
WHERe
e.department_id=d.id
AND
d.id>1;
自连接
把一张表当成两张表来看代就可以进行自己连接自己的操作了
- 查询部门id相差1的员工的信息(这些啥鬼需求,把爷给整乐了)
SELECt
a.name,a.department_id,b.name,b.department_id
FROM
employee a,employee b
WHERe
ABS(a.department_id-b.department_id)=1;
这个案例实在垃圾,只是为了展示一下自连接
结果图:
将错就错,有哪位大佬能消除重复数据吗?求请教(评论区)
99版本
原来我习惯用的都是92版本的,现在来看看99版本的
等值连接
这个也就是我们常说的内连接,我基本没怎么用到它(指这个版本哈)
- 求所有员工及其部门的信息
SELECt
d.name,e.name
FROM
department d
INNER JOIN
employee e
ON
e.department_id=d.id;
非等值连接
- 查询部门id>1的所有员工
SELECt
d.id 部门id, d.name 部门,e.name 员工
FROM
department d
INNER JOIN
employee e
ON
e.department_id=d.id
WHERe
d.id>1;
自连接
- 查询部门id相差1的员工的信息
SELECt
a.name,a.department_id,b.name,b.department_id
FROM
employee a
INNER JOIN
employee b
ON
ABS(a.department_id-b.department_id)=1;
总结
对比一下,可以发现99和92版本的区别,我平时习惯用的就是92版本的语句,然后99版本多了比较重要一个功能就是外连接
外连接
-
外连接的查询结果为主表中的所有记录,如果从表中有和他匹配的,则显示匹配的值,如果从表中没有和他匹配的,则显示null
-
全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
-
外连接查询结果=内连接结果+主表中主表中有而从表的记录
左外连接
这里只展示左外连接哈,右外连接类似
给部门表添加一个字段(市场),如图
可以看到左表(主表)的字段都完全显示了
sql语句:
SELECt
d.name,e.name
FROM
department d
LEFT JOIN
employee e
ON
e.department_id=d.id;