我到今天才知道SQL92和SQL99

2023年2月26日11:26:59

不多说,是在下孤陋寡闻了,今天才知道SQL分为92和99两个版本,也解除了我一直以来的疑惑,为啥我学习等值连接的时候会有两个版本。
ps: 92版本及1992年的版本,99类似

92版本

这里就介绍一下多表连接的区别哈

笛卡尔积

首先是知道啥是笛卡尔积哈,如果看图不明白,直接任意门哈→SQL 笛卡尔积现象

我到今天才知道SQL92和SQL99
  • 求所有员工及其部门的信息
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.后面的等值条件消除了笛卡尔积现象,得到我想要的结果

我到今天才知道SQL92和SQL99

非等值连接

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

这个案例实在垃圾,只是为了展示一下自连接

结果图:
我到今天才知道SQL92和SQL99
将错就错,有哪位大佬能消除重复数据吗?求请教(评论区)


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没有的

  • 外连接查询结果=内连接结果+主表中主表中有而从表的记录

左外连接

这里只展示左外连接哈,右外连接类似
给部门表添加一个字段(市场),如图
我到今天才知道SQL92和SQL99

可以看到左表(主表)的字段都完全显示了
sql语句:

SELECT 
	d.name,e.name 
FROM 
	department d
LEFT JOIN
	employee e
ON 
	e.department_id=d.id;

  • 作者:cleverhope
  • 原文链接:https://blog.csdn.net/AM_XinYang/article/details/108245274
    更新时间:2023年2月26日11:26:59 ,共 1512 字。