学习资源来自:《Mysql必知必会》该书简单明了,适合我这种大白,像是小学老师授课一样。在做学习笔记的时候,结合本身专业,将其对应扩展,便于迁移到实际应用中,将固定的知识同实践相结合去理解各个知识点。
最前面是工作中较为常用的语句,后面是看书总结的语法知识。
一、LIKE
使用通配符% 来匹配city字段中包含的字母。
SELECT * FROM Persons
WHERE City LIKE '%lon%'
表:某种特定类型数据的结构化清单。在应用中,常用语存储训练样本。
列:表中的一个字段,所有的表都是由一个或者多个列组成。每一列在机器学习(machine learning,ML)中,代表一个特征的取值,第一行是特征的名字。
行:表中的一个记录,一个表可以由多个记录组成。在ML的训练样本中,每一行表示一个样本所对应各个特征的取值。
主键:唯一标志表中的每一行的字段。通常,样本表和特征表不在一个表中,因此我们通常关联两个表中的主键,获取样本中的特征值。因为一个样本,可能存在多个不同粒度下的特征,每一个粒度下的特征都会构建一个表,来生成这些特征。比如:一个人A作为一个样本,他具有个人属性粒度的特征,也具有社会属性粒度的特征。想要将个人属性和社会属性关联起来,则需要两个表中的主键想关联。
比如:
select 个人属性特征
from 个人属性表
left outer join
(select 社会属性特征
from 社会属性表)
on 个人属性表主键=社会属性表主键
比如:下面是一个表,表中有三个字段特征:姓名、性别、年龄,对应三列。每一行代表一个个体,或则说是一个样本。
名字 |
性别 |
年龄 |
---|---|---|
张三 |
男 |
12 |
李四 |
男 |
13 |
(sql对大小写敏感,select=SELECT=Select)
举例:
select prod_name
from products;
解释:利用select语句从products表中检索一个名为prod_name的列。select后 给出所需的列名,from关键字指出从其中检索数据的表名。该搜索将返回表中的所有行,没有对数据进行排序或者过滤。
结果举例(横线为了说明上面是字段,下面是具体内容):
prod_name
fish
bird
bean
toy
注意:sql语句中的空格都会被忽略。sql语句可以在一行给出,也可在多行写出(便于调试和阅读)。但是多贴sql语句必须以英文状态下的分号(;)分隔。一般不需要在单条
举例:
selelct prod_id,prod_name,prod_price
from products
解释:从products表中取三列,列名之间用逗号分隔。在机器学习工作中,常常需要获取不同特征,用于实验该特征是否对模型提高精度有贡献。
举例:
select *
from products
解释:(*)是通配符,表示返回表中所有列。
举例:
select prod_name
from products
order by prod_name
解释:这条语句对prod_name列以字母顺序排序
结果举例:
prod_name
bean
bird
fish
toy
注意:在指定一条order by子句时,应保证它是select语句中最后一条子句,该子句的次序不对,将会出现错误。
举例:
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表示第二列。这样写增加了错用列名排序的可能。
举例:
selelct prod_id,prod_name,prod_price
from products
order by prod_price desc
解释:排序默认是升序(A-->Z),可以设置为下降排序,在需要下降排序的字段后面加上desc就好。desc只应用到直接位于其前面的列名。多个列都需要降序的话,则每个字段后面都加上desc关键字。
在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之后,否则将会产生错误。
注意:IS NULL这个特殊用法,常用语判断哪些数据为NULL值,这个NULL值跟空值、0不是等价的。一列不包含值的时候,成为空值NULL(无值)。
举例:
selelct prod_price
from products
where prod_price IS NULL
解释:返回没有价格的所有产品。
高级过滤,在之前的基础上,多给出一个限制条件,用操作符进行联结,这里的操作符就是逻辑操作符,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的优先级提前。
IN用于指定条件范围,范围中的每个条件都可以进行匹配。合法值用逗号分隔,全部都在括号内。
举例:
selelct prod_price,prod_name
from products
where prod_name IN('bean','bird')
order by prod_name
解释:在prod_name在'bean','bird'之内,搜索商品,并按照prod_name进行排序。
NOT:否定它之后的任何条件。
举例:
selelct prod_price,prod_name
from products
where NOT prod_name =bean
order by prod_name
解释:NOT 否定它之后的条件。
通配符:用来匹配值的一部分的特殊字符。
搜索模式:由字面值、通配符或者两者组合构成的搜索条件。
通配符搜索只用于文本字段,非文本数据类型字段不能使用通配符搜索。
用处举例:搜索产品名中包含本文"bean"的所有产品。
在搜索子句中,使用通配符,必须使用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
在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)
将拼接字段得到的值赋给一个新的字段,便于后续引用。
举例:
select vend_name + ' (' +RTRIM(vend_country) + ')' AS vend_title
from vendors
order by vend_name
结果显示:
vend_title
Bear (USA)
Bears (USA)
解释:此时的列 vend_title 就像一个实际存在的列。后续工作可进行引用。
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中的物品,
group by 后的字段不能使用别名。
位于where子句之后,order by子句之前。
可以采用having进行过滤,where过滤行,having过滤分组。
where在数据分组前进行过滤,having在数据分组后进行过滤。
union使用规则:union中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)
union的查询结果集中默认自动去掉了重复的行(换句话说,他的行为与单条select语句中使用多个where子句条件一样),如果不希望去掉,则使用union all。
在使用union组合查询时,只能使用一条order by子句,它必须出现在最后一条select语句之后。
同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.1更新数据
update:可更新表中特定行、也可以是所有行。
使用方法:包括:要更新的表、列名和他们的新值、确定要更新哪些行的过滤条件。
输入:
update Custmoers
set cust_email ='12233'
where cust_id='33333'
删除某一列的值可以采用:set 字段=null
16.2删除数据
输入:
delete from 表名
where cust_id='2333'
1.
Hive 正则匹配函数 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。