MySQL/語言/函式
函式名稱不區分大小寫。您可以根據自己的喜好編寫它們
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 子句,它在找到所有匹配行後應用。
型別無關函式。
執行 expression n 次並返回它所花費的時間。有助於查詢 SQL 表示式中的瓶頸。
SELECT BENCHMARK(10000, 'hello'); -- Treatment in 0.0010 sec
返回以指定型別轉換的值。
SELECT CAST(20130101 AS DATE); -- 2013-01-01
返回 string 使用的字元集。
SELECT CHARSET(20130101); -- binary
SHOW CHARACTER SET; -- displays all the different installed CHARACTER SET
返回第一個不為 NULL 的引數。如果所有引數均為 NULL,則返回 NULL。必須至少有一個引數。
SELECT COALESCE(NULL, 'hello', NULL); -- hello
返回 強制性(介於 0 到 5 之間)
SELECT COERCIBILITY('hello'); -- 4
| 強制性[1] | 意思 | 例子 |
|---|---|---|
| 0 | 顯式排序規則 | 具有 COLLATE 子句的值 |
| 1 | 無排序規則 | 具有不同排序規則的字串的串聯 |
| 2 | 隱式排序規則 | 列值 |
| 3 | 系統常數 | USER() 返回值 |
| 4 | 可強制 | 文字字串 |
| 5 | 可忽略 | NULL 或從 NULL 派生的表示式 |
返回 string 使用的排序規則。
SELECT COLLATION('hello'); -- utf8_general_ci
返回當前執行緒的 ID。
SELECT CONNECTION_ID(); -- 31
返回轉換為指定型別的 value。
SELECT CONVERT ('666', UNSIGNED INTEGER)
將傳遞的字串轉換為指定的字元集。
SELECT CONVERT ('This is a text' USING utf8)
返回當前連線中使用的使用者名稱和主機名。
SELECT CURRENT_USER()
SELECT CURRENT_USER -- it's correct
返回當前資料庫的名稱,使用 USE 命令設定。
SELECT DATABASE()
在使用 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
返回傳遞的最大引數。
如果 val1 為 TRUE,則返回 val2。如果 val1 為 FALSE 或 NULL,則返回 val3。
如果 val1 為 NULL,則返回 val2;否則,返回 val1。
如果傳遞的值為 NULL,則返回 1,否則返回 0。
返回第一個引數大於第一個引數的位置,從引數中的整數的零開始。
SELECT INTERVAL(10, 20, 9, 8, 7); -- 0
SELECT INTERVAL(10, 9, 20, 8, 7); -- 1
SELECT INTERVAL(10, 9, 8, 20, 7); -- 2
SELECT INTERVAL(10, 9, 8, 7, 20); -- 3
如果 val1 = val2,則返回 NULL;否則,返回 val1。
返回資料庫中 AUTO_INCREMENT 中最後插入的 ID,這可以避免在插入兩條記錄時使用 SELECT,其中第二條需要一個指向第一條的外部索引鍵。
返回傳遞的最小引數。
擷取字串
SELECT SUBSTR('Hello World!', 7, 5); -- World
有許多與日期相關的函式。[2]
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
注意: convert('17/02/2016 15:49:03',datetime) 或 convert('17-02-2016 15:49:03',datetime) 給出 null,因此插入請求會用與 now() 相同的結果替換它。這應該是 convert('2016-02-17 15:49:03',datetime) 或 convert('2016/02/17 15:49:03',datetime)。
如果給出 *,而不是欄位名,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() 可用於獲取與查詢匹配的行中表達式的最大值。如果沒有行與查詢匹配,則返回 NULL。
SELECT MAX(`cost`) FROM `antiques`
SELECT MAX(LENGTH(CONCAT(`first_name`, ' ', `last_name`))) FROM `subscribers`
MIN() 可用於獲取與查詢匹配的行中表達式的最小值。如果沒有行與查詢匹配,則返回 NULL。
SELECT MIN(`cost`) FROM `antiques`
AVG() 可用於獲取與查詢匹配的行中表達式的平均值。如果沒有行與查詢匹配,則返回 NULL。
SELECT AVG(`cost`) FROM `antiques`
SUM() 可用於獲取與查詢匹配的行中表達式的值的總和。如果沒有行與查詢匹配,則返回 NULL。
如果使用 SUM(DISTINCT expression),則相同值只新增一次。它已在 MySQL 5.1 中新增。
SELECT SUM(`cost`) FROM `antiques`
GROUP_CONCAT() 可用於將組中所有記錄的值連線成一個字串,預設情況下用逗號分隔,或者如果你將它作為可選的第二個引數放置,則可以是任何其他標記。
CREATE TEMPORARY TABLE product (
id INTEGER, product_type VARCHAR(10), product_name VARCHAR(50)
);
INSERT INTO product VALUES
(1, 'mp3', 'iPod'),
(2, 'mp3', 'Zune'),
(3, 'mp3', 'ZEN'),
(4, 'notebook', 'Acer Eee PC'),
(4, 'notebook', 'Everex CloudBook');
SELECT * FROM product;
SELECT product_type, group_concat(product_name)
FROM product
GROUP BY product_type;
SELECT product_type, group_concat(' ', product_name)
FROM product
GROUP BY product_type;
一般語法
FUNCTION_NAME(''expression'')
這些函式計算結果集的每一行的 expression,並在所有 expression 之間執行計算。這些是按位函式。使用的精度為 64 位。
SELECT BIT_AND(ip) FROM log
SELECT BIT_OR(ip) FROM log
(如果沒有行,則返回 0)
SELECT BIT_XOR(ip) FROM log
(如果沒有行,則返回 0)