工作中用到的sql汇总:

学习资源来自:《Mysql必知必会》该书简单明了,适合我这种大白,像是小学老师授课一样。在做学习笔记的时候,结合本身专业,将其对应扩展,便于迁移到实际应用中,将固定的知识同实践相结合去理解各个知识点。

最前面是工作中较为常用的语句,后面是看书总结的语法知识。

一、LIKE

使用通配符% 来匹配city字段中包含的字母。

SELECT * FROM Persons
WHERE City LIKE '%lon%'

1.基本概念:

表:某种特定类型数据的结构化清单。在应用中,常用语存储训练样本。

列:表中的一个字段,所有的表都是由一个或者多个列组成。每一列在机器学习(machine learning,ML)中,代表一个特征的取值,第一行是特征的名字。

行:表中的一个记录,一个表可以由多个记录组成。在ML的训练样本中,每一行表示一个样本所对应各个特征的取值。

主键:唯一标志表中的每一行的字段。通常,样本表和特征表不在一个表中,因此我们通常关联两个表中的主键,获取样本中的特征值。因为一个样本,可能存在多个不同粒度下的特征,每一个粒度下的特征都会构建一个表,来生成这些特征。比如:一个人A作为一个样本,他具有个人属性粒度的特征,也具有社会属性粒度的特征。想要将个人属性和社会属性关联起来,则需要两个表中的主键想关联。

比如:

select 个人属性特征

from 个人属性表

left outer join

(select 社会属性特征

from 社会属性表)

on 个人属性表主键=社会属性表主键

比如:下面是一个表,表中有三个字段特征:姓名、性别、年龄,对应三列。每一行代表一个个体,或则说是一个样本。

名字

性别

年龄

张三

12

李四

13

2.检索数据——select

(sql对大小写敏感,select=SELECT=Select)

2.1检索单个列

举例:

select  prod_name

from products;

解释:利用select语句从products表中检索一个名为prod_name的列。select后 给出所需的列名,from关键字指出从其中检索数据的表名。该搜索将返回表中的所有行,没有对数据进行排序或者过滤。

结果举例(横线为了说明上面是字段,下面是具体内容):

prod_name                 

fish

bird

bean

toy

注意:sql语句中的空格都会被忽略。sql语句可以在一行给出,也可在多行写出(便于调试和阅读)。但是多贴sql语句必须以英文状态下的分号(;)分隔。一般不需要在单条

2.2检索多个列

举例:

selelct prod_id,prod_name,prod_price

from  products

解释:从products表中取三列,列名之间用逗号分隔。在机器学习工作中,常常需要获取不同特征,用于实验该特征是否对模型提高精度有贡献。

2.3检索所有列

举例:

select *

from products

解释:(*)是通配符,表示返回表中所有列。

3排序检索数据——order by

3.1按单个列排序

举例:

select prod_name

from products

order by prod_name

解释:这条语句对prod_name列以字母顺序排序

结果举例:

prod_name    

bean

bird

fish

toy

注意:在指定一条order by子句时,应保证它是select语句中最后一条子句,该子句的次序不对,将会出现错误。

3.2按多个列排序

举例:

selelct prod_id,prod_name,prod_price

from  products

order by prod_price,prod_name

解释:先按照prod_price排序,如果多行prod_price相同,则这些行按照prod_name进行排序。

举例:

selelct prod_id,prod_name,prod_price

from  products

order by 3,2

解释:作用同上个例子,3表示表的第三列,2表示第二列。这样写增加了错用列名排序的可能。

3.3指定排序方向

举例:

selelct prod_id,prod_name,prod_price

from  products

order by prod_price  desc

解释:排序默认是升序(A-->Z),可以设置为下降排序,在需要下降排序的字段后面加上desc就好。desc只应用到直接位于其前面的列名。多个列都需要降序的话,则每个字段后面都加上desc关键字。

4.过滤数据——where

在select语句中,数据根据where子句中指定的搜索条件进行过滤。where子句在表名后给出。

举例:

selelct prod_id,prod_name,prod_price

from  products

where prod_price =3.18

解释:这条语句只返回prod_price 的值为3.18的行。在机器学习获取样本数据时候,常用语获取正负样本,正样本的label=1,负样本的label=0.有时候也需要进行时间限制,比如获取7天的数据,则进行限制where partition_date between '2018-01-18' and '2018-01-25'(后面会做笔记说这个)

举例:

selelct prod_id,prod_name,prod_price

from  products

where prod_price between 3 and 7

注意:在同时使用order by和where子句时,应该让order by位于where之后,否则将会产生错误。

4.1where子句操作符

屏幕快照 2018-01-27 下午8.25.41.png

注意:IS NULL这个特殊用法,常用语判断哪些数据为NULL值,这个NULL值跟空值、0不是等价的。一列不包含值的时候,成为空值NULL(无值)。

举例:

selelct prod_price

from  products

where prod_price IS NULL

解释:返回没有价格的所有产品。

5.高级过滤数据——AND、OR、IN

5.1 逻辑操作符

高级过滤,在之前的基础上,多给出一个限制条件,用操作符进行联结,这里的操作符就是逻辑操作符,and (表示前后条件都得满足), or(前一个条件或者后一个条件,有一个满足即可)。

举例:

selelct prod_price,prod_name

from  products

where prod_price > 1 and prod_price  < 5

解释:检索出价格大于1,小于5的商品

注意:and 和or 同时使用时,有优先级的限制,默认and优先级高,先执行and的条件,在执行or。因此如果想要先执行or,可以添加括号(),将or的优先级提前。

5.2  IN操作符

IN用于指定条件范围,范围中的每个条件都可以进行匹配。合法值用逗号分隔,全部都在括号内。

举例:

selelct prod_price,prod_name

from  products

where prod_name IN('bean','bird')

order by prod_name

解释:在prod_name在'bean','bird'之内,搜索商品,并按照prod_name进行排序。

5.3 NOT操作符

NOT:否定它之后的任何条件。

举例:

selelct prod_price,prod_name

from  products

where NOT prod_name =bean

order by prod_name

解释:NOT 否定它之后的条件。

6.用通配符进行过滤——like

通配符:用来匹配值的一部分的特殊字符。

搜索模式:由字面值、通配符或者两者组合构成的搜索条件。

通配符搜索只用于文本字段,非文本数据类型字段不能使用通配符搜索。

用处举例:搜索产品名中包含本文"bean"的所有产品。

6.1操作符-LIKE

在搜索子句中,使用通配符,必须使用like操作符。

通配符:%

%表示任何字符出现任意次数。

举例:

selelct prod_name

from  products

where  prod_name  like ‘be%’

结果举例:

prod_name  

bean

解释:检索任意以be起头的词,接受be之后的任意字符,不管它有多少字符。

注意:搜索区分大小写。

通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。

举例:

selelct prod_name

from  products

where  prod_name  like ‘%bean bag%’

结果显示:

prod_name     

fish bean  bag toy

bird bean bag toy

rabbit bean bag toy

解释:搜索模式‘%bean bag%’表示匹配任何位置包含文本bean bag的值,而不论它之前或者之后出现什么字符。

注意:除了一个或多个字符外,%还能匹配0个字符。

通配符:下划线(_)

下划线(_)作用同%,但是下划线只能匹配单个字符,而不是多个字符。

举例:

selelct prod_name

from  products

where  prod_name  like ‘__ inch teddy bear’

结果显示:

prod_name     

12 inch teddy bear

18 inch teddy bear

解释:where子句的搜索模式给出了后面根由文本inch teddy bear的两个通配符。第一行中下划线匹配12,第二行中匹配18.而8 inch teddy bear产品没有匹配,因为搜索模式要求两个字符,而8只是一个字符。因此没有显示。对照%举例:

举例:

selelct prod_name

from  products

where  prod_name  like ‘% inch teddy bear’

结果显示:

prod_name     

8 inch teddy bear

12 inch teddy bear

18 inch teddy bear

注意:与%能够匹配0哥字符不一样,_总是匹配一个字符,不能多也不能少。

通配符:方括号[ ]

方括号 [ ] 用来指定一个字符集,它必须匹配指定位置的一个字符。比如:找出所有名字以J 或者M开头的联系人:

举例:

select cust_contact

from customers

where cust_contact like '[JM]%'

order by cust_contact

结果显示:

cust_contact    

Jim jjooo

John Sjhhh

Michelle Grenn

解释:[JM]匹配任何以方括号中字母开头的联系人名,它也只能匹配单个字符。[JM]之后的%通配符匹配第一个字符之后的任意数目的字符,返回所需结果。

注意:此通配符可以用前缀字符^(脱字号)来否定。比如下面查询匹配不以J 或者M开头的任意联系人名(与前一个例子相反)

举例:

select cust_contact

from customers

where cust_contact like '[^JM]%'

order by cust_contact

7.创建计算字段

7.1拼接字段

在sql中的select语句中,可使用一个特殊的操作符拼接两个列,此操作符可以是(+)或者(||)。

举例:

select vend_name + ' (' +vend_country + ')'

from vendors

order by vend_name

结果显示:

Bear  (USA  )

Bears  (USA  )

解释:select 语句链接以下四个元素:

存储在vend_name列中的名字、包含一个空格和一个括号的串、存储在vend_country列中的国家、包含一个括号的串。

注意:拼接过程中,如果字段中存在空格,则一并将其连带拼接,因此未来保证能够正确拼接,必须去掉空格,采用RTRIM()函数来完成此项任务,表示去掉字段右边的空格。LTRIM()表示字段左边的空格,TRIM()表示去掉字段两边的空格。

举例:

select vend_name + ' (' +RTRIM(vend_country) + ')'

from vendors

order by vend_name

结果显示:

Bear  (USA)

Bears  (USA)

7.2使用别名- -AS

将拼接字段得到的值赋给一个新的字段,便于后续引用。

举例:

select vend_name + ' (' +RTRIM(vend_country) + ')' AS vend_title

from vendors

order by vend_name

结果显示:

 vend_title    

Bear  (USA)

Bears  (USA)

解释:此时的列 vend_title 就像一个实际存在的列。后续工作可进行引用。

8.使用数据处理函数

9.汇总数据

avg() 通过对表中行数技术并计算特定列值之和,求该列的平均值,

也可以返回所有列的平均值,也可以用于返回特定列或者行(此时需要加上where子句,限定一下特定行,比如 where vend_id='DLL01')的平均值。

举例: 

select avg(prod_price) as vag_price

from products

结果显示:

avg_price

6.823333

解释:

注意:avg()函数忽略值为null的值。

count()函数进行计数。确定表中行的数目或符合特定条件的行的数目。有两种使用方式:

一、count(*)对表中行的数目进行计数,不管列表中包含的是空值null还是非空值。

二、count(column)对特定列中具有值的行进行计数,忽略null值。

举例:

select COUNT(*) as num_cust

from customers

结果显示:

num_cust

5

_________

举例:

select COUNT(cust_email) as num_cust

from customers

结果显示:

num_cust

3

解释:以上两个例子说明:5个客户中只有3个 客户具有email。

max()返回指定列中的最大值。max要求指定列名。

举例:

select max(prod_price) as max_price

from products

结果显示:

max_price

11.9000

解释:

注意:max函数忽略列值为null的行

sum()用来返回指定列值的和(总计)。

举例:

select sum(quantity) as items_ordered  //返回订单所有物品数量之和

from orderitems

where order_num=20005

结果显示:

items_ordered 

200

解释:只统计订单20005中的物品,

10.分组数据

group by 后的字段不能使用别名。

位于where子句之后,order by子句之前。

可以采用having进行过滤,where过滤行,having过滤分组。

where在数据分组前进行过滤,having在数据分组后进行过滤。

14.组合查询

union使用规则:union中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)

union的查询结果集中默认自动去掉了重复的行(换句话说,他的行为与单条select语句中使用多个where子句条件一样),如果不希望去掉,则使用union all。

在使用union组合查询时,只能使用一条order by子句,它必须出现在最后一条select语句之后。

15 插入数据

同select一样较为常用的一个语句:insert。用来插入或者添加行到数据库表。

可:插入完整的行、插入行的一部分、插入某些查询的结果。

要求:指定表名和被插入到新行中的值。

eg:insert into CUSTOMERS(cust_id,.....)VALUES('www','www'....)

输入:

select *

into CustCopy

from Customers

解释:创建一个新表CustCopy,并把Customers表中的数据复制过去。

注意:在使用select into 复制表时:任何select选项和子句都可以使用,包括where和group by。可以利用链接从多个表插入数据,不管从多少个表中检索数据,数据都只能插入到单个表中。

insert  select:从其他表中导入行。

例子:

insert into custmors(sdid,。。。。)

select sdid,

。。。。。

from custnew

解释:从表custnew中将所有数据导入到custmors表中。

16.更新和删除数据

16.1更新数据

update:可更新表中特定行、也可以是所有行。

使用方法:包括:要更新的表、列名和他们的新值、确定要更新哪些行的过滤条件。

输入:

update Custmoers

set cust_email ='12233'

where cust_id='33333'

删除某一列的值可以采用:set 字段=null

16.2删除数据

输入:

delete from 表名

where cust_id='2333'

EG:

1.

Hive 正则匹配函数 regexp_extract

1。regexp_extract

语法:    regexp_extract(string subject,  string pattern,  int index)

返回值: string

说明:  将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

第一参数:   要处理的字段

第二参数:    需要匹配的正则表达式

第三个参数:

  • 0是显示与之匹配的整个字符串

  • 1 是显示第一个括号里面的

  • 2 是显示第二个括号里面的字段...

注意,在有些情况下要使用转义字符(双斜杠了‘\\’)。

正则匹配字符解释:

  • ^ 表示开头

  • $ 表示结尾

  • . 表示任意字符

  • * 表示任意多个

2.https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/REGEXP_REPLACE.html

regexp_replace(string,pattern,replace_string,position)

参数

source_string要搜索的字符串表达式(如列名称)。pattern表示 SQL 标准正则表达式模式的字符串文本。replace_string将替换模式的每个匹配项的字符串表达式(如列名称)。默认值是空字符串 ("")。position

指示在 source_string 中开始搜索的位置的正整数。此位置基于字符数而不是字节数,这是为了将多字节字符作为单字符计数。默认值为 1。如果 position 小于 1,则搜索从 source_string 的第一个字符开始。如果 position 大于 source_string 中的字符数量,则结果为 source_string

猜你喜欢

转载自blog.csdn.net/pearl8899/article/details/81186861