MySQL數據庫筆記4——子查詢、union及limit用法

1.子查詢
      select語句當中嵌套select語句,被嵌套的select語句是子查詢。

子查詢可以出現在:
在這裏插入圖片描述
2.where子句中使用子查詢
案例:找出高於平均薪資的員工信息?
select * from emm where sal>avg(sal); //錯誤寫法,where後面不能直接使用分組函數
改正:select * from emp where sal>(select avg(sal) from emp);

3.from後面嵌套子查詢
案例1:找出每個部門平均薪水的薪資等級?
select t.*,s.grade from (select deptno,avg(sal) avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal;

案例2:找出每個部門平均的薪水等級?
select e.deptno,avg(s.grade) from emp e join salgrade s on e.sal between s.losal and hisal group by e.deptno;

4.select後面嵌套子查詢
案例:找出每個員工所在的部門名稱,要求顯示員工名和部門名?
select e.ename,(select d.dname from dept d where e.deptno=d.deptno) as dname from emp e;

5.union的用法(可以將查詢結果集相加)
案例:找出工作崗位是SALESMAN和MANAGER的員工?
第一種:select ename,job from emp where job=‘MANAGER’ or job=‘SALESMAN’;
第二種:select ename,job from emp where job in (‘MANAGER’,‘SALESMAN’);
第三種:select ename,job from emp where job=‘MANAGER’ union select ename,job from emp where job=‘SALESMAN’;

語法:(select colum1,colum2…columN from tableA ) union (select colum1,colum2…columN from tableB );
或者
(select colum1,colum2…columN from tableA ) union all (select colum1,colum2…columN from tableB );
注意:
(1)通過union連接的SQL它們分別單獨取出的列數必須相同;
(2)不要求合併的表列名稱相同時,以第一個sql 表列名爲準;
(3)使用union 時,完全相等的行,將會被合併,由於合併比較耗時,一般不直接使用 union 進行合併,而是通常採用union all 進行合併;
(4)被union 連接的sql 子句,單個子句中不用寫order by ,因爲不會有排序的效果。但可以對最終的結果集進行排序。

5.limit用法
(重點中的重點,以後分頁查詢會用到limit)
(1)limit是MySQL特有的,其他數據庫中沒有,不通用。Oracle中有一個相同的機制,叫做rownum。
(2)limit取結果集中的部分數據,這是它的作用。
語法機制:limit startIndex,length
startIndex表示起始位置,length表示取幾個

案例1:取出工資前5名的員工?
select ename,sal from emp order by sal desc limit 0,5;
或者
select ename,sal from emp order by sal desc limit 5;

(3)limit是sql語句最後執行的一個環節。
在這裏插入圖片描述
案例2:找出工資排列在第4到第9名的員工?
select ename,sal from emp order by sal desc limit 3,6;
//從第4名開始取6個

(4)通用的標準分頁sql?
每頁顯示三條記錄:
第1頁:0,3
第2頁:3,3
第3頁:6,3
第4頁:9,3
第5頁:12,3

每頁顯示pageSize條記錄:
第pageSize頁:(pageNo-1)*pageSize,pageSize
(pageSize表示每頁顯示幾條記錄;pageNo表示顯示第幾頁)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章