1. 程式人生 > >MySQL入門(5)- 子查詢&union&limit&case...when...then...when...then...end

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 |

+--------+---------+---------+

DEPTNODNAMELOC
10ACCOUNTINGNEW YORK
20RESEARCHINGDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7369SMITHCLERK79021980/12/17800NULL20
7499ALLENSALESMAN76981981/2/20160030030
7521WARDSALESMAN76981981/2/22125050030
7566JONESMANAGER78391981/4/22975NULL20
7654MARTINSALESMAN76981981/9/281250140030
7698BLAKEMANAGER78391981/5/12850NULL30
7782CLARKMANAGER78391981/6/92450NULL10
7788SCOTTANALYST75661987/4/193000NULL20
7839KINGPERSIDENTNULL1981/11/175000NULL10
7844TURNERSALESMAN76981981/9/81500NULL30
7876ADAMSCLERK77881987/5/231100NULL20
7900JAMESCLERK76981981/12/3950NULL30
7902FORDANALYST75661981/12/33000NULL20
7934MILLERCLERK77821982/1/231300NULL10
GRADELOSALHISAL
17001200
212011400
314012000
420013000
530019999