亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL?with語(yǔ)句講解

 更新時(shí)間:2022年11月12日 10:16:43   作者:只是甲  
這篇文章主要介紹了MySQL?with語(yǔ)句小結(jié),對(duì)于邏輯復(fù)雜的sql,with可以大大減少臨時(shí)表的數(shù)量,提升代碼的可讀性、可維護(hù)性,對(duì)mysql?with語(yǔ)句相關(guān)知識(shí)感興趣的朋友一起看看吧

備注:測(cè)試數(shù)據(jù)庫(kù)版本為MySQL 8.0

今天我們來(lái)聊聊MySQL的with語(yǔ)句
對(duì)于邏輯復(fù)雜的sql,with可以大大減少臨時(shí)表的數(shù)量,提升代碼的可讀性、可維護(hù)性

MySQL 8.0終于開(kāi)始支持with語(yǔ)句了,對(duì)于復(fù)雜查詢,可以不用寫那么多的臨時(shí)表了。

如需要scott用戶下建表及錄入數(shù)據(jù)語(yǔ)句,可參考:
scott建表及錄入數(shù)據(jù)sql腳本

語(yǔ)句結(jié)構(gòu):

with subquery_name1 as (subquery_body1),
        subquery_name2 as (subquery_body2)
...
select * from subquery_name1 a, subquery_name2 b
where a.col = b.col
...

優(yōu)勢(shì)

  • – 代碼模塊化
  • – 代碼可讀性增強(qiáng)
  • – 相同查詢唯一化

一.提升代碼的可讀性和可維護(hù)性

需求:求每個(gè)部門的平均工資,以及剔除薪資低于1000的實(shí)習(xí)人員之后的平均工資

-- 求每個(gè)部門的平均工資,以及剔除薪資低于1000的實(shí)習(xí)人員之后的平均工資
-- 主查詢的from后面跟了2個(gè)臨時(shí)表,程序可讀性不佳
select d.deptno, tmp1.avg_sal avg_sal1, tmp2.avg_sal avg_sal2
  from dept d
  left join (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
               from emp e1
              group by e1.deptno) tmp1
    on d.deptno = tmp1.deptno
  left join (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
               from emp e1
              where e1.sal > 1000
              group by e1.deptno) tmp2
    on d.deptno = tmp2.deptno;
    
    
-- 求每個(gè)部門的平均工資,以及剔除薪資低于1000的實(shí)習(xí)人員之后的平均工資
-- 2個(gè)臨時(shí)表的定時(shí)語(yǔ)句通過(guò)with封裝成子查詢了,程序可讀性增強(qiáng)
with tmp1 as
 (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
    from emp e1
   group by e1.deptno),
tmp2 as
 (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
    from emp e1
   where e1.sal > 1000
   group by e1.deptno)
select d.deptno, tmp1.avg_sal avg_sal1, tmp2.avg_sal avg_sal2
  from dept d
  left join tmp1
    on d.deptno = tmp1.deptno
  left join tmp2
    on d.deptno = tmp2.deptno;
mysql> -- 求每個(gè)部門的平均工資,以及剔除薪資低于1000的實(shí)習(xí)人員之后的平均工資
mysql> -- 主查詢的from后面跟了2個(gè)臨時(shí)表,程序可讀性不佳
mysql> select d.deptno, tmp1.avg_sal avg_sal1, tmp2.avg_sal avg_sal2
    ->   from dept d
    ->   left join (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
    ->                from emp e1
    ->               group by e1.deptno) tmp1
    ->     on d.deptno = tmp1.deptno
    ->   left join (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
    ->                from emp e1
    ->               where e1.sal > 1000
    ->               group by e1.deptno) tmp2
    ->     on d.deptno = tmp2.deptno;
+--------+----------+----------+
| deptno | avg_sal1 | avg_sal2 |
+--------+----------+----------+
|     10 |  2916.67 |  2916.67 |
|     20 |  2175.00 |  2518.75 |
|     30 |  1566.67 |  1690.00 |
|     40 |     NULL |     NULL |
+--------+----------+----------+
4 rows in set (0.00 sec)

mysql>
mysql>
mysql> -- 求每個(gè)部門的平均工資,以及剔除薪資低于1000的實(shí)習(xí)人員之后的平均工資
mysql> -- 2個(gè)臨時(shí)表的定時(shí)語(yǔ)句通過(guò)with封裝成子查詢了,程序可讀性增強(qiáng)
mysql> with tmp1 as
    ->  (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
    ->     from emp e1
    ->    group by e1.deptno),
    -> tmp2 as
    ->  (select e1.deptno, round(avg(ifnull(e1.sal, 0)), 2) avg_sal
    ->     from emp e1
    ->    where e1.sal > 1000
    ->    group by e1.deptno)
    -> select d.deptno, tmp1.avg_sal avg_sal1, tmp2.avg_sal avg_sal2
    ->   from dept d
    ->   left join tmp1
    ->     on d.deptno = tmp1.deptno
    ->   left join tmp2
    ->     on d.deptno = tmp2.deptno;
+--------+----------+----------+
| deptno | avg_sal1 | avg_sal2 |
+--------+----------+----------+
|     10 |  2916.67 |  2916.67 |
|     20 |  2175.00 |  2518.75 |
|     30 |  1566.67 |  1690.00 |
|     40 |     NULL |     NULL |
+--------+----------+----------+
4 rows in set (0.00 sec)

mysql>

二.with遞歸

用with遞歸構(gòu)造數(shù)列

-- 用with遞歸構(gòu)造1-10的數(shù)據(jù)
with RECURSIVE c(n) as
 (select 1   union all select n + 1 from c where n < 10)
select n from c;
-- 用with遞歸構(gòu)造1-10的數(shù)據(jù)
mysql> with RECURSIVE c(n) as
    ->  (select 1   union all select n + 1 from c where n < 10)
    -> select n from c;
+------+
| n    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
+------+
10 rows in set (0.00 sec)

用with遞歸構(gòu)造級(jí)聯(lián)關(guān)系

with RECURSIVE emp2(ename,empno,mgr,lvl)
  as
   (select ename, empno, mgr, 1 lvl from emp where mgr is null
    union all
    select emp.ename, emp.empno, emp.mgr, e2.lvl+1
      from emp, emp2 e2
     where emp.mgr = e2.empno
   )
select lvl,
      concat(repeat('**',lvl),ename) nm
  from emp2
 order by lvl,ename
;
mysql> with RECURSIVE emp2(ename,empno,mgr,lvl)
    ->   as
    ->    (select ename, empno, mgr, 1 lvl from emp where mgr is null
    ->     union all
    ->     select emp.ename, emp.empno, emp.mgr, e2.lvl+1
    ->       from emp, emp2 e2
    ->      where emp.mgr = e2.empno
    ->    )
    -> select lvl,
    ->       concat(repeat('**',lvl),ename) nm
    ->   from emp2
    ->  order by lvl,ename
    -> ;
+------+---------------+
| lvl  | nm            |
+------+---------------+
|    1 | **KING        |
|    2 | ****BLAKE     |
|    2 | ****CLARK     |
|    2 | ****JONES     |
|    3 | ******ALLEN   |
|    3 | ******FORD    |
|    3 | ******JAMES   |
|    3 | ******MARTIN  |
|    3 | ******MILLER  |
|    3 | ******SCOTT   |
|    3 | ******TURNER  |
|    3 | ******WARD    |
|    4 | ********ADAMS |
|    4 | ********SMITH |
+------+---------------+
14 rows in set (0.00 sec)

到此這篇關(guān)于MySQL with語(yǔ)句小結(jié)的文章就介紹到這了,更多相關(guān)mysql with語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql優(yōu)化系列 DELETE子查詢改寫優(yōu)化

    mysql優(yōu)化系列 DELETE子查詢改寫優(yōu)化

    有個(gè)采用子查詢的DELETE執(zhí)行得非常慢,改寫成SELECT后執(zhí)行卻很快,最后把這個(gè)子查詢DELETE改寫成JOIN優(yōu)化過(guò)程
    2016-08-08
  • MySQL中如何增加字段SQL語(yǔ)句

    MySQL中如何增加字段SQL語(yǔ)句

    這篇文章主要介紹了MySQL中如何增加字段SQL語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mysql的select?into給多個(gè)字段變量賦值方式

    mysql的select?into給多個(gè)字段變量賦值方式

    這篇文章主要介紹了mysql的select?into給多個(gè)字段變量賦值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql設(shè)置指定ip遠(yuǎn)程訪問(wèn)連接實(shí)例

    mysql設(shè)置指定ip遠(yuǎn)程訪問(wèn)連接實(shí)例

    這篇文章主要介紹了mysql設(shè)置指定ip遠(yuǎn)程訪問(wèn)連接的方法,分別實(shí)例講述了從任意主機(jī)和指定ip訪問(wèn)遠(yuǎn)程MySQL數(shù)據(jù)庫(kù)的方法,代碼簡(jiǎn)單功能實(shí)用,需要的朋友可以參考下
    2014-10-10
  • MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫(kù)的2個(gè)方法

    MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫(kù)的2個(gè)方法

    MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫(kù)的2個(gè)方法,大家可以測(cè)試下。
    2009-07-07
  • MYSQL慢查詢和日志實(shí)例講解

    MYSQL慢查詢和日志實(shí)例講解

    這篇文章主要介紹了MYSQL慢查詢和日志實(shí)例講解,有對(duì)這方面感興趣的同學(xué)可以研究學(xué)習(xí)下
    2021-02-02
  • MySQL UPDATE 語(yǔ)句的非標(biāo)準(zhǔn)實(shí)現(xiàn)代碼

    MySQL UPDATE 語(yǔ)句的非標(biāo)準(zhǔn)實(shí)現(xiàn)代碼

    這篇文章主要介紹了MySQL UPDATE 語(yǔ)句的非標(biāo)準(zhǔn)實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 深入淺出講解MySQL的并行復(fù)制

    深入淺出講解MySQL的并行復(fù)制

    這篇文章主要給大家介紹了關(guān)于MySQL并行復(fù)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • MySQL Hash索引和B-Tree索引的區(qū)別

    MySQL Hash索引和B-Tree索引的區(qū)別

    MySQL Hash索引和B-Tree索引的區(qū)別究竟在哪里呢?相信很多人都有這樣的疑問(wèn),下文對(duì)兩者的區(qū)別進(jìn)行了詳細(xì)的分析,需要的朋友可以參考下
    2014-03-03
  • MySQL易學(xué)易用之MYSQL不為人知的特性

    MySQL易學(xué)易用之MYSQL不為人知的特性

    MySQL易學(xué)易用,且附帶豐富的技術(shù)文檔,這二個(gè)因素使之被廣泛應(yīng)用。然而,隨著MySQL發(fā)展之迅速,即使一個(gè)MySQL老手有時(shí)也會(huì)為該軟件出其不意的功能感嘆。
    2011-01-01

最新評(píng)論