【MySQL】近2万字,138张图解,我终于把mysql总结完整了,建议收藏( 九 )

  • 汇总函数 , 比如 sum 求和、count 统计数量、max 最大值、min 最小值等
  • group by , 关键字表示对分类聚合的字段进行分组 , 比如按照部门统计员工的数量 , 那么 group by 后面就应该跟上部门
  • with 是可选的语法 , 它表示对汇总之后的记录进行再次汇总
  • having 关键字表示对分类后的结果再进行条件的过滤 。
  • ?
    看起来 where 和 having 意思差不多 , 不过它们用法不一样 , where 是使用在统计之前 , 对统计前的记录进行过滤 , having 是用在统计之后 , 是对聚合之后的结果进行过滤 。 也就是说 where 永远用在 having 之前 , 我们应该先对筛选的记录进行过滤 , 然后再对分组的记录进行过滤 。
    ?
    可以对 job 表中员工薪水进行统计 , 选出总共的薪水、最大薪水、最小薪水
    select sum(salary) from job;

    select max(salary)min(salary) from job;

    比如我们要统计 job 表中人员的数量
    select count(1) from job;

    统计完成后的结果如下
    我们可以按照 job 表中的年龄来进行对应的统计
    select agecount(1) from job group by age;

    既要统计各年龄段的人数 , 又要统计总人数
    select agecount(1) from job group by age with rollup;

    在此基础上进行分组 , 统计数量大于 1 的记录
    select agecount(1) from job group by age with rollup having count(1) > 1;

    表连接表连接一直是笔者比较痛苦的地方 , 曾经因为一个表连接挂了面试 , 现在来认真撸一遍 。
    表连接一般体现在表之间的关系上 。 当需要同时显示多个表中的字段时 , 就可以用表连接来实现 。
    为了演示表连接的功能 , 我们为 job 表加一个 type 字段表示工作类型 , 增加一个 job_type 表表示具体的工作种类 , 如下所示
    下面开始我们的演示
    查询出 job 表中的 type 和 job_type 表中的 type 匹配的姓名和工作类型
    select job.namejob_type.name from jobjob_type where job.type = job_type.type;

    上面这种连接使用的是内连接 , 除此之外 , 还有外连接 。 那么它们之间的区别是啥呢?
    ?
    内连接:选出两张表中互相匹配的记录;
    外连接:不仅选出匹配的记录 , 也会选出不匹配的记录;
    ?
    外连接分为两种
    • 左外连接:筛选出包含左表的记录并且右表没有和它匹配的记录
    • 右外连接:筛选出包含右表的记录甚至左表没有和它匹配的记录
    为了演示效果我们在 job 表和 job_type 表中分别添加记录 , 添加完成后的两表如下
    下面我们进行左外连接查询:查询出 job 表中的 type 和 job_type 表中的 type 匹配的姓名和工作类型
    select job.namejob_type.name from job left join job_type on job.type = job_type.type;

    查询出来的结果如下
    可以看出 cxuan06 也被查询出来了 , 而 cxuan06 他没有具体的工作类型 。
    使用右外连接查询
    select job.namejob_type.name from job right join job_type on job.type = job_type.type;

    可以看出 , job 表中并没有 waiter 和 manager 的角色 , 但是也被查询出来了 。
    子查询有一些情况 , 我们需要的查询条件是另一个 SQL 语句的查询结果 , 这种查询方式就是子查询 , 子查询有一些关键字比如 「in、not in、=、!=、exists、not exists」 等 , 例如我们可以通过子查询查询出每个人的工作类型