1. 程式人生 > >SQL筆記之SELECT語句

SQL筆記之SELECT語句

  • SELECT語句的完整語法:

    SELECT【ALL/DISTINCT】目標列表達式  [AS 別名],··· --ALL不去掉重複 DISTINCT去掉重複
    FROM 表名或檢視名 或者(SELECT語句)AS 表名(屬性)
    [WHERE] 條件表示式
    [GROUP BY] 列名 【HAVING 條件表示式】
    [ORDER BY] 列名 【ASC|DESC】 --ASC = ASCENDING(預設為遞增遞增)DESC = DESCENDING(遞減)
    [LIMIT子句]

去重選項

  • 去重選項是指是否對結果中完全相同的記錄(所有欄位資料都相同)進行去重:
    • ALL:不去重 (預設)
    • DISTINCT:去重
CREATE TABLE student(name VARCHAR(15),gender VARCHAR(15));
INSERT INTO student(name,gender) VALUES("lihua","male");
INSERT INTO student(name,gender) VALUES("lihua","male");
SELECT * FROM student;
SELECT DISTINCT * FROM student;

欄位別名

  • 欄位別名是指給列名另取一個名字
CREATE TABLE student(name VARCHAR(15),gender VARCHAR(15));
INSERT INTO student(name,gender) VALUES("lihua","male");
INSERT INTO student(name,gender) VALUES("lihua","male");
SELECT * FROM student;
SELECT  name AS "姓名",gender AS "性別" FROM student;

資料來源

  • 資料來源可以為單表資料來源或者多表資料來源
    • 單表:SELECT 欄位列表 FROM 表名;
    • 多表: SELECT 欄位列表 FROM 表名1,表名2,…;

PS :

  • 多表查詢時是將每個表中的X條記錄與另一個表Y條記錄組成結果,組成的結果的記錄條數為X*Y (笛卡爾積)

WHERE 子句

  • WHERE子句是用於篩選符合條件的結果的。
  • WHERE幾種語法:
    • 基於值:
      • = : WHERE 欄位 = 值 ;查找出對應欄位等於對應值的記錄。(相似的,<是小於對應值,<=是小於等於對應值,>是大於對應值,>=是大於等於對應值,!=是不等於)
      • LIKE:WHERE 欄位 LIKE 值 ;功能與 = 相似 ,但可以使用模糊匹配來查詢結果。
    • 基於值的範圍:
      • IN: WHERE 欄位 IN 範圍;查找出對應欄位的值在所指定範圍的記錄。
      • NOT IN : WHERE 欄位 IN 範圍;查找出對應欄位的值不在所指定範圍的記錄。
      • BETWEEN X AND Y :WHERE 欄位 BETWEEN X AND Y;查找出對應欄位的值在閉區間[X,Y]範圍的記錄。
    • 條件複合:
      • OR : WHERE 條件1 OR 條件2… ; 查找出符合條件1或符合條件2的記錄。
      • AND: WHERE 條件1 AND 條件2… ; 查找出符合條件1並且符合條件2的記錄。
      • NOT : WHERE NOT 條件1 ;查找出不符合條件的所有記錄。
      • &&的功能與AND相同;||與OR功能類似,!與NOT 功能類似。

PS :

  • WHERE是從磁碟中獲取資料的時候就進行篩選的。所以某些在記憶體是才有的東西WHERE無法使用。(欄位別名什麼的是本來不是“磁碟中的資料”(是在記憶體這中執行時才定義的),所以WHERE無法使用,一般都依靠HAVING來篩選)

GROUP BY 子句

  • GROUP BY 可以將查詢結果依據欄位來將結果分組。
SELECT name,gender,count(name) AS "組員" FROM student AS d GROUP BY name;
SELECT name,gender,count(name) AS "組員" FROM student AS d GROUP BY name,gender;

PS :

  • 實際上,GROUP BY 的作用主要是統計(使用情景很多,比如說統計某人的總分數,學生中女性的數量。。),所以一般會配合一些統計函式來使用:
    • COUNT(X):統計每組的記錄數,X是*時代表記錄數,為欄位名時代表統計欄位資料數(除去NULL)
    • MAX(X):統計最大值,X是欄位名
    • MIN(X):統計最小值,X是欄位名
    • AVG(X):統計平均值,X是欄位名
    • SUM(X):統計總和,X是欄位名
  • GROUP BY 欄位 後面還可以跟上ASC或DESC,代表分組後是否根據欄位排序。

HAVING 子句:

  • HAVING功能與WHERE類似,不過HAVING的條件判斷髮生在資料在記憶體中時,所以可以使用在記憶體中才發生的資料,如“分組”,“欄位別名”等。(操作符之類的可以參考WHERE的,增加的只是一些“記憶體”中的篩選條件)
SELECT name AS n ,gender FROM student HAVING n ="lihua";
SELECT name,gender,COUNT(*) AS "組員" FROM student AS d GROUP BY name,gender HAVING COUNT(*) >2 ;-- 這裡只顯示記錄數>2的分組

ORDER BY 子句:

  • ORDER BY 可以使查詢結果按照某個欄位來排序
  • 語法:SELECT 欄位列表 FROM 表名 ORDER BY 欄位 [ASC|DESC];
  • 欄位可以有多個,從左到右,後面的排序基於前面的,(比如:先按NAME排序,再按GENDER排序,後面的GENDER排序是針對前面NAME排序時NAME相同的資料)
  • ASC代表排序是遞增的 (預設)
  • DESC代表是遞減的
  • 也可以指定某個欄位的排序方法,比如第一個欄位遞增,第二個遞減。只需要在每個欄位後面加ASC或DESC即可(雖然預設不加是遞增,但還是加上更清晰明確)。
SELECT * FROM student ORDER BY name;
SELECT * FROM student ORDER BY name,gender;
SELECT * FROM student ORDER BY name ASC,gender DESC;

LIMIT 子句:

  • LIMIT是用來限制結果數量的。與WHERE\HAVING等配合使用時,可以限制匹配出的結果。但凡是涉及數量的時候都可以使用LIMIT(這裡只是強調LIMIT的作用,不要過度理解)
  • 語法:SELECT 欄位列表 FROM 表名 LIMIT [OFFSET,...] COUNT;
  • COUNT是數量
  • OFFSET是起始位置,OFFSET從0開始,可以說是每條記錄的索引號
SELECT * FROM student LIMIT 1;
SELECT * FROM student LIMIT 3,1;
SELECT * FROM student WHERE name ="lihua" limit 1;
SELECT * FROM student WHERE name ="lihua" limit 3,1;

此文參考:https://www.cnblogs.com/progor/p/8786133.html