轉自:http://www.2cto.com/database/201208/149044.html
SQL裏各種聯合查詢總結
- create database mytest
- go www.2cto.com
- use mytest
- go
- create table t_dept
- (
- d_id int primary key identity(1,1),
- d_name varchar(20),
- d_remark varchar(20)
- )
- go
- create table t_emp
- (
- e_id int primary key identity(1,1),
- d_id int references t_dept(d_id),
- e_name varchar(20),
- e_sex varchar(4)
- )
- go www.2cto.com
- insert into t_dept values('一部','1111');
- insert into t_dept values('二部','2222');
- insert into t_dept values('三部','3333');
- insert into t_dept values('四部','4444');
- go
- insert into t_emp values(1,'一部A君','男');
- insert into t_emp values(1,'一部B君','男');
- insert into t_emp values(2,'二部C君','女');
- insert into t_emp values(null,'三部D君','男');
- go
- select * from t_dept;
- select * from t_emp;
- go
- --注:聯接查詢,哪個表在前,就以哪個表爲主表
- --內聯接(兩表標識號相同的所有行)
- select * from t_dept a inner join t_emp b on a.d_id=b.d_id ;
- 1 一部 1111 1 1 一部A君 男
- 1 一部 1111 2 1 一部B君 男
- 2 二部 2222 3 2 二部C君 女
- --外連接(外聯接可以是左向外聯接、右向外聯接或完整外部聯接)
- --(1)
- select * from t_dept a left outer join t_emp b on a.d_id=b.d_id ;--"左外連接 等同於 左連接"
- select * from t_dept a left join t_emp b on a.d_id=b.d_id ;--左連接(所有的部門顯示,員工表裏部門id爲null的顯示不出來)
- 1 一部 1111 1 1 一部A君 男
- 1 一部 1111 2 1 一部B君 男
- 2 二部 2222 3 2 二部C君 女
- 3 三部 3333 NULL NULL NULL NULL
- 4 四部 4444 NULL NULL NULL NULL
- www.2cto.com
- --(2)
- select * from t_dept a right outer join t_emp b on a.d_id=b.d_id ;--"右外連接 等同於 右連接"
- select * from t_dept a right join t_emp b on a.d_id=b.d_id ;--右連接,員工表所有員工顯示,"三部"和"四部"沒有員工的部門則該部門不顯示
- 1 一部 1111 1 1 一部A君 男
- 1 一部 1111 2 1 一部B君 男
- 2 二部 2222 3 2 二部C君 女
- NULL NULL NULL 4 NULL 三部D君 男
- --(3)
- --完整外部聯接,返回左表和右表中的所有行
- --當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
- select * from t_dept a full outer join t_emp b on a.d_id=b.d_id ;
- select * from t_dept a full join t_emp b on a.d_id=b.d_id ;
- 1 一部 1111 1 1 一部A君 男
- 1 一部 1111 2 1 一部B君 男
- 2 二部 2222 3 2 二部C君 女
- 3 三部 3333 NULL NULL NULL NULL
- 4 四部 4444 NULL NULL NULL NULL
- NULL NULL NULL 4 NULL 三部D君 男
- --笛卡爾積
- select * from t_emp,t_dept
- select * from t_dept,t_emp
- --返回16條數據,左表有4條,右表有4條,返回行數爲4*4=16(條),產生笛卡爾積
- www.2cto.com
- 1 一部 1111 1 1 一部A君 男
- 2 二部 2222 1 1 一部A君 男
- 3 三部 3333 1 1 一部A君 男
- 4 四部 4444 1 1 一部A君 男
- 1 一部 1111 2 1 一部B君 男
- 2 二部 2222 2 1 一部B君 男
- 3 三部 3333 2 1 一部B君 男
- 4 四部 4444 2 1 一部B君 男
- 1 一部 1111 3 2 二部C君 女
- 2 二部 2222 3 2 二部C君 女
- 3 三部 3333 3 2 二部C君 女
- 4 四部 4444 3 2 二部C君 女
- 1 一部 1111 4 NULL 三部D君 男
- 2 二部 2222 4 NULL 三部D君 男
- 3 三部 3333 4 NULL 三部D君 男
- 4 四部 4444 4 NULL 三部D君 男