sql的join分為三種,內連線、外連線、交叉連線。
以下先建2張表,插入一些資料,後續理解起來更方便一些。
create table emp(empno int, name char(20),depart int);
create table depart(dpno int,dpname char(20));
insert into emp values (1,'bell',1);
insert into emp values (2,'smith',2);
insert into emp values (3,'jet',3);
insert into depart values (1,'design');
insert into depart values (2,'database');
insert into depart values (4,'warehouse');
1. 內連線 inner join(等同行與join) 僅列出兩表能按照join條件連線起來的資訊,其他的資訊不顯示
select a.*,b.* from emp a inner join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
和如下語句得到的資訊是一樣的:
select a.*,b.* from emp a,depart b where a.depart=b.dpno;
2. 外連線 outer join
(1)左外連線 left outer join = left join 顯示左表的所有記錄,右表符合join條件的資訊顯示,不符合的置空。
select a.*,b.* from emp a left join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
3 jet 3
(2)右外連線 right outer join = right join 和left join相反,顯示右表的所有記錄,左表符合join條件的資訊顯示,不符合的置空。
select a.*,b.* from emp a right join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
4 warehouse
(3)全外連線 full outer join = full join ,左右兩表的資訊都全部顯示,符合join條件的資訊顯示,不符合的置空。
select a.*,b.* from emp a full join depart b on a.depart=b.dpno;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 2 database
4 warehouse
3 jet 3
3.交叉連線,也即生成兩表的笛卡爾積。得到的記錄相當於兩表記錄的乘積。
select a.*,b.* from emp a cross join depart b ;
empno name depart dpno dpname
1 bell 1 1 design
2 smith 2 1 design
3 jet 3 1 design
1 bell 1 2 database
2 smith 2 2 database
3 jet 3 2 database
1 bell 1 4 warehouse
2 smith 2 4 warehouse
3 jet 3 4 warehouse
相當於如下語句:
select a.*,b.* from emp a,depart b;
需要注意的是交叉連線後只能跟where,不可以跟on。
如下語句是錯的:
select a.*,b.* from emp a cross join depart b on a.depart=b.dpno;
要修改為這樣的才正確:
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno;
一般來講,在大表關聯的時候,建議使用inner join或者left join,不建議使用cross join或者where
比如:select a.*,b.* from emp a,depart b where a.depart=b.dpno ; a ---不推薦
select a.*,b.* from emp a cross join depart b where a.depart=b.dpno ; b ---不推薦
select a.*,b.* from emp a inner join depart b on a.depart = b.dpno; c ----推薦
這是因為a,b中,sql需要先對兩表生成笛卡爾積,然後才根據where後的條件進行判斷,而使用c則不需要。所以c較有效率。
sql中join語句區別
表如下 aid anum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表b記錄如下 bid bname 1 2006032401 2 2006032402 3 2006032403 4 2006032404 8 200603...
SQL 語句之Join複習
left join 左聯接 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 right join 右聯接 返回包括右表中的所有記錄和左表中聯結字段相等的記錄 inner join 等值連線 只返回兩個表中聯結字段相等的行 a表 id姓名1張三 2李四3王五 b表 id成績190 270480 s...
HIVE中的join語句
hive支援通常的sql join語句,但是只支援等值連線。1.1 inner join 只有進行連線的兩個表都存在與連線標準相匹配的資料才會儲存下來 select a.ymd a.price b.price from stocks a join stocks b on a.ymd b.ymd wh...