跳转到内容

面向十一级(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)

华夏公益教科书