1. 程式人生 > 資料庫 >MySQL DQL資料查詢語言 重點

MySQL DQL資料查詢語言 重點

1.什麼是DQL?

DQL(Data Query Language):資料查詢語⾔,通俗點講就是從資料庫獲取資料的,按照DQL的語法給資料庫傳送⼀條指令,資料庫將按需求返回資料。

2.基礎操作

2.1 基礎查詢

通用語法: SELECT 查詢的列 FROM 表名;
舉例: SELECT id, name FROM stu;
注意:查詢結果放在一個表中,表的第0行是標題,第1行開始是資料。和資料庫表一樣。只不過查詢出來的表並不是真實存在的。

查詢常量: SELECT 常量1,常量2,…;
舉例: SELECT 1,‘hello’;
result

查詢表示式: SELECT 表示式;
舉例: SELECT 1+1, 2*3, 5/3;

result

查詢函式: SELECT 函式;
舉例: SELECT MOD(5,2),ISNULL(NULL),IFNULL(NULL,‘1’),IFNULL(‘0’,‘1’);
注意:IFNULL 函式有2個引數,判斷第1個引數是否為空,如果為空返回第2個引數的值,否則返回第1個引數的值。
result

查詢所有列: SELECT * FROM 表名;
舉例: SELECT * FROM stu;

2.2 使用別名

  • 列別名
    語法: SELECT 列 [AS] 別名 FROM 表;
    舉例1: SELECT name AS ‘名字’ FROM stu;
    別名1
    舉例2: SELECT MOD(5,2) AS result;

    別名2

  • 表別名
    語法: SELECT 別名.欄位, 別名.* FROM 表名 [AS] 別名;
    舉例: SELECT s.id,s.name FROM stu AS s;

2.3 條件查詢

語法: SELECT 列名 FROM 表名 WHERE 列 運算子 值;

2.3.1 算術條件查詢運算子

  • 等於(=)
    語法: SELECT 列名 FROM 表名 WHERE 列 = 值;
    舉例: SELECT id,name FROM stu WHERE id=1;
    說明:查詢出指定的列和對應的值相等的記錄。值如果是字串型別,需要⽤單引號或者雙引號引起來。
  • 不等於(<>或!=)
    說明:
    <> 這個是最早的⽤法。
    != 是後來才加上的。
    兩者意義相同,在可移植性上前者優於後者,所以 SQL 語句中儘量使用 <> 來做不等判斷。
  • 其他
    >(大於),>=(大於等於),<(小於),<=(小於等於)
    說明:
    數值按照大小比較。
    字元按照ASCII碼對應的值進行比較,比較時按照字元對應的位置1個字元1個字元的比較。

2.3.2 邏輯查詢運算子

適用於多個條件查詢。

  • AND(並且)
    SELECT 列名 FROM 表名 WHERE 條件1 AND 條件2;
    說明:表示返回滿足條件1和條件2的記錄。
  • OR(或者)
    SELECT 列名 FROM 表名 WHERE 條件1 OR 條件2;
    說明:滿足條件1或者滿足條件2的記錄都會被返回。

2.3.3 其他

  • LIKE (模糊查詢)
    語法: SELECT 列名 FROM 表名 WHERE 列 LIKE pattern;
    說明:pattern中可以包含萬用字元,有以下萬用字元:
    %:表示匹配任意一個或多個字元
    _:表示匹配任意一個字元。

  • BETWEEN AND(閉區間查詢)
    語法: SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
    說明:BETWEEN … AND … 會選取介於兩個值之間的資料範圍,這些值可以是數值、文字或者日期,屬於一個閉區間查詢。
    返回對應的列的值在[值1,值2]區間中的記錄
    兩個臨界值不要調換位置,只能是大於等於左邊的值,並且小於等於右邊的值。因為也可以使用 >=和<=加上邏輯查詢符 AND 實現同樣的功能。

  • IN
    語法: SELECT 列名 FROM 表名 WHERE 欄位 IN (值1,值2,值3,值4);
    說明: 操作符允許我們在 WHERE 子句中規定多個值。
    IN 後面括號中可以包含多個值,對應記錄的欄位滿足 IN 中任意一個都會被返回
    IN 列表的值型別必須一致或相容
    IN 列表中不支援萬用字元。
    也可以使用多個 OR 來實現同樣的功能。

  • NOT IN
    語法: SELECT 列名 FROM 表名 WHERE 欄位 NOT IN (值1,值2,值3,值4);
    說明: NOT IN 和 IN 剛好相反,in 是列表中被匹配的都會被返回, NOT IN 是和列表中都不匹配的會被返回。

  • NULL
    算數查詢運算子、 LIKE 、 BETWEEN AND 、 IN 、 NOT IN 對NULL值查詢不起效。

  • IS NULL/IS NOT NULL (NULL值專用查詢)

    • IS NULL (返回值為空的記錄)
      SELECT 列名 FROM 表名 WHERE 列 IS NULL;
      查詢指定的列的值為NULL的記錄。
      IS NOT NULL (返回值不為空的記錄)
      SELECT 列名 FROM 表名 WHERE 列 IS NOT NULL;
      查詢指定的列的值不為NULL的記錄。
  • <=> (安全等於)
    說明:既可以判斷NULL值,又可以判斷普通的數值,可讀性較低。

  • 測試題
    問:下面的2個sql查詢結果一樣麼?
    SELECT * FROM stu;
    SELECT * FROM stu WHERE name LIKE ‘%’;
    答:結果分2種情況:
    當name沒有NULL值時,返回的結果一樣。
    當name有NULL值時,第2個sql查詢不出name為NULL的記錄。

2.4 排序和分頁

2.4.1 排序查詢

  • 正常 ORDER BY 排序
    排序語法: SELECT 欄位名 FROM 表名 ORDER BY 欄位1 [ASC|DESC],欄位2 [ASC|DESC];
    需要排序的欄位跟在 ORDER BY 之後;
    ASC|DESC 表示排序的規則, ASC :升序, DESC :降序,預設為 ASC ;
    支援多個欄位進行排序,多欄位排序之間用逗號隔開。
  • ORDER BY 後面可跟 別名 或者 函式
  • ORDER BY 可在 WHERE 子句之後對過濾後的資料進行排序

2.4.2 分頁

  • LIMIT
    LIMIT 用來限制 SELECT 查詢返回的行數,常用於分頁等操作。
    語法: SELECT 列 FROM 表 LIMIT [OFFSET,] COUNT;
    說明:
    OFFSET :表示偏移量,通俗點講就是跳過多少行, OFFSET 可以省略,預設為0,表示跳過0行;範圍:[0,+∞)。
    COUNT :跳過 OFFSET 行之後開始取資料,取 COUNT 行記錄;範圍:[0,+∞)。
    LIMIT 中 OFFSET 和 COUNT 的值不能用表示式。
  • 獲取前n行記錄
    SELECT 列 FROM 表 LIMIT 0,n; 或者 SELECT 列 FROM 表 LIMIT n;
    -獲取最大的一條記錄
    思路:先按 DESC 降序排序,然後獲取第一條(即前一條)記錄。
  • 獲取排名第n到m的記錄
    思路:要先跳過n-1條記錄,然後取m-n+1條記錄,即: SELECT 列 FROM 表 LIMIT n-1,m-n+1;
  • 分頁查詢
    分頁 SQL 一般需要2個引數:
    page:表示第幾頁,從1開始,範圍[1,+∞)
    pageSize:每頁顯示多少條記錄,範圍[1,+∞)
    如:page = 2,pageSize = 10,表示獲取第2頁10條資料。
    使用 LIMIT 實現分頁查詢,語法如下: SELECT 列 FROM 表名 LIMIT (page - 1) * pageSize,pageSize;

2.4.3 小結

  • ORDER BY … [ASC|DESC]用於對查詢結果排序, ASC :升序, DESC :降序, ASC | DESC 可以省略,預設為 ASC
  • LIMIT 用來限制查詢結果返回的行數,有2個引數( OFFSET , COUNT ), OFFSET :表示跳過多少行, COUNT :表示跳過 OFFSET 行之後取 COUNT 行
  • LIMIT 中 OFFSET 可以省略,預設值為0
  • LIMIT 中 OFFSET 和 COUNT 都必須大於等於0
  • LIMIT 中 OFFSET 和 COUNT 的值不能用表示式,必須為確定的自然數
  • 分頁排序時,排序不要有二義性,二義性情況下可能會導致分頁結果亂序,可以在後⾯追加一個主鍵排序,讓排序結果具有唯一性。

2.5 分組

2.5.1 分組基礎

語法:
SELECT COLUMN, group_function,… FROM TABLE
[WHERE CONDITION]
GROUP BY group_by_expression
[HAVING group_condition];

說明:
group_function:聚合函式。
groupbyexpression:分組表示式,多個之間用逗號隔開。
group_condition:分組之後對資料進行過濾。

分組中, SELECT 後面只能有兩種型別的列:
出現在 GROUP BY 後的列
或者使用聚合函式的列

  • 單欄位分組
    GROUP BY 後面只有一個欄位
    -多欄位分組
    GROUP BY 後面有多個欄位,以逗號隔開
  • 分組前篩選資料
    分組前對資料進行篩選,使用 WHERE 關鍵字
  • 分組後篩選資料
    分組後對資料篩選,使用 HAVING 關鍵字

2.5.2 where 和 having 的區別

WHERE 是在分組(聚合)前對記錄進行篩選,而 HAVING 是在分組結束後的結果裡篩選,最後返回整個 SQL 的查詢結果。
可以把 HAVING 理解為兩級查詢,即含 HAVING 的查詢操作先獲得不含 HAVING 子句時的 SQL 查詢結果表,然後在這個結果表上使用 HAVING 條件篩選出符合的記錄,最後返回這些記錄,因此, HAVING 後是可以跟聚合函式的,並且這個聚集函式不必與 SELECT 後面的聚集函式相同。

2.5.3 查詢關鍵字的順序

語法如下:
SELECT 列
FROM 表名
WHERE [查詢條件]
GROUP BY [分組表示式]
HAVING [分組過濾條件]
ORDER BY [排序條件]
LIMIT [OFFSET,] COUNT;

注意:
寫法上必須按照上面的順序來寫。
[] 表示可選項。