摘要:導(dǎo)語今天在寫的時(shí)候,遇到一個(gè)問題。需求是這樣的,查詢數(shù)據(jù),按照評(píng)分倒序近一周訪問量倒序,這樣進(jìn)行排序。解決辦法呢,就是將條件放到中。參考資料步步深入架構(gòu)總覽查詢執(zhí)行流程解析順序操作中與放置條件的區(qū)別中過濾條件放在和中的區(qū)別。
導(dǎo)語
今天在寫 SQL 的時(shí)候,遇到一個(gè)問題。需求是這樣的,查詢數(shù)據(jù),按照評(píng)分倒序、近一周訪問量倒序,這樣進(jìn)行排序。問題是常規(guī)的寫法,將 day >= xxx 條件放到 where 中, 如果某些數(shù)據(jù)近一周沒有訪問量,那么這條數(shù)據(jù)就查不出來。解決辦法呢,就是將條件放到 LEFT JOIN 中。
MySQL 語句執(zhí)行順序首先先說明一個(gè)概念,MySQL 語句執(zhí)行的順序,并不是按照 SQL 語句的順序。下面是示例 SQL
SELECT DISTINCT < select_list > FROM < left_table > < join_type > JOIN < right_table > ON < join_condition > WHERE < where_condition > GROUP BY < group_by_list > HAVING < having_condition > ORDER BY < order_by_condition > LIMIT < limit_number >
下面是 SQL 的執(zhí)行順序
FROMLEFT JOIN 的作用ON JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY LIMIT
結(jié)果集的不同,不僅與 SQL 的優(yōu)先級(jí)有關(guān),還和 LEFT JOIN 有關(guān)
使用left join時(shí)on后面的條件只對(duì)右表有效
on是在生成臨時(shí)表的時(shí)候使用的條件,不管on的條件是否起到作用,都會(huì)返回左表 (table_name1) 的行。
where則是在生成臨時(shí)表之后使用的條件,此時(shí)已經(jīng)不管是否使用了left join了,只要條件不為真的行,全部過濾掉。
以上是從兩篇資料中摘抄的,可以很好的概括(原文鏈接在下方,其中都有示例)。
參考資料:步步深入:MySQL架構(gòu)總覽->查詢執(zhí)行流程->SQL解析順序、MySQL left join操作中 on與where放置條件的區(qū)別、SQL中過濾條件放在on和where中的區(qū)別。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30027.html
摘要:如果之前對(duì)不同的執(zhí)行結(jié)果沒有概念,可以結(jié)合這篇文章往下看的執(zhí)行順序以下是查詢的通用結(jié)構(gòu)它的執(zhí)行順序如下語句里第一個(gè)被執(zhí)行的總是子句對(duì)左右兩張表執(zhí)行笛卡爾積,產(chǎn)生第一張表。 0 索引 JOIN語句的執(zhí)行順序 INNER/LEFT/RIGHT/FULL JOIN的區(qū)別 ON和WHERE的區(qū)別 1 概述 一個(gè)完整的SQL語句中會(huì)被拆分成多個(gè)子句,子句的執(zhí)行過程中會(huì)產(chǎn)生虛擬表(vt)...
閱讀 2545·2023-04-26 01:44
閱讀 2558·2021-09-10 10:50
閱讀 1411·2019-08-30 15:56
閱讀 2250·2019-08-30 15:44
閱讀 512·2019-08-29 11:14
閱讀 3417·2019-08-26 11:56
閱讀 3018·2019-08-26 11:52
閱讀 909·2019-08-26 10:27