联接的三种基本类型;
Student表
Sno | Sname | Ssex | Sbirthday | Class |
101 | 陆君 | 男 | 1998-01-01 | 95033 |
102 | 王丽 | 女 | 1998-01-01 | 95031 |
Cno | Cname | Tno |
3-105 | 高等数学 | 804 |
6-106 | 计算机导论 | 805 |
Sno | Cno | Degree |
101 | 3-105 | 88 |
102 | 6-106 | 87 |
Teacher
Tno | Tname | Tsex | Prof | Tbirthday | Depart |
804 | 王萍 | 女 | 助教 | 1985-01-01 | 计算机导论 |
805 | 张旭 | 男 | 讲师 | 1979-01-01 | 高等数学 |
1: 交叉联接;只需实现一个逻辑查询步骤,对输入的两个表进行操作,生成二者的笛卡儿积。也就是将一个输入表的每行与另一个表的所有行进行匹配。如果一个表有m行,而另一个表有n行,将得到m*n行的结果集。( 避免对大型表使用交叉连接)
SELECT S.sname, SC.degree
FROM student AS S CROSS JOIN score AS SC;
(SQL-89的语法中可以简单的只加个逗号)
2:内联接
INNER JOIN 內联接是默认的联接方式,所以INNER是可选的。
SELECT S.sname, SC.degree
FROM student AS S
JOIN score AS SC
ON S.sno = SC.sno;
多表联接
SELECT S.sname, C.cname, SC.degree
FROM student AS S
JOIN score AS SC
ON S.sno = SC.sno
JOIN Course AS C
ON SC.cno = C.cno;
3:外联接;
LEFT JOIN
RIGTH JOIN
FULL JOIN
在表名之间指定JOIN关键字,在ON子句中制定联接条件。(外联接会应用内联接所应用的两个逻辑处理步骤(笛卡儿积和ON过滤))然后添加外部行。
SELECT S.sname, S.class, SC.degree
FROM student AS S
LEFT JOIN score AS SC
ON S.sno = SC.sno
可以认为外联接结果中的数据 行包括两种:内部行和外部行。内部行是指按照ON字句条件能在另一边找到匹配的那些行;而外部行则是找不到匹配的那些行。
內联接只返回内部行,而外联接同时返回内部行和外部行。当需要表达一个非最终的条件时,就在ON子句中指定联接条件。当在生成外部行以后,要应用过滤器,而希望过滤条件是最终的,就应该在WHERE子句中指定条件。WHERE子句是在FROM子句之后被处理的。WHERE子句是最终的。
SELECT S.sname, S.class, SC.degree
FROM student AS S
LEFT JOIN score AS SC
ON S.sno = SC.sno
WHERE SC.degree IS NULL;
ps:当在FROM子句中联接多表时,要书写多个用来定义其中两个表的公共部分的on语句,on语句必须遵循from后面所列表的顺序,即FROM后面写的表相应的on语句要先写。