分组显示

select 列名 from 表名 group by 用于分组的列名

分组后的处理对象是“同一组的所有记录”

例:id,sales,month

根据员工id分组,并显示每位员工的总销售额

select id,sum(sales) as 合计
from tb
group by id

 根据员工id分组,并计算每组销售额的平均值

select id,avg(sales) from tb
group by id;

 设置条件分组显示

select 统计列 from 表名 by 分组列 having 条件

用于提取记录的having是在分组之后执行的

例:按员工id分组计算总销售额,仅显示小组总销售额大于等于200万元的记录

select id,sum(sales) from tb
group by id
having sum(sales)>=200;

如果提取记录后分组:

例:仅提取销售额大于等于50万元的记录,并以该记录为对象计算各员工的平均销售额

select id,avg(sales)
from tb where sales>=50
group by id;

如果 分组后排序:

例:将各员工的平均销售额按从高到底的顺序显示

select id,avg(sales)
from tb
group by id
order by avg(sales) desc;//先分组后排序

记住顺序:where->group by->order by (desc)

使用多个表:

示例表:

 从多个表取出记录汇总到一起显示

select 列表1 from 表名1 union select 列名2 from 表名2;

如果合并相同列结构的两个表

select *from tb1
union
select *
from tb2;

 按条件合并多条提取结果进行显示:

在各个命令的最后加上where条件

例:将tb中销售额大于等于200万元的员工号,表tb1中年龄大于等于35岁的老员工的员工号(满足任意一个即可)合并起来

(select id from tb where sales>=200)
union
(select id from tb1 where age>=35);

执行该语句时会自动执行“消除重复记录”的操作。如果对大量记录执行“消除重复”的操作,就会产生的一定的等待时间。

消除重复:

(select id from tb where sales>=200)
union all
(select id from tb1 where age>=35);
//在union后加上all允许重复

连接多个表并显示(内连接):

将多个表通过某个连接键连接在一起的处理称为“连接”。使用join连接两个表

select 列名 from 表1
join 要连接的表2
on 表1的列=表2的列

选择列进行显示:把列名写成“表名.列名”。

只显示id,name,sales

select tb.id,tb1.name,tb.sales from tb
join tb1
on tb.id=tb1.id;

给表添加别名:

select *from tb as x;

显示列名可以写成“别名.列名”,可以化简书写

例:tb表别名为x,tb1表别名为y,显示tb中的id和sales,以及tb1中的姓名

思路:将tb的列id与tb1的列id相匹配的记录进行连接,然后显示表tb的列id,表tb1,的列name和表tb的列sales。这些处理在给表tb添加别名"x",给表tb1添加别名“y”的前提下进行。

select x.id,y.name,x.sales
from tb as x
join tb1 as y
on x.id=y.id;

使用using 使on 的部分更容易阅读

当作为连接键的两个列名相同,可以用using化简

select x.id,y.name,x.sales
from tb as x
join tb1 as y
using(id);

通过where设置条件从连接表中提取记录

在最后加上where条件。列名要按照“表名.列名”(或者别名.列名)进行书写。

例:将tb的中的销售额大于等于100万元的优秀成绩为对象的id,sales,连同tb1中的姓名合并显示处来。

思路:根据id将表tb和表tb1进行连接,显示表tb的列sales中值大于等于100的记录。显示列id,列name,列sales,并给它们分别加上别名“员工号”,“姓名”,“销售额”

select tb.id as 员工号,tb1.name as 姓名,tb.sales as 销售额
from tb join tb1
using(id)
where tb.sales>=100

提取多个表中的记录

select ~ from tb
join tb1 连接条件(on或者using)
join tb2 连接条件
join tb3 连接条件
...;

例:连接销售信息表tb,员工信息表tb1,员工出生地表tb3,显示员工号(tb.id),销售额(tb.sales),姓名(tb1.name),出生地(tb3.religion)。

select tb.id,tb.sales,tb1.name,tb3.region
from tb
join tb1 using(id)
join tb3 using(id);

显示多个表的所有记录(外连接

使用join的内连接只会提取与连接键相匹配的记录,即共有的记录。如果要显示不是共有的记录,就需要使用外连接。

即使与连接键不匹配,外连接也会提取另一个表中的所有记录。

外连接的种类:

select from 表1 join 表2

左外连接:显示相匹配的记录和表1的全部记录

右外连接:显示相匹配的记录和表2的全部记录

使用左外连接:

select 列名
from 表1
left join 要连接的表2
on 表1的列=表2的列

 例:将id作为连接键,使用左外连接显示表tb和表tb1相匹配的记录,以及表tb的所有记录。但是仅显示表tb的列id,和tb1的列name

select tb.id,tb1.name
from tb
left join tb1
using(id);

如果tb中的id在tb1中没有记录,那么name显示为null

使用右外连接:

select 列名 from 表1
right join 要连接的表2
on 表1的列=表2的列;

例:以id为键,使用右外连接显示表tb和表tb1相匹配的记录,以及表tb1的所有即。仅显示表tb的列id和表tb1的列name

select tb.id,tb1.name
from tb
right join
tb1
using(id);

混合使用左外连接和右外连接可能会导致日后发生错误。

注:left join 可以写成left outer join 。同样,right join 可以写成right outer join

自连接:

将表与其自身,也就是和同名的表进行连接。为了区分不同的列,连接时必须起别名

select 列名 from 表名 as 别名1
join 表名 as 别名2;

例:对员工信息tb1进行自连接,并把所有的列显示出来

select * from tb1
as a
join tb1
as b;

由于表tb1是和不同名的自身进行连接,所以自身拥有的所有记录将与自身拥有的所有记录进行连接(n*n)

自连接的作用:

自连接会包含所有的组合。可以通过筛选设置条件选出想要的内容?

子查询:

执行查询(子查询),然后使用检索到的记录进一步执行查询。

例如,在第一阶段提取“销售额大于等于200万元的员工号”,然后在第二阶段中进行“从提取出来的员工号中提取相对应的姓名”。第一阶段的查询叫做子查询

第一阶段的子查询可以返回值,列和记录等。

例:显式表tb中sales最大值的记录(返回值的子查询)

思路:在第一阶段查询中取出max(sales)的值,然后在第二阶段选择了包含了最大值列sales的记录

select * from tb
where sales in (select max(sales) from tb); 

例;计算tb1中员工的平均年龄,并提取大于等于平均年龄的员工记录(返回值的子查询)

select * from tb1
where age>=(select avg(age) from tb1);

例:显式销售额大于等于200万元的员工姓名(返回列的子查询):使用in

思路:提取销售信息表tb中的销售额(sales)大于等于200的id,然后显示tb1中的姓名

select * from tb1
where id in
(select id from tb where sales>=200);

当只有一条记录时, 使用=也无妨

子查询和内连接提取结果的差异:

子查询:

select id,name
from tb1
where id in(select id from tb);

这里,会显示tb1中和tb id相匹配的记录

内连接:

select tb1.id,tb1.name
from tb1
join tb
on tb1.id=tb.id;

这里,会显示tb中的所有记录

【MYSQL笔记】分组计算多表查询相关推荐

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

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

  2. MySQL字段约束及多表查询---讲解三

    MySQL环境配置(mysql有下载包) MySQL数据库表的基础操作(增删改查)-讲解一 MySQL数据库表的模糊/多行/分组/排序/分页查询以及字mysql数据类型的讲解-讲解二 MySQL字段约 ...

  3. MySQL数据库中的多表查询含义以及练习~建议码友们点亮拇指+收藏呐~

    MySQL数据库中的多表查询含义以及练习 一. 多表查询含义 二. 多表查询练习 1. 已知表 2. 需求And代码 一. 多表查询含义 查询语法: select列名列表from表名列表where条件 ...

  4. MySQL核心查询-排序 分组 聚合 多表查询 合并查询 子查询

    目录 一.单表查询 排序 聚合函数 分组 limit关键字 二.SQL约束 主键的自增 DELETE和TRUNCATE对自增长的影响 三.多表查询 外键约束 删除外键约束 多表查询的分类 内连接查询 ...

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

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

  6. 在mysql数据库中,多表查询,事务,DCL,

    多表查询: * 查询语法:select列名列表from表名列表where.... * 准备sql# 创建部门表CREATE TABLE dept(id INT PRIMARY KEY AUTO_INC ...

  7. MySQL数据库-DQL(单表查询)

    单表查询 数据准备 查询语法 查询全部 条件查询 (where) 查询条件分类 条件查询的语法 聚合函数查询 聚合函数介绍 聚合函数分类 聚合函数语法 案例学习 排序查询 (order by) 注意 ...

  8. MySQL的约束、多表查询、子查询

    一.约束之主键约束 约束:约束是添加在列上的,用来约束列的. 1.主键约束(唯一标识):非空.唯一.被引用 当表的某一列被指定为主键后,该类就不能为空,不能有重复值出现 创建表时指定主键的两种方式: ...

  9. MySQL 第六章-多表查询+课后练习

    #1.多表的查询如何实现 #错误的实现方式,每个员工都与每个部门匹配了一遍 SELECT employee_id,department_name FROM employees,departments; ...

最新文章

  1. python中raw函数_python中忽略get_row函数
  2. 【Linux多线程】三个经典同步问题
  3. “远程银行”优秀厂商认证!网易云信入选《区域性银行数字化厂商全景报告》...
  4. ubuntu 18 mysql5.7_Ubuntu18.04 下 MySQL5.7 的安装
  5. MySQL使用时遇到的问题
  6. LibLinear(SVM包)使用说明之(二)MATLAB接口
  7. nodejs入门学习笔记一——一个完整的http路由服务实现
  8. 云计算:OpenStack、Docker、K8S(Kubernetes容器编排工具)的演进史 | 附推荐阅读
  9. jQuery学习(十二)—jQuery中对象的查找方法总结
  10. ICLR 2019提交截止,近1600篇论文已全部上线
  11. C语言pop_back用法,【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)...
  12. atitit.安全的签名摘要 算法attilax总结
  13. HeroM2连击技能设置和DB完整数据
  14. 乌鲁木齐市建筑物矢量数据(Shp格式+带高度)
  15. c++ 调用meshlab程序慢_从Meshlab学架构
  16. 在word中选择所有匹配查找内容的文档内容
  17. 无线基础知识学习(一)
  18. PS-把长方形图片改为正方形图片
  19. 华为交换机如何查看端口所联设备的MACIP
  20. drools快速入门:简介、语法和结构

热门文章

  1. IOS开发之视图和视图控制器
  2. servlet监听器Listener(理论+例子)
  3. CCF201403-1 相反数(100分)【序列处理】
  4. Bailian2926 算术运算【水题】
  5. Bailian2677 Bailian3865 肿瘤检测【基础】
  6. UVA355 UVALive5249 The Bases Are Loaded【进制】
  7. C/C++ 安全编码 —— 不安全的函数
  8. matlab 时频分析(短时傅里叶变换、STFT)
  9. vim 与 ascii 码表与可显示字符
  10. 趣学 C 语言(四)—— 字符串与字符数组