91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL之SQL語法及SQL解析順序源碼分析

發布時間:2023-03-30 15:30:03 來源:億速云 閱讀:147 作者:iii 欄目:MySQL數據庫

這篇“MySQL之SQL語法及SQL解析順序源碼分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL之SQL語法及SQL解析順序源碼分析”文章吧。

SQL(Structured Query Language)是一種標準,作為一種訪問【關系型數據庫的標準語言】。許多數據庫產品,如Oracle,DB2,SQL Server,PostgreSQL,MySQL都支持它。近幾年的NoSQL最初是宣稱不再需要SQL,后來也不得不修正為Not Only SQL,來擁抱SQL。

目前比較典型的版本是 SQL 92標準。包括MySql在內的其他數據庫,在SQL 92 或 SQL 99這些標準基礎之上,還擴展了一些自己的SQL語句,如 MySQL中的limit關鍵字。

SQL語言分類

  • DDL

    數據定義語言,用來定義數據庫對象,數據庫,表,列等。如create,alter,drop等

  • DML

    數據操作語言,用來對數據庫中的表的記錄進行更新。如insert,update,delete等

  • DCL

    數據控制語言,用來定義數據庫的訪問權限,安全級別等。如grant等

  • DQL:

    數據查詢語言,用來查詢。如select,from,where等

 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>

# 解析順序
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>  -- 這一步和上一步,會循環執行
WHERE <where_condition> -- 這一步會循環執行,多個條件從左往右
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT   -- 分組之后才執行SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number> -- 這一步是MySQL獨有的語法,前面都是SQL92標準

FROM

對FROM的左表和右表計算笛卡爾積,產生虛表VT1

select * from seller join product;

MySQL之SQL語法及SQL解析順序源碼分析

ON

產生虛表VT1后,通過ON關鍵字進行篩選,只有符合<join_condition>條件的才會被篩選到虛表VT2

select * from seller s join product p on s.id = p.id;

MySQL之SQL語法及SQL解析順序源碼分析

OUTER JOIN

  • LEFT (OUTER) JOIN : 會返回左表(保留表)中全部記錄以及右表中滿足ON條件的記錄

  • RIGHT (OUTER) JOIN : 同理

  • INNTER JOINT : 只返回左右兩表中滿足ON條件的記錄

 若指定了OUTER JOIN(LEFT JOIN,RIGHT JOIN),那么保留表中未匹配ON條件的行,就會作為外部行,添加到虛表VT2中,形成虛表VT3。

select * from seller s right join product p on s.id = p.id;

MySQL之SQL語法及SQL解析順序源碼分析

若FROM子句,包含不止2個表,則會對上一個join連接產生的結果VT3,和下一個表重復執行上面的步驟

WHERE

根據where條件過濾

GROUP BY

對結果進行分組

-- mysql 8 默認開啟了 only_full_group_by
select version(),@@sql_mode;
-- 需要把這個選項關掉,
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- 后執行group by 正常
select * from user group by name;

MySQL之SQL語法及SQL解析順序源碼分析

HAVING

對分組的結果,進行having條件過濾

SELECT

選取指定的列

DISTINCT

針對某列去重
注意DISTINCT 一定要SELECT的第一列,加在后面無效

-- 下面無效
select id, distinct name from user;
-- 下面有效
select distinct name from user;

MySQL之SQL語法及SQL解析順序源碼分析

MySQL之SQL語法及SQL解析順序源碼分析

distinct 后加多列,則是將多列拼接在一起來去重

MySQL之SQL語法及SQL解析順序源碼分析

若想根據某一列去重,并顯示出整行的數據,可以用GROUP BY

ORDER BY

排序

LIMIT

分頁

注意:對于select中的列的別名,只有在order by中才能使用,由上面的SQL解析順序可知

MySQL之SQL語法及SQL解析順序源碼分析

以上就是關于“MySQL之SQL語法及SQL解析順序源碼分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海丰县| 永平县| 靖边县| 游戏| 敦化市| 祁门县| 乐陵市| 方山县| 汾阳市| 公安县| 滨海县| 林甸县| 江孜县| 广宗县| 永定县| 酉阳| 咸阳市| 永泰县| 寿光市| 兴义市| 凌源市| 唐海县| 安义县| 拜泉县| 揭阳市| 板桥市| 外汇| 开化县| 平湖市| 昭觉县| 大理市| 天水市| 侯马市| 舟山市| 峨山| 漾濞| 临潭县| 广河县| 贵定县| 鄢陵县| 太保市|