SQL基础语法

1.SQL语句写法顺序

方式一:

SELECT    字段1,字段2,字段3……
FROM  table_1
		JOIN  table_2 ON table_1和table_2的连接条件
				JOIN  table_3  ON table_2和table_3的连接条件
WHERE   不包含组函数的过滤条件
                  (如:salary>5000)  AND  不包含组函数的过滤条件
GROUP BY …… , ……
HAVING 包含组函数的过滤条件
ORDER BY …… ASC/DESC
LIMIT …… , ……

方式二:

SELECT    字段1,字段2,字段3……
FROM  table_1 , table_2  , table_3 
WHERE   多表的连接条件 
AND/OR  不包含组函数的限制条件
GROUP BY …… , ……
HAVING 包含组函数的限制条件
ORDER BY …… ASC/DESC
LIMIT …… ,

注:
组函数: group by 进行分组的字段函数。
where:不能使用聚合函数SUM,AVG,COUNT和分组中的函数,但是先筛选条件再关联,执行效率高

2.SQL语句数据处理常用函数和非符号型运算符

  • DISTINCT 去除重复行紧跟SELECT。
运算符作用示例
IN判断一个值是否为列表中的任意一个值select d from table where c in(a,b)
NOT IN判断一个值是否不是列表中的任意一个值select d from table where c not in(a,b)
ISNULL判断值、字符串或表达式是否为空select a from table where a isnull
IS NOT NULL判断值、字符串或表达式是否不为空select a from table where a is not null
LEAST在多个值中返回最小值select d from table where c least(a,b)
GREATEST在多个值中返回最大值select d from table where c greatest(a,b)
BETWEEN AND判断一个值是否在两个值之间select d from table where c between a and b;
等价于 select d from table where c >= and c<= b
LIKE判断一个值是否符合模糊匹配的规则select a from table where b like ‘%_%’
REGEXP判断一个值是否符合正则表达式的规则select a from table where b regexp ’ ’

3.语句中常用的函数

  • IF(value,value1,value2): 如果value的值为TRUE,返回value1,否则返回value2。
  • IFNULL(value1,value2): 如果value1不为NULL,返回value1,否则返回value2。
  • EXISTS、NOT EXISTS : 常常伴随子查询使用 — select name from student where sex = ‘f’ and mark exists(select a from b where …) 。
  • CASE WHEN 条件1 THEN 结果
    WHEN 条件2 THEN 结果2
    ELSE 结果3 END

4.字符替换、分割函数

函数释义说明
space(n)space(n)返回n个空格。
left(str,len)left(字符,从最左边开始截取到第几位)从字符最左边截取一定数量的字符。
right(str,len)right(字符,从最右边开始截取到第几位)从字符最右边截取一定数量的字符。
repeat(str,count)repeat(字符串,重复该字符n次)连续重复出现该字符n次。
instr(str,substr)instr(主串,子串)函数返回子串在 字符串中首次出现的位置。
substr(string,start,length)substr(字符串,第几个字符开始,截取字符个数)从字符的某处开始截取,一定长度的字符。
replace(str,from_str,to_str)replace(字符,字符中指定字符,替换的新字符)将主串中 某个子串替换成另一部分字符。
string_agg(name,‘,’)string_agg(列名,连接符将表中某一列数据通过特定符号连接。
concat(str1,str2,…)concat(字符1,字符2,…)拼接字符1,字符2……。
concat_ws(‘-’,str1,str2,…)concat(‘间隔符’,字符串1,字符串2)第一位为分隔符,将每个字符间隔开。
TRIM(str)
TRIM(substr from str)
TRIM(字符开头包含空格)去除首尾空格。
去除开头和结尾的某字符
LTRIM(str)LTRIM(字符开头包含空格)去除首部空格。
RTRIM(str)RTRIM(字符尾部包含空格)去除尾部空格。
LPAD(str,len,padstr)LPAD(字符,总长度,空位填充符)左对齐。
RPAD(str,len,padstr)RPAD(字符,总长度,空位填充符)右对齐。
ETL(N,str1,str2,str3,…)ETL(N,字符1,字符2,……)返回第几个字符串。
FIELD(str,str1,str2,str3,…)FIELD(待查询字符,字符1,字符2,…)str字符第一次出现的位置。
FIND_IN_SET(str,strlist)FIND_IN_SET(字符,字符列表)返回字符在字符列表中的位置,如FIND_IN_SET(‘mm’,‘gg,mm,dd,jj’)返回结果为 2。
REVERSE(str)reverse(字符)将字符顺序颠倒,abcd变成dcba。

5.正则替换、匹配函数

函数释义说明
regexp_instr(source_string, pattern, position, occurrence, return_option, match_parameter)source_string:要搜索的字符串
pattern:正则表达式模式,用于匹配字符串
position:可选参数,指定从哪个字符位置开始搜索。默认为1
occurrence:可选参数,指定要返回的匹配项的序号。默认为1
return_option:可选参数,指定返回的匹配项的位置类型,如起始位置、结束位置等。默认为0
match_parameter:可选参数,指定匹配模式,如大小写敏感、多行模式等。默认为NULL。
在字符串中搜索匹配正则表达式的子字符串,并返回其在源字符串中的位置。
regexp_substr(source_string, pattern, position, occurrence, match_parameter)source_string:要搜索的字符串
pattern:正则表达式模式,用于匹配字符串
position:可选参数,指定从哪个字符位置开始搜索。默认为1
occurrence:可选参数,指定要返回的匹配项的序号。默认为1
match_parameter:可选参数,指定匹配模式,如大小写敏感、多行模式等。默认为NULL。
在字符串中匹配并返回第一个符合正则表达式的子字符串。
regexp_replace(source_string, pattern, replace_string, position, occurrence, match_parameter)source_string:要搜索的字符串
pattern:正则表达式模式,用于匹配字符串
replace_string:要替换匹配项的字符串
position:可选参数,指定从哪个字符位置开始搜索。默认为1
occurrence:可选参数,指定要替换的匹配项的序号。默认为NULL
match_parameter:可选参数,指定匹配模式,如大小写敏感、多行模式等。默认为NULL。
在字符串中搜索匹配正表达式的子字符串,并用指定的字符串替换它们。
regexp_split_to_table(string text, pattern text, flags text)string:是要分割的字符串,pattern:是用来分割字符串的正则表达式,flags参数是一个可选的标志参数,用来指定正则表达式的匹配选项。函数返回一个表格,每一行都是分割后的子串。它可以将一个字符串按照正则表达式分割成多行。select regexp_split_to_table(‘apple,banana,orange’, ‘,’)
返回的结果为:
apple
banana
orange
这里我们使用了逗号作为分隔符,因此函数会将字符串分割成三行。注意,返回结果中的每一行都是text类型的。
还可以使用flags参数来指定正则表达式的匹配选项。比如,如果我们想不区分大小写地匹配字符串,可以使用’c’标志:
select regexp_split_to_table(‘Apple,Banana,orange’, ‘,’, ‘c’)
regexp_split_to_array(source, pattern , flags)source表示要拆分的字符串
pattern表示正则表达式
flags表示可选的标志,可以用来指定正则表达式的匹配模式。
将一个字符串按照正则表达式拆分成多个子串,但是它将这些子串放入一个数组中返回,而不是放入一个表中
如:SELECT regexp_split_to_array(‘hello,world’, ‘,’);执行该语句后,将返回一个包含两个元素的数组,分别为"hello"和"world"。
需要注意的是,regexp_split_to_array函数返回的是一个数组,而不是一个表,因此无法直接使用SELECT语句查询其结果。如果需要查询数组中的元素,则需要使用如下语法:SELECT regexp_split_to_array(‘hello,world’, ‘,’)[1];执行该语句后,将返回数组中第一个元素"hello"。

6.SQL中的窗口函数

6.1 窗口函数语法说明

窗口函数的基本写法
窗口函数写法: | OVER (PARTITION BY <分组字段> ORDER BY <排序字段> ASC/DESC<窗口范围>]

说明:*<窗口函数>* 是指在窗口内执行的聚合函数,例如 SUM、AVG、COUNT 等;*PARTITION BY* 是指按照哪个字段进行分组;*ORDER BY* 是指按照哪个字段进行排序;*<窗口范围>* 是指窗口的大小,可以是行数(ROWS)或者范围(RANGE)。

释义:

  • <窗口函数>:窗口函数是一种特殊的聚合函数,它可以在窗口内进行计算,并且返回多行结果。常见的窗口函数有 SUM、AVG、COUNT、MAX、MIN 等。
  • <分组字段>:指按照哪个字段进行分组计算。如果不指定分组字段,则整个表被视为一个分组。
    +<排序字段>:指按照哪个字段进行排序。如果不指定排序字段,则使用默认的排序顺序。
  • <窗口范围>:指窗口的大小和位置。可以使用 ROWS 指定窗口大小为行数,或者使用 RANGE 指定窗口范围为数值范围。窗口范围可以是当前行之前的若干行,或者是当前行及其前后若干行。

例如:

select&emsp;name,salary,row_number() over (partition by department order by salary desc) as row_num
from employees
  • 这个查询将 employees 表按照部门分组,并为每个部门内的员工按薪资降序分配行号。
  • row_number() over (partition by 是 SQL 中的窗口函数,它可以给查询结果的每一行分配一个唯一的行号。其中 partition by 子句用于对结果集进行分组,行号仅在每一组内是唯一的。

6.2 日期函数

函数释义说明

6.3 常见的窗口函数

6.3.1 分类

  • 排名函数:row_number(),rank(),dense_rank()
  • 聚合函数:max(),min(),count(),sum(),avg(),median()
  • 向前向后取值:lag(),lead()
  • 百分位:percent_rank()
  • 取值函数:first_value(),last_value(),nth_value()
  • 分箱函数:ntile()

1、排名函数

函数说明
row_number()同薪不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
rank()同薪同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
dense_rank()同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3

2、聚合函数

函数说明
max()最大值
min()最小值
avg()平均值
sum()求和
median()中位数

3、向前向后取值

函数说明
ag(field,n,default)前N行,在一次查询中取出当前行的同一字段(field参数)的前面第n行的数据,如果没有用default代替
lead(field,n,default)后N行,在一次查询中取出当前行的同一字段(field参数)的后面第n行的数据,如果没有用default代替

4、百分位

函数说明
percent_rank()计算分组内每一行所在的百分比排名

5、取值函数

函数说明
first_value()分组内第一行的值
last_value()分组内最后一行的值
nth_value(expr, n)分组内第n行的值

6、分箱函数

函数说明
ntile(n)将分区中已排序的行划分为大小尽可能相等的n个已排名组(等频分箱)

7、移动平均

函数用法
n PRECEDING前n行
n FOLLOWING后n行
CURRENT ROW当前行
UNBOUNDED PRECEDING窗口第一行
UNBOUNDED FOLLOWING窗口的最后一行

本文常见的窗口函数部分参考博文详细链: SQL常用窗口函数

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flink SQL 是 Flink 提供的一种声明式的编程方式,它支持类 SQL 的语法。以下是 Flink SQL基础语法: 1. 创建表 可以使用 CREATE TABLE 语句来创建表,语法如下: ```sql CREATE TABLE table_name ( column_name1 data_type1, column_name2 data_type2, ... ) [WITH (property_name=property_value, ...)]; ``` 其中,table_name 是要创建的表名,column_name 是列名,data_type 是数据类型,WITH 子句是可选的,可以设置表的一些属性。 2. 插入数据 可以使用 INSERT INTO 语句来向表中插入数据,语法如下: ```sql INSERT INTO table_name (column_name1, column_name2, ...) VALUES (value1, value2, ...); ``` 其中,table_name 是要插入数据的表名,column_name 是列名,VALUES 子句是要插入的值。 3. 查询数据 可以使用 SELECT 语句来查询数据,语法如下: ```sql SELECT column_name1, column_name2, ... FROM table_name [WHERE condition] [GROUP BY column_name1, column_name2, ...] [HAVING condition] [ORDER BY column_name1 [ASC|DESC], column_name2 [ASC|DESC], ...]; ``` 其中,column_name 是要查询的列名,table_name 是要查询的表名,WHERE 子句是查询条件,GROUP BY 子句是分组条件,HAVING 子句是分组后的过滤条件,ORDER BY 子句是排序条件。 4. 更新数据 可以使用 UPDATE 语句来更新数据,语法如下: ```sql UPDATE table_name SET column_name1 = value1, column_name2 = value2, ... [WHERE condition]; ``` 其中,table_name 是要更新的表名,column_name 是要更新的列名,value 是要更新的值,WHERE 子句是更新条件。 5. 删除数据 可以使用 DELETE FROM 语句来删除数据,语法如下: ```sql DELETE FROM table_name [WHERE condition]; ``` 其中,table_name 是要删除数据的表名,WHERE 子句是删除条件。 以上就是 Flink SQL基础语法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值