本文主要是介绍<SQL>《SQL命令(含例句)精心整理版(2)》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《SQL命令(含例句)精心整理版(2)》
- 跳转《SQL命令(含例句)精心整理版(1)
- 8 函数
- 8.1 文本处理函数
- 8.2 数值处理函数
- 8.3 时间处理函数
- 8.3.1 时间戳转化为自定义格式from_unixtime
- 8.3.2 转化时间格式CONVERT()
- 8.3.3 获取系统时间
- 8.4 聚集函数(aggregate function)
- COALESCE
- 9 子查询
- 9.1 子查询
- 9.2 GROUP BY & ORDER BY
- 9.3 分组排序 (row_number()over())
跳转《SQL命令(含例句)精心整理版(1)
8 函数
8.1 文本处理函数
函数 | 说明 |
---|---|
LEFT() | (或使用子字符串函数) 返回字符串左边的字符 |
LENGTH() | (也使用DATALENGTH()或LEN()) 返回字符串长度 |
LOWER() | (Access使用LCASE()) 将字符串转换为小写 |
LTRIM() | 去掉字符串左边的空格 |
RIGHT() | (或使用子字符串函数) 返回字符串右边的字符 |
RTRIM() | 去掉字符串右边的空格 |
SOUNDEX() | 返回字符串的SOUNDEX值 |
UPPER() | (Access使用UCASE()) 将字符串转换成大写 |
8.2 数值处理函数
函数 | 说明 |
---|---|
ABS() | 返回一个数的绝对值 |
COS() | 返回一个角度的余弦 |
EXP() | 返回一个数的指数值 |
PI() | 返回圆周率 |
SIN() | 返回一个角度的正弦 |
SQRT() | 返回一个数的平方根 |
TAN() | 返回一个角度的正切 |
8.3 时间处理函数
函数 | 说明 |
---|---|
now() | 当前日期日期 |
curdate() | 当前日期 |
curtime() | 当前时间 |
时间差 | DATE_ADD() # 给日期添加指定的时间间隔 DATE_SUB() # 给日期减去指定的时间间隔 例如:DATE_SUB(curdate(),INTERVAL 7 DAY) 当前日期减七天 |
时间差函数 timestampdiff | 语法: timestampdiff(unit,begin,end) begin和end可以为DATE或DATETIME类型,并且可允许参数为混合类型。 |
8.3.1 时间戳转化为自定义格式from_unixtime
函数 | 说明 |
---|---|
格式 | from_unixtime(timestamp(需要转化的时间戳),‘%Y-%m-%d %h:%i:%s’) |
%Y 年 | 4位,2023 |
%y | 年,2位,23 |
%M | 月名 |
%m | 月,数值(00-12) |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%H:%i:%s | 00:00:00 |
8.3.2 转化时间格式CONVERT()
函数 | 说明 |
---|---|
格式 | CONVERT(expr,type) expr: 要转换的值 type: 要转换为的数据类型 |
DATE | 将expr转换成’YYYY-MM-DD’格式 |
DATETIME | 将expr转换成’YYYY-MM-DD HH:MM:SS’格式 |
TIME | 将expr转换成’HH:MM:SS’格式 |
CHAR | 将expr转换成CHAR(固定长度的字符串)格式 |
SIGNED | 将expr转换成INT(有符号的整数)格式 |
UNSIGNED | 将expr转换成INT(无符号的整数)格式 |
DECIMAL | 将expr转换成FLOAT(浮点数)格式 |
BINARY | 将expr转换成二进制格式 |
8.3.3 获取系统时间
函数 | 说明 |
---|---|
DBMS | 函数/变量 |
Access | NOW() |
DB2 | CURRENT_DATE |
MySQL | CURRENT_DATE() |
Oracle | SYSDATE |
PostgreSQL | CURRENT_DATE |
SQL Server | GETDATE() |
SQLite | Date(‘now’) |
8.4 聚集函数(aggregate function)
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUN() | 返回某列值之和 |
举例:组合聚合函数 | SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM Products |
COALESCE
按顺序对其参数求值并返回第一个非NULL值。仅当所有参数均为NULL时结果才为NULL。
为消息中可能不存在的字段提供缺省值。
表达式:COALESCE(Body.Salary,0) ,
如果消息中有SALARY字段,将返回它的值,如果该字段不存在,将返回0.
9 子查询
9.1 子查询
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
9.2 GROUP BY & ORDER BY
例1:SELECT vend_id,count() AS num_prods FROM Products GROUP BY vend_id
例2:SELECT cust_id,count() AS orders FROM Orders GROUP BY cust_id HAVING COUNT() >=2
9.3 分组排序 (row_number()over())
(1)对查询结果进行排序(无分组)
SELECT empno,WORKDEPT,SALARY,Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee
empno | WORKDEPT | SALARY | Row_Number() |
---|---|---|---|
000010 | A00 | 152750 | 1 |
000110 | A00 | 66500 | 2 |
000120 | A00 | 49250 | 3 |
200010 | A00 | 46500 | 4 |
200120 | A00 | 39250 | 5 |
000020 | B01 | 94250 | 1 |
000030 | C01 | 98250 | 1 |
000130 | C11 | 73800 | 2 |
(2)对查询结果进行排序(无分组)
SELECT empno,WORKDEPT,SALARY,Row_Number() OVER (ORDER BY salary desc) rank FROM employee
empno | WORKDEPT | SALARY | Row_Number() |
---|---|---|---|
000010 | A00 | 152750 | 1 |
000030 | C01 | 98250 | 2 |
000070 | D21 | 96170 | 3 |
000020 | B01 | 94250 | 4 |
000090 | E11 | 89750 | 5 |
000100 | E21 | 86150 | 6 |
000050 | E01 | 80175 | 7 |
000130 | C11 | 73800 | 8 |
000060 | D11 | 72250 | 9 |
小结:row_number() over()和rownum差不多,功能更强一点。(可以在各个分组内从1开始排序)
(3)rank() over() 是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
SELECT WORKDEPT,SALARY,rank() OVER (partition by workdept ORDER BY salary ) as dense_rank_order FROM emp order by workdept
WORKDEPT | SALARY | rank() |
---|---|---|
A00 | 39250 | 1 |
A00 | 46500 | 2 |
A00 | 49250 | 3 |
A00 | 66500 | 4 |
A00 | 152750 | 5 |
B01 | 94250 | 1 |
C01 | 68420 | 1 |
C01 | 68420 | 1 |
C01 | 73800 | 3 |
(4)dense_rank() over() 是连续排序,有两个第二名时仍然跟着第三名。相比之下,row_number是没有重复值的
SELECT WORKDEPT,SALARY,dense_rank() OVER (partition by workdept ORDER BY salary ) as dense_rank_order FROM emp order by workdept
WORKDEPT | SALARY | dense_rank() |
---|---|---|
A00 | 39250 | 1 |
A00 | 46500 | 2 |
A00 | 49250 | 3 |
A00 | 66500 | 4 |
A00 | 152750 | 5 |
B01 | 94250 | 1 |
C01 | 68420 | 1 |
C01 | 68420 | 1 |
C01 | 72420 | 2 |
C01 | 73800 | 3 |
这篇关于<SQL>《SQL命令(含例句)精心整理版(2)》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!