1. 程式人生 > >MySQL基礎語法之三:join語法

MySQL基礎語法之三:join語法

join語法:表與表關聯

join 用於多表中欄位之間的聯絡

JOIN 按照功能大致分為如下三類:

INNER JOIN(內連線,或等值連線):取得兩個表中存在連線匹配關係的記錄。

LEFT JOIN(左連線):取得左表(table1)完全記錄,即是右表(table2)並無對應匹配記錄。

RIGHT JOIN(右連線):與 LEFT JOIN 相反,取得右表(table2)完全記錄,即是左表(table1)並無匹配對應記錄。

注意:mysql不支援Full join,不過可以通過UNION 關鍵字來合併 LEFT JOIN 與 RIGHT JOIN來模擬FULL

練習:

先建立2個表 create table testa(aid int,aname varchar(100)); create table testb(bid int,bname varchar(100),age int);

insert into testa values(1,‘America’); insert into testa values(2,‘China’); insert into testa values(3,‘Japan’); insert into testa values(4,‘British’); insert into testa values(5,‘India’);

insert into testb values(1,‘Australia’,15); insert into testb values(2,‘Korea’,16); insert into testb values(3,‘Japan’,17); insert into testb values(4,‘India’,18);

insert into testb values(7,‘Europe’,19); insert into testb values(8,‘Russia’,20); insert into testb values(9,‘Germany’,21);

單欄位匹配連線

(1)左連線:以左表資料為主且最全,右表去匹配(on後面的欄位)左表,匹配不到就顯示null

left join,(或left outer join:在Mysql中兩者等價,推薦使用left join.)左連線從左表(A)產生一套完整的記錄,與匹配的記錄(右表(B)) .如果沒有匹配,右側將包含null。

select a.aid,a.aname, b.bid,b.bname from testa a left join testb b on a.aid=b.bid; 在這裡插入圖片描述

格式: select a表字段1,欄位2 b表字段1,欄位2 from a表 xxx(別名) left join b表 yyy(別名)on a表字段1(2)=b表字段1(2) 別名可以不要,下同

如果想只從左表(A)中產生一套記錄,但不包含右表(B)的記錄,可以通過設定where語句來執行,如: select a.aid,a.aname, b.bid,b.bname from testa a left join testb b on a.aid=b.bid where a.aid is null or b.bid is null; 在這裡插入圖片描述

(2)右連線:以右表資料為主且最全,左表去匹配(on後面的欄位)右表,匹配不到就null

與左連線相似: select a.aid,a.aname, b.bid,b.bname from testa a right join testb b on a.aid=b.bid; 在這裡插入圖片描述

格式: select a表字段1,欄位2 b表字段1,欄位2 from a表 xxx(別名) right join b表 yyy(別名)on a表字段1(2)=b表字段1(2)

right同樣也可以使用where語句篩選目標條件: select a.aid,a.aname, b.bid,b.bname from testa a right join testb b on a.aid=b.bid where a.aid is null or b.bid is null; 在這裡插入圖片描述

(3)內連線:兩張表匹配的資料行才顯示

inner join產生同時符合A和B的一組資料。

select a.aid,a.aname, b.bid,b.bname from testa a inner join testb b on a.aid=b.bid; 在這裡插入圖片描述

格式: select a表字段1,欄位2 b表字段1,欄位2 from a表 xxx(別名) inner join b表 yyy(別名)on a表字段1(2)=b表字段1(2)

多欄位匹配連線(and)

根據id和name匹配 (1)左連線

select a.aid,a.aname, b.bid,b.bname from testa a left join testb b on a.aid=b.bid and a.aname=b.bname; 在這裡插入圖片描述

格式: select a表字段1,欄位2 b表字段1,欄位2 from a表 xxx(別名) left join b表 yyy(別名) on a表字段1=b表字段1,a表字段2=b表字段2; (2)右連線

select a.aid,a.aname, b.bid,b.bname from testa a right join testb b on a.aid=b.bid and a.aname=b.bname; 在這裡插入圖片描述

格式: select a表字段1,欄位2 b表字段1,欄位2 from a表 xxx(別名) right join b表 yyy(別名) on a表字段1=b表字段1,a表字段2=b表字段2; (3)內連線

select a.aid,a.aname, b.bid,b.bname from testa a inner join testb b on a.aid=b.bid and a.aname=b.bname; 在這裡插入圖片描述

格式: select a表字段1,欄位2 b表字段1,欄位2 from a表 xxx(別名) inner join b表 yyy(別名) on a表字段1=b表字段1,a表字段2=b表字段2;

部門編號匹配員工表

使用上次使用的三個表:部門表、工資等級表、員工表 (1)查詢一個員工的部門坐落在哪個地方

select a.ename,a.deptno, b.dname,b.loc from emp a left join dept b on a.deptno=b.deptno; 在這裡插入圖片描述

格式: select 員工表的員工名,員工表的部門編號, 部門表的部門編號,部門坐落位置 from 員工表 a left join 部門表 b on a.部門編號=b.部門編號; (2)員工的所屬部門是什麼?在什麼地方?所屬的工資等級是什麼?

原理同上,只是多添加了一個條件 select a.ename,a.deptno,(a.sal+a.comm) as sal, s.grade, b.dname,b.loc from emp a left join dept b on a.deptno=b.deptno (先將員工匹配的部門位置篩選出來) left join salgrade s on (a.sal+a.comm) between s.losal and s.hisal;( 再將薪水限制在最高和最低薪水之間匹配等級) 在這裡插入圖片描述

那麼問題來了,使用以上語法執行指令碼,發現薪水這一列數值出現null值,原本薪水+獎金肯定是一個數值,這裡顯示不出來是因為獎金如果是數值0的話,會顯示null值,null與一個具體的數值相加減最後輸出的還是null值,使得薪水這一列同樣也出現null值,自然薪水等級顯示不出來,所以需要對獎金為0的數值進行輸出限定,賦予數值0輸出,使用函式IFNULL(對應欄位, 0)

select a.ename,a.deptno,a.sal,IFNULL(a.comm, 0) comm,(a.sal+IFNULL(a.comm, 0)) as salcomm, b.dname,b.loc from emp a left join dept b on a.deptno=b.deptno; 在這裡插入圖片描述

可以看到薪水和獎金都是有數值的了,那麼再進行之前的語法操作,就能顯示每個人的薪水等級:

select a.ename,a.deptno,(a.sal+IFNULL(a.comm, 0)) as salcomm , s.grade, b.dname,b.loc from emp a left join dept b on a.deptno=b.deptno left join salgrade s on (a.sal+IFNULL(a.comm, 0)) between s.losal and s.hisal; 在這裡插入圖片描述

MySQL總結:

null與數值相加減必為null,需將null輸出為0; left join在一個指令碼種不止一個,可根據實際情況對相應的欄位進行多個篩選 on後面可以關聯><或者between…and…

---------------------------------------------------未完待續-----------------------------------------------------