一、深入学习  group by

  group by ,分组,顾名思义,把数据按什么来分组,每一组都有什么特点。

  1、我们先从最简单的开始:

    select count(*) from tb1 group by tb1.sex;

    查询所有数据的条数,按性别来分组。这样查询到的结果集只有一列count(*)。

  2、然后我们来分析一下,这个分组,我们能在select 和 from 之间放一些什么呢?

    当数据分组之后,数据的大部分字段都将失去它存在的意义,大家想想,多条数据的同一列,只显示一个值,那到底显示谁的,这个值有用吗?

    通过思考,不难发现,只有by的那些列可以放进去,然后就是sql的函数操作了,比如count(),sum()……(包含在by后面作为分组的依据,包含在聚合函数中作为结果)

    例:查询每个学院的学生有多少人:(学院的值是学院的id)

      SELECT a.COLLEGE AS 学院,COUNT(*)  AS 学生人数  FROM base_alumni a GROUP BY a.COLLEGE;

      

  3、where,having,和group by联合使用

    在最初学习group by的时候,我就陷入了一个误区,那就是group by不能和where一起使用,只能用having……

    看书不认真啊,其实它们都是可以一起使用的,只不过是where只能在group by 的前面,having只能在group by 的后面。

    where,过滤条件的关键字,但是它只能对group by之前的数据进行过滤筛选;

    having,也是过滤条件的关键字作用和where是一样的,但是它过滤的是分组后的数据,就是对分组后得到的结果集进行过滤筛选。

    出现having其实我觉得就是为了解决一条语句出现两个where的问题,把它们区分开来

    例:

      查询 30100学院的每个专业的学生有多少人。

      SELECT a.MAJOR AS 专业, COUNT(*) AS 学生人数 FROM base_alumni a WHERE a.COLLEGE = 30100 GROUP BY a.MAJOR;

      

      查询每个学院的学生有多少人,并且只要学生人数大于3的。

      SELECT a.COLLEGE AS 学院,COUNT(*)  AS 学生人数  FROM base_alumni a GROUP BY a.COLLEGE HAVING COUNT(*)>3;

      

     滤清执行顺序:①先对*进行筛选,②对筛选的结果进行分组,③对分组的结果进行筛选

  4、Group By All 的使用,哈哈哈哈,经常网上的查阅,我决定淘汰这个语法~

    其实就是前面where之后,想要分组的结果显示不符合where的数据,当然,不做运算,运算结果用0或null表示,感觉这语法没啥用,想不出应用场景~

二、深入学习  连接

  连接分4种,内连接,全连接,左外连接,右外连接

  https://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html

  1、连接出现的地方

    ①from和where之间,做表和表的连接

    ②where和having之间,having是对group by的结果集进行筛选,就是把group by的结果集作为一张表,然后可以再和别的表做连接,再进一步筛选

  2、连接类型解读

    把表看成是一个集合,连接看成是映射,那么它们的结果

    内连接:一一映射;全连接:笛卡尔乘积;左外连接:一一映射+左表对应右表的null;右外连接:一一映射+右表对应左表的null。

    关键字:

    内连接:inner join;全连接:cross join;左外连接:left join;右外连接:right join   。

    语法:

    表a   left join  表b  on  a.列1 = b.列2

  3、连接的使用

    之前学习group by的例子中,结果集是存在bug的。

    例:查询每个学院的学生有多少人:(学院的值是学院的id),在没有连接的时候,学院人数为0的是显示不出来的,因为当前表中就没有这个学院的信息

      那么我们在这里做一下左连接(左外连接):

      SELECT c.ID, a.COLLEGE, COUNT(a.COLLEGE) FROM (SELECT ID FROM dic_college) c LEFT JOIN ( SELECT COLLEGE FROM base_alumni ) a ON c.ID = a.COLLEGE GROUP BY c.ID

      我这里是一个完整的语句了。我在写出这条语句之前遇到了许多的磕磕碰碰。

    解读它:

      我们先把学院表和校友信息表(学生表)做左连接

      因为我们要的是学院,所以学院作为主表,放left join的前面      c LEFT JOIN a ON ...

      然后我们发现有很多字段,于是我们去掉多余的字段,这样既方便我们观察,也提高了sql的执行效率

        ①把学院表变成只有一个字段(SELECT ID FROM dic_college) c

        ②把学生表变成只有一个字段( SELECT COLLEGE FROM base_alumni ) a

      这时,查询结果是这样的

        SELECT * FROM (SELECT ID FROM dic_college) c LEFT JOIN ( SELECT COLLEGE FROM base_alumni ) a ON c.ID = a.COLLEGE

        

      这时候,对这个结果集进行分组:GROUP BY c.ID,并且查询字段要做更改

      在上边那个结果集中,c.ID和a.COLLEGE是一一对应的,此时,count(*)的数据是总行数,因为我们的主表是学院表,所以这个数据和count(c.ID)的数据是一样的。

      但是a.COLLEGE为空的行的数据中值都是1,这不是我们想要的,所以我们把count(*)改成count(a.COLLEGE),这样数据就出来了。

        

    这才是查询所有学院中每个学院的学生人数的正确答案!当然,上边的截图只是数据的前几行,后面还有数据的

      

  4、经过我测试了一下……

    左连接和右连接……

      SELECT * FROM a LEFT JOIN  b ON b.ID = a.FK_ID;

      SELECT * FROM b RIGHT JOIN  a ON b.ID = a.FK_ID;

      这两个语句的结果相同,它两并没有发现别的区别。

    全连接就是交叉连接,和不使用连接……

      SELECT * FROM c,a WHERE c.ID = a.FK_ID;

      SELECT * FROM c CROSS JOIN a ON c.ID = a.FK_ID;

      这两个语句也没有区别。

      

      

      

  

    

    

sql基础语法复习(二)-- 分组,连接的使用的更多相关文章

  1. SQL基础语法(二)

    SQL SELECT 语句 本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL ...

  2. sql基础语法复习

    约定:数据库名:test:表名:tb1,tb2,tb3…: 对象:数据库:database 表:table 列:column 索引:index 视图:view 存储过程:procedure 一.数据结 ...

  3. sql 基础语法3:分组,聚合函数,having,联合查询,快速备份,内联函数

    select * from Classinfo select * from StuInfo select * from CourseInfo select * from ScoreInfo --分组 ...

  4. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  5. SQL基础--查询之二--连接查询

    SQL基础--查询之二--连接查询

  6. JS基础语法(二)

    目录 JavaScript基础语法(二) 八. 函数 1. 函数的概念 2. 函数的使用 声明函数 调用函数 3. 函数的封装 4. 函数的参数 函数的参数匹配问题 5. 函数返回值 6. argum ...

  7. Golang 基础之基础语法梳理 (二)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...

  8. java基础语法(二)--单列模式

    java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...

  9. SQL基础语法笔记教程整理

    PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的 ...

随机推荐

  1. cogs 341:[NOI2005] 聪聪与可可

    ★★   输入文件:cchkk.in   输出文件:cchkk.out   简单对比 时间限制:1 s   内存限制:256 MB [问题描述] 在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小 ...

  2. Java 可重入锁

    一般意义上的可重入锁就是ReentrantLock http://www.cnblogs.com/hongdada/p/6057370.html 广义上的可重入锁是指: 可重入锁,也叫做递归锁,指的是 ...

  3. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  4. HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (二)

    接上篇 HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (一) 整个 ppt 可以去这里下载. 这一篇主要从服务端应该如何返回合理的返回值的角度,讨论如何设计一个合理的 HTTP ...

  5. emmet常用指令组合

    emmet的应用   1.生成html(需要先将文件命名为.html后缀) !+tab,html:5+tab   2.生成meta utf meta:utf+tab   3.生成meta viewpo ...

  6. Asp.Net将Session保存在数据库中

    1.由于项目dll文件变动比较频繁,而保存登陆的状态又保存在Session中,所以导致用户经常无故掉线.(dll变动的时候导致Session丢失) 2.有一种方法可以长期保存session,那就是se ...

  7. hibernate:inverse、cascade,一对多、多对多详解

    1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所 ...

  8. java23种设计模式之二: 单例设计模式(6种写法)

    目的:在某些业务场景中,我们需要某个类的实例对象的只能有一个,因此我们需要创建一些单例对象. 本文共有6种写法,仅供参考 1.饿汉式 优点: 在多线程情况下,该方法创建的单例是线程安全的(立即加载) ...

  9. mac 下测试各种IE版本

    背景 作为前端开发,在谈到兼容性时不得不谈到IE浏览器,那么,如果在mac上该怎么测试各种版本的IE呢 方法 1. 下载VirtualBox虚拟器 2. 下载安装了对应版本的windows系统,htt ...

  10. 三、nginx 编译参数

    命令 --prefix=/usr/share/nginx # nginx 帮助目录 --sbin-path=/usr/sbin/nginx # nginx 执行命令 --modules-path=/u ...