天天看點

mysql 資料查詢

文法形式:

select [all | distinct] 字段或表達式清單 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];

字段或表達式清單:

  • 字段,自然是來源于“表”,則其必然依賴于from子句;
  • 表達式是類似這樣一個内容:8,8+3, now()
    mysql 資料查詢
  • concat()函數是mysql中的系統函數,用于“連接配接”多個字元串;
    mysql 資料查詢
每個“輸出項”(字段或表達式結果),都可以給其設定一個“别名”(字段别名)形式為:

字段或表達式 as 别名;

mysql 資料查詢

注意:實際上,表的字段并沒有改變,而隻是改變了“結果集”的字段名;

all 和 distinct

用于設定select出來的資料,是否消除“重複行”,可以不寫,那就是預設值all:
  • all:表示不消除,即所有都出來,預設值;
  • distinct:表示會消除;
  • 使用all(跟不使用結果是一樣的):
    mysql 資料查詢
    對比:
    mysql 資料查詢

from子句

from子句表示select部分從中“取得”資料的資料源——其實就是表

where子句

說明:

  • where子句就是對from子句中的“資料源”中的資料進行篩選的條件設定,篩選的機制是“一行一行進行判斷”,其作用,幾乎就跟各種語言中if語句的作用一樣。
  • where子句依賴于from子句;
  • where子句中,通常都需要使用各種“運算符”;
  • 算術運算符: + - * / %
  • 比較運算符: > >= < <= =(等于) < >(不等于) ==(等于) !=(不等于)
  • 邏輯運算符: and or not
    mysql 資料查詢
對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個的品牌資訊:

    mysql 資料查詢
    結果為:
    mysql 資料查詢
  • count(*)是獨立計算的結果:即對每一組進行原始資料行的統計,并用該條件進行篩選。

    例:

    mysql 資料查詢
    結果為:
    mysql 資料查詢

“恢複”(導入)資料:

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子句;
  • 上述各子句的“内部執行過程”,基本上也都是按照該順序進行的:
    mysql 資料查詢

繼續閱讀