SQL在数据分析中的应用-b站三节课互联网商业数据分析实战
程序员文章站
2024-01-29 10:21:16
...
SQL核心语句——数据过滤与查询
-最常用8个核心语句
-练习
-8个核心语句背后的执行逻辑
SQL核心语句组成:
① select 列名/聚合函数 as 别名 (select必选,as可选)
② from 表名(必选)
③ where 限制条件(可选)
④ group by 列名(可选)
⑤ having 限制条件(可选)
⑥ order by 列名 asc/desc(可选)
⑦ limit 行数(可选)
SQL查询执行顺序:2345167
-案例问题:在指定的数据库中创建表并插入数据
-建表:
create table MysqlTest.content(
content_id int(11),
user_id int(11),
create_date date,
type text(10)
)
-插入数据:
insert into MysqlTest.content valus
(1345285694,46372583,'2018-12-01','post'),
(1345285695,47378323,'2018-12-06','comment'),
(1345285696,53647584,'2018-12-10','vedio'),
(1345285697,47583920,'2018-12-11','post'),
(1345285698,54789392,'2018-12-05','comment'),
(1345285699,53647583,'2018-12-07','vedio'),
(1345285700,47381933,'2018-12-10','post'),
-调取所有的id:
select content_id from MysqlTest.content;
-调取2018-12-05当天发布的内容id和作者id:
select content_id,user_id
from MysqlTest.content
where create_date='2018-12-05'
SQL核心语句——数据聚合
聚合函数——对一组值进行计算,并返回单个值的函数
常见聚合函数:
-count(列名):返回指定列中的行数(不包括null)
-count(*):返回列中指定的行数(包括null)
-sum(列名):返回数值列的总数(不包括null)
-avg(列名):返回数值列的平均值(不包括null)
-min/max(列名):返回指定列中的最小/最大值(不包括null)
-问题:查看历史发布内容的总数
select count(content_id) as num
from mysqltest.content;
-问题:表中分布有哪几种内容类型
select distinct type
from mysqltest.content;
-问题:将所有记录按照创建时间升序排列
select *
from mysqltest.content
order by create_date;
-问题:调取最近投稿的三个记录
from mysqltest.content
order by create_date desc
limit 3;
/*limit和order by常常一起用,是取头或者取尾*/
-问题:每个种类分别由多少个内容记录
select count(content_id) as num,type
from mysqltest.content
group by type;
/*先分组再聚合*/
-问题:找出内容记录多于2个的种类及对应的内容数
select type,count(content_id) as num
from mysqltest.content
group by type
having count(content_id)>2;
/*having对结果集的过滤作用*/
SQL进阶用法
1、case语句——根据条件表达式进行分组
2、表连接
3、子查询——当一个查询是另一个查询的条件时,称之为子查询
4、SQL语句优化
-不需要所有列时避免使用*(*不能使用索引,从而导致效率降低)
-能用where解决就不用having (在分组前剔除多余的行可以提升效率)
-关联查询代替子查询 (子查询多了建立和销毁临时表的过程,使效率降低)
-使用count时慎用distinct (数据量很大时,去重操作不能多线程进行,使效率降低)
-问题:查看每个作者所在的城市(只返回有城市信息的作者)
/*从多个表中选取字段时需要指明字段所在的表名*/
写法一:
select content.user_id,city.city
from mysqltest.content join mysqltest.city
on mysqltest.content.user_id=mysqltest.city.user_id;
写法二:
select content.user_id,city.city
from mysqltest.content inner join mysqltest.city
where mysqltest.content.user_id=mysqltest.city.user_id;
- 问题:查看每个作者所在的城市(包括缺失城市信息的作者)
/*left join之前的表为左表*/
select content.user_id,city.city
from mysqltest.content
left join
mysqltest.city
on mysqltest.content.user_id=mysqltest.city.user_id;
-问题:输出所有记录,并增加一列标明内容形式是否为video
select *,
case when type='vedio' then 'yes' else 'no'
end as is_video
from mysqltest.content
case when后面跟判断条件,then后面跟满足条件后的输出结果
end as 输出这一列的命名
-问题:与作者id为53647584发布相同种类作品的所有作者id
select user_id
from mysqltest.content c1
where c1.type=(select type
from mysqltest.content c2
where c2.user_id=53647584)
上一篇: 获取屏幕上当前相应者