最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 橫向衍生表(Lateral Derived Tables)的實現(xiàn)

 更新時間:2025年06月11日 11:45:32   作者:V1ncent-CC  
橫向衍生表適用于在需要通過子查詢獲取中間結(jié)果集的場景,相對于普通衍生表,橫向衍生表可以引用在其之前出現(xiàn)過的表名,本文就來介紹一下MySQL 橫向衍生表(Lateral Derived Tables)的實現(xiàn),感興趣的可以了解一下

前面我們介紹過MySQL中的衍生表(From子句中的子查詢)和它的局限性,MySQL8.0.14引入了橫向衍生表,可以在子查詢中引用前面出現(xiàn)的表,即根據(jù)外部查詢的每一行動態(tài)生成數(shù)據(jù),這個特性在衍生表非常大而最終結(jié)果集不需要那么多數(shù)據(jù)的場景使用,可以大幅降低執(zhí)行成本。

衍生表的基礎(chǔ)介紹:
MySQL 衍生表(Derived Tables)

一、橫向衍生表用法示例

橫向衍生表適用于在需要通過子查詢獲取中間結(jié)果集的場景,相對于普通衍生表,橫向衍生表可以引用在其之前出現(xiàn)過的表名,這意味著如果外部表上有高效的過濾條件,那么在生成衍生表時就可以利用這些條件,相當于將外層的條件提前應(yīng)用到子查詢中。

先創(chuàng)建示例數(shù)據(jù),有2張表,一張存儲科目和代課老師(Subject表),一張存儲學生的成績(Exam表) :

create table subject(
id int not null primary key,
sub_name varchar(12),
teacher varchar(12));

insert into subject values (1,'語文','王老師'),(2,'數(shù)學','張老師');

create table exam(
id int not null auto_increment primary key,
subject_id int,
student varchar(12),
score int);

insert into exam values(null,1,'小紅',87);
insert into exam values(null,1,'小橙',98);
insert into exam values(null,1,'小黃',89);
insert into exam values(null,1,'小綠',98);
insert into exam values(null,2,'小青',77);
insert into exam values(null,2,'小藍',83);
insert into exam values(null,2,'小紫',99);

select * from subject;
select * from exam;

在這里插入圖片描述

1.1 用法示例

現(xiàn)需要查詢每個代課老師得分最高的學生及分數(shù)。這個問題需要分為兩步:
1.通過對exam表進行分組,找出每個科目的最高分數(shù)。
2.通過subject_id和最高分數(shù),找到具體的學生和老師。

通過普通衍生表,SQL的寫法如下:

select s.teacher,e.student,e.score
from subject s
join exam e on e.subject_id=s.id
join (select subject_id, max(score) highest_score from exam group by subject_id) best 
on best.subject_id=e.subject_id and best.highest_score=e.score;

在這里插入圖片描述

  • 通過衍生表best,首先查出每個科目的最高最高分數(shù)。
  • 將衍生表與原表連接,查出最高分數(shù)對應(yīng)的學生和老師。

橫向衍生表通過在普通衍生表前面添加lateral關(guān)鍵字,然后就可以引用在from子句之前出現(xiàn)的表,這個例子中具體的表現(xiàn)是在衍生表中和exam進行了關(guān)聯(lián)。

select s.teacher,e.student,e.score
from subject s
join exam e on e.subject_id=s.id
join lateral (select subject_id, max(score) highest_score from exam where exam.subject_id=e.subject_id group by e.subject_id) best 
on best.highest_score=e.score;

在這里插入圖片描述

1.2 使用建議

橫向衍生表特性作為普通衍生表的補充,其本質(zhì)就是關(guān)聯(lián)子查詢,可以提升特定場景下查詢性能。

上面的案例中:

  • 如果exam表非常大,而查詢結(jié)果僅涉及小部分科目,那么衍生表就沒必要對全部的exam數(shù)據(jù)進行分組,利用橫向生成衍生表時可以直接過濾出這小部分科目的數(shù)據(jù),然后再分組,此時橫向衍生表性能更優(yōu)。
  • 如果exam表比較小,或者查詢結(jié)果覆蓋了大部分科目,那么一次性生成中間結(jié)果集成本更低,那么普通衍生表性能更優(yōu)。

 到此這篇關(guān)于MySQL 橫向衍生表(Lateral Derived Tables)的實現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL 橫向衍生表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 使用mysqldump對MySQL的數(shù)據(jù)進行備份的操作教程

    使用mysqldump對MySQL的數(shù)據(jù)進行備份的操作教程

    這篇文章主要介紹了使用mysqldump對MySQL的數(shù)據(jù)進行備份的操作教程,示例環(huán)境基于CentOS操作系統(tǒng),需要的朋友可以參考下
    2015-12-12
  • MySQL?Prepared?Statement?預處理的操作方法

    MySQL?Prepared?Statement?預處理的操作方法

    預處理語句是一種在數(shù)據(jù)庫管理系統(tǒng)中使用的編程概念,用于執(zhí)行對數(shù)據(jù)庫進行操作的?SQL?語句,這篇文章主要介紹了MySQL?Prepared?Statement?預處理?,需要的朋友可以參考下
    2024-08-08
  • 簡單談?wù)凪ySQL的loose index scan

    簡單談?wù)凪ySQL的loose index scan

    各種資料關(guān)于loose index scan的解釋很拗口,其實等同于oracle的index skip scan。今天我們就來詳細看看loose index scan的使用
    2015-12-12
  • jdbc調(diào)用mysql存儲過程實現(xiàn)代碼

    jdbc調(diào)用mysql存儲過程實現(xiàn)代碼

    接下來將介紹下mysql存儲過程的創(chuàng)建及調(diào)用,調(diào)用時涉及到j(luò)dbc的知識,不熟悉的朋友還要溫習下jdbc哦,話不多說看代碼,希望可以幫助到你
    2013-03-03
  • 使用存儲過程實現(xiàn)循環(huán)插入100條記錄

    使用存儲過程實現(xiàn)循環(huán)插入100條記錄

    本節(jié)主要介紹了使用存儲過程實現(xiàn)循環(huán)插入100條記錄的具體實現(xiàn),需要的朋友可以參考下
    2014-07-07
  • mysql的日期和時間函數(shù)大全

    mysql的日期和時間函數(shù)大全

    mysql的日期和時間函數(shù) 這里是一個使用日期函數(shù)的例子。下面的查詢選擇所有 date_col 值在最后 30 天內(nèi)的記錄。
    2008-04-04
  • MySQL函數(shù)date_format()日期格式轉(zhuǎn)換的實現(xiàn)

    MySQL函數(shù)date_format()日期格式轉(zhuǎn)換的實現(xiàn)

    本文主要介紹了MySQL函數(shù)date_format()日期格式轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • mysql 5.7更改數(shù)據(jù)庫的數(shù)據(jù)存儲位置的解決方法

    mysql 5.7更改數(shù)據(jù)庫的數(shù)據(jù)存儲位置的解決方法

    隨著MySQL數(shù)據(jù)庫存儲的數(shù)據(jù)逐漸變大,已經(jīng)將原來的存儲數(shù)據(jù)的空間占滿了,導致mysql已經(jīng)鏈接不上了。所以要給存放的數(shù)據(jù)換個地方,下面小編給大家分享mysql 5.7更改數(shù)據(jù)庫的數(shù)據(jù)存儲位置的解決方法,一起看看吧
    2017-04-04
  • mysql命令行下用戶管理方法分享

    mysql命令行下用戶管理方法分享

    如果有mysql管理工具phpmyadmin的話,我們可以通過圖形畫界面來對用戶進行管理,但是如果沒有phpmyadmin這樣的管理工具怎么辦呢
    2012-07-07
  • 經(jīng)典mysql連接查詢例題

    經(jīng)典mysql連接查詢例題

    本文通過一個有趣的例子向我們介紹了mysql連接查詢,采用了子查詢和連接查詢混合和多次連接查詢,需要的朋友可以參考下
    2015-07-07

最新評論

尼玛县| 新闻| 光山县| 湖州市| 收藏| 五峰| 安达市| 长泰县| 清徐县| 新密市| 河源市| 日喀则市| 永善县| 渝中区| 清水县| 新津县| 博白县| 察隅县| 靖江市| 喀什市| 绩溪县| 阿尔山市| 田阳县| 许昌市| 湛江市| 乌鲁木齐市| 堆龙德庆县| 南阳市| 甘洛县| 平谷区| 襄垣县| 木兰县| 霍山县| 五莲县| 新郑市| 商水县| 广饶县| 徐闻县| 桂平市| 云阳县| 衡东县|