当前位置:   article > 正文

MySQL学习(三、分组查询和多表查询)_什么表达式不能用统计函数

什么表达式不能用统计函数

一、分组查询

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;
   
    *表别名:直接在表名后面空格,加上表别名(缩写)
    *自连接查询: 把一张表看成两张表来查询




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/596518
推荐阅读
相关标签
  

闽ICP备14008679号