您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“MySql中的連接查詢問題怎么解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“MySql中的連接查詢問題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
當進行多表連接查詢時 需要指定字段所屬的表 , 可以提高查詢效率 , 如果不指定字段所屬的表 , 數據庫會從每個表中都找一下該字段
e . 字段名 : 表示取 emp 表的某個字段
emp as e : 表的別名機制 , 可以省略 as 直接寫成 emp e
連接查詢:也可以叫跨表查詢,需要關聯多張表聯合起來查詢數據
emp表和dept表聯合起來查詢數據,從emp表中取員工名字,從dept表中取部門名字
注意: 做連接查詢的時候一定要寫上關聯條件 避免笛卡爾積現象
根據語法的年代分類
SQL92:1992年的時候出現的語法
sql92的缺點:結構不清晰,表的連接條件,和后期進一步篩選的條件,都放到了where后面
SQL99:1999年的時候出現的語法(重點學習)
sql99優點:表的連接條件和查詢條件分離,連接之后如果還需要進一步篩選,再往后繼續添加where , 多個表進行連接的時候更清晰
根據表連接的方式分類
內連接:等值連接 , 非等值連接 , 自連接 , inner 可以省略 一般不加
表 A inner join 表 B on 關聯條件
外連接:左外連接(左連接), 右外連接(右連接), outer 可以省略一般不加
表 A left outer join 表 B on 關聯條件
表 B right outer join 表 A on 關聯條件
左連接以左面的表為準和右邊的表比較,和左表相等的不相等都會顯示出來,而右表符合條件的顯示,不符合條件的不顯示 (右連接恰恰相反)
左連接能完成的功能右連接一定可以完成
全連接 , 連接的兩張表都是主表 , 都能查詢出來
當兩張表進行連接查詢,沒有指定連接條件的時候,最終查詢結果條數是兩張表條數的乘積,這種現象被稱為:笛卡爾積現象(笛卡爾發現的,這是一個數學現象)
避免笛卡爾積現象:連接多個表時加連接條件,將滿足這個條件的記錄被篩選出來
匹配的過程中匹配的次數沒有減少 , 但是最終查詢的結果條數是變少了 , 因為根據連接條件進行了篩選
通過笛卡爾積現象得出,表的連接次數越多效率越低,盡量避免表的連接次數
因為條件是等量關系,所以被稱為等值連接(連接條件相等的數據)
查詢每個員工所在部門名稱,顯示員工名和部門
emp e和dept d表進行連接 , 連接條件是:e.deptno = d.deptno
--sql92的缺點:結構不清晰,表的連接條件,和后期進一步篩選的條件,都放到了where后面 select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno; --sql99優點:表連接的條件是獨立的,連接之后,如果還需要進一步篩選,再往后繼續添加where select e.ename,d.dname from emp e --inner可以省略(帶著inner可讀性更好) (inner) join dept d on e.deptno = d.deptno;
因為只有一張表連接,具體的查詢方法是把一張表看作兩張表自己連接自己 , 所以成為自連接
查詢員工的上級領導,要求顯示員工名和對應的領導名
一張表看成兩張表 , emp e 代表了員工表,emp m 也代表了領導表
連接條件: e.mgr = m.empno 員工的領導編號 = 領導的員工編號
--SQL92 select e.ename, m.ename from emp e, emp m where e.mgr=m.empno; --SQL99 select a.ename as '員工名', b.ename as '領導名' from emp e join emp m on e.mgr = m.empno;
因為連接條件不是一個等量關系,所以稱為非等值連接
顯示薪水大于 2000 的員工信息,并顯示所屬的部門名稱
--采用 SQL92 語法 select e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno and e.sal > 2000; --采用 SQL99 語法 select e.ename, e.sal, d.dname from emp e (inner) join dept d on e.deptno=d.deptno where e.sal>2000;
找出每個員工的薪資等級,要求顯示員工名、薪資、薪資等級
select e.ename, e.sal, s.grade from emp e (inner) join salgrade s on e.sal between s.losal and s.hisal;
外連接: 在外連接當中,兩張表連接產生了主次關系 , 主要查詢的是主表的數據 , 捎帶著關聯查詢次表 , 即如果對方沒有記錄和我主表匹配 , 那么默認對方是null , outer關鍵字可以省略
右外連接: 帶有 right 的是右外連接,表示將join關鍵字右邊的這張表看成主表,主要是為了將這張表的數據全部查詢出來,捎帶著關聯查詢左邊的表
左外連接: 帶有 lef t的是左外連接 , 表示將join關鍵字左邊的這張表看成主表,主要是為了將這張表的數據全部查詢出來,捎帶著關聯查詢右邊的表
**注意: 任何一個右連接都有左連接的寫法 , 任何一個左連接都有右連接的寫法 **
查詢每個員工的上級領導,要求顯示所有員工的名字和領導名 , 如果某個員工沒有領導 , 那么該員工也必須顯示出來
--左連接 select a.ename as '員工名', b.ename as '領導名' from emp a left (outer) join emp b on a.mgr = b.empno; --右連接 select a.ename as '員工名', b.ename as '領導名' from emp b right (outer) join emp a on a.mgr = b.empno;
內連接:A表和B表連接,A和B兩張表沒有主次關系是平等的 , 查詢時只是將能夠匹配上連接條件的數據查詢出來 , 即如果沒有匹配的就查詢不出來 , inner關鍵字可以省略
外連接: 在外連接當中,兩張表連接產生了主次關系 , 主要查詢的是主表的數據 , 捎帶著關聯查詢次表 , 即如果對方沒有記錄和我主表匹配 , 那么默認對方是null , outer關鍵字可以省略
注意: 區分內外連接的辦法是通過 right 和 left 關鍵字 , 不是通過 inner 和 outer 因為它們都可以省略 , 并且外連接的查詢結果條數一定是大于等于內連接的查詢結果條數
顯示員工信息,并顯示所屬的部門名稱
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
顯示員工信息,并顯示所屬的部門名稱,如果某一個部門沒有員工,那么該部門也必須顯示出來
--外連接(右外連接) select e.ename,d.dname from emp e --outer是可以省略的,帶著可讀性強 --right代表什么:表示將join關鍵字右邊的這張表看成主表,主要是為了將這張表的數據全部查詢出來,捎帶著關聯查詢左邊的表 right (outer) join dept d on e.deptno = d.deptno; --外連接(左外連接) select e.ename,d.dname from dept d --outer是可以省略的,帶著可讀性強 left (outer) join emp e on e.deptno = d.deptno;
一條SQL中內連接和外連接可以混合 , 都可以出現
--表示一: a 和 b 進行內連接 , a 和 c 進行內連接 , a 和 d 進行右外連接(推薦) --表示二: a 和 b 的內連接結果去內連接 c 的結果再去右外連接 d select ... from a join b on a和b的連接條件 join c on a和c的連接條件 right join d on a和d的連接條件
找出每個員工的部門名稱以及工資等級,要求顯示員工名、部門名、薪資、薪資等級
select e.ename,e.sal,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;
查詢結果
+--------+---------+------------+-------+ | ename | sal | dname | grade | +--------+---------+------------+-------+ | SMITH | 800.00 | RESEARCH | 1 | | ALLEN | 1600.00 | SALES | 3 | | WARD | 1250.00 | SALES | 2 | | JONES | 2975.00 | RESEARCH | 4 | | MARTIN | 1250.00 | SALES | 2 | | BLAKE | 2850.00 | SALES | 4 | | CLARK | 2450.00 | ACCOUNTING | 4 | | SCOTT | 3000.00 | RESEARCH | 4 | | KING | 5000.00 | ACCOUNTING | 5 | | TURNER | 1500.00 | SALES | 3 | | ADAMS | 1100.00 | RESEARCH | 1 | | JAMES | 950.00 | SALES | 1 | | FORD | 3000.00 | RESEARCH | 4 | | MILLER | 1300.00 | ACCOUNTING | 2 | +--------+---------+------------+-------+
找出每個員工的部門名稱以及工資等級,還有上級領導,要求顯示員工名、領導名、部門名、薪資、薪資等級
select e.ename,e.sal,d.dname,s.grade,l.ename from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal left join emp l on e.mgr = l.empno;
查詢結果
+--------+---------+------------+-------+-------+ | ename | sal | dname | grade | ename | +--------+---------+------------+-------+-------+ | SMITH | 800.00 | RESEARCH | 1 | FORD | | ALLEN | 1600.00 | SALES | 3 | BLAKE | | WARD | 1250.00 | SALES | 2 | BLAKE | | JONES | 2975.00 | RESEARCH | 4 | KING | | MARTIN | 1250.00 | SALES | 2 | BLAKE | | BLAKE | 2850.00 | SALES | 4 | KING | | CLARK | 2450.00 | ACCOUNTING | 4 | KING | | SCOTT | 3000.00 | RESEARCH | 4 | JONES | | KING | 5000.00 | ACCOUNTING | 5 | NULL | | TURNER | 1500.00 | SALES | 3 | BLAKE | | ADAMS | 1100.00 | RESEARCH | 1 | SCOTT | | JAMES | 950.00 | SALES | 1 | BLAKE | | FORD | 3000.00 | RESEARCH | 4 | JONES | | MILLER | 1300.00 | ACCOUNTING | 2 | CLARK | +--------+---------+------------+-------+-------+
讀到這里,這篇“MySql中的連接查詢問題怎么解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。