Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解...
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
 查詢數(shù)據(jù)指從數(shù)據(jù)庫中獲取所需要的數(shù)據(jù)。查詢數(shù)據(jù)是數(shù)據(jù)庫操作中最常用,也是最重要的操作。用戶可以根據(jù)自己對數(shù)據(jù)的需求,使用不同的查詢方式。通過不同的查詢方式,可以獲得不同的數(shù)據(jù)。MySQL中是使用SELECT語句來查詢數(shù)據(jù)的。在這一章中將講解的內(nèi)容包括。
 1、查詢語句的基本語法
 2、在單表上查詢數(shù)據(jù)
 3、使用聚合函數(shù)查詢數(shù)據(jù)
 4、多表上聯(lián)合查詢
 5、子查詢
 6、合并查詢結(jié)果
 7、為表和字段取別名
 8、使用正則表達(dá)式查詢
什么是查詢?
 
怎么查的?
 
 數(shù)據(jù)的準(zhǔn)備如下:
[sql]? view plain copy
然后這是學(xué)生成績表,其中定義了外鍵約束
[sql]? view plain copy
一、查詢語句的基本語法
查詢數(shù)據(jù)是指從數(shù)據(jù)庫中的數(shù)據(jù)表或視圖中獲取所需要的數(shù)據(jù),在MySQL中,可以使用SELECT語句來查詢數(shù)據(jù)。根據(jù)查詢條件的不同,數(shù)據(jù)庫系統(tǒng)會找到不同的數(shù)據(jù)。
SELECT語句的基本語法格式如下:
[sql]? view plain copy- 屬性列表:表示需要查詢的字段名。
- 表名或視圖列表:表示即將進(jìn)行數(shù)據(jù)查詢的數(shù)據(jù)表或者視圖,表或視圖可以有多個(gè)。
- 條件表達(dá)式1:設(shè)置查詢的條件。
- 屬性名1:表示按該字段中的數(shù)據(jù)進(jìn)行分組。
- 條件表達(dá)式2:表示滿足該表達(dá)式的數(shù)據(jù)才能輸出。
- 屬性2:表示按該字段中的數(shù)據(jù)進(jìn)行排序,排序方式由ASC或DESC參數(shù)指定。
- ASC:表示按升序的順序進(jìn)行排序。即表示值按照從小到大的順序排列。這是默認(rèn)參數(shù)。
- DESC:表示按降序的順序進(jìn)行排序。即表示值按照從大到小的順序排列。
如果有WHERE子句,就按照“條件表達(dá)式1”指定的條件進(jìn)行查詢;如果沒有WHERE子句,就查詢所有記錄。
如果有GROUP BY子句,就按照“屬性名1”指定的字段進(jìn)行分組;如果GROUP BY子句后面帶著HAVING關(guān)鍵字,那么只有滿足“條件表達(dá)式2”中指定的條件的記錄才能夠輸出。GROUP BY子句通常和COUNT()、SUM()等聚合函數(shù)一起使用。
如果有ORDER BY子句,就按照“屬性名2”指定的字段進(jìn)行排序。排序方式由ASC或DESC參數(shù)指定。默認(rèn)的排序方式為ASC。
二、在單表上查詢數(shù)據(jù)
2.1、查詢所有字段
[sql]? view plain copy
 ??
2.2、按條件查詢
 
(1) 比較運(yùn)算符 ? ? > , ?< ,= ?, != (< >),>= ? , ? <=??
[sql]? view plain copy
?in(v1,v2..vn)? ,符合v1,v2,,,vn才能被查出
IN關(guān)鍵字可以判斷某個(gè)字段的值是否在指定的集合中。如果字段的值在集合中,則滿足查詢條件,該紀(jì)錄將被查詢出來。如果不在集合中,則不滿足查詢條件。其語法規(guī)則如下:[ NOT ] IN ( 元素1, 元素2, …, 元素n )?
[sql]? view plain copy
?between v1 and v2 ? ?在v1至v2之間(包含v1,v2)
BETWEEN AND關(guān)鍵字可以判讀某個(gè)字段的值是否在指定的范圍內(nèi)。如果字段的值在指定范圍內(nèi),則滿足查詢條件,該紀(jì)錄將被查詢出來。如果不在指定范圍內(nèi),則不滿足查詢條件。其語法規(guī)則如下:
[ NOT ] BETWEEN 取值1 AND 取值2?
[sql]? view plain copy
(2)邏輯運(yùn)算符 not ( ! ) ?邏輯非
[sql]? view plain copy
 
OR關(guān)鍵字也可以用來聯(lián)合多個(gè)條件進(jìn)行查詢,但是與AND關(guān)鍵字不同。使用OR關(guān)鍵字時(shí),只要滿足這幾個(gè)查詢條件的其中一個(gè),這樣的記錄將會被查詢出來。如果不滿足這些查詢條件中的任何一個(gè),這樣的記錄將被排除掉。OR關(guān)鍵字的語法規(guī)則如下:
條件表達(dá)式1 OR 條件表達(dá)式2 [ …OR 條件表達(dá)式n ]
其中,OR可以用來連接兩個(gè)條件表達(dá)式。而且,可以同時(shí)使用多個(gè)OR關(guān)鍵字,這樣可以連接更多的條件表達(dá)式。
[sql]? view plain copy
?and ( && ) ?邏輯與
AND關(guān)鍵字可以用來聯(lián)合多個(gè)條件進(jìn)行查詢。使用AND關(guān)鍵字時(shí),只有同時(shí)滿足所有查詢條件的記錄會被查詢出來。如果不滿足這些查詢條件的其中一個(gè),這樣的記錄將被排除掉。AND關(guān)鍵字的語法規(guī)則如下:
條件表達(dá)式1 AND 條件表達(dá)式2 [ … AND 條件表達(dá)式n ]
其中,AND可以連接兩個(gè)條件表達(dá)式。而且,可以同時(shí)使用多個(gè)AND關(guān)鍵字,這樣可以連接更多的條件表達(dá)式。
(3)模糊查詢 like 像
LIKE關(guān)鍵字可以匹配字符串是否相等。如果字段的值與指定的字符串相匹配,則滿足查詢條件,該紀(jì)錄將被查詢出來。如果與指定的字符串不匹配,則不滿足查詢條件。其語法規(guī)則如下:[ NOT ] LIKE '字符串'?
“NOT”可選參數(shù),加上 NOT表示與指定的字符串不匹配時(shí)滿足條件;“字符串”表示指定用來匹配的字符串,該字符串必須加單引號或雙引號。
通配符: ?% ?任意字符
[sql]? view plain copy
[sql]? view plain copy
?_? 單個(gè)字符 比如說插入
[sql]? view plain copy
然后
[sql]? view plain copy
 
 但是如果下后面加兩個(gè)_符號?
[sql]? view plain copy
 
 “字符串”參數(shù)的值可以是一個(gè)完整的字符串,也可以是包含百分號(%)或者下劃線(_)的通配字符。二者有很大區(qū)別
 “%”可以代表任意長度的字符串,長度可以為0;
 “_”只能表示單個(gè)字符。
 如果要匹配姓張且名字只有兩個(gè)字的人的記錄,“張”字后面必須要有兩個(gè)“_”符號。因?yàn)橐粋€(gè)漢字是兩個(gè)字符,而一個(gè)“_”符號只能代表一個(gè)字符。
 (4)空值查詢
 IS NULL關(guān)鍵字可以用來判斷字段的值是否為空值(NULL)。如果字段的值是空值,則滿足查詢條件,該記錄將被查詢出來。如果字段的值不是空值,則不滿足查詢條件。其語法規(guī)則如下:
 IS [ NOT ] NULL
 其中,“NOT”是可選參數(shù),加上NOT表示字段不是空值時(shí)滿足條件。
 IS NULL是一個(gè)整體,不能將IS換成”=”.
三、使用聚合函數(shù)查詢數(shù)據(jù)
3.1、group by 分組
如下:
[sql]? view plain copy
 
 如果想看分組的內(nèi)容,可以加groub_concat?
[sql]? view plain copy
3.2、一般情況下group需與統(tǒng)計(jì)函數(shù)(聚合函數(shù))一起使用才有意義
?先準(zhǔn)備一些數(shù)據(jù):
[sql]? view plain copy
 mysql中的五種統(tǒng)計(jì)函數(shù):
 (1)max:求最大值
 求每個(gè)部門的最高工資:
[sql]? view plain copy
 
(2)min:求最小值
求每個(gè)部門的最仰工資:
[sql]? view plain copy
 
?(3)sum:求總數(shù)和
求每個(gè)部門的工資總和:
[sql]? view plain copy
 
(4)avg:求平均值
求每個(gè)部門的工資平均值
[sql]? view plain copy
 
(5)count:求總行數(shù)
 求每個(gè)部門工資大于一定金額的人數(shù)
[sql]? view plain copy
 
3.3、帶條件的groub by 字段 having,利用HAVING語句過濾分組數(shù)據(jù)
 having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組,也可以使用多個(gè)分組標(biāo)準(zhǔn)進(jìn)行分組。
 having 子句被限制子已經(jīng)在SELECT語句中定義的列和聚合表達(dá)式上。通常,你需要通過在HAVING子句中重復(fù)聚合函數(shù)表達(dá)式來引用聚合值,就如你在SELECT語句中做的那樣。
[sql]? view plain copy
 
四、多表上聯(lián)合查詢
 多表上聯(lián)合查詢分為內(nèi)連接查詢和外連接查詢
(1)隱式內(nèi)連接查詢
[sql]? view plain copy
 
(2)顯式內(nèi)連接查詢
[sql]? view plain copy
 
用法:select .... from 表1 inner join 表2 on 條件表達(dá)式
(3)外連接查詢
 left join.左連接查詢。
 用法 :select .... from 表1 left join 表2 on 條件表達(dá)式
意思是表1查出來的數(shù)據(jù)不能為null,但是其對應(yīng)表2的數(shù)據(jù)可以為null
[sql]? view plain copy
right join就是相反的了,用法相同
用left join的時(shí)候,left join操作符左側(cè)表里的信息都會被查詢出來,右側(cè)表里沒有的記錄會填空(NULL).right join亦然;inner join的時(shí)候則只有條件合適的才會顯示出來
 full join()
 完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)
 值。
 ????? 僅當(dāng)至少有一個(gè)同屬于兩表的行符合聯(lián)接條件時(shí),內(nèi)聯(lián)接才返回行。內(nèi)聯(lián)接消除與另一個(gè)表中的任何行不匹配的行。而外聯(lián)接會返回 FROM 子句中提到的至少一個(gè)表或
 視圖的所有行,只要這些行符合任何 WHERE 或 HAVING 搜索條件。將檢索通過左向外聯(lián)接引用的左表的所有行,以及通過右向外聯(lián)接引用的右表的所有行。完整外
 部聯(lián)接中兩個(gè)表的所有行都將返回。
五、子查詢
以一個(gè)查詢select的結(jié)果作為另一個(gè)查詢的條件
 語法:select * from 表1 wher 條件1(select ..from 表2 where 條件2)
1、與In結(jié)合
[sql]? view plain copy
 
 
2、與EXISTS結(jié)合
EXISTS和NOT EXISTS操作符只測試某個(gè)子查詢是否返回了數(shù)據(jù)行。如果是,EXISTS將是true,NOT EXISTS將是false。
[sql]? view plain copy
 
 3、ALL、ANY和SOME子查詢
 any和all的操作符常見用法是結(jié)合一個(gè)相對比較操作符對一個(gè)數(shù)據(jù)列子查詢的結(jié)果進(jìn)行測試。它們測試比較值是否與子查詢所返回的全部或一部分值匹配。比方說,如果比較值小于或等于子查詢所返回的每一個(gè)值,<=all將是true,只要比較值小于或等于子查詢所返回的任何一個(gè)值,<=any將是true。some是any的一個(gè)同義詞。
[sql]? view plain copy
 
只要學(xué)號大于上面的任意一個(gè)就顯示出來:
[sql]? view plain copy
 
六、合并查詢結(jié)果
 合并查詢結(jié)果是將多個(gè)SELECT語句的查詢結(jié)果合并到一起。因?yàn)槟撤N情況下,需要將幾個(gè)SELECT語句查詢出來的結(jié)果合并起來顯示。
 使用UNION關(guān)鍵字時(shí),數(shù)據(jù)庫系統(tǒng)會將所有的查詢結(jié)果合并到一起,然后去除掉相同的記錄。而UNION ALL關(guān)鍵字則只是簡單的合并到一起。其語法規(guī)則如下:
七、排序與取數(shù)
7.1、order by
 (1) order by price //默認(rèn)升序排列
 (2)order by price desc //降序排列
 (3)order by price asc //升序排列,與默認(rèn)一樣
 (4)order by rand() //隨機(jī)排列,效率不高
[sql]? view plain copy
默認(rèn)是按升序的,
也可以這么寫
[sql]? view plain copy
 如果想換成降序的:
[sql]? view plain copy
 
7.2、limit
 limit [offset,] N
 offset 偏移量,可選,不寫則相當(dāng)于limit 0,N
 N 取出條目?
取分?jǐn)?shù)最高的前5條
[sql]? view plain copy
 
取分?jǐn)?shù)最低的前5條
[sql]? view plain copy
 
取分?jǐn)?shù)排名在10-15之間的5條
[sql]? view plain copy
 
 
 
八、為表和字段取別名
使用AS來命名列
[sql]? view plain copy 
 當(dāng)表的名稱特別長時(shí),在查詢中直接使用表名很不方便。這時(shí)可以為表取一個(gè)別名。用這個(gè)別名來代替表的名稱。
 MySQL中為表取別名的基本形式如下:
 表名 表的別名
 
九、使用正則表達(dá)式查詢
 ??????? 正則表達(dá)式是用某種模式去匹配一類字符串的一個(gè)方式。例如,使用正則表達(dá)式可以查詢出包含A、B、C其中任一字母的字符串。正則表達(dá)式的查詢能力比通配字符的查詢能力更強(qiáng)大,而且更加的靈活。正則表達(dá)式可以應(yīng)用于非常復(fù)雜查詢。
 MySQL中,使用REGEXP關(guān)鍵字來匹配查詢正則表達(dá)式。其基本形式如下:
 屬性名 REGEXP '匹配方式'
 
在使用前先插入一些數(shù)據(jù):
[sql]? view plain copy
 (1)使用字符“^”可以匹配以特定字符或字符串開頭的記錄。
 查詢所有以阿頭的
[sql]? view plain copy
以數(shù)字開頭
[sql]? view plain copy
 
(2)使用字符“$”可以匹配以特定字符或字符串結(jié)尾的記錄
以數(shù)字結(jié)尾
[sql]? view plain copy
 
 (3)用正則表達(dá)式來查詢時(shí),可以用“.”來替代字符串中的任意一個(gè)字符。
 
 (4)使用方括號([])可以將需要查詢字符組成一個(gè)字符集。只要記錄中包含方括號中的任意字符,該記錄將會被查詢出來。
 例如,通過“[abc]”可以查詢包含a、b、c這三個(gè)字母中任何一個(gè)的記錄。
 使用方括號可以指定集合的區(qū)間。
 “[a-z]”表示從a-z的所有字母;
 “[0-9]”表示從0-9的所有數(shù)字;
 “[a-z0-9]”表示包含所有的小寫字母和數(shù)字。
 “[a-zA-Z]”表示匹配所有字母。
 
使用“[^字符集合]”可以匹配指定字符以外的字符
 (5){}表示出現(xiàn)的次數(shù)
 正則表達(dá)式中,“字符串{M}”表示字符串連續(xù)出現(xiàn)M次;“字符串{M,N}”表示字符串聯(lián)連續(xù)出現(xiàn)至少M(fèi)次,最多N次。例如,“ab{2}”表示字符串“ab”連續(xù)出現(xiàn)兩次。“ab{2,4}”表示字符串“ab”連續(xù)出現(xiàn)至少兩次,最多四次。
o出現(xiàn)2次
[sql]? view plain copy
 (6)+表示到少出現(xiàn)一次
 fa至少出現(xiàn)一次
[sql]? view plain copy
 ???????
 ?注意:??
 ?????? 正則表達(dá)式可以匹配字符串。當(dāng)表中的記錄包含這個(gè)字符串時(shí),就可以將該記錄查詢出來。如果指定多個(gè)字符串時(shí),需要用符號“|”隔開。只要匹配這些字符串中的任意一個(gè)即可。每個(gè)字符串與”|”之間不能有空格。因?yàn)?#xff0c;查詢過程中,數(shù)據(jù)庫系統(tǒng)會將空格也當(dāng)作一個(gè)字符。這樣就查詢不出想要的結(jié)果。
 正則表達(dá)式中,“*”和“+”都可以匹配多個(gè)該符號之前的字符。但是,“+”至少表示一個(gè)字符,而“*”可以表示零個(gè)字符。
轉(zhuǎn)載于:https://my.oschina.net/zhanghaiyang/blog/606371
總結(jié)
以上是生活随笔為你收集整理的Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 使软件可二次开发_基于C++的?UG二次
- 下一篇: 西门子上升沿指令_西门子SCL编程实例—
