一、分组查询

1.MySQL查询函数

函数的分类:
    1,单行函数:将每条数据进行独立的计算,然后每条数据得到一条结果。
    2,多行函数:多条数据同时计算,最终得到一条结果数据。也成为聚集函数、分组函数, 主要用于完成一些统计功能。

2.什么是分组?

针对于班上所有的同学:
    分组情况1-按照性别分组:男生一组,女生一组,之后可以统计男生和女生的数量;
    分组情况2-按照年龄段分组:80后一组,90后一组;
    分组情况3-按照籍贯分组:广东一组,湖南一组,江西一组;

3.分组查询语法

语法:
SELECT  *|colName1,colName2,..|统计函数
FROM tName
[WHERE 条件]
GROUP BY colName1,[colName2],[...]
[ORDER BY colName1,colName2];
------------------------------------------------------
使用GROUP BY子句将表分成小组组函数忽略空值,可以使用ifnull
结果集隐式按升序排列,如果需要改变排序方式可以使用order by 子句

.使用GROUP BY

1,出现在SELECT列表中的字段,如果出现的位置不是在组函数中,那么必须出现在GROUP BY子句中。
2,在GROUP BY 子句中出现的字段,可以不出现在SELECT列表中
3,如果没有GROUP BY子句SELECT列表中的任何列或表达式不能使用统计函数。(不合理操作,Oracle会直接报错)(没有分组GROUP BY,查询没有意义)
-----------------------------------------------------------------------------
分组函数单独使用:
SELECT COUNT(empno) FROM emp;
错误的使用,出现了其他字段:
SELECT empno,COUNT(empno) FROM emp;     //FALSE
----------------------------------------------------------------------------
如果现在要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现:
正确做法:
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job;
错误的做法:
SELECT deptno,job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job;
-----------------------------------------------------------------------------
组函数的错误用法:
1,不能在 WHERE 子句中限制组。
2,限制组必须使用 HAVING 子句。
3,不能在 WHERE 子句中使用组函数。

需求:按照职位分组,求出每个职位的最高和最低工资

6.使用HAVING子句对分组的结果进行限制

SELECT *|colName1,colName2,... | 统计函数
FROM tName
WHERE 条件1
GROUP BY colName1,colName2,..
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];

*注意点:WHERE和HAVING的区别
WHERE:是在执行GROUP BY操作之前进行的过滤,表示从全部数据之中筛选出部分的数据,在WHERE之中不能使用统计函数;
HAVING:是在GROUP BY分组之后的再次过滤,可以在HAVING子句中使用统计函数;

二、多表查询

单表查询:从一张表中查询数据
            SELECT col1,col2,col3
            FROM tName
    
        多表查询:从多张表中联合查询出数据
            SELECT <selectlist> From tName1,tName2

1.笛卡尔积

没有连接条件的表关系返回的结果,多表查询会产生笛卡尔积
     假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
     实际运行环境下,应避免使用全笛卡尔积
     解决办法:在where子句中加入有效的连接条件---->等值连接(连接n张表,至少需要n-1个连接条件)
    
主键约束(PRIMARY KEY)
    约束在当前表中,指定列的值非空且唯一
外键约束(FORGEIGN KEY
     主表的外键列必须要引用于(参照)从表的主键列(避免无数据值)
     为了保证数据的合理性,我们需要建立外键约束关系,
     规定:

外键值应该来源于从表的主键值

一般我们定义外键的时候,习惯命名:引用表名_引用列名
    在开发中,我们有时候为了提高性能,会故意删除外键约束,此时我们可以通过java代码来控制数据的合理性


    注意:在MYSQL中,innoDB支持事务和外键。修改表的存储引擎为innoDB
          ALTER TABLE tName ENGINE='InnoDB'(InnoDB存储引擎,支持外键又支持事务)

2.内连接

内连接:相对于外连接的查询
    内连接分为:隐式内连接、显示内连接,查询效果相同

隐式内连接(常用):
    SELECT <selectlist> FROM A,B WHERE A.col=B.col
    显示内连接(推荐):
    SELECT <selectlist> FROM A [INNER] JOIN B ON A.col=B.col

隐式内连接连接(看不到JOIN):

SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,…]
FROM 表名称 [别名], [表名称 [别名] ,…]
[WHERE 条件(S)]
[ORDER BY 排序字段 [ASC|DESC] [,排序字段 [ASC|DESC] ,…]];
-------------------------------------------------------------------------
使用表连接从多个表中查询数据
SELECT    table1.column, table2.column
FROM        table1, table2
WHERE    table1.column1 = table2.column2;

在 WHERE 子句中写入连接条件当多个表中有重名列时,必须在列的名字前加上表名作为前缀/或使用表的别名

等值连接是连接操作中最常见的一种,通常是在存在主外键约束条件的多表上建立的,连接条件中的两个字段通过等号建立等值关系。

使用表的别名简化了查询提高了查询的性能
SELECT e.empno,e.ename,d.deptno,d.dname FROM emp e,dept d WHERE e.deptno = d.deptno;

显示内连接查询(查询效果和隐式内连接相同):
SELECT    table1.column, table2.column
FROM    table1 INNER JOIN table2  ON(table1.column_name = table2.column_name)

自然连接的条件是基于表中所有同名列的等值连接为了设置任意的连接条件或者指定连接的列,需要使用ON子句连接条件与其它的查询条件分开书写使用ON 子句使查询语句更容易理解

练习,使用显式内连接查询:
需求:查询员工编号,员工名称,员工所属部门名称.
SELECT e.empno,e.ename,d.dname  FROM emp e JOIN dept d ON  e.deptno = d.deptno
SELECT e.empno,e.ename,d.dname  FROM emp e JOIN dept d  USING(deptno)

3.外连接

外连接查询(左外,右外,全外): 根据表在JOIN左边还是右边来区分.
      左外连接:查询出JOIN左边表的全部数据查询出来,JOIN右边的表不匹配的数据使用NULL来填充数据.
      右外连接:查询出JOIN右边表的全部数据查询出来,JOIN左边的表不匹配的数据使用NULL来填充数据.
      MYSQL中暂时不支持全连接
      可以通过union +左右连接来完成;
------------------------------------------------
在查询语句中,一张表可以重复使用多次,完成多次连接的需要;
需求:查询员工名称和其对应经理的名称.
SELECT e.empno,e.ename,m.ename FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;
   
    *表别名:直接在表名后面空格,加上表别名(缩写)
    *自连接查询: 把一张表看成两张表来查询

MySQL学习(三、分组查询和多表查询)相关推荐

  1. 小汤学编程之MySQL(三)——约束、多表查询、事务和数据库其他操作

    一.约束 1.主键约束     2.自动增长     3.非空约束     4.唯一约束     5.默认约束     6.外键约束     7.级联删除和级联更新     8.null删除和null ...

  2. MySQL学习总结(2) --- 数据表管理(增删改查)、使用DQL查询数据(SELECT)

    MySQL学习总结(2) - 数据表管理(增删改查).使用DQL查询数据(SELECT) 1. 数据管理(增删改查) 数据库数据管理方法: a.通过SQLyog等管理工具管理数据库数据 b. 通过DM ...

  3. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  4. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

  5. MySQL 数据库约束、聚合查询、多表查询

    一.数据库约束 约束就是数据库在使用的时候,对于里面能够存的数据提出的要求和限制,程序猿就可以借助约束来完成更好的校验 1.约束类型 ① NULL约束 NOT NULL - 指示某列不能存储 NULL ...

  6. Linux命令:MySQL系列之五--SELECT单表查询、多表查询升级及删除,插入

    SELECT:查询 SELECT select-list FROM tb WHERE qualification  根据标准qualification查找对应的行 查询语句类型:  qualifica ...

  7. 【MySQL笔记 第06章_多表查询】

    第06章_多表查询 多表查询概述 1.一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 演示代码 2. 多表查询分类讲解 分类1:等值连接 vs 非等值连接 等值连接 非 ...

  8. MySQL从入门到精通:多表查询的灵活运用_02

    我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华. 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦. 上一篇:MySQL从入门到精通:基本语法介绍与使用_01 下一篇:MySQL从 ...

  9. Mysql单表查询和多表查询

    单表查询 一 单表查询的语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法select * from, ...

  10. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.T ...

最新文章

  1. 自动化测试框架的隐藏小细节,你都知道么
  2. 面向过程与面向对象引入三大特性事务
  3. 【QuantOS】jaqs实例代码(可以使用版本)
  4. java开发简介_Java Web开发介绍
  5. Debian 新负责人发表演讲:Debian 的现状与面临的一些问题
  6. 生产者/消费者模式(一)
  7. linux终端什么字体舒服,推荐一款 Linux 上比较漂亮的字体
  8. PASCAL VOC数据集分析及下载、解压
  9. IDEA打包程序与运行(windows环境)
  10. java省市区树_ztree实现中国省市区树形
  11. 乐观锁实现之CAS算法分析
  12. 我儿子今年15周岁,学习不好,去年上的高职,今年我犹豫是让他继续上,还是学个手艺?...
  13. 献给小白的笔记day6
  14. 互联网电商平台运营模式
  15. 机器学习—分类算法的对比实验
  16. php获取蓝奏云直连,最新php蓝奏云直链api接口源代码
  17. matlab ilu函数,不完全 LU 分解
  18. pythonrequests查询_PyQt5+requests实现车票查询工具
  19. 负数modulo运算_Java Modulo Operator-Java中的Modulus运算符
  20. 解决联想笔记本安装银河麒麟系统安装时只有机械硬盘,没有固态硬盘的方法

热门文章

  1. 数据结构之简单排序算法
  2. Swift - 设置UIView的背景色和背景图片
  3. Tomcat中配置文件conf修改的一些常识
  4. 【视频】线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例
  5. 拓端tecdat|Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
  6. ctimespan 获取毫秒_VC++ 获取系统时间的方法汇总
  7. 配置oracle方言类,Oracle环境下的Hibernate方言配置
  8. mybatis 多租户saas_SaaS 微服务脚手架
  9. susue linux防火墙,在64位的SUSUE下,g++编译的代码中,进入函数前的一段汇编让人费解,请高手解释一下?...
  10. astype和squeeze 函数