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)