广告
返回顶部
首页 > 资讯 > 数据库 >第三天MYSQL
  • 510
分享到

第三天MYSQL

第三天MYSQL 2021-10-26 08:10:19 510人浏览 猪猪侠
摘要

第三天Mysql学习 :分组函数、分组查询、连接查询(等值连接、非等值连接、自连接) 2020/5/6 分组函数:(分组函数用作统计使用,又称聚合函数、统计函数或组函数)  #sum(求和)、avg(平

第三天MYSQL

第三天Mysql学习 :分组函数、分组查询、连接查询(等值连接、非等值连接、自连接)

2020/5/6

分组函数:(分组函数用作统计使用,又称聚合函数、统计函数或组函数)

 #sum(求和)、avg(平均值)、max(最大值)、min(最小值)、count(计数)

 特点:

以上分组函数中都是可以忽略null值 (其中count本身就是计算非null值得个数)

sum和avg函数的参数一般只能处理数值型,而max、min以及count可针对任意类型的参数

SELECT  SUM(salary)  FROM  employees;-> 691400.00

SELECT  AVG(salary)  FROM  employees;-> 6461.682243

SELECT  MAX(salary)  FROM  employees;-> 24000.00

SELECT  MIN(salary)  FROM  employees;-> 2100.00

SELECT  COUNT(salary)  FROM  employees;-> 107

 

#组合使用:

SELECT

       SUM(salary) 和,

       ROUND(AVG(salary),2) 平均, #嵌套使用round()函数,将值保留至小数点后面2位

       MAX(salary) 最大值,

       MIN(salary) 最小值,

       COUNT(salary) 总数

FROM

       employees;

 

关于分组函数忽略nul值,举例:

SELECT

       AVG(commission_pct),

       SUM(commission_pct) / COUNT(commission_pct),

       SUM(commission_pct) / COUNT(*)

FROM

       employees;

 

这里可以看出avg(commissom_pct)的值等于sum(commission_pct)/ count(commission_pct)(非空的总数),而不是总体的个数(count(*))

 

#与DISTINCT(去重)关键字搭配使用

SELECT  SUM(DISTINCT salary), SUM(salary)  FROM  employees;

去重之后,在统计工资之和

 

 

 

SELECT  SUM(DISTINCT  salary), SUM(salary)  FROM  employees;

统计工资的种类

 

#count函数详细介绍

select count(*)  from 表名;  ->统计表的总行数

select count(1)  from  表名; ->相当于在表中多了一列,这一列中根据表内的行数加了相应个数的1,统计1的个数,并返回

效率比较:

MYISAM存储引擎下,count(*)的效率高

INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)(有个判断字段是否为null的过程)要高

注意:和分组函数一同查询的字段要求是group by 后的字段

 

十六、分组查询

语法:(group by 子句语法)

注意:查询列表必须特殊,要求是分组函数或group by后出现的字段

       SELECT

              分组函数,列(要求要出现在group by 之后)

       FROM

              表名

       [WHERE

              筛选条件]

       GROUP BY

    分组的列表

       [ORDER BY

    子句]

特点:

  1. 分组查询中的筛选条件分为两类

                      数据源                    位置                     关键字

分组前筛选   原始表                  group by子句前               where

分组后筛选   分组后的结果       group by子句后                having

若分组函数做筛选条件则肯定放在having子句中

能用分组前筛选的,就优先考虑使用分组前筛选(考虑效率问题)

group by 子句中支持单个字段分组,多个字段分组(多个字段用逗号隔开,没有顺序要求,还支持表达式和函数分组(用的较少))

也可以添加排序(排序放在整个分组查询语句的最后)

----------------------------------简单分组查询------------------------

#案例一:查询每个部门的平均工资

SELECT

       AVG(salary) 平均工资,

       department_id

FROM

       employees

GROUP BY

       department_id;

 

#案例二:查询每个工种的最高工资

SELECT

       MAX(salary),

       job_id

FROM

       employees

GROUP BY

       job_id;

 

 #案例三:查询每个位置上的部门个数

SELECT

       COUNT(*),

       location_id FROM

       departments

GROUP BY

       location_id;

 

-----------------------------添加筛选条件的分组查询-------------------

分组前筛选

#案例1:查询邮箱中包含a字符的,每个部门的平均工资

SELECT

  AVG(salary)  平均工资,

  department_id  部门编号

FROM

  employees

WHERE

  email LIKE "%a%"

GROUP BY

  department_id;

 

#案例2:查询有奖金的每个领导手下员工的最高工资

SELECT

  MAX(salary) 最高工资,

  manager_id 领导编号

FROM

  employees

WHERE

  commission_pct IS NOT NULL

GROUP BY

       manager_id;

分组后筛选

#案例1:查询哪个部门的员工个数>2

 

SELECT

  count(*) 员工个数,

  department_id 部门编号

FROM

  employees

GROUP BY

  department_id

HAVING    #根据GROUP by 执行后的结果再筛选

  count(*) > 2;

 

SELECT

  count(*) 员工个数,

  department_id 部门编号

FROM

  employees

GROUP BY

  department_id

HAVING

  员工个数 > 2;#可使用别名

 

#案例2:查询每个工种有奖金的员工的最高工资>12000

SELECT

  MAX(salary) 最高工资,

  job_id 工种编号

FROM

  employees

WHERE

  commission_pct IS NOT NULL

GROUP BY

  job_id

HAVING

  MAX(salary) > 12000;

-------------------------------------------------

SELECT

  MAX(salary) 最高工资,

  job_id 工种编号

FROM

  employees

WHERE

  commission_pct IS NOT NULL

GROUP BY

  工种编号

HAVING

  MAX(salary) > 12000;

 注意:ORDER BY以及GROUP BY子句后都可以使用别名,注意!!!WHERE子句后不可以!!!

 

#案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资

SELECT

  MIN(salary) 最低工资,

  manager_id 领导编号

FROM

  employees

WHERE

  manager_id > 102

GROUP BY

  manager_id

HAVING

  MIN(salary) > 5000;

 

对比分组前筛选与分组后筛选:

                     数据源                   位置                   关键字

分组前筛选  原始表                 group by子句前          where

分组后筛选  分组后的结果       group by子句后          having

注意:

  1. 若分组函数做筛选条件则肯定放在having子句中
  2. 能用分组前筛选的,就优先考虑使用分组前筛选(考虑效率问题)

 

 

---------------------按表达式或函数分组查询(用的较少)--------------------

#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些

 

SELECT

       COUNT(*) 员工个数,

       LENGTH(last_name) len_name

FROM

       employees

GROUP BY

       LENGTH(last_name)

HAVING

       COUNT(*) > 5;

 

-----------------------------多个字段的分组查询----------------------------

#案例:每个部门每个工种的平均工资

 

SELECT

       AVG(salary) 平均工资,

       department_id,

       job_id

FROM

       employees

GROUP BY       #department_id与job_id一致的分为一个小组(与顺序无关)

       department_id,

       job_id;

 

----------------------------添加排序条件的分组查询-------------------------

#案例:每个部门每个工种的奖金存在的并且平均工资大于1000的平均工资,并且按平均工资的高低显示

SELECT

       AVG(salary) 平均工资,

       department_id,

       job_id

FROM

       employees

WHERE

       department_id IS NOT NULL

GROUP BY  #department_id与job_id一致的分为一个小组(与顺序无关)

       department_id,

       job_id

HAVING

       AVG(salary)>10000

ORDER BY

       AVG(salary) DESC;

 

十七、连接查询

含义:又称多表查询,当查询的字段来自于多个表时,就会用到

笛卡尔乘积现象:表1 有m行,表2 有n行,结果=m*n行

发生原因:没有有效的连接条件

如何避免:添加上有效的连接条件

连接查询分类:

  按年代分类:

       sq92标准:仅仅支持内连接(对mysql而言)

       sq99标准(推荐):支持内连接+外连接(左外、右外)+交叉连接

 

按功能分类:

       内连接:

              等值连接

              非等值连接

              自连接

       外连接:

              左外连接

              右外连接

              全外连接

       交叉连接

 

(sq92标准)

#等值连接                     

特点:

  1. 多表连接的结果为多表的交集部门
  2. n表连接,至少需要n-1个连接条件
  3. 多表的顺序没有要求
  4. 一般需要为表取别名
  5. 可以搭配前面介绍的所有子句

#案例1:查询女神名和对应的男神名

SELECT

       NAME,

       boyname

FROM

       beauty,

       boys

WHERE

       beauty.boyfriend_id = boys.id;    #在两个表之间添加了一个连接的条件

 

#案例2:查询员工名和对应的部门名

SELECT

       last_name,

       department_name

FROM

       employees,

       departments

WHERE

       employees.department_id = departments.department_id;

 

#案例3:查询员工名、工种号、工种名

SELECT

       last_name,

       employees.job_id,  #要用表名去限定,否则识别不出来是哪个表中的job_id

       job_title

FROM

       employees,

       jobs           #两个表的顺序可调换

WHERE

       employees.job_id = jobs.job_id;

 

------------为表取别名----------------

  1. 提高语句的简洁度
  2. 区分多个重名的字段(限定字段)
  3. 若为表取了别名,则查询的字段就不能使用原来的表名取限定

SELECT

       e.last_name,

       e.job_id,#用表名去限定

       j.job_title

FROM

       employees e,

       jobs j

WHERE

       e.job_id = j.job_id;

 

#案例4:查询有奖金的员工名、部门名、奖金率【增加筛选条件】

 

SELECT

       last_name,

       department_name,

       commission_pct

FROM

       employees e,

       departments d

WHERE

       e.department_id = d.department_id

AND e.commission_pct IS NOT NULL;

 

#案例5:查询城市名中第二个字符为"o"的部门名和城市名【增加筛选条件】

SELECT

       department_name,

       city

FROM

       departments d,

       locations l

WHERE

       d.location_id = l.location_id

AND city LIKE "_o%";

 

#案例6:查询每个城市的部门个数【与group by子句搭配使用】

 

SELECT

       count(*) 个数,

       city

FROM

       departments d,

       locations l

WHERE

       d.location_id = l.location_id

GROUP BY

       city;

#案例7:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资

 

【与group by子句搭配使用】

SELECT

       department_name,

       e.manager_id,

       MIN(salary)

FROM

       departments d,

       employees e

WHERE

       e.department_id = d.department_id

AND e.commission_pct IS NOT NULL

GROUP BY

       department_name,manager_id;

 

#案例8:查询每个工种的工种名,和员工个数,并按员工个数降序【与order by 子句搭配使用】

 

SELECT

       job_title,

       COUNT(*)

FROM

       jobs j,

       employees e

WHERE

       j.job_id = e.job_id

GROUP BY

       job_title

ORDER BY

       COUNT(*) DESC;

 

#案例9:查询员工名、部门名和所在的城市【多表联合查询】

 

SELECT

       last_name,

       department_name,

       city

FROM

       employees e,

       departments d,

       locations l

WHERE

       e.department_id = d.department_id

AND d.location_id = l.location_id;

 

 

#非等值连接

#案例1:查询员工的工资和工资级别

SELECT

       salary,

       grade_level

FROM

       employees e,

       job_grades j

WHERE

       salary BETWEEN lowest_sal    #salary在这个范围内就显示出来(不是等值的形式,而是一个范围的判断)

AND highest_sal;

 

#自连接(当前表要要连接当前表,为了不模糊,则需各取别名进行限定!)

#案例:查询员工名和上级的名称

SELECT

       e.last_name 员工名,

       m.last_name 上级名称

FROM

       employees e,

       employees m

WHERE

       e.manager_id = m.employee_id;

您可能感兴趣的文档:

--结束END--

本文标题: 第三天MYSQL

本文链接: https://www.lsjlt.com/news/5940.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL第三天
    MySQL第二天 关键词:分组聚合 自关联 物理上一张表,逻辑上是两张表 create table areas( id int primary key, atitle varchar(20)...
    99+
    2022-10-18
  • 第三天MYSQL
    第三天MySQL学习 :分组函数、分组查询、连接查询(等值连接、非等值连接、自连接) 2020/5/6 分组函数:(分组函数用作统计使用,又称聚合函数、统计函数或组函数)  #sum(求和)、avg(平...
    99+
    2021-10-26
    第三天MYSQL
  • Python第三天
    python操作文件之读 打开后如何关闭 python操作文件默认动作是读 在打开文件时有时候需要转义 打开文件时文件绝对路径转义方法 相对路径打开文件 非文字类型的文件读操作rb 按行读取 将每一行当成列表的每一个元素 大...
    99+
    2023-01-31
    Python
  • Flask入门第三天
      一、数据库操作   1,orm orm(object-Relation Mapping),对象-关系映射,主要实现模型对象到关系数据库数据的映射。 优点: - 只需要面向对象编程, 不需要面向数据库编写代码. - 对数据库的操作...
    99+
    2023-01-31
    门第 Flask
  • python-selenum3 第三天基
    打开网页并验证 #验证网页 #打开火狐 driver = webdriver.Firefox(executable_path = "d:\\geckodriver") #将地址赋值给变量fURL fURL = "https://www.ba...
    99+
    2023-01-31
    天基 python
  • python3第三天(运算符)
    python直接以下运算符:    算术运算符    比较(关系)运算符    赋值运算符    逻辑运算符    位运算符    成员运算符    身份运算符    运算符优先级算术运算符:    + 加    - 减    * 乘   ...
    99+
    2023-01-31
    运算符
  • 第一天MySQL
    MySQL学习笔记   2020/5/4 一、 数据库的相关概念 数据库的好处 1   能够永久性的保存数据,实现数据持久化 2   可以实现结构化查询,方便管理   2.数据库相关概念 1数据库(DB->database):...
    99+
    2020-05-20
    第一天MySQL
  • 第二天MySQL
    SQL条件查询、排序查询、一些常见函数 2020/5/5 一、 DQL条件查询 语法:(执行顺序已标出) SELECT      查询列表                      3 FORM...
    99+
    2021-02-10
    第二天MySQL
  • 第五天MYSQL
    分页查询、联合查询、DML(修改、删除、插入语句) 2020 5/9   十九、分页查询 应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求 语法:(执行顺序已标出)          SE...
    99+
    2021-11-05
    第五天MYSQL
  • 第四天MySQL
    第四天MySQL 连接查询(内连接、外连接、交叉连接)(sql99版本下) 子查询: select 后面(标量子查询) from 后面(表子查询) where 或having后面(标量子查询...
    99+
    2020-08-04
    第四天MySQL
  • 第六天MySQL
    DDL语言库与表的管理(创建、修改、删除)、一些常见的数据类型(整形、浮点|定点、日期,字符)   2020 5/9   二十二、DDL(数据定义语言)->用于库和表的管理 一、 库的管理 a)    ...
    99+
    2021-10-26
    第六天MySQL
  • python第三天(list,元组,di
    1.list 列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示: list1 = ['phy...
    99+
    2023-01-30
    python list di
  • 第22天 常用模块三
    介绍的模块 logginghashlib  模块一:logging 人生三问 什么是日志  对每天所发生的事情做的记录就是日志。 为什么要用日志  日志记录了我们程序每天发生了什么事情,这个对于我们程序的维护有很大的帮助。例如每天都...
    99+
    2023-01-30
    模块 常用
  • 我的python学习--第三天
    第三天  1:列表及Python基础回顾  2:字典 列表字典生成式及应用场景  3:字符串 字典字符串转换及应用场景  4:文件操作 文件字典转换及应用场景  5:总结基础数据结构的知识脑图 -- 增删查改1、列表的操作:  help(l...
    99+
    2023-01-31
    python
  • MySQL第三课
    首先创建一个数据库: CREATE DATABASE ku; Query OK, 1 row affected 查看一下是否有此数据库: SHOW DATABASES; +--------------------+| Database   ...
    99+
    2018-10-18
    MySQL第三课
  • 我的python学习--第十三天
    nginx + uwsgi + flask一、安装1、安装uwsgi[root@yaoliang day_13]# wget http://projects.unbit.it/downloads/uwsgi-2.0.4.tar.gz [ro...
    99+
    2023-01-31
    第十三天 python
  • 学习python的第三天(变量)
    一.关于python 1.交互式 说一句解释一句 2.命令行式 1.编写文件并且保存 2.打开python解释器,在pyrhon中打开文本,读入内存(python打开的时候,翻译不是瞬间) 3.python解释文本 注意:第二阶段相当于...
    99+
    2023-01-31
    变量 python
  • 【C++笔试强训】第三十天
    🎇C++笔试强训 博客主页:一起去看日落吗分享博主的C++刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光...
    99+
    2023-09-03
    c++ java 数据库
  • 使用sysbench压力测试MySQL(三)(r12笔记第6天)
      昨天使用gdb调试MySQL中事务临界状态的时候,发现其实有些场景可能比我想得还要复杂一些,所以我在昨天的测试中结尾也是快快扫过,但是表明了意思即可。这一点上我在后面会把Oracle的临界...
    99+
    2022-10-18
  • Python 学习 第三天 课后总结:
    PYTHON学习第三天课后总结: 1,注释:就是对代码起到说明注解的作用。      注释分为单行注释与多行注释。       单行注释:只注释一行代码在需要注释的所在行的行首使用#号来注释此行,注意#与代码之间需要加一个空格    ...
    99+
    2023-01-31
    课后 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作