文法形式: select [all | distinct] 字段或表達式清單 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
字段或表達式清單:
- 字段,自然是來源于“表”,則其必然依賴于from子句;
- 表達式是類似這樣一個内容:8,8+3, now()
- concat()函數是mysql中的系統函數,用于“連接配接”多個字元串;
每個“輸出項”(字段或表達式結果),都可以給其設定一個“别名”(字段别名)形式為: 字段或表達式 as 别名;
》
注意:實際上,表的字段并沒有改變,而隻是改變了“結果集”的字段名;
all 和 distinct
用于設定select出來的資料,是否消除“重複行”,可以不寫,那就是預設值all:
- all:表示不消除,即所有都出來,預設值;
- distinct:表示會消除;
- 使用all(跟不使用結果是一樣的): 對比:
from子句
from子句表示select部分從中“取得”資料的資料源——其實就是表
where子句
說明:
- where子句就是對from子句中的“資料源”中的資料進行篩選的條件設定,篩選的機制是“一行一行進行判斷”,其作用,幾乎就跟各種語言中if語句的作用一樣。
- where子句依賴于from子句;
- where子句中,通常都需要使用各種“運算符”;
- 算術運算符: + - * / %
- 比較運算符: > >= < <= =(等于) < >(不等于) ==(等于) !=(不等于)
- 邏輯運算符: and or not
對where子句的更進一步了解: is運算符:空值和布爾值的判斷
形式 | 含義 |
---|---|
XX is null | 判斷某個字段是“null”值——就是沒有值 |
XX is not null | 判斷某個字段不是“null”值 |
XX is true | 判斷某個字段為“真”(true) |
XX is false | 判斷某個字段為“假”(false):0, 0.0, ‘’, null |
所謂布爾值,其實是tinyint(1)這個類型的一個“别名”,本質上,隻是判斷一個數字是否為0;
between運算符:範圍判斷
用于判斷某個字段的資料值是否在某個給定的範圍——适用于數字類型;
文法:
- XX between 值1 and 值2;
含義:
- XX字段的值在給定“值1”和“值2”之間,其實相當于: XX >=值1 and XX <= 值2;
in運算符:給定确定資料的範圍判斷
文法:
XX in (值,值, 值, .....);
含義:
- 表示字段XX的值為所列出的這些值中的一個,就算是滿足了條件;這些值,通常是零散無規律的。
- 它羅列出的資料,如果有一定的規律,則其實可以使用邏輯運算符或between運算符來代替。
like運算符:對字元串進行模糊查找
文法:
XX like ‘要查找的内容’
含義:
實作對字元串的某種特征資訊的模糊查找。它其實依賴于以下2個特殊的“符号”:
- % :它代表“任何個數的任何字元”;
- _ :(下杠),它代表“一個任何字元”;
如果我要找某個字段中含“%”(或_)的行,怎麼辦?轉義就ok:
- \%:表示%這個字元本身
- \ _ :表示_這個字元本身
group by 子句:分組
形式: group by 字段1 【desc|asc】, 字段2 【desc|asc】, .....
說明:
- 分組是對“前述”已經找出的資料(即where已經篩選過了)進行某種指定标準(依據)的分組。
- 同時,該分組結果,可以同時指定其“排序方式”:desc(倒序),asc(順序);
- 通常,分組就一個字段(依據),2個以上很少。
分組:就是将多行資料,以某種标準(就是指定的字段)來進行“分類”存放。
特别注意:
- 分組之後的結果,一定要了解為:隻有一個一個組了
- 結果是:在select語句中的“輸出(取出)”部分,隻應該出現“組的資訊”:
應用中,分組之後,通常隻有如下幾種可用的“組資訊”了(即可以出現在select中):
- 每一組的“數量”資訊:就是用count(*)獲得;
- 原來資料中的“數值類型字段的聚合資訊”,包括如下幾個:
類型 | 形式 |
---|---|
最大值 | max(字段名) |
最小值 | min(字段名) |
平均值 | avg(字段名) |
總和值 | sum(字段名) |
having子句
having的作用跟where完全一樣,但其隻是對“分組的結果資料”進行篩選;
- where對原始資料行進行篩選;
-
having對分組之後的資料行進行篩選;
例:找出商品數超過2個的品牌資訊:
結果為: -
count(*)是獨立計算的結果:即對每一組進行原始資料行的統計,并用該條件進行篩選。
例:
結果為:
“恢複”(導入)資料:
mysql登入後:source “備份資料檔案的完整路徑”
order by 子句
- 它用于将前面“取得”的資料以設定的标準(字段)來進行排序以輸出結果。
- 形式:
order by 字段 【asc|desc】, 字段 【asc|desc】,......
說明:
- 對前面的結果資料以指定的一個或多個字段排序;
- 排序可以誰定正序(asc,預設值)或倒序(desc);
- 多個字段的排序,都是在前一個字段排序基礎上,如果還有“相等值”,才繼續以後續字段排序;
limit子句
含義:
它用于将“前述取得的資料”,按指定的行取出來:從第幾行開始取出多少行;
形式:
limit 起始行号, 要取出的行數;
說明:
- 起始行号都是從0開始算起的;
- 起始行号跟資料中的任何一個字段(比如id)沒有關系;
- 要取出的行數也是一個數字,自然應該是大于0的;
- 有一個簡略形式:limit 行數; 表示直接從第0行開始取出指定的行數,它相當于limit 0, 行數;
對整個select語句的一些總結
- 雖然在形式上,select的很多子句都是可以省略的,但他們的順序(如果出現),就不能打亂的:必須仍然按照給出的順序寫出;
- where子句依賴于from子句:即沒有from,就不能有where;
- having子句依賴于groupby子句:即沒有groupby,就不能有having;
- select中的“字段”也是依賴于from子句;
- 上述各子句的“内部執行過程”,基本上也都是按照該順序進行的: