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

王林
發布: 2023-05-29 10:34:13
轉載
1493 人瀏覽過

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關鍵字進行篩選,只有符合條件的才會被篩選到虛表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=&#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;;
set session sql_mode=&#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;;
-- 后执行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解析順序源碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!