今天学习了SQL Server 的连接查询,来记录一下。
什么是连接查询呢?
就是同时查询多张表,有内连接查询,外连接查询,交叉查询。而外连接查询又分左外连接查询、右外连接查询和全外连接查询,但是连接查询也可以查询一张表叫自连接查询。
INNER JOIN:表示内连接,INNER可以省略只写JOIN
ON:给出连接的条件
(JOIN ... ON ...)等同于 (,... where...)
先准备2张用来查询的表 Table01,Table02:
Table01
Table02
那么,首先就来说一下多张表的内连接查询
select Table01.SID ,SName,CID,CContact,CPhone
from Table01 JOIN Table02
ON Table01.SID=Table02.SID
在多表连接查询时若连接的表中有相同的字段,则在引用时必须在其前面加上表的前缀(查询Table01中的SID就要写Table01.SID),若查询字段在多个表中是唯一的,则可以不加表名前缀。
查询结果:
接着说一下查询一张表的自连接查询吧,其实可以看成是一种另类的内连接。
自连接查询必须将表指定两个别名,其实就是复制一张自己的表,使其变成两张表了。
select S1.SID,S1.SName,S1.SDID,s1.SPostID
from Table01 AS S1 JOIN Table01 AS S2
ON S1.SDID!=S2.SDID and S1.SPostID=S2.SPostID
Table 定义别名 S1和S2
查询结果:
下面说一下外链接查询,有左连接查询(LEFT OUTER JOIN),右连接查询(RIGHT OUTER JOIN)和全连接查询(FULL OUTER JOIN)。 OUTER 可以省略
先准备2张表,Table01,Table02:
Table01 Table02
1、左外连接查询也称左连接查询(LEFT OUTER JOIN)
概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则右表中所对应的的行为空值。
select * from Table01 left join Table02
on Table01.classId = Table02.classId
查询结果:
2、右外连接查询也称右连接查询(RIGHT OUTER JOIN)
概念:与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则左表中所对应的的行为空值。
select * from Table01 right join Table02
on Table01.classId = Table02.classId
查询结果:
3、全外连接查询也称全连接查询(FULL OUTER JOIN)
概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表行为空值(先根据左表查右表,查不到的话,右表的行为空值,等查好后右表剩下的全展示,左表行全为空值)
select * from Table01 full join Table02
on Table01.classId = Table02.classId
查询结果:
最后一种就是交叉查询 (CROSS JOIN)也叫笛卡尔积,查询表使用外链接的两张表Table01,Table02
概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,就是左表的每一行分别于右表的每一行组合,返回结果的行数等于两个表行数的乘积(例如:Table01t和Table02,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数。
1、不带 WHERE:
select * from Table01 cross join Table02也可以写成select * from Table01,Table02
查询结果 :
2、带WHERE 子句,先将2个表乘积组合,再根据条件查询
注:交叉带条件查询必须使用 WHERE,不能使用ON
select * from Table01 CROSS join Table02
WHERE Table01.classId = Table02.classId
查询结果:
总算写完了,连接查询就这些了,看了之后是不是觉得很简单呢?