SQL打工er:SQL基础知识汇总(持续更新版)

前情提要:

  • 很久远的笔记,试图用于想不起来某知识点时查询,但SQL学习更重实践
  • 侧重DQL,未区分工具,函数分类方式较主观
  • 或有存误之处,欢迎纠错


1. 分类

  • DDL:Data Definition Language 数据定义语言
    • 用于定义数据段、数据库、表、列、索引等数据库对象。
  • DML:Data Manipulation Language 数据操纵语句
    • 用于添加、删除、更新和查询数据库记录,并检查数据完整性。
  • DCL:Data Control Language 数据控制语句
    • 用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。
  • DQL:Data Query language 数据查询语言
    • 用于查询数据。

2. 数据类型

2.1 MySQL

2.1.1 Text

数据类型

简介

CHAR(size)

保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。

VARCHAR(size)

保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。

TINYTEXT

存放最大长度为 255 个字符的字符串。

TEXT

存放最大长度为 65,535 个字符的字符串。

BLOB

用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。

MEDIUMTEXT

存放最大长度为 16,777,215 个字符的字符串。

MEDIUMBLOB

用于 BLOBs(Binary Large OBjects)。

存放最多 16,777,215 字节的数据。

LONGTEXT

存放最大长度为 4,294,967,295 个字符的字符串。

LONGBLOB

用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。

ENUM(x,y,z,etc.)

允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。

注释:这些值是按照您输入的顺序排序的。

可以按照此格式输入可能的值: ENUM('X','Y','Z')

SET

与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。

2.1.2 Number

数据类型

简介

TINYINT(size)

带符号-128到127 ,无符号0到255。

SMALLINT(size)

带符号范围-32768到32767,无符号0到65535, size 默认为 6。

MEDIUMINT(size)

带符号范围-8388608到8388607,无符号的范围是0到16777215。 size 默认为9

INT(size)

带符号范围-2147483648到2147483647,无符号的范围是0到4294967295。 size 默认为 11

BIGINT(size)

带符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。size 默认为 20

FLOAT(size,d)

带有浮动小数点的小数字。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。

DOUBLE(size,d)

带有浮动小数点的大数字。在 size 参数中规显示定最大位数。在 d 参数中规定小数点右侧的最大位数。

DECIMAL(size,d)

作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。

2.1.3 Date/Time

数据类型

描述

DATE()

日期。格式:YYYY-MM-DD

注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME()

*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP()

*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME()

时间。格式:HH:MM:SS

注释:支持的范围是从 '-838:59:59' 到 '838:59:59'

YEAR()

2 位或 4 位格式的年。

注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

2.2 SQL Server

2.2.1 String

数据类型

简介

存储

char(n)

固定长度的字符串。最多 8,000 个字符。

Defined width

varchar(n)

可变长度的字符串。最多 8,000 个字符。

2 bytes + number of chars

varchar(max)

可变长度的字符串。最多 1,073,741,824 个字符。

2 bytes + number of chars

text

可变长度的字符串。最多 2GB 文本数据。

4 bytes + number of chars

nchar

固定长度的 Unicode 字符串。最多 4,000 个字符。

Defined width x 2

nvarchar

可变长度的 Unicode 字符串。最多 4,000 个字符。

nvarchar(max)

可变长度的 Unicode 字符串。最多 536,870,912 个字符。

ntext

可变长度的 Unicode 字符串。最多 2GB 文本数据。

bit

允许 0、1 或 NULL

binary(n)

固定长度的二进制字符串。最多 8,000 字节。

varbinary

可变长度的二进制字符串。最多 8,000 字节。

varbinary(max)

可变长度的二进制字符串。最多 2GB。

image

可变长度的二进制字符串。最多 2GB。

2.2.2 Number

数据类型

简介

存储

tinyint

允许从 0 到 255 的所有数字。

1 字节

smallint

允许介于 -32,768 与 32,767 的所有数字。

2 字节

int

允许介于 -2,147,483,648 与 2,147,483,647 的所有数字。

4 字节

bigint

允许介于 -9,223,372,036,854,775,808 与 9,223,372,036,854,775,807 之间的所有数字。

8 字节

decimal(p,s)

固定精度和比例的数字。

允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节

numeric(p,s)

固定精度和比例的数字。

允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节

smallmoney

介于 -214,748.3648 与 214,748.3647 之间的货币数据。

4 字节

money

介于 -922,337,203,685,477.5808 与 922,337,203,685,477.5807 之间的货币数据。

8 字节

float(n)

从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。

n 参数指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。

4 或 8 字节

real

从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。

4 字节

2.2.3 Date

数据类型

简介

存储

datetime

从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。

8 字节

datetime2

从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。

6-8 字节

smalldatetime

从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。

4 字节

date

仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。

3 bytes

time

仅存储时间。精度为 100 纳秒。

3-5 字节

datetimeoffset

与 datetime2 相同,外加时区偏移。

8-10 字节

timestamp

存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 值基于内部时钟,不对应真实时间。

每个表只能有一个 timestamp 变量。

2.2.4 其他

数据类型

简介

sql_variant

存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。

uniqueidentifier

存储全局唯一标识符 (GUID)。

xml

存储 XML 格式化数据。最多 2GB。

cursor

存储对用于数据库操作的指针的引用。

table

存储结果集,供稍后处理。

3. 函数

3.1 数据类型转换

序号

函数

简介

1

cast()

cast(expression as data_dype[length]) length默认为30

①整数:cast(‘12’ as int)

②浮点数:cast(‘1.2’ as decimal(9,2)) —1.20,decimal(m,n),m代表数字个数,n为保留n位小数,若不指定,默认为整数

③日期:select cast('20210922' as date) --2021-09-22

select cast(',1,2,3,4,8,9,10,11,12,13,14,15,16,17,18' as varchar)

select cast(',1,2,3,4,8,9,10,11,12,13,14,15,16,17,18' as varchar(50))

2

convert()

convert(data_type(length), data_to_be_converted, style)

数据类型,需要转换的值,输出格式

style用于将日期时间或smalldatetime转换为字符数据的样式值

【示例】

select convert (int, 25.65)     --25

select convert(decimal, '123.45') -- 123

select convert(decimal(9,2), '123.45') -- 123.45

select convert(varchar(25), getdate())    

--09 22 2021 10:31PM

select convert(varchar (24), getdate(), 120)   

--2021-09-22 22:32:43,最常用,保留日期时间信息

select convert(varchar(10), getdate(), 102)     

--2021.09.22,只保留日期信息

select convert (varchar(10), getdate(), 111)     

--2021/09/22,只保留日期信息

select convert(varchar(10), getdate(), 108)     

--22:34:06,只保留时间信息

3.2 字符串处理

序号

类别

函数

简介

1

转换

ascii()

ascii(字段),返回字段表达式最左段字符的ascii码值

2

转换

char()

输入0-255之间ascii值,将ascii码转换成字符;若不属于0-255或未输入,char()返回NULL

3

转换

soundex()

将任何文本串转换为描述其语音表示的字母数字模式的算法,返回soundex值

4

转换

str()

str(float_expression, length, decimal):数值,字符串长度,小数位数

将数值型数据转换成字符型数据,先服从length后decimal。

如果没有指定长度,默认length为10,默认decimal为0;

如果length或decimal为负数,返回NULL;

如果length小于小数点左边的位数,返回length个*;

如果字符串位数小于length,左边补足空格。

5

转换

lower()

全小写,lcase(str)

6

转换

upper()

全大写,ucase(str)

7

去空格

trim()

两头去空格,trim(substr from str),去掉str两端的substr

8

去空格

ltrim()

左边去空格

9

去空格

rtrim()

右边去空格

10

截取

left()

left(char_expression, integer_expression)=left(字段,个数)

返回char左边n个字符

11

截取

right()

right(char_expression, integer_expression)=right(字段,个数)

返回char右边n个字符

12

截取

substring()

substr()

substr(expression, start_position, length)=mid(str, n, len)

返回从char左边第n个字符起,长度为length的子串

13

截取

substring_index

substring(被截取字段,分隔符,位置)

select substring_index(‘www.baidu.com)’, ‘.’, 2)

14

切割

split()

hive数据库:split(字符串,分隔符),划分结果是array

select split ('wo,shi,xiao,ming',',')

-- ["wo","shi","xiao","ming"]

15

切割

explode()

hive数据库:一行转一列

将一行数据拆分成一列,explode(array/map类型)

select explode(array("wo","shi","xiao","ming")) as word

–分成一列

select explode(map('A','1','B','2','C','3'))

—分2列,key、value各一列

16

切割

posexplode()

hive数据库:多行转多列

select id,tim, single_id_index, single_id from test.a

lateral view posexplode(split(id,',')) t as single_id_index, single_id

17

切割

lateral view

hive数据库:lateral view

格式:laterak view 虚拟表 虚拟表名称 as 拆分字段

用法:

①from后where前;

②必须给虚拟表命名;

③from后可以带多个lateral view;

④如果要拆分的字段有null值,需要使用lateral view outer 替代,避免数据缺失。

select   name,   t_course.course,   t_hobby.hobby

from lateral_test

lateral view explode(split(course, ',')) t_course as course

lateral view explode(split(hobby, ',')) t_hobby as hobby

select   name,  course,  col1 from lateral_test

lateral view outer explode(array()) et as col1

18

拼接

concat()

concat(字段, 符号,字段……):用逗号分隔连接的字段或字符串

也可以用“+”(加号)拼接,如name+’A’+class as new

19

拼接

concat_ws()

可以一次性指定分隔符号,分隔符号不能是NULL

concat_ws(分隔符号, str1, str2)

20

拼接

group_concat()

分组拼接

group_concat(分组字段 order by 排序字段 desc separator 分隔符)

select name, group_concat(id) from t1 group by name

select name,group_concat(id order by id desc separator  '_')  from tt2 group by name

21

查找

charindex()

charindex(substr_expression, expression):

substr_expression是要找的字符串,expression可以是字符串,也可以是列表;如果发现子串,返回子串开始出现的位置;如果没有发现子串,返回0。

不能用于text和image数据类型。

22

查找

parindex()

parindex(%substr_expression%, column_name),返回指定子串开始出现的位置,找不到则返回0。

要找的字符串前后必须有%,否则返回值为0。

可以用于char、varchar、text数据类型。

23

查找

instr()

instr(str, substr),返回在字符串str中子串substr第一个出现的位置,下标从1开始,没有返回0,hql中可以使用

24

查找

locate()

locate (substr,str,pos)

从str的pos开始找substr,返回第一个出现的位置,没有返回0

hql中可以使用

25

查找

position()

position(substr,str)

返回子串 substr 在字符串 str 中第一次出现的位置。

如果子串 substr 在 str 中不存在,返回值为 0,hql中不可以使用

26

查找

find_in_set()

find_in_set(str1,str2)

返回str2中str1所在的位置索引,str2必须以","分割开, 如有两行数据

27

查找

contains()

contains('targetStr','serachStr')

在mysql中,对普通的字符串列无法使用contains方法

28

比较

like

通配符:

①%(百分号):代表0-n个字符;

②_(下划线):代表1个字符;

③[](方括号):代表字符集,如’[JM]%’代表以J或M开头的字符串;

④^或!:与方括号搭配使用,表示否定,’[^JM]%’代表不以J或M开头的字符串;'[M-Z]inger'代表以M-Z开头的字符串

29

操作

quotename()

主要作用就是在存储过程中,给列名、表名等加个[]、''等以保证sql语句能正常执行。如表名称为123、abc时,直接查询会出错,得将其转为参数,所以需要用quotename来转义。

quotename(character_string, quote_character)

character_string:字符串

quote_character :sysname值,可以是单引号(’)、左方括号([)、右方括号(])、双引号(”)等,默认为方括号[]

select quotename('ab[]cde')        

输出结果:[ab[]]cde]         

select quotename('ab[]cde',']')    

输出结果:[ab[]]cde]          

select quotename('ab[]cde','')     

输出结果:[ab[]]cde]          

select quotename('ab[]cde','''')   

输出结果:'ab[]cde'          

select quotename('ab[]cde','}')    

输出结果:{ab[]cde}          

select quotename('ab{}cde','}')    

输出结果:{ab{}}cde} 

select quotename ('测试') -- 结果 :[测试]

select quotename ('测试', '[') -- 结果 :[测试]

select quotename ('测试', '{') -- 结果 :{测试}

select quotename ('测试', '(') -- 结果 :(测试)

30

操作

replicate()

repeat()

repliacate(str, count)—字符串,复制次数

select replicate(‘a’,2) –返回’aa’

返回一个重复character_expression 指定次数的字符串

31

操作

reverse()

将指定的字符串的字符排列顺序颠倒

reverse(<character_expression>)

其中character_expression 可以是字符串、常数或一个列的值

32

操作

space()

返回一个有指定长度的空白字符串

space (<integer_expression>) 如果值为负值,则返回NULL

33

替换

replace()

返回被替换了指定子串的字符串

replace(str,str1,str2):用str2替换str中的str1

34

替换

stuff()

insert()

stuff (string, start, length, substring)

字符串,起始位置,长度,用于替换的字符串

用substring替换string从start开始长度为length的子串

如果起始位置为负,或长度为负,或其实位置大于string长度,返回NULL;

如果length长度大于start起始位置开始的长度,string只保留首字符

35

替换

lpad()

lpad(str, length, substr),用substr替换str左起length长度的字符。

如果substr长度大于length,长度缩短至length。

36

替换

rpad()

rpad(str, length, substr)

37

其他

len()

length()

返回字符串长度

38

其他

bit_length()

返回字符串的比特长度

39

其他

difference()

两个字符串发音越相似(仅限于英文字符),返回值越大(返回值在0 - 4之间)

DIFFERENCE( ' sun ' , ' san ' )     -- 返回值4

DIFFERENCE( ' sun ' , ' safdsdf ' )    -- 返回值3

DIFFERENCE( ' sun ' , ' dgffgfdg ' )    -- 返回值0

40

其他

strcamp()

strcamp(str1,str2):如果str1和str2相同,返回0;str1小于str2,返回-1;其他情况返回1

41

其他

elt()

elt(n,str1,str2,……,strn),返回第n个字符串

3.3 日期时间

序号

类别

函数

简介

1

获取日期

curdate()或current_date()

返回当前日期,如2023-04-11

utc_date():返回当前UTC(世界标准时间)日期值,其格式为"YYYY-MM-DD"或"YYYYMMDD"

utc_time():返回当前UTC时间值,其格式为"YYYY-MM-DD"或"YYYYMMDD"

2

获取时间

curtime()或current_time

返回当前时间,如15:33:11

3

获取时间

now()

返回当前日期+时间,如2023-04-11 15:33:11

current_timestamp()、localtime()、sysdate()

4

获取年月日

year()

year(date_expression):返回date_expression中的年份值

YEAR("2022-04-11 15:44:28")

5

获取年月日

month()

month(date_expression):返回date_expression中的月份值

MONTH("2022-04-11 15:44:28")

6

获取年月日

monthname()

monthname(date_expression):

返回date_expression中的月份名称。

MONTHNAME("2022-04-11 15:44:28") -- April

7

获取年月日

day()

day(date_expression):返回date_expression中的日期值

DAY("2022-04-11 15:44:28")

8

获取时分秒

hour()

hour(date_expression):返回date_expression中的小时值

HOUR("2022-04-11 15:44:28")

9

获取时分秒

minute()

minute(date_expression):返回date_expression中的分钟值

MINUTE("2022-04-11 15:44:28")

10

获取时分秒

second()

second(date_expression):返回date_expression中的秒值

SECOND("2022-04-11 15:44:28")

11

获取

extract(type from date)

从日期中提取一部分,type可以是YEAR、YEAR_MONTH、DAY_HOUR、DAY_MINUTE、DAY_SECOND、DAY_MICROSECOND

12

获取星期

dayname()

dayname(date_expression):返回当天星期名称

DAYNAME("2022-04-11 15:44:28") – Monday

13

计算日期

date_add()

add_date()

date_add(date, interval expr type)

date_add(日期,interval 数字 时间单位)

type:year/quarter/month/week/day/hour/minute/second/

microsecond

date_add(now(), interval 1 year)

date_add(now(),interval 1 month) 

sql server是dateadd(type, expr, date)

add_date(date, interval expr type)

14

计算日期

date_sub()

date_sub(日期,interval 数字 时间单位)

subdate(date, interval expr type)

15

计算间隔

datediff()

datediff(date1, date2)=date1-date2,只计算日期差异

16

计算间隔

timestampdiff()

timestampdiff(unit, begin, end)=end-begin

17

计算间隔

unix_timestamp()

unix_timestamp()返回格林尼治标准时间1970-01-01 00:00:00到现在的秒数,unix_timestamp(date)返回格林尼治标准时间1970-01-01 00:00:00到指定时间的秒数

18

日期顺序

dayofyear()

dayofyear(),返回date是一年的第几天,1-366

19

日期顺序

dayofmonth()

dayofmonth(),返回date是一个月的第几天,1-31

20

日期顺序

dayofweek()

weekday()

dayofweek(),返回date是一星期的第几天,1-7,1是周日

weekday(),返回date是一星期的第几天,0-6,0是周一

21

日期顺序

quarter()

返回date是一年的第几季度,1-4

22

日期顺序

week()

返回date是一年的第几周,1-53

23

格式化

date_format()

date_format(date, format)

date_format(now(), ‘%Y.%m.%d’) – 2023.07.01

年=%Y,4位,yyyy

年=%y,2位,yy

月=%M,英文名

月=%m,数值,01-12

月=%b,缩写月名

星期=%a,缩写星期名

星期=%W,星期名

星期=%w,数值,0-6

日=%D,带英文前缀

日=%d,数值,01-31

日=%e,数值,1-31

%J:年的天,001-366

%X:年,星期日是周的第一天,4 位,与 %V 使用

%V:周 (01-53) 星期日是一周的第一天,与 %X 使用

%x:年,星期一是周的第一天,4 位,与 %v 使用

%v:周 (01-53) 星期一是一周的第一天,与 %x 使用

%U:周 (00-53) 星期日是一周的第一天

%u:周 (00-53) 星期一是一周的第一天

24

格式化

time_format()

time_format(now(), ‘%h:%i:%s’) – 08:00:23

%H:00-23

%h:01-12

%I:01-12

%k:0-23

%l:1-12

%i:00-59,分钟

%p:AM、PM

%S:00-59秒

%s:00-59

%f:微妙

%r:时间,12小时,hh:mm:ss AM/PM

%T:时间,24小时,hh:mm:ss

25

格式化

to_date()

to_date(datetime, format)

26

格式化

from_unixtime()

from_unixtime(unix_timestamp, format)

时间戳,时间格式

27

其他

time_to_sec(time)

sec_to_time(num)

time_to_sec(time)=3600*小时+60*分钟+秒

sec_to_time是time_to_sec的反函数

3.4 数学相关

序号

类别

函数

简介

1

数值编辑

str()

str(number, length, decimal)= 数字,长度,小数位

SELECT STR( 123.34584 ,  7 ,  3 )    -- 返回值123. 346

当设定长度值小于整数部位长度时,字符串将返回设定长度个 *

SELECT STR( 123333.34584 ,  5 ,  4 )    -- 返回值 *****

2

数值编辑

floor()

返回指定数字的最大整数

select floor( 123456.1234 )    -- 返回值123456

3

数值编辑

ceiling()

返回不带小数部分并且不小于其参数的值的最小数字。如果参数是一个空序列,则返回空序列

select ceiling( 123.010 )     -- 返回124

select ceiling( null )     -- 返回NULL

4

数值编辑

round()

返回四舍五入后的最接近该数值的数值

select round( 126.018 , 2 )     -- 返回126. 12

5

数值编辑

abs()

绝对值

6

常数

pi()

SELECT PI()      -- 返回3. 14159265358979

7

常数

rand()

函数返回一个介于 0 和 1(不包括 0 和 1)之间的随机 float 值

rand(seed):如果不指定seed,会随机分配seed

8

数学运算

squart()

平方:Square(float_expression)

float_expression 是 float 类型或能隐式转换为 float 类型的表达式;函数的返回值为 float 数据

select SQUARE(9) as '9 的平方'

9

数学运算

sqrt()

平方根:Sqrt(float_expression)

select SQRT(9) as '9 的平方根'

10

数学运算

power()

乘方:Power(float_expression,y)

select POWER(3,3) as '3 的 3 次方',POWER(1.5,3) as '1.5 的 3 次方'

11

数学运算

mod(x,y)

返回x/y的模(余数)

12

数学运算

log(x,y)

logyx=返回x的以y为底的对数

13

数学运算

ln(x)

返回x的以e为底数的对数=lnx

14

数学运算

log10(x)

返回x的以10为底数的对数=log10x

15

数学运算

mod(x,y)

返回x/y的模(余数)

16

数学运算

srdev

stddev_pop

标准差

select srdev(column_name) from table_name;

select stddev_pop(column_name) from table_name;

sqrt(sum(power(column_name - avg(column_name), 2)) / count(*))

17

三角函数

sin()

返回指定角度的三角正弦值

18

三角函数

cos()

返回指定角度的三角余弦值

19

三角函数

tan()

返回指定角度的三角正切值

20

三角函数

cot()

返回指定角度的三角余切值

21

三角函数

asin()

返回反正弦值

22

三角函数

acos()

返回反余弦值

23

三角函数

atan()

返回反正切值

24

其他

radians()

返回x由角度转化为弧度的值

25

其他

degrees()

返回x由弧度转化为角度的值

26

其他

sign()

返回代表数字x的符号的值

27

其他

greatest()

greatest(x1,x2,……xn),返回集合中最大的值

28

其他

least()

least (x1,x2,……xn),返回集合中最小的值

28

其他

format()

format(x,n):将数字x格式化,并以四舍五入的方式保留小数点后n位,结果以字符串形式返回

3.5 聚合函数

序号

函数

简介

1

avg()

聚合开窗:

select sum(score) over(partition by name) from table – name相同的分数相加

select sum(score) over(order by id) from table – 按照id的顺序升序依次相加

group by后加 with rollup会把整体再算一遍

with rollup作用:在聚合函数上,如果聚合函数是COUNT(*)则会在统计的记录中再次求COUNT(*),如果是AVG(),则会在分组

with rollup 作用在group by 的第一个字段

2

count()

3

min()

4

max()

5

sum()

6

group_concat()

7

group by

3.6 窗口函数

<窗口函数> over (partition by <用于分组的列名>

                 order by <用于排序的列名>

 frame_clause <窗口大小>)

【frame_clause】作用是对分组进一步细分,在当前分组内指定一个计算窗口。

指定了窗口之后,就不再基于分组进行计算,而是基于窗口内的数据进行计算。窗口会随着当前处理的数据行而移动,也可理解为 限制窗口框架,可以使用 rows 和 range。

rows :将分组中包含的行指定为当前行之前或之后的行。

例如,rows N preceding (表示之前 N 行到本行)

range :按照排序列的当前值,根据相同值来确定分组中的行。

例如:range between frame_start and frame_end

【frame_start 和 frame_end】

current row:对于 rows 方式,代表了当前行;对于 range ,代表了当前行的所有对等行。

unbounded preceding:代表了分组中的第一行。

unbounded following:代表了分组中的最后一行。

n preceding:对于 rows 方式,代表了当前行之前的第 n 行;对于 range ,代表了等于当前行的值减去 n 的所有行;如果当前行的值为 NULL,代表了当前行的所有对等行。

n following:对于 rows 方式,代表了当前行之后的第 n 行;对于 range ,代表了等于当前行的值加上 n 的所有行;如果当前行的值为 NULL,代表了当前行的所有对等行。

序号

函数

简介

1

first_value()

在窗口取到的第一个值

select first_value(score) over( partition by name) as first_score

--根据name分区(组),取score列的第一个值

2

last_value()

在窗口取到的最后一个值

last_value(score) over(partition by name) as last_score

--根据name分区(组),取score列的最后一个值

3

lead()

取当前行的上 N 条数据,并且可以设置默认值

lead(expression, offset, default_value)=列,偏移量,如果没有数值时的默认值(默认为null,可以设置为0)

lead(score,1,0) over(partition by name ) as lead_score

--根据name分区(组),score列当前行的上面N行,如果没有就为默认值0

4

lag()

取当前行的下 N 条数据,并且可以设置默认值

lag(expression, offset, default_value)=列,偏移量,如果没有数值时的默认值(默认为null,可以设置为0)

lag(score,1,0) over(partition by name ) as lag_score

--根据name分区(组),score列当前行的下面N行,如果没有就为默认值0

5

row_number()

row_number ()是为每组的行设置一个连续的递增的数字(123456)

row_number() over( partition by name order by score) as row_score

6

rank()

rank()是排名,也为每一组的行生成一个序号,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的,如111456

rank() over(partition by name order by score asc) as rank_score

7

dense_rank()

dense_rank()是排名,如果有相同序号,序号不会间断,如112334

dense_rank() over(partition by name order by score asc) as dense_rank_score

8

ntile()

ntile(n) over(partition by expression order by expression desc/asc)

n是将数据集分成的组数,partition是要分组的列,order是排序顺序。

ntile( 4 ) over ( PARTITION BY id ORDER BY sale ) AS rank1—先按sale升序排序,按id特征分组,分成4组—主打一个分桶的概念

9

nth_value(expr,n)

nth_value(expr,n):返回窗口中第n个expr的值

NTH_VALUE( cost, 3 ) OVER ( ORDER BY username ASC ) nth_cost

-- 按username排序,排序完取cost第3行的值

nth_value(cost, 3) over(partition by username order by cost) as nth_cost

-- 按username分组分别按cost升序排序,取每组排序第3的cost,如果排序在3之前,该数值为null

10

cume_dist()

计算分组中当前行的相对排名。即计算每行数据在其分组内的累积分布,也就是排在该行数据之前的所有数据所占的比率,取值范围(0,1]。

假如一共有k个值,本行排序第n

返回值=n/k

11

percent_rank()

当前行的百分比排名

返回值在[0,1]内,假如一共有k个值,本行排序第n

返回值=n-1/k-1

3.7 条件判断

序号

函数

简介

1

case when

case when 条件1 then 结果1

       ……

when 条件n then 结果n

        else 结果n+1 end

case 字段 when 值1 then 结果1

       ……

when 值n then 结果n

        else 结果n+1 end

2

if()

if(条件1,结果1,结果2)

如果条件1满足,返回结果1,否则返回结果2

3

ifnull()

判断第一个参数是否为Null,ifnull(字段1, 字段2)

如果字段1不是空,返回字段1,否则返回字段2

4

nullif()

判断两个参数是否相等,nullif(字段1, 字段2)

如果字段1=字段2,返回null,否则返回字段1

3.8 系统信息

序号

函数

简介

1

VERSION()

看版本

2

connnection_id()

当前用户连接数

3

USER()、CURRENT_USER()、SYSTEM_USER()、SESSION_USER():查看当前被MySQL服务器验证的用户名和主机的组合,一般这几个函数的返回值是相同的

4

charset(str)

查看字符串str使用的字符集

5

collation()

查看字符串排列方式

3.9 加密函数

序号

函数

简介

1

password(str)

从原明文密码str计算并返回加密后的字符串密码,注意这个函数的加密是单向的(不可逆),因此不应将它应用在个人的应用程序中而应该只在MySQL服务器的鉴定系统中使用

2

md5(str)

为字符串算出一个MD5 128比特校验和,改值以32位十六进制数字的二进制字符串形式返回

3

encode(str,pswd_str)

使用pswd_str作为密码,加密str

4

decide(crypt_str,pswd_str)

使用pswd_str作为密码,解密加密字符串crypt_str,crypt_str是由ENCODE函数返回的字符串

3.10 其他

序号

函数

简介

1

CONV(N,from_base,to_base)

不同进制数之间的转换,返回值为数值N的字符串表示,由from_base进制转换为to_base进制

2

INET_ATON(expr)

给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数,地址可以使4或8比特

3

INET_NTOA(expr)

给定一个数字网络地址(4或8比特),返回作为字符串的该地址的点地址表示

4

BENCHMARK(count,expr)

重复执行count次表达式expr,它可以用于计算MySQL处理表达式的速度,结果值通常是0(0只是表示很快,并不是没有速度)。

另一个作用是用它在MySQL客户端内部报告语句执行的时间

5

CONVERT(str USING charset)

使用字符集charset表示字符串str

6

ifnull(expression,值)

7

coalesce(val1, val2, ...., val_n)

返回第一个非空值

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值