MySQL學(xué)習(xí)之SQL語(yǔ)法及SQL解析順序
SQL(Structured Query Language)是一種標(biāo)準(zhǔn),作為一種訪問(wèn)【關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言】。許多數(shù)據(jù)庫(kù)產(chǎn)品,如Oracle,DB2,SQL Server,PostgreSQL,MySQL都支持它。近幾年的NoSQL最初是宣稱不再需要SQL,后來(lái)也不得不修正為Not Only SQL,來(lái)?yè)肀QL。
目前比較典型的版本是 SQL 92標(biāo)準(zhǔn)。包括MySql在內(nèi)的其他數(shù)據(jù)庫(kù),在SQL 92 或 SQL 99這些標(biāo)準(zhǔn)基礎(chǔ)之上,還擴(kuò)展了一些自己的SQL語(yǔ)句,如 MySQL中的limit關(guān)鍵字。
SQL語(yǔ)言分類
DDL
數(shù)據(jù)定義語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象,數(shù)據(jù)庫(kù),表,列等。如create,alter,drop等
DML
數(shù)據(jù)操作語(yǔ)言,用來(lái)對(duì)數(shù)據(jù)庫(kù)中的表的記錄進(jìn)行更新。如insert,update,delete等
DCL
數(shù)據(jù)控制語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限,安全級(jí)別等。如grant等
DQL:
數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢。如select,from,where等
SQL語(yǔ)法順序和解析順序
# 語(yǔ)法順序 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ì)循環(huán)執(zhí)行 WHERE <where_condition> -- 這一步會(huì)循環(huán)執(zhí)行,多個(gè)條件從左往右 GROUP BY <group_by_list> HAVING <having_condition> SELECT -- 分組之后才執(zhí)行SELECT DISTINCT <select_list> ORDER BY <order_by_condition> LIMIT <limit_number> -- 這一步是MySQL獨(dú)有的語(yǔ)法,前面都是SQL92標(biāo)準(zhǔn)
FROM
對(duì)FROM的左表和右表計(jì)算笛卡爾積,產(chǎn)生虛表VT1
select * from seller join product;
ON
產(chǎn)生虛表VT1后,通過(guò)ON關(guān)鍵字進(jìn)行篩選,只有符合<join_condition>條件的才會(huì)被篩選到虛表VT2
select * from seller s join product p on s.id = p.id;
OUTER JOIN
LEFT (OUTER) JOIN : 會(huì)返回左表(保留表)中全部記錄以及右表中滿足ON條件的記錄
RIGHT (OUTER) JOIN : 同理
INNTER JOINT : 只返回左右兩表中滿足ON條件的記錄
若指定了OUTER JOIN(LEFT JOIN,RIGHT JOIN),那么保留表中未匹配ON條件的行,就會(huì)作為外部行,添加到虛表VT2中,形成虛表VT3。
select * from seller s right join product p on s.id = p.id;
若FROM子句,包含不止2個(gè)表,則會(huì)對(duì)上一個(gè)join連接產(chǎn)生的結(jié)果VT3,和下一個(gè)表重復(fù)執(zhí)行上面的步驟
WHERE
根據(jù)where條件過(guò)濾
GROUP BY
對(duì)結(jié)果進(jìn)行分組
-- mysql 8 默認(rèn)開(kāi)啟了 only_full_group_by select version(),@@sql_mode; -- 需要把這個(gè)選項(xiàng)關(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
對(duì)分組的結(jié)果,進(jìn)行having條件過(guò)濾
SELECT
選取指定的列
DISTINCT
針對(duì)某列去重
注意DISTINCT 一定要SELECT的第一列,加在后面無(wú)效
-- 下面無(wú)效 select id, distinct name from user; -- 下面有效 select distinct name from user;
distinct 后加多列,則是將多列拼接在一起來(lái)去重
若想根據(jù)某一列去重,并顯示出整行的數(shù)據(jù),可以用GROUP BY
ORDER BY
排序
LIMIT
分頁(yè)
注意:對(duì)于select中的列的別名,只有在order by中才能使用,由上面的SQL解析順序可知
到此這篇關(guān)于MySQL學(xué)習(xí)之QL語(yǔ)法及SQL解析順序的文章就介紹到這了,更多相關(guān)SQL語(yǔ)法及解析順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中order by在子查詢中失效的問(wèn)題解決方案
這篇文章主要介紹了MySQL中order by在子查詢中失效的問(wèn)題解決,文中補(bǔ)充介紹了Mysql 5.7版本導(dǎo)致的子查詢order by排序無(wú)效問(wèn)題的探究,需要的朋友可以參考下2023-07-07Centos7.3下mysql5.7.18安裝并修改初始密碼的方法
這篇文章主要為大家詳細(xì)介紹了Centos7.3下mysql5.7.18安裝并修改初始密碼的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06mysql 實(shí)現(xiàn)設(shè)置多個(gè)主鍵的操作
這篇文章主要介紹了mysql 實(shí)現(xiàn)設(shè)置多個(gè)主鍵的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式
前段時(shí)間在項(xiàng)目開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)了系統(tǒng)異常,打開(kāi)日志查看發(fā)現(xiàn)了如下的這個(gè)報(bào)錯(cuò),查找相關(guān)資料終于解決了,這篇文章主要給大家介紹了關(guān)于mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式的相關(guān)資料,需要的朋友可以參考下2024-01-01深度解析MySQL啟動(dòng)時(shí)報(bào)“The server quit without updating PID file”錯(cuò)誤的原
這篇文章主要介紹了MySQL啟動(dòng)時(shí)報(bào)“The server quit without updating PID file”錯(cuò)誤的原因,需要的朋友可以參考下2017-05-05MySQL數(shù)據(jù)庫(kù)10秒內(nèi)插入百萬(wàn)條數(shù)據(jù)的實(shí)現(xiàn)
假設(shè)現(xiàn)在我們要向mysql插入500萬(wàn)條數(shù)據(jù),如何實(shí)現(xiàn)高效快速的插入進(jìn)去?本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-10-10mysql unsigned 用法及相減出現(xiàn)補(bǔ)數(shù)溢出解決方法
unsigned表示無(wú)符號(hào)的意思,也就是非負(fù)數(shù),只用于整型并且unsigned 是MYSQL自定義的類型,非標(biāo)準(zhǔn)SQL。用途1是紅苕說(shuō)的起到約束數(shù)值的作用,2是可以增加數(shù)值范圍(相當(dāng)于把負(fù)數(shù)那部分加到正數(shù)上)。不過(guò)少用,不方便移植2012-04-04解讀索引列中有null值會(huì)不會(huì)使索引失效
這篇文章主要介紹了解讀索引列中有null值會(huì)不會(huì)使索引失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12