LEVEL1
(1)輸出 Hello SQL:
SELECT "Hello SQL!";
(2)使用 SELECT DISTINCT 查詢不同行:
SELECT DISTINCT column_name FROM table_name;
(3)使用 SELECT WHERE 對行進行篩選過濾:常用的有等于 =、小于 < 、大于 > 、不等于<> 或 !=
(4)使用 INSERT INTO 在不指定列的情況下插入資料:
INSERT INTO `table_name`
VALUES (value1, value2, value3,...);
(5)使用 INSERT INTO 在指定的列中插入資料:
INSERT INTO `table_name`
(`column1`, `column2`, `column3`,...)
VALUES (value1, value2, value3,...);
(6)使用 UPDATE 更新資料:
UPDATE `table_name`
SET `column1`=value1,`column2`=value2,...
WHERE `some_column`=some_value;
(7)使用 DELETE 删除資料:
DELETE FROM `table_name`
WHERE `some_column` = `some_value`;
LEVEL2
(1) 比較運算符:
A operator B
,常用的比較運算符有 =(等于) 、!=(不等于)、 <>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于),其中 != 和 <> 在特殊情況下用法是不同的,這裡暫時不提。
(2)使用 AND 連接配接多條件:
SELECT `column_name`
FROM `table_name`
WHERE condition1 AND condition2;
(3)使用 OR 連接配接多個條件:
SELECT `column_name`
FROM `table_name`
WHERE condition1 or condition2;
(4)使用 NOT 過濾不滿足條件的資料
SELECT `column_name`
FROM `table_name`
WHERE NOT `condition`;
//舉例
SELECT *
FROM `teachers`
WHERE NOT (`age` > 20 AND `country` = 'CN');
(5)使用 IN 查詢多條件:當我們需要查詢單個表條件過多時,就會用多個 'OR' 連接配接或者嵌套,這會比較麻煩,現在我們有 'IN' 能更友善的解決這一問題。
SELECT *
FROM `table_name`
WHERE `column_name` IN `value`;
//舉例
SELECT *
FROM `teachers`
WHERE `country` IN ('CN', 'UK');
(6)使用 NOT IN 排除
SELECT *
FROM `table_name`
WHERE `column_name` NOT IN value;
(7)使用 BETWEEN AND 查詢兩值間的資料範圍:
- BETWEEN AND 會選取介于兩個值之間的資料範圍。這些值可以是數值、文本或者日期。
- 請注意,在不同的資料庫中,BETWEEN 操作符會産生不同的結果!
- 在某些資料庫中,BETWEEN 選取介于兩個值之間但不包括兩個測試值的字段。
- 在某些資料庫中,BETWEEN 選取介于兩個值之間且包括兩個測試值的字段。
- 在某些資料庫中,BETWEEN 選取介于兩個值之間且包括第一個測試值但不包括最後一個測試值的字段。
- 是以,請檢查您的資料庫是如何處理 BETWEEN 操作符!
- 我們這裡選用的是 MySQL 的支援,BETWEEN 選取介于兩個值之間且包括兩個測試值的字段,即BETWEEN 200 AND 250 選取結果會包括 200 和 250
SELECT *
FROM `table_name`
WHERE `column_name` BETWEEN `value` AND `value`;
(8)使用 IS NULL 查詢空資料:NULL 值代表遺漏的未知資料。預設的,表的列可以存放 NULL 值。
注意:
- NULL 用作未知的或不适用的值的占位符。
- 無法比較 NULL 和 0;它們是不等價的。
- 無法使用比較運算符來測試 NULL 值,比如 =、!= 或 <>。
- 我們必須使用 IS NULL 和 IS NOT NULL操作符。
SELECT *
FROM `table_name`
WHERE `column_name` IS NULL;
(9)使用 LIKE 模糊查詢
NUM | 通配符 | 描述 |
---|---|---|
1 | % | 替代 0 個或多個字元 |
2 | _ | 替代一個字元 |
3 | [charlist] | 字元列中的任何單一字元 |
4 | 或 [!charlist] | 不在字元列中的任何單一字元 |
SELECT *
FROM `table_name`
WHERE `column_name` LIKE `value`;
(10)使用 ORDER BY 對資料進行排序
ORDER BY 關鍵字用于對結果集按照一個列或者多個列進行排序,其具有 ASC(升序)和 DESC(降序)兩個關鍵字,且預設按照升序排列。
- ASC :按升序排列,ORDER BY 預設按照升序對記錄進行排序,是以升序的關鍵字 ASC 可以省去不寫。
- DESC:按降序排列,如果需要按照降序對記錄進行排序,可以使用 DESC 關鍵字。
SELECT `column_name`, `column_name`
FROM `table_name`
ORDER BY `column_name`, `column_name` ASC|DESC;
(11)使用 LIMIT 限制輸出行數:
LIMIT 子句用于 SELECT 中,對輸出結果集的行數進行限制,LIMIT 接收2個參數 offset 和 count,兩個參數都是整型數字,但通常隻用一個。
- offset :是傳回集的初始标注,起始點是0,不是1
- ount :制定傳回的數量
- LIMIT 關鍵字的位置,需要放在 ORDER BY 關鍵字的後面,否則會報錯。
SELECT `column_name`, `column_name`
FROM `table_name`
LIMIT `offset` , `count`;
LEVEL3
算數函數(1)
(1) 使用 AVG() 函數求數值列的平均值:
- 平均函數 AVG() 是平均數 AVERAGE 的縮寫,它用于求數值列的平均值。它可以用來傳回所有列的平均值,也可以用來傳回特定列和行的平均值。
-
具體的計算過程為:其通過對表中行數計數并計算特定數值列的列值之和,求得該列的平均值。
* 但是當參數 `column_name` 列中的資料均為空時,結果會傳回 NULL。
SELECT AVG(`column_name`)
FROM `table_name`;
//舉例,其中 AS 關鍵字的作用是賦予 AVG(student_count) 計算結果列顯示在清單中的别名。
SELECT AVG(`student_count`) AS `average_student_count`
FROM `courses`;
何為别名?
别名是一個字段或值的替換名,由關鍵字 AS 賦予。别名還有其他用途,常見的用途包括在實際的表列名包含不符合規定的字元(如空格)時重新命名它,在原來的表列名含糊或者容易誤解時擴充它等。
别名常與函數聯用,給使用函數之後的新計算列一個名字,友善我們檢視和使用。我們會在後續的學習中經常見到它。
(2)使用 MAX() 函數傳回指定列中的最大值:它隻有一個參數 column_name ,表示指定的列名。但是當參數 column_name 列中的資料均為空時,結果會傳回 NULL。
SELECT MAX(`column_name`)
FROM `table_name`;
(3)使用 MIN() 函數傳回指定列中的最小值
SELECT MIN(`column_name`)
FROM `table_name`;
(4)使用 SUM() 函數統計數值列的總數:
SELECT SUM(`column_name`)
FROM `table_name`;
算數函數(2)
(1) 使用 ROUND() 函數将數值四舍五入:
ROUND()
函數用于把數值字段舍入為指定的小數位數。
-
:傳回參數 X 四舍五入後的一個整數。ROUND(X)
-
:傳回參數 X 四舍五入且保留 D 位小數後的一個數字。如果 D 為 0,結果将沒有小數點或小數部分。ROUND(X, D)
-
傳回值資料類型會被變換為一個 BIGINT 。ROUND()
SELECT ROUND(`column_name`, `decimals`)
FROM `table_name`;
(2)使用 NULL() 函數判斷空值
- ISNULL():
函數用于判斷字段是否為 NULL,它隻有一個參數ISNULL()
為列名,根據column_name
列中的字段是否為 NULL 值傳回 0 或 1。column_name
SELECT ISNULL(`column_name`)
FROM `table_name`;
- IFNULL():
函數也用于判斷字段是否為NULL,但是與IFNULL()
不同的是它接收兩個參數,第一個參數ISNULL()
為列名,第二個參數column_name
value
相當于備用值。
其中:
(1) 如果 column_name 列中的某個字段是 NULL 則傳回 value 值,不是則傳回對應内容。
(2) COALESCE(column_name, value) 函數也用于判斷字段是否為NULL,其用法和 IFNULL() 相同。
SELECT IFNULL(`column_name`, `value`)
FROM `table_name`;
//舉例
SELECT `name`, `email`, ISNULL(`email`), IFNULL(`email`, 0), COALESCE(`email`, 0)
FROM `teachers`;
(3)使用 COUNT() 函數計數:當
COUNT()
中的參數不同時,其的用途也是有明顯的不同的,主要可分為以下三種情況:COUNT(column_name) 、COUNT( * ) 和 COUNT(DISTINCT column_name) 。
- COUNT( column_name ):
-
COUNT(column_name) 函數會對指定列具有的行數進行計數,但是會除去值為 NULL 的行。該函數主要用于檢視各列資料的數量情況,便于統計資料的缺失值。
* 假如出現某一列的資料全為 NULL 值的情況,使用COUNT( column_name ) 函數對該列進行計數,會傳回 0。
-
SELECT COUNT(`column_name`)
FROM `table_name`;
- COUNT():COUNT() 函數會對表中行的數目進行計數,包括值為 NULL 所在行和重複項所在行。該函數主要用于檢視表中的記錄數。
SELECT COUNT(*)
FROM `table_name`;
注意:COUNT(column_name) 與 COUNT(*) 的差別
-
中,如果COUNT(column_name)
字段中的值為 NULL,則計數不會增加,而如果字段值為空字元串"",則字段值會加 1column_name
-
中,除非整個記錄全為COUNT(*)
,則計數不會增加,如果存在某一個記錄不為NULL
,或者為空字元串"",計數值都會加 1。正常來說,表都會有主鍵,而主鍵不為空,是以NULL
在有主鍵的表中等同于COUNT(*)
,即查詢有多少條記錄。COUNT(PRIMARY_KEY)
SELECT COUNT(*)
FROM `table_name`;
時間函數(1)
(1)使用 NOW() 、 CURDATE()、CURTIME() 擷取目前時間
-
可以用來傳回目前日期和時間 格式:YYYY-MM-DD hh:mm:ssNOW()
-
可以用來傳回目前日期 格式:YYYY-MM-DDCURDATE()
-
可以用來傳回目前時間 格式:hh:mm:ssCURTIME()
//舉例 使用 NOW() 向記錄表 records 中插入目前的時間(精确到毫秒)
INSERT INTO `records` VALUES (NOW(3));
(4)使用 DATE()、TIME() 函數提取日期和時間
使用
DATE()
、
TIME()
函數分别将 '2021-03-25 16:16:30' 這組資料中的日期于時間提取出來,并用 date 、time 作為結果集列名。
SELECT DATE('2021-03-25 16:16:30') AS `date`,TIME('2021-03-25 16:16:30') AS `time`;
運作結果如下:
date | time |
---|---|
2021-03-25 | 16:16:30 |
(5)使用 EXTRACT() 函數提取指定的時間資訊:
EXTRACT()
函數用于傳回日期/時間的單獨部分,如 YEAR (年)、MONTH (月)、DAY (日)、HOUR (小時)、MINUTE (分鐘)、 SECOND (秒)。
SELECT EXTRACT(unit FROM date)
FROM `table`
- date 參數是合法的日期表達式。
- unit 參數是需要傳回的時間部分,如
YEAR
MONTH
DAY
HOUR
MINUTE
等。SECOND
- 在一般情況下,
與EXTRACT(unit FROM date)
的結果相同。unit()
//舉例
SELECT `name`, EXTRACT(HOUR FROM `created_at`) AS `created_hour`
FROM `courses`;
(6)使用 DATE_FORMAT() 格式化輸出日期:
SELECT DATE_FORMAT(date,format);
- 我們在 SQL 中使用 DATE_FORMAT() 方法來格式化輸出 date/time。
-
需要注意的是 DATE_FORMAT() 函數傳回的是字元串格式。
舉例:
SELECT DATE_FORMAT(`created_at`, '%Y %m') AS `DATE_FORMAT`
FROM `courses`;
時間函數(2)
SELECT DATE_ADD(date, INTERVAL expr type)
FROM table_name
- date 指代希望被操作的有效日期,為起始日期
- expr 是希望添加的時間間隔的數值(expr 是一個字元串,對于負值的間隔,可以以 ”-“ 開頭)
- type 是具體的資料類型,表示加上時間間隔的機關(可以是 MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , YEAR 等)
//舉例
SELECT `name`, DATE_ADD(`created_at`, INTERVAL 1 YEAR) AS `new_created`
FROM `courses`;