上一节课,我们已经学会了把数据插入到表中,也知道了怎么删除和更新数据。
其实在大数据和机器学习中更常用的是数据的查询,以后你们所听到的etl什么的,全部是一堆的查询语句拼成一个存储过程或者是类似存储过程的文件。
所以我们接下来就要学习和了解一下sql的查询了
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[ORDER BY column_name desc|asc]
[LIMIT N]
这就是我们查询数据的sql语法。其实我们前面已经用过了,只是不知道为什么那么用而已,对吧。
例如:
select * from dm_user_info 这就是查询一个表全部数据的语句。
那么我们看语法上面,select后面明明跟的是多个列名, 那为什么是*号就可以查询出所有列呢? *这里是一个通配符,就是代表着所有列的意思。 其实我们也可以这样写
select day_id ,pv from dm_user_info;直接跟列名称, 列与列之间通过逗号隔开。
那以上两种办法都能够查询出一个表的所有数据,也就是说一个表有多少条数据,给我们返回的结果就是多少条数据。
但是我们实际的情况中肯定不可能要全部的数据的,我们可能只需要查看我们需要查看的一部分数据,因为一个表中的数据可能就是上亿条记录的, 我们不可能全部查出来然后再一个个去找,那么此时我们就要讲一个非常有用的子句, 叫where子句
where子句在一个查询语句中起的作用,其实就是做过滤。 过滤出我们需要的数据,或者是过滤掉我们不需要的数据。所以where子句是可有可无的,没有where子句并不影响到查询sql的语法。
例如我们要查询一下时间为20170831这一天的数据,那么我们就该这样写sql:
select * from dm_user_info where day_id = 20170831
直接在from后面的表名跟where条件即可, 然后就是要加上对应的过滤条件的限制。某个列的值等于某某
这里的where条件和前面讲的update ,delete语句是一模一样的,没有任何区别,多个限制条件中间通过and or来连接。
and就是与操作,就是两者的条件必须全部满足。 如果是or的话,就是满足其一即可
例如:
select * from dm_user_info where day_id = 20170831 and user_id = 'xxxxxxxx'
那如果我们对查询出来的结构还有排序的需求呢?
sql也给我们提供了对应的语句order by ,这些语句都是可选的,使用语法都不影响语法结构,但是都是我们平常经常使用的。
例如我们按照day_id 降序排序:
select * from dm_user_info order by day_id desc ;
如果是升序的话, 则是
select * from dm_user_info order by day_id asc;
当然中间也还是可以加where条件的 , 如果要加where条件的话,必须在order by 子句全面。
例如:
select * from dm_user_info where day_id >=20170831 order by day_id , user_id desc
然后还有一个limit语句, 这个是mysql中的分页语句,也是限制查询多少条数据的语句。这个语句是在mysql 中和greenplum数据库中存在的,包括后面的hive也有这样的语句,但是在oracle中是没有这样的语句的。我们也来演示一下:
select * from dm_user_info where day_id >=20170831 order by day_id , user_id desc limit 3; 只查询三条数据出来
接下来讲一个非常有用的,case when判断语句。 这种语句在编程语言中是非常常用的, 因此在sql中也有case when这样的控制语句,废话不多说,我们直接上代码:
select case when day_id =20170831 then 201708 when day_id=20170901 then 201709
when day_id=20170902 then 201709 when day_id=20170903 then 201709 when day_id=20170904 then 201709 when day_id=20170905 then 201709 else 0 end as momth_id , user_id from dm_user_info
这种语句的主要用途,就是用在判断的时候,当某个值为什么的时候,或者什么的时候,就可以使用了。
在查询语句里面,我们最后再讲一个及其重要的语句,子查询, 什么叫子查询, 也就是说把一个查询结果当做一个表的结果, 然后在此基础上面再去查询, 例如:
select * from (select * from dm_user_info where day_id >=20170831 order by day_id , user_id desc) where day_id = 20170831;
好的,那这节课我们就先讲到这里, 下一节课我们开始讲解数据库中常用的函数