日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL(四) - 子查询和union以及limit分页

發布時間:2023/12/4 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL(四) - 子查询和union以及limit分页 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

子查詢概念

什么是子查詢?子查詢都可以出現在哪里?

select語句當中嵌套select語句,被嵌套的select語句是子查詢。
子查詢可以出現在哪里?

select..(select). from..(select). where..(select).

1.where子句中使用子查詢

案例:找出高于平均薪資的員工信息。

select * from emp where sal > avg(sal); //錯誤的寫法,where后面不能直接使用分組函數。

錯誤的寫法:where后面不能直接使用分組函數。

第一步:找出平均薪資

select avg(sal) from emp;

第二步:where過濾

select * from emp where sal > 2073.214286;

第一步和第二步合并:

select * from emp where sal > (select avg(sal) from emp);

2.from后面嵌套子查詢 (重要)

應用場景:將查詢后得到的表,與其他表做連接查詢。

案例:找出每個部門平均薪水的等級。

第一步:找出每個部門平均薪水(按照部門編號分組,求sal的平均值)

select deptno,avg(sal) as avgsal from emp group by deptno;

第二步:將以上的查詢結果當做臨時表t,讓t表和salgrade s表連接,
條件是:t.avgsal between s.losal and s.hisal

select t.*,s.grade from(select deptno,avg(sal) as avgsal from emp group by deptno) t joinsalgrade s ont.avgsal between s.losal and s.hisal;


案例:找出每個部門平均的薪水等級(這個案例不需要看作臨時表)。

第一步:找出每個員工的薪水等級。

select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;

第二步:基于以上結果,繼續按照deptno分組,求grade平均值。

select e.deptno,avg(s.grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group bye.deptno;

3.在select后面嵌套子查詢 (很少用)。

案例:找出每個員工所在的部門名稱,要求顯示員工名和部門名。

方法一:等值內連接

select e.ename,d.dname fromemp e joindept d one.deptno = d.deptno;

方法二:select后面子嵌套

select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;

4.union (可以將查詢結果集相加)

案例:找出工作崗位是SALESMAN和MANAGER的員工?

第一種:select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN'; 第二種:select ename,job from emp where job in('MANAGER','SALESMAN');

第三種:union

select ename,job from emp where job = 'MANAGER' union select ename,job from emp where job = 'SALESMAN';


只能用union的情況:
案例:兩張不相干的表中的數據拼接在一起顯示?

select ename from emp union select dname from dept;


注意:兩張表查詢結果的列數必須一樣

5.limit (重點中的重點,以后分頁查詢全靠它了。)

limit是mysql特有的,其他數據庫中沒有,不通用。(Oracle中有一個相同的機制,叫做rownum)

作用:limit取結果集中的部分數據,這是它的作用。

語法機制:
limit startIndex, length

  • startIndex表示起始位置,從0開始,0表示第一條數據。
  • length表示取幾個

1.案例:取出工資前5名的員工(思路:降序取前5個)

select ename,sal from emp order by sal desc;

取前5個:

select ename,sal from emp order by sal desc limit 0, 5; select ename,sal from emp order by sal desc limit 5; //startIndex省略表示從0開始

注意:limit是sql語句最后執行的一個環節:

select 5... from 1... where 2... group by 3... having 4... order by 6... limit 7...;

2.案例:找出工資排名在第4到第9名的員工?

select ename,sal from emp order by sal desc limit 3,6;

通用的標準分頁sql?

每頁顯示3條記錄:
第1頁:0, 3
第2頁:3, 3
第3頁:6, 3
第4頁:9, 3
第5頁:12, 3

每頁顯示pageSize條記錄:

第pageNo頁:(pageNo - 1) * pageSize, pageSize

pageSize:是每頁顯示多少條記錄
pageNo :顯示第幾頁

java代碼{int pageNo = 2; // 頁碼是2int pageSize = 10; // 每頁顯示10條limit (pageNo - 1) * pageSize, pageSize }

總結

以上是生活随笔為你收集整理的SQL(四) - 子查询和union以及limit分页的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。