大家好,我是jacky朱元禄,很高兴继续跟大家分享《MySQL数据分析实战》系列课程,前面的课程jacky分享了数据层面增删改查中的增删改,下面的课程我们要说增删改查的这个查,jacky说数据层面的查询在我们MySQL中是最重要的,也是最复杂的;
为了更有逻辑性的讲清楚这个查,jacky给大家编了二首打油诗,每个打油诗共八句,jacky称之为八句箴言,作为我们学习SQL查询的逻辑统领,那在这个八句箴言的统领下,jacky展开对SQL查询语句的分享;
上次课jacky用配乐诗朗诵的形式跟大家分享了单表查询的八句箴言,这样的形式也是为了大家印象更深的记住这几句话,我们既然有单表查询的八句箴言,对应的jacky后续还会分享多表操作的八句箴言,这是后面课程我们要来解决的,本次课,我们先回顾一下上次课jacky朗诵的单表查询的八句箴言:
不管三七二十一,先把数据show来看
数据清洗两条路,唯一where走一走
清洗数据有空值,is not 来去除
结构数据有标准,as 别名来规范
别拿 SQL做分析,关公面前耍大刀
要想分析怎么办,编程语言是主力
SQL函数茫茫多,真的不能用太多
筛选透视是基础,分组聚合要熟记
(一) 第一句 的逻辑线
八句箴言第一句:不管三七二十一,先把数据show来看
1.1 MySQL到底是做什么的?-课程中期总结
好,为了搞懂这八句箴言的第一句,我们一定要搞懂这MySQL到底是做什么的这个事情?在课程的前期jacky说,这数据库就是存储数据的,并且说了我们为什么要引入数据库,如果有忘记的小伙伴可以翻阅前面的课程,也就是前面我们对于MySQL到底是什么这个问题,我们仅仅从是什么和为什么的层面说了,是吧;
(1) 数据库就是存储数据的:解决了是什么的问题;
(2)为什么要引入数据库:解决了为什么的问题;
(3)那数据库的企业应用场景是什么呢?知道了这个我们就解决了怎样使用MySQL的问题;
好,大家听好,MySQL的应用场景有两个:
- (a)方便网站或应用程序上传数据
- (b)方便后期数据统计
这就是jacky的分享风格,别来那么多理论,实际上MySQL的应用场景就这么两个;举个不恰当的比如,大家都知道区块链技术现在很火,是吧,但是理论层面前景广阔,但是应用层级真的是现阶段做不了什么,就跟MySQL一样,MySQL理论层面上,理论层面上可以实现共享、减少数据冗余,集中控制等等,每一个点深入下去都是科技前沿,可我们工作中,数据库就是为了方便我们给网站或者是应用程序上传数据的,就是这么回事;
我给大家具一个例子,我们看下jacky用编程语言框架做的一个网站,大家不用管什么事编程语言,也不用管什么框架,jacky 就是做了一个网站,为了上传资料方便吗,我们就要用数据库了,这里jacky就选择MySQL数据库
1.1.1 方便网站上传数据
- 注意jacky这里说的是方便网站上传数据,MySQL
1.1 SQL查询模型-初级形态(1)
select + 字段列表/* + from + 表名
1.选择特定的字段
select id,name from user;
2.给字段取别名 - as
作用:缩短SQL语句
字段和字段之间必须用逗号,字段和别名之间要不用as,要不用空格
3.distinct关键字的使用-取出唯一值
select distinct name from user;
4.使用where条件进行查询
select * from user where id>=5 and id<7;
5.查询空值null
select * from user where name is null;
select * from user where name is not null;
6.搜索like关键字
搜索名字里带有a的字段
select * from user where name like ‘%s%’;
- 包含什么在它前后加%,%在计算机里往往代表任意多个字符的意思;
7.使用order by对查询结果培训
默认是升序,asc 可加也可不加
select * from user order by id asc;
select * from user order by id desc;
8.使用limit 限定输出个数
select * from user order by id desc limit 0,3;
9.Excel 字段合并: concat
select id,name,pass,concat(id,’-‘,name) idname from user;
10.rand函数-目的不是求随机数,是为了随机排序
- 比如说我们要做一个随机点名,或者是随机抽奖的系统
select * from user order by rand() limit 1;
- 我们可以查看我们MySQL的内置手册,有许许多多的函数,如果我们不是专门在公司里做优化的,jacky是反对学习过多的MySQL函数,尽量的编程语言能完成的,Python能完成的,Java能完成的,PHP能完成的,MySQL就不要去做,MySQL只是一个数据的存储器,就跟U盘一样,你就把数据存进去,再把数据取出来,其余事情不要交给MySQL去做,MySQL本身是一种检索技术,检索本身就要消耗很多资源,所以jacky说学MySQL不要学那么多函数,所有函数都要学习,一周的时间也是不够的,因为这些函数,编程语言Python,java,php等等都有了,我们为什么还要学这么多函数;还有就是,在MySQL中如果有一列用了函数,这一列的索引就要失效了;
所以用函数时,我们首要考虑编程语言来做;
11.count()
- 统计个数
12.求和、平均数、最大值、最小值
- select count(id),sum(age),avg(age),max(id),min(id) from user;
这里对于count函数,有个技巧,在MySQL5.1之后,内部优化了conunt(*) 这个函数用法,可以快速的统计个数
count(*)这个功能是经常被用到的,比如说我们总共有多少帖子,总共有多少商品,总共有多少注册用户
需求:下面为网站留言板上的一些数据,现在想知道每一人今天发的多少帖子
首先我们要分组,给人分组,分组的依据是人,分组后在把每一个人发多少帖子在聚合起来,这里我们就要讨论一个问题:分组并且聚合;
select name,count(id) from mess group by name;
我们看到user1发了3篇帖子,user2和user3发了1篇帖子,user6发了2篇帖子;
这里用的count来聚合,count可以收集一个列,从上到下的个数,
我们也可以分组后再排序,看一下发帖子的人从少到多排下顺,这里有个细节就是分组一定要写在order by前面,而不能是排了序后在去分组;
- 我们想一下肯定是先分组在排序才是合理的,如何先排序,在分组,那排序就没有任何意义了,所以这里MySQL对于分组和排序就搞了一个优先级,我们设想如何我们是开发MySQL的人员我们也会这样的设定优先级规则,所以,jacky一直说MySQL是个很严谨的软件;
那分组的基础上加条件呢,我们就用having,而不是where,这里大家要注意,
下面有个需求,就是找出发帖数大于1的发帖人和发帖个数,那我们应该怎么写呢?
- select name ,count(id) from mess group by name having count(id)>1;