1. 程式人生 > >MySQL(四) 單表查詢

MySQL(四) 單表查詢

4 單表查詢

  搭建環境:在test資料庫下建立資料表grade:

CREATE TABLE grade(
    id INT(10) NOT NULL,
    sex CHAR(1),
    firstname VARCHAR(20) NOT NULL,
    lastname VARCHAR(20) NOT NULL,
    english FLOAT,
    math FLOAT,
    chinese FLOAT
);

  向資料表grade中插入幾條資料:

INSERT INTO grade
VALUES (1,'m','John','Smith',88.0
,85.0,82.0), (2,'f','Adam','Smith',76.0,78.0,90.0), (3,'m','Allen','William',88.0,92.0,95.0), (4,'m','George','William',62.0,58.0,72.0), (5,'f','Alice','Davis',89.0,94.0,98.0), (6,'m','Kevin','Miller',77.0,88.0,99.0), (7,'f','Helen','Davis',79.0,83.0,91.0), (8,'m','Andrew','Johnson',81.0,86.0,88.0);

  4.1. 簡單查詢

  4.1.1 查詢所有欄位

    格式:SELECT * FROM 表名;

SELECT * FROM grade;

  

  4.1.2 查詢指定欄位

  格式:SELECT 指定欄位名 FROM 表名;

  例:查詢grade表中的id,firstname,lastname欄位

SELECT id,firstname,lastname FROM grade;

  

  4.2. 按條件查詢

  格式:SELECT 欄位名 FROM 表名

       WHERE 條件表示式;

  4.2.1 帶關係運算符的查詢

  例1:查詢grade表中id大於4的學生姓名

SELECT id,firstname,lastname FROM grade
WHERE id>4;

  

  例2:查詢grade表中女生的記錄

SELECT * FROM grade
WHERE sex='f';

  

  4.2.2 帶IN關鍵字的查詢

  例:查詢grade表中id值為2,4,6的學生記錄

SELECT * FROM grade
WHERE id IN (2,4,6);

  

  4.2.3 帶 BETWEEN AND關鍵字的查詢

  例:查詢grade表中math成績在85到94之間的記錄

SELECT * FROM grade
WHERE math BETWEEN 85 AND 94;

  

  4.2.4 帶LIKE關鍵字的查詢

  (1) 百分號(%)萬用字元

SELECT * FROM grade WHERE firstname LIKE "A%";

  

SELECT * FROM grade WHERE firstname LIKE "A%e";

  

SELECT * FROM grade WHERE firstname LIKE "%l%";

  

  (2) 下劃線(_)萬用字元

SELECT * FROM grade WHERE firstname LIKE "A____";

  

SELECT * FROM grade WHERE firstname LIKE "_e___";

  

  4.2.5 帶AND關鍵字的條件查詢

SELECT * FROM grade WHERE english>80 AND math>90;

  

  4.2.6 帶關鍵字OR的條件查詢

SELECT * FROM grade WHERE math>90 OR chinese>90;

  

  4.2.7 帶關鍵字NOT的條件查詢

SELECT * FROM grade WHERE id NOT IN (1,3,5,7);

  

  4.2.8 空值查詢

SELECT * FROM grade WHERE id IS NULL;

  

  4.2.9 帶DISTINCT關鍵字的查詢(過濾)

  使用DISTINCT關鍵字可以過濾掉查詢記錄中重複的值,並且只有DISTINCT關鍵字後指定的多個欄位值都相同,才會被認作是重複記錄。

  格式:SELECT DISTINCT 指定過濾的欄位名 FROM 表名;

  例1:查詢grade表中的性別有哪些

SELECT DISTINCT sex FROM grade;

  

  例2:查詢grade表中的lastname有哪幾種

SELECT DISTINCT lastname FROM grade;

  

  4.3. 高階查詢

  4.3.1 聚合函式

  COUNT( )函式:統計記錄的條數

  格式:SELECT COUNT(*) FROM 表名 [WHERE 條件表示式];

  例1:求出表中所有記錄的條數

SELECT COUNT(*) FROM grade; 

  

  例2:求出表中英語成績的80的記錄的條數

SELECT COUNT(*) FROM grade WHERE english>80;

  

  SUM( )函式:求出表中某個欄位的所有值的總和

  格式:SELECT SUM(欄位名) FROM 表名 [WHERE 條件表示式];

  例1:計算所有學生的數學成績的和

SELECT SUM(math) FROM grade;

  

  例2:計算女生的數學成績的和

SELECT SUM(math) FROM grade WHERE sex='f';

  

  AVG( )函式:用於求出某個欄位所有值的平均值

  格式:SELECT AVG(欄位名) FROM 表名 [WHERE 條件表示式];

  例1:計算英語成績平均分

SELECT AVG(english) FROM grade;

  

  例2:計算男生的英語成績平均分

SELECT AVG(english) FROM grade WHERE sex='m';

  

  MAX( )函式:用於求出某個欄位的最大值

  格式:SELECT MAX(欄位名) FROM 表名 [WHERE 條件表示式];

  例1:求出數學成績的最高分

SELECT MAX(math) FROM grade;

  

  例2:求出男生中的數學最高分

SELECT MAX(math) FROM grade WHERE sex='m';

  

  MIN( )函式:用於求出某個欄位的最小值

  格式:SELECT MIN(欄位名) FROM 表名 [WHERE 條件表示式];

  與MAX( )函式用法一致,不再舉例。

  4.3.2 對查詢結果排序

  格式:SELECT 欄位名 FROM 表名

       ORDER BY 排序依據欄位名 [ASC|DESC]......

  例1:按照math成績的升序進行排列

SELECT * FROM grade
ORDER BY math ASC;       

  

  例2:按照sex欄位的升序和chinese欄位的降序排列

SELECT sex,english,math,chinese FROM grade
ORDER BY sex ASC,chinese DESC;

  

  4.3.3 分組查詢

  格式:SELECT 欄位名 FROM 表名

       GROUP BY 分組依據欄位名

     [HAVING 條件表示式];

  (1) 單獨使用GROUP BY 分組

  例:查詢資料表grade中的記錄,按照sex欄位進行分組

SELECT * FROM grade 
GROUP BY sex;

  

  注意:這樣的查詢結果只顯示每個分組中的一條記錄,意義並不大,一般情況下GRUOP BY都會和聚合函式一起使用。

  (2) GROUP BY 和聚合函式一起使用

  例:將grade表按照lastname欄位值分組,並計算每個分組中的學生數

SELECT COUNT(*),lastname FROM grade
GROUP BY lastname;

  

  (3) GROUP BY和HAVING關鍵字一起使用

  注意:HAVING和WHERE都用於對查詢結果進行過濾,兩者的區別在於,HAVING關鍵字後可以跟聚合函式,而WHERE關鍵字不能。即:

  WHERE 是在分組之前進行過濾,HAVING是在分組之後進行過濾。

  例:對grade表按照lastname欄位分組,查出math欄位和小於100的組

SELECT SUM(math),lastname FROM grade
GROUP BY lastname
HAVING SUM(math)<100;

  

  4.3.4 使用LIMIT限制查詢結果的數量

  格式:SELECT 欄位名 FROM 表名

        LIMIT [OFFSET],記錄數;

  例1:查詢grade表的前4條記錄

SELECT * FROM grade
LIMIT 4;

  

  例2:查詢grade表中的第3到第6條記錄

SELECT * FROM grade
LIMIT 2,4;

  

  4.3.5   函式(列表)

  MySQL中提供了豐富的函式,通過這些函式可以簡化使用者對資料的操作。

  包括:數學函式、字串函式、日期和時間函式、條件判斷函式、加密函式等

SELECT CONCAT(id,'_',english,'_',math,'_',chinese) FROM grade;

  

SELECT id,IF(sex='m',1,0) FROM grade;

  

  4.4為表和欄位取別名

  4.4.1 為表取別名

  格式:SELECT 欄位名 FROM 表名 [AS] 別名;

  例:為grade表取一個別名g,並查詢grade表中女生的成績

SELECT id,sex,english,math,chinese FROM grade AS g 
WHERE g.sex='f';  

  

  注意:條件表示式中可以為g.sex或者sex,但是不能為grade.sex

  4.4.2 為欄位取別名

  格式:SELECT 欄位名 [AS] 別名 FROM 表名;

SELECT id,math+english+chinese total FROM grade;