欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

MySQL8.0新特性--CTE(一)

1、CTE簡介

創(chuàng)新互聯(lián)公司主打移動(dòng)網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、域名與空間、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。

MySQL從8.0開始支持CTE,慢慢地向Oracle學(xué)習(xí),CTE確實(shí)是個(gè)很好用的東西,特別是針對OLAP類型的SQL,可以大大簡化,優(yōu)化SQL.

那么什么是CTE呢?

個(gè)人理解:CTE(common table expression)是一個(gè)臨時(shí)的結(jié)果集,類似一個(gè)函數(shù),一旦定義好,可以多次調(diào)用。

2、CTE語法

with_clause:
    WITH [RECURSIVE]
        cte_name [(col_name [, col_name] ...)] AS (subquery)
        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

(1)列別名可以在不同的位置定義

mysql> WITH cte (col1, col2) AS
    -> (
    ->   SELECT 1, 2
    ->   UNION ALL
    ->   SELECT 3, 4
    -> )
    -> SELECT col1, col2 FROM cte;
+------+------+
| col1 | col2 |
+------+------+
|    1 |    2 |
|    3 |    4 |
+------+------+
2 rows in set (0.00 sec)

等價(jià)與:
mysql> WITH cte AS
    -> (
    ->   SELECT 1 AS col1, 2 AS col2
    ->   UNION ALL
    ->   SELECT 3, 4
    -> )
    -> SELECT col1, col2 FROM cte;
+------+------+
| col1 | col2 |
+------+------+
|    1 |    2 |
|    3 |    4 |
+------+------+
2 rows in set (0.00 sec)

(2) CTE用在Select操作

mysql> create table t1(a int,b int);
mysql> insert into t1 values(1,1),(2,2),(3,3);
mysql> with t as
       (select a+2 c,b from t1) 
       select c,b from t;
+------+------+
| c    | b    |
+------+------+
|    3 |    1 |
|    4 |    2 |
|    5 |    3 |
+------+------+
3 rows in set (0.00 sec)

(3)CTE用在DML操作

mysql> with t as (select a+2 as a,b from t1) update t1,t set t1.a=t.a+10 where t1.a=t.a;
mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
|   13 |    3 |
+------+------+
3 rows in set (0.00 sec)

mysql> with t as (select a+2 as a,b from t1) delete t1 from t1,t where t1.a=t.a;
mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> insert into t1 with t as (select 10*a as a,b from t1) select * from t;
mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
|   10 |    1 |
|   20 |    2 |
|   30 |    3 |
+------+------+
6 rows in set (0.00 sec)

3、CTE可以優(yōu)化SQL

(1)下面第一條SQL可以改寫成如下兩種CTE簡化形式

mysql> select count(*) from employees e1 
       left join (select * from employees) e2 on e1.emp_no=e2.emp_no 
       left join (select * from employees) e3 on e2.emp_no=e3.emp_no;
       

mysql> with e2 as (select * from employees),
            e3 as (select * from employees) 
            select count(*) from employees e1 
            left join e2 on e1.emp_no=e2.emp_no 
            left join e3 on e2.emp_no=e3.emp_no;
            
mysql> with e as(select * from employees) select count(*) from employees e1
        left join e e2 on e1.emp_no=e2.emp_no
        left join e e3 on e2.emp_no=e3.emp_no;

(2)CTE的本質(zhì)是子查詢,所以子查詢的一些特性都適用,如子查詢合并。

mysql> desc with e as(select /*+ set_var(optimizer_switch='derived_merge=off')*/ * from employees)
    -> select count(*) from employees e1
    -> left join e e2 on e1.emp_no=e2.emp_no
    -> left join e e3 on e2.emp_no=e3.emp_no;
+----+-------------+------------+------------+-------+---------------+-------------+---------+------------------+--------+----------+-------------+
| id | select_type | table      | partitions | type  | possible_keys | key         | key_len | ref              | rows   | filtered | Extra       |
+----+-------------+------------+------------+-------+---------------+-------------+---------+------------------+--------+----------+-------------+
|  1 | PRIMARY     | e1         | NULL       | index | NULL          | PRIMARY     | 4       | NULL             | 299512 |   100.00 | Using index |
|  1 | PRIMARY     | <derived2> | NULL       | ref   | <auto_key0>   | <auto_key0> | 4       | testdb.e1.emp_no |     10 |   100.00 | NULL        |
|  1 | PRIMARY     | <derived2> | NULL       | ref   | <auto_key0>   | <auto_key0> | 4       | e2.emp_no        |     10 |   100.00 | NULL        |
|  2 | DERIVED     | employees  | NULL       | ALL   | NULL          | NULL        | NULL    | NULL             | 299512 |   100.00 | NULL        |
+----+-------------+------------+------------+-------+---------------+-------------+---------+------------------+--------+----------+-------------+
4 rows in set, 2 warnings (0.00 sec)

(3)CTE可以起到減少插入臨時(shí)表數(shù)據(jù),優(yōu)化SQL的作用

mysql> flush status;
Query OK, 0 rows affected (0.02 sec)
mysql> select /*+ set_var(optimizer_switch='derived_merge=off')*/ * from
    -> (select * from t_group) t1
    -> join (select * from t_group) t2
    -> on t1.emp_no=t2.emp_no;
+--------+---------+------------+------------+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    | emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+--------+---------+------------+------------+
|  22744 | d006    | 1986-12-01 | 9999-01-01 |  22744 | d006    | 1986-12-01 | 9999-01-01 |
|  24007 | d005    | 1986-12-01 | 9999-01-01 |  24007 | d005    | 1986-12-01 | 9999-01-01 |
|  30970 | d005    | 1986-12-01 | 2017-03-29 |  30970 | d005    | 1986-12-01 | 2017-03-29 |
|  31112 | d002    | 1986-12-01 | 1993-12-10 |  31112 | d002    | 1986-12-01 | 1993-12-10 |
|  40983 | d005    | 1986-12-01 | 9999-01-01 |  40983 | d005    | 1986-12-01 | 9999-01-01 |
|  46554 | d008    | 1986-12-01 | 1992-05-27 |  46554 | d008    | 1986-12-01 | 1992-05-27 |
|  48317 | d008    | 1986-12-01 | 1989-01-11 |  48317 | d008    | 1986-12-01 | 1989-01-11 |
|  49667 | d007    | 1986-12-01 | 9999-01-01 |  49667 | d007    | 1986-12-01 | 9999-01-01 |
|  50449 | d005    | 1986-12-01 | 9999-01-01 |  50449 | d005    | 1986-12-01 | 9999-01-01 |
|  10004 | d004    | 1986-12-01 | 9999-01-01 |  10004 | d004    | 1986-12-01 | 9999-01-01 |
+--------+---------+------------+------------+--------+---------+------------+------------+
10 rows in set (0.00 sec)
mysql> show status like '%handler_write%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Handler_write | 20    |
+---------------+-------+
1 row in set (0.00 sec)


mysql> flush status;
Query OK, 0 rows affected (0.02 sec)
mysql> with t as(select /*+ set_var(optimizer_switch='derived_merge=off')*/ * from t_group)
    -> select * from t t1
    -> join t t2 on t1.emp_no=t2.emp_no;
+--------+---------+------------+------------+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    | emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+--------+---------+------------+------------+
|  22744 | d006    | 1986-12-01 | 9999-01-01 |  22744 | d006    | 1986-12-01 | 9999-01-01 |
|  24007 | d005    | 1986-12-01 | 9999-01-01 |  24007 | d005    | 1986-12-01 | 9999-01-01 |
|  30970 | d005    | 1986-12-01 | 2017-03-29 |  30970 | d005    | 1986-12-01 | 2017-03-29 |
|  31112 | d002    | 1986-12-01 | 1993-12-10 |  31112 | d002    | 1986-12-01 | 1993-12-10 |
|  40983 | d005    | 1986-12-01 | 9999-01-01 |  40983 | d005    | 1986-12-01 | 9999-01-01 |
|  46554 | d008    | 1986-12-01 | 1992-05-27 |  46554 | d008    | 1986-12-01 | 1992-05-27 |
|  48317 | d008    | 1986-12-01 | 1989-01-11 |  48317 | d008    | 1986-12-01 | 1989-01-11 |
|  49667 | d007    | 1986-12-01 | 9999-01-01 |  49667 | d007    | 1986-12-01 | 9999-01-01 |
|  50449 | d005    | 1986-12-01 | 9999-01-01 |  50449 | d005    | 1986-12-01 | 9999-01-01 |
|  10004 | d004    | 1986-12-01 | 9999-01-01 |  10004 | d004    | 1986-12-01 | 9999-01-01 |
+--------+---------+------------+------------+--------+---------+------------+------------+
10 rows in set, 1 warning (0.00 sec)
mysql> show status like '%handler_write%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Handler_write | 10    |
+---------------+-------+
1 row in set (0.00 sec)

CTE除了一般功能外,還可以實(shí)現(xiàn)遞歸一些復(fù)雜SQL需求,參考MySQL 8.0新特性--CTE(二)

參考鏈接

13.2.13 WITH Syntax (Common Table Expressions)

文章標(biāo)題:MySQL8.0新特性--CTE(一)
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article24/joidje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)Google、企業(yè)建站、做網(wǎng)站、網(wǎng)站制作云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
在线免费观看一二区视频| 久久国产亚洲精品赲碰热| 国产又色又爽又黄的精品视频| 日韩成人h视频在线观看| 大香蕉久久精品一区二区字幕| 免费在线成人午夜视频| 亚洲专区一区中文字幕| 99在线视频精品免费播放| 91国内视频一区二区三区| 日韩美女偷拍视频久久| 日本午夜福利视频免费观看| 亚洲欧美日韩在线中文字幕| 日韩丝袜诱惑一区二区| 精品国产91亚洲一区二区三区| 亚洲精品一区二区三区日韩| 中文久久乱码一区二区| 最近的中文字幕一区二区| 日韩三极片在线免费播放| 亚洲中文字幕有码在线观看| 大屁股肥臀熟女一区二区视频| 亚洲男人天堂成人在线视频 | 欧美人与动牲交a精品| 91久久精品国产成人| 激情内射日本一区二区三区| 不卡在线播放一区二区三区| 国产精品亚洲一级av第二区| 真实国产乱子伦对白视频不卡| 精品少妇一区二区视频| 欧美性猛交内射老熟妇| 狠狠亚洲丁香综合久久| 国产熟女一区二区不卡| 日本女人亚洲国产性高潮视频| 91人人妻人人爽人人狠狠| 少妇激情在线免费观看| 在线欧美精品二区三区| 黄片免费在线观看日韩| 国产毛片不卡视频在线| 日本 一区二区 在线| 久久一区内射污污内射亚洲| 国产午夜精品久久福利| 91麻豆视频国产一区二区|