欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)
相关标签: SQL