MySQL進階之高階查詢,真的高階啊!
高階查詢
1.多表查詢(關聯查詢,連線查詢)
- 內連線
- 沒有主從表之分。
- 與連線順序無關
- 內連接出現在結果集中的資料必須出現在每一個關聯表中。
select * from emp,dept where emp.deptno = dept.deptno;
select * from emp inner join dept on emp.deptno = dept.deptno;
select * from emp inner join dept using (deptno); 不通用,必須通用列欄位名稱一樣,會去除重複列。 |
- 外連線(左外連線 右外連線)
- 有主從表之分,與連線順序有關。
- 以主表為基準,依次在從表中查詢與主表記錄相關聯記錄,如果找到則關聯並顯示,否則以null填充。
select * from emp left/right join dept on emp.deptno = dept.deptno; |
2.子查詢(巢狀查詢)
- 一次查詢的結果作為另一查詢的條件或者結果集,稱為子查詢。
子查詢返回結果一條記錄 select * from dept where deptno = (select deptno from emp where empno=7369);
子查詢返回結果多條記錄 select * from dept where deptno in ( select deptno from emp where sal > 2000); any/all =any: 相當於in >any:大於最小值 <any:小於最大值 <>all: 相當於not in >all:大於最大值 <all:小於最小值
# 查詢超過所在部門的平均工資的員工資訊。 #關聯 select * from emp, (select deptno,avg(sal) avg from emp group by deptno) e where e.deptno = emp.deptno and sal > e.avg; #子查詢 #1.主查詢將deptno傳給子查詢 #2.子查詢根據主查詢傳的部門編號查詢該部門的平均工資 #3.子查詢將結果返回給主查詢,主查詢執行。 select * from emp e1 where sal >( select avg(sal) avg from emp e2 where e2.deptno = e1.deptno);
#查詢工資>2000的員工所在部門的名稱 select dname from dept where deptno in (select deptno from emp where sal > 2000);
#exists select dname from dept where exists( select * from emp where sal > 2000 and dept.deptno = emp.deptno);
#exits和in對比 #in:先執行子查詢,將子查詢結果返回給主查詢,主查詢根據返回的結果後續處理。 #exits:先執行主查詢,子查詢根據主查詢傳輸的資料,依次在子查詢中匹配,如果能夠找到與主查詢相匹配的記錄,則返回true,顯示主查詢的結果;如果不能匹配,則返回false,則主查詢該記錄不會顯示在結果集中。 |
3.聯合查詢 union 去重、union all 不去重
select * from emp where deptno =20 union all select * from emp where sal >2000; |