MySQL學習之SQL語法及SQL解析順序
SQL(Structured Query Language)是一種標準,作為一種訪問【關(guān)系型數(shù)據(jù)庫的標準語言】。許多數(shù)據(jù)庫產(chǎn)品,如Oracle,DB2,SQL Server,PostgreSQL,MySQL都支持它。近幾年的NoSQL最初是宣稱不再需要SQL,后來也不得不修正為Not Only SQL,來擁抱SQL。
目前比較典型的版本是 SQL 92標準。包括MySql在內(nèi)的其他數(shù)據(jù)庫,在SQL 92 或 SQL 99這些標準基礎(chǔ)之上,還擴展了一些自己的SQL語句,如 MySQL中的limit關(guān)鍵字。
SQL語言分類
DDL
數(shù)據(jù)定義語言,用來定義數(shù)據(jù)庫對象,數(shù)據(jù)庫,表,列等。如create,alter,drop等
DML
數(shù)據(jù)操作語言,用來對數(shù)據(jù)庫中的表的記錄進行更新。如insert,update,delete等
DCL
數(shù)據(jù)控制語言,用來定義數(shù)據(jù)庫的訪問權(quán)限,安全級別等。如grant等
DQL:
數(shù)據(jù)查詢語言,用來查詢。如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> -- 這一步和上一步,會循環(huán)執(zhí)行 WHERE <where_condition> -- 這一步會循環(huán)執(zhí)行,多個條件從左往右 GROUP BY <group_by_list> HAVING <having_condition> SELECT -- 分組之后才執(zhí)行SELECT DISTINCT <select_list> ORDER BY <order_by_condition> LIMIT <limit_number> -- 這一步是MySQL獨有的語法,前面都是SQL92標準
FROM
對FROM的左表和右表計算笛卡爾積,產(chǎn)生虛表VT1
select * from seller join product;

ON
產(chǎn)生虛表VT1后,通過ON關(guān)鍵字進行篩選,只有符合<join_condition>條件的才會被篩選到虛表VT2
select * from seller s join product p on s.id = p.id;

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;

若FROM子句,包含不止2個表,則會對上一個join連接產(chǎn)生的結(jié)果VT3,和下一個表重復執(zhí)行上面的步驟
WHERE
根據(jù)where條件過濾
GROUP BY
對結(jié)果進行分組
-- mysql 8 默認開啟了 only_full_group_by select version(),@@sql_mode; -- 需要把這個選項關(guān)掉, 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'; -- 后執(zhí)行g(shù)roup by 正常 select * from user group by name;

HAVING
對分組的結(jié)果,進行having條件過濾
SELECT
選取指定的列
DISTINCT
針對某列去重
注意DISTINCT 一定要SELECT的第一列,加在后面無效
-- 下面無效 select id, distinct name from user; -- 下面有效 select distinct name from user;


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

若想根據(jù)某一列去重,并顯示出整行的數(shù)據(jù),可以用GROUP BY
ORDER BY
排序
LIMIT
分頁
注意:對于select中的列的別名,只有在order by中才能使用,由上面的SQL解析順序可知

到此這篇關(guān)于MySQL學習之QL語法及SQL解析順序的文章就介紹到這了,更多相關(guān)SQL語法及解析順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL MVVC多版本并發(fā)控制的實現(xiàn)詳解
在多版本并發(fā)控制中,為了保證數(shù)據(jù)操作在多線程過程中,保證事務隔離的機制,降低鎖競爭的壓力,保證較高的并發(fā)量。在每開啟一個事務時,會生成一個事務的版本號,被操作的數(shù)據(jù)會生成一條新的數(shù)據(jù)行2022-08-08
MySQL5.7限制general_log日志大小的實現(xiàn)
MySQL5.7.41中為避免通用查詢?nèi)罩緂eneral_log快速增長占用硬盤空間,可以通過定時任務執(zhí)行腳本進行每日備份或清理,從而限制其大小,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-10-10
使用Dify訪問mysql數(shù)據(jù)庫詳細代碼示例
這篇文章主要介紹了使用Dify訪問mysql數(shù)據(jù)庫的相關(guān)資料,并詳細講解了如何在本地搭建數(shù)據(jù)庫訪問服務,使用ngrok暴露到公網(wǎng),并創(chuàng)建知識庫、數(shù)據(jù)庫訪問工作流和智能體,需要的朋友可以參考下2025-03-03
mysql如何在已有數(shù)據(jù)庫上統(tǒng)一字符集
這篇文章主要介紹了mysql如何在已有數(shù)據(jù)庫基礎(chǔ)上換字符集,數(shù)據(jù)庫里面,部分數(shù)據(jù)表和數(shù)據(jù)是latin1的,部分數(shù)據(jù)表和數(shù)據(jù)是UTF8,還有部分表,表結(jié)構(gòu)是utf8而數(shù)據(jù)是latin1,下面說一下,怎么樣字符集統(tǒng)一成utf8,需要的朋友可以參考下2019-06-06
MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析
這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析,并通過實例給大家例句的問題處理辦法,需要的朋友參考學習下。2017-12-12

