天天看點

MySQL/MariaDB DML操作之Select

前言

上文我們已經講解了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>&lt;=&gt;  </code><code>#等值比較,包括與NULL的安全比較</code>

<code>&lt;&gt;或!=  </code><code>#不等值比較</code>

<code>&lt;,&lt;=,&gt;,&gt;=  </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 --&gt; WHERE --&gt; GROUP BY --&gt; HAVING --&gt; ORDER BY --&gt; SELECT --&gt; 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 &gt; (</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 &gt; 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&gt;=40 union </code><code>select</code> <code>Name,Age from students where Age&gt;=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