前言
上文我們已經講解了MySQL/MariaDB的基礎知識和DDL相關操作,接下來我們來說一下MySQL/MariaDB的DML操作,因select查詢較複雜也較重要,是以本文主要是對select查詢的詳解。
DML操作
DML之select
投影查詢
1
2
3
4
<code>select</code> <code>col_name,[col_name1,...] from table_name;</code>
<code>select</code> <code>* from table_name ;</code><code>#顯示全表</code>
<code>周遊整張資料表,但對系統資源消耗較大,再進行大資料量的查詢時,禁止使用這類操作</code>
條件查詢
5
6
7
8
9
10
11
12
13
14
15
16
<code>select</code> <code>col_name,[col_name1,...] from table_name where where_definition</code>
<code>#條件比較操作符</code>
<code>= </code><code>#等值比較</code>
<code><=> </code><code>#等值比較,包括與NULL的安全比較</code>
<code><>或!= </code><code>#不等值比較</code>
<code><,<=,>,>= </code><code>#其它比較符</code>
<code>IN </code><code>#指定範圍内值的存在性測試</code>
<code>BETWEEN … AND … </code><code>#在某取值範圍内</code>
<code>IS NULL </code><code>#是否為空值</code>
<code>IS NOT NULL </code><code>#是否為非空</code>
<code>LIKE </code><code>#可使用通配符:%, _</code>
<code>RLIKE或REGEXP </code><code>#可使用正規表達式的模式</code>
<code>#邏輯操作符</code>
<code>AND </code>
<code>OR</code>
<code>NOT</code>
聚合查詢
<code>AVG():平均值 </code>
<code>SUM():總和</code>
<code>MAX():最大值</code>
<code>MIN():最小值</code>
<code>COUNT():記錄總數</code>
子句修飾符
<code>GROUP BY </code><code>#對符合條件的結果進行分組</code>
<code>HAVING: 對聚合查詢的結果做過濾</code>
<code>ORDER BY col1[,col2] {ASC|DESC} </code><code>#排序</code>
<code>LIMIT [Offset,]count </code><code>#限制輸出行數</code>
select執行流程
<code>FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY --> SELECT --> LIMIT</code>
連接配接查詢
事先将兩張或多張表執行相應的join操作,而後根據join結果做查詢
<code>CROSS JOIN:笛卡爾積,交叉連接配接</code>
<code>select</code> <code>* from tab1,tab2; </code>
<code>INNER JOIN:内連接配接</code>
<code>#等值連接配接</code>
<code>select</code> <code>* from tab1 inner </code><code>join</code> <code>tab2 on tab1.col_name = tab2.col_name</code>
<code>OUTER JOIN:外連接配接</code>
<code>LEFT OUTER JOIN:左外連接配接</code>
<code>select</code> <code>s.name as student,t.name as teacher from students as s lift </code><code>join</code> <code>teachers as t </code>
<code>on s.TeacherID = t.TID; </code>
<code>RIGHT OUTER JOIN:右外連接配接 </code>
<code>select</code> <code>s.name as student,t.name as teacher from students as s right </code><code>join</code> <code>teachers as t</code>
<code>on s.TeacherID = t.TID; </code>
<code>NATURAL JOIN:自然連接配接,等值連接配接</code>
<code>select</code> <code>tab1.col_name,tab2.col_name from tab1,tab2 where tab1.col_name = tab2.col_name;</code>
子查詢
基于某查詢語句的結果再次進行的查詢
用于where子句的子查詢
<code>①用于比較表達式中的子查詢</code>
<code>要求子查詢隻能傳回單個結果 </code>
<code>select</code> <code>Name,Age from students where Age > (</code><code>select</code> <code>AVG(Age) from students);</code>
<code>②用于</code><code>in</code><code>中的子查詢</code>
<code>判斷是否存在于指定的清單中</code>
<code>select</code> <code>Name from students where StuID </code><code>in</code> <code>(</code><code>select</code> <code>TID from teschers);</code>
<code>③用于exists中子查詢</code>
用于from中的子查詢
<code>select</code> <code>alias</code><code>.col,... from (</code><code>select</code> <code>statement) as </code><code>alias</code> <code>where clause</code>
<code>select</code> <code>s.Name from (</code><code>select</code> <code>* from students where Age > 20) as s where s.Name like </code><code>'s%'</code><code>;</code>
注:MySQL/MariaDB在子查詢優化方面并不成熟,是以盡量避免使用子查詢
聯合查詢
将兩外或多個傳回值字段相同的查詢的結果合并輸出
<code>select</code> <code>statement union </code><code>select</code> <code>statement</code>
<code>select</code> <code>Name,Age from teachers where Age>=40 union </code><code>select</code> <code>Name,Age from students where Age>=40;</code>
select實戰
<code>表結構</code>
<a href="http://s3.51cto.com/wyfs02/M00/6C/75/wKioL1VJ3PvQAmUpAAKjBbhoib8087.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/6C/79/wKiom1VJ26DRdh3NAAH7mRXXnIA739.jpg" target="_blank"></a>
<code>以ClassID分組,顯示每班的同學的人數</code>
<a href="http://s3.51cto.com/wyfs02/M01/6C/79/wKiom1VJ29vRLcI6AACq3EN5vzA400.jpg" target="_blank"></a>
<code>以Gender分組,顯示其年齡之和</code>
<a href="http://s3.51cto.com/wyfs02/M00/6C/79/wKiom1VJ3IvxA-sKAAB6Gyk75Go008.jpg" target="_blank"></a>
<code>以ClassID分組,顯示其平均年齡大于25的班級</code>
<a href="http://s3.51cto.com/wyfs02/M02/6C/75/wKioL1VJ35GhhSPVAACbXt1hYIs496.jpg" target="_blank"></a>
<code>以Gender分組,顯示各組中年齡大于25的學員的年齡之和</code>
<a href="http://s3.51cto.com/wyfs02/M01/6C/79/wKiom1VJ3zLDcN4pAAByhZBzhJE193.jpg" target="_blank"></a>
<code>顯示前5位同學的姓名、課程及成績</code>
<a href="http://s3.51cto.com/wyfs02/M02/6C/76/wKioL1VJ40yxvGm1AAHMozrkQQU793.jpg" target="_blank"></a>
<code>顯示其成績高于80的同學的名稱及課程</code>
<a href="http://s3.51cto.com/wyfs02/M02/6C/76/wKioL1VJ4_bgzH7kAAGQ7rHbyT8098.jpg" target="_blank"></a>
<code>求前8位同學每位同學自己兩門課的平均成績,并按降序排列</code>
<a href="http://s3.51cto.com/wyfs02/M02/6C/76/wKioL1VJ5puQXyfBAAFGckvbgUs609.jpg" target="_blank"></a>
<code>顯示每門課程課程名稱及學習了這門課的同學的個數</code>
<a href="http://s3.51cto.com/wyfs02/M00/6C/7A/wKiom1VJ6MOCvZFrAAEJAPED65E191.jpg" target="_blank"></a>
<code>顯示其年齡大于平均年齡的同學的名字</code>
<a href="http://s3.51cto.com/wyfs02/M00/6C/7B/wKiom1VJ6cmgrkBJAACWDPkAnNo217.jpg" target="_blank"></a>
<code>統計各班級中年齡大于全校同學平均年齡的人數</code>
<a href="http://s3.51cto.com/wyfs02/M00/6C/76/wKioL1VJ7U6AEN4MAACyOqVPhD8468.jpg" target="_blank"></a>
The end
好了,select查詢就先說到這裡了,看起來select就這麼點東西,其實要真正用好并不容易,是以小夥伴們多加練習吧,後續文章還會繼續講解MySQL/MariaDB系列的知識,有興趣的可繼續關注哦。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
本文轉自 北城書生 51CTO部落格,原文連結:http://blog.51cto.com/scholar/1643563