MySQL入門(5)- 子查詢&union&limit&case...when...then...when...then...end
子查詢&union&limit&case...when...then...when...then...end
此係列記錄PN視訊學習筆記* 本部落格涉及到的資料為bjpowernode.sql,資料見文末,
* 該資料有三張表,分別是部門表dept(deptno部門編號、dname部門名稱、loc位置)、
員工表emp(empno工號、ename員工姓名、job職位、mgr直屬領導工號、
hiredate入職日期、sal月薪、comm補貼、deptno部門編號)、
薪水等級表salgrade(grade等級、losal區間下限、hisal區間上限)
一、子查詢
子查詢就是巢狀select語句
1、什麼是子查詢?
-select語句巢狀select語句
2、子查詢可以出現在哪兒?
select...(select).
from...(select).
where...(select).
3、where後使用select子查詢
案例:找出薪水比公司平均薪水高的員工,要求顯示員工名和薪水
selectename,sal from emp e where sal > avg(sal);
以上語句執行報錯,分組函式不能直接使用在where後
select avg(sal)from emp;【得到值AVG】
select ename,sal fromemp e where sal > AVG;
上面語句可用如下顯示
select ename,sal fromemp e where sal > (select avg(sal) from emp);
4、from後使用select子查詢【小竅門:將查詢結果當做臨時表】
案例:找出每一個部門的平均薪水,並且找出平均薪水的薪水等級
第一步:找出每個部門的平均薪水
select deptno,avg(sal)asavgsal from emp group by deptno;
第二步:將上面的查詢結果當做臨時表t,t表和salagrade連線
select
t.deptno,t.avgsal,s.grade (t.*,s.grade 也行)
from
(select avg(sal)as avgsal from emp)t
join
salgrade s on t.avgsal between s.losal and s.hisal;
5、select後使用select子查詢【瞭解】
selecte.ename,(select d.dname from dept d where e.deptno = d.deptno)as dname from empe;
查詢員工名以及對應的部門名
二、union
用來合併集合
案例:找出工作崗位是salesman和manager的員工
select ename,job fromemp job =‘salesman’or job =‘manager’;
select ename,job fromemp where job in(‘salesman’,’manager’);
下面寫法要求:兩個select語句必須擁有相同的欄位個數相同(oracle要求欄位的資料型別相同)
select ename,job fromemp where job =‘salesman’
union
select ename,job fromemp where job =‘manager’
將兩個查詢結果合併成一個,兩個查詢結果可以來自不同的表
select ename as enamedname from emp
union
select dname as enamedname from dept;
三、limit
limit的使用語法格式:limit 起始下標,長度
起始下標沒有指定,預設從0開始,0表示表中第一條記錄
limit出現在SQL語句的最後位置
1、limit用來獲取一張表中的某部分資料
2、limit只有在MYSQL資料庫中存在,不通用,是MYSQL資料管理系統的特色
3、案例:找出員工表中前五條記錄
select ename from emp limit 5;
以上SQL語句的“limit 5”中的5表示從表中記錄下標0開始,取5條記錄
等同於下面SQL語句
select enamefrom emp limit 0,5;
4、案例:找出公司中工資排名在前五名的員工
思路:按照工資降序排列取前五個
select ename,salfrom emp order by sal desc limit 5;
5、案例:找出工資排名在3-9名的員工
select ename,salfrom emp order by sal desc limit 2,7;【閉區間】
6、MYSQL中通用的分頁SQL語句
假設每頁顯示三條記錄
第一頁:0,3
第二頁:3,3
第三頁:6,3
第四頁:9,3
……
每頁顯示pageSize條記錄
第pageNo頁:(pageNo - 1)*pageSize, pageSize
通用的分頁SQL【只適用於MYSQL資料管理系統】
select ename,sal from emp order by sal desc limit (pageNo- 1)*pageSize, pageSize;
select t.* from t order by t.x desc/asc limit (pageNo - 1)*pageSize,pageSize;
四、case...when...then...when...then...end,使用在DQL語句中
select
ename,sal,(casejob when 'manager' then sal * 1.1 when 'salesman' then sal * 1.5 end) as newsal
from
emp;
+--------+---------+---------+
| ename | sal | newsal |
+--------+---------+---------+
| SIMITH | 800.00 | NULL |
| ALLEN | 1600.00 | 2400.00 |
| WARD | 1250.00 | 1875.00 |
| JONES | 2975.00 | 3272.50 |
| MARTIN | 1250.00 | NULL |
| BLAKE | 2850.00 | 3135.00 |
| CLARK | 2450.00 | 2695.00 |
| SCOTT | 3000.00 | NULL |
| KING | 5000.00 | NULL |
| TURNER | 1500.00 | 2250.00 |
| ADAMS | 1100.00 | NULL |
| JAMES | 950.00 | NULL |
| FORD | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
+--------+---------+---------+
select
ename,sal,(casejob when 'manager' then sal * 1.1 when 'salesman' then sal * 1.5 else sal end) as newsal
from
emp;
+--------+---------+---------+
| ename | sal | newsal |
+--------+---------+---------+
| SIMITH | 800.00 | 800.00 |
| ALLEN | 1600.00 | 2400.00 |
| WARD | 1250.00 | 1875.00 |
| JONES | 2975.00 | 3272.50 |
| MARTIN | 1250.00 | 1250.00 |
| BLAKE | 2850.00 | 3135.00 |
| CLARK | 2450.00 | 2695.00 |
| SCOTT | 3000.00 | 3000.00 |
| KING | 5000.00 | 5000.00 |
| TURNER | 1500.00 | 2250.00 |
| ADAMS | 1100.00 | 1100.00 |
| JAMES | 950.00 | 950.00 |
| FORD | 3000.00 | 3000.00 |
| MILLER | 1300.00 | 1300.00 |
+--------+---------+---------+
DEPTNO | DNAME | LOC |
10 | ACCOUNTING | NEW YORK |
20 | RESEARCHING | DALLAS |
30 | SALES | CHICAGO |
40 | OPERATIONS | BOSTON |
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
7369 | SMITH | CLERK | 7902 | 1980/12/17 | 800 | NULL | 20 |
7499 | ALLEN | SALESMAN | 7698 | 1981/2/20 | 1600 | 300 | 30 |
7521 | WARD | SALESMAN | 7698 | 1981/2/22 | 1250 | 500 | 30 |
7566 | JONES | MANAGER | 7839 | 1981/4/2 | 2975 | NULL | 20 |
7654 | MARTIN | SALESMAN | 7698 | 1981/9/28 | 1250 | 1400 | 30 |
7698 | BLAKE | MANAGER | 7839 | 1981/5/1 | 2850 | NULL | 30 |
7782 | CLARK | MANAGER | 7839 | 1981/6/9 | 2450 | NULL | 10 |
7788 | SCOTT | ANALYST | 7566 | 1987/4/19 | 3000 | NULL | 20 |
7839 | KING | PERSIDENT | NULL | 1981/11/17 | 5000 | NULL | 10 |
7844 | TURNER | SALESMAN | 7698 | 1981/9/8 | 1500 | NULL | 30 |
7876 | ADAMS | CLERK | 7788 | 1987/5/23 | 1100 | NULL | 20 |
7900 | JAMES | CLERK | 7698 | 1981/12/3 | 950 | NULL | 30 |
7902 | FORD | ANALYST | 7566 | 1981/12/3 | 3000 | NULL | 20 |
7934 | MILLER | CLERK | 7782 | 1982/1/23 | 1300 | NULL | 10 |
GRADE | LOSAL | HISAL |
1 | 700 | 1200 |
2 | 1201 | 1400 |
3 | 1401 | 2000 |
4 | 2001 | 3000 |
5 | 3001 | 9999 |