大家好,我是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(*)这个功能是经常被用到的,比如说我们总共有多少帖子,总共有多少商品,总共有多少注册用户

  • 需求:下面为网站留言板上的一些数据,现在想知道每一人今天发的多少帖子

比Excel还简单的SQL语句查询-LMLPHP

比Excel还简单的SQL语句查询-LMLPHP

比Excel还简单的SQL语句查询-LMLPHP

  • 首先我们要分组,给人分组,分组的依据是人,分组后在把每一个人发多少帖子在聚合起来,这里我们就要讨论一个问题:分组并且聚合;

  • select name,count(id) from mess group by name;

比Excel还简单的SQL语句查询-LMLPHP

  • 我们看到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;
05-11 15:57