跳轉到內容

面向十一級(CBSE)的資訊學實踐/SQL 函式和分組

來自華夏公益教科書,開放的書籍,開放的世界

函式名稱不區分大小寫。您可以隨意編寫它們。

SELECT database() -- ok
SELECT DataBase() -- ok
SELECT DATABASE() -- ok

如果未設定 IGNORE_SPACE SQL_MODE,則不能在函式名和第一個括號之間放置空格。它會返回一個 1064 錯誤。IGNORE_SPACE 通常為 0。原因是如果停用該標誌,解析器會更快。所以

SELECT DATABASE () -- usually not accepted
SELECT DATABASE() -- always works fine

但是,此限制僅適用於本機 MySQL 函式。UDF 和儲存函式可以在名稱後使用空格編寫。

您不能使用在 SELECT 子句中計算的值作為 WHERE 子句中的約束(這是一個雞生蛋的問題);WHERE 子句決定 SELECT 子句中的值。您想要的是 HAVING 子句,它在找到所有匹配的行 *之後* 應用。

通用函式

[編輯 | 編輯原始碼]

型別無關函式。


BENCHMARK(times, espression)

執行 espression n 次並返回它花費的時間。用於查詢 SQL 表示式中的瓶頸。

BENCHMARK(10000, CAST(666 AS TEXT))

CAST(value AS type)

返回轉換為指定型別的 value。

CHARSET(string)

返回 string 使用的字元集。

COALESCE(value, ...)

返回第一個非 NULL 的引數。如果所有引數都是 NULL,則返回 NULL。必須至少有一個引數。

COERCIBILITY(string)

COLLATION(string)

返回 string 使用的排序規則。

CONNECTION_ID()

返回當前執行緒的 ID。

CONVERT(value, type)

返回轉換為指定型別的 value。

SELECT CONVERT ('666', UNSIGNED INTEGER)

CONVERT(string USING charset)

將傳遞的 string 轉換為指定的字元集。

SELECT CONVERT ('This is a text' USING utf8)

CURRENT_USER()

返回當前連線中使用的使用者名稱和主機名。

SELECT CURRENT_USER()
SELECT CURRENT_USER -- it's correct

DATABASE()

返回當前資料庫的名稱,使用 USE 命令設定。

SELECT DATABASE()

FOUND_ROWS()

在帶有 LIMIT 子句和 SQL_CALC_FOUND_ROWS 關鍵字的 SELECT 之後,您可以使用 FOUND_ROWS() 函式執行另一個 SELECT。如果之前的查詢沒有 LIMIT 子句,它會返回之前的查詢找到的行數。

SELECT SQL_CALC_FOUND_ROWS * FROM stats ORDER BY id LIMIT 10 OFFSET 50
SELECT FOUND_ROWS() AS n

GREATEST(value1, value2, ...)

返回傳遞的最大引數。

IF(val1, val2, val3)

如果 val1 為 TRUE,則返回 val2。如果 val1 為 FALSE 或 NULL,則返回 val3。

IFNULL(val1, val2)

如果 val1 為 NULL,則返回 val2;否則,返回 val1。

ISNULL(value)

如果傳遞的值為 NULL,則返回 1,否則返回 0。

INTERVAL(val1, val2, val3, ...)

NULLIF(val1, val2)

如果 val1 = val2,則返回 NULL;否則,返回 val1。

LEAST(value1, value2, ...)

返回傳遞的最小引數。

日期和時間

[編輯 | 編輯原始碼]
SELECT * FROM mytable
 WHERE datetimecol >= (CURDATE() - INTERVAL 1 YEAR)  AND
 datetimecol < (CURDATE() - INTERVAL 1 YEAR) INTERVAL 1 DAY;
SELECT IF(DAYOFMONTH(CURDATE()) <= 15,
 DATE_FORMAT(CURDATE(), '%Y-%m-15'),
 DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m-15')) AS next15
FROM table;
SELECT YEAR('2002-05-10'), MONTH('2002-05-10'), DAYOFMONTH('2002-05-10')
SELECT PurchaseDate FROM table WHERE YEAR(PurchaseDate) <= YEAR(CURDATE())
SELECT columns FROM table
WHERE start_time >= '2004-06-01 10:00:00' AND end_time <= '2004-06-03 18:00:00'
SELECT * FROM t1
WHERE DATE_FORMAT(datetime_column, '%T') BETWEEN 'HH:MM:SS' AND 'HH:MM:SS'
SELECT Start_time, End_time FROM Table
WHERE Start_time >= NOW() - INTERVAL 4 HOUR

SELECT NOW() + INTERVAL 60 SECOND
SELECT UNIX_TIMESTAMP('2007-05-01'); -- 1177970400
SELECT FROM_UNIXTIME(1177970400); -- 2007-05-01 00:00:00

聚合函式

[編輯 | 編輯原始碼]

COUNT(field)

[編輯 | 編輯原始碼]

如果給出 *,而不是欄位名,COUNT() 會返回查詢找到的行數。它通常用於獲取表中的行數。

SELECT COUNT(*) FROM `antiques`

如果使用 DISTINCT 關鍵字,則相同的行只計算一次。

SELECT COUNT(DISTINCT *) FROM `antiques`

如果給出欄位名,則返回非 NULL 值的數量。

SELECT COUNT(`cost`) FROM `antiques`

如果給出欄位名並且給出 DISTINCT 關鍵字,則返回非 NULL 值的數量,並且相同的行只計算一次。

SELECT COUNT(DISTINCT `cost`) FROM `antiques`

您可以計算表示式的非 NULL 值

SELECT COUNT(`longitude` + `latitude`) FROM `cities`

這會返回經度和緯度都非 NULL 的行數。

MAX(field)

[編輯 | 編輯原始碼]

MAX() 可用於獲取與查詢匹配的行中表達式 的最大值。如果沒有任何行與查詢匹配,則返回 NULL。

SELECT MAX(`cost`) FROM `antiques`
SELECT MAX(LENGTH(CONCAT(`first_name`, ' ', `last_name`))) FROM `subscribers`

MIN(field)

[編輯 | 編輯原始碼]

MAX() 可用於獲取與查詢匹配的行中表達式 的最小值。如果沒有任何行與查詢匹配,則返回 NULL。

SELECT MIN(`cost`) FROM `antiques`

AVG(field)

[編輯 | 編輯原始碼]

MAX() 可用於獲取與查詢匹配的行中表達式 的平均值。如果沒有任何行與查詢匹配,則返回 NULL。

SELECT AVG(`cost`) FROM `antiques`

SUM(field)

[編輯 | 編輯原始碼]

SUM() 可用於獲取與查詢匹配的行中表達式 的值的總和。如果沒有任何行與查詢匹配,則返回 NULL。

如果使用 SUM(SELECTED expr),則相同的行只新增一次。SUM(DISTINCT) 已在 MySQL 5.1 中新增。

SELECT SUM(`cost`) FROM `antiques`

聚合位函式

[編輯 | 編輯原始碼]

通用語法

FUNCTION_NAME(expression)

這些函式為結果集的每一行計算 expression,並在所有 expression 之間執行計算。這些是按位函式。使用的精度為 64 位。

AND

SELECT BIT_AND(ip) FROM log

OR

SELECT BIT_OR(ip) FROM log

(如果沒有任何行,則返回 0)

XOR

SELECT BIT_XOR(ip) FROM log

(如果沒有任何行,則返回 0)

華夏公益教科書