1、union 和 union all

还记得高中课本上学到的 交集 和 并集 的概念吗?

union 就是并集的概念,而下面即将要提到的join,就是交集的概念。区别:

union:合并时,会自动删除重复行

union all:就是无脑拼接,不去重

select * from student1

union

select * from student2

2、笛卡尔积(交叉连接)

笛卡尔积是没有连接条件返回的结果。

2行3列的数据,和3行2列的数据,进行笛卡尔积后,产生一个6×6的数据表。

这就是笛卡尔积。

一般不太建议使用笛卡尔积,因为非常好资源,比如2个100×100的表进行笛卡尔积,你会得到一个10000×10000的数据表。

3、各种 join

join就是高中数据中,交并集中的交集概念。

基本语法就是 A join B on A.key = B.key,这里 on 后面就是返回2个表的关联条件;

此处多提一句,通过建立外键索引,并使用外键进行关联,可以提升SQL的运行效率;

在多提一句,建立索引对查询是有利的,但对于维护数据库(增删改)是有弊的。一张图看懂SQL join 的逻辑:

join的逻辑上图已经讲的很清楚了,重点是多练习;4

该题的思路2(有点意思昂):

select 课程号,

sum(case when 成绩>=60 then 1 else 0 end) as 及格人数,

sum(case when 成绩 < 60 then 1 else 0 end) as 不及格人数

from score

group by 课程号;

该题的解法2:

select a.课程号,b.课程名称,

sum(case when 成绩 between 85 and 100 then 1 else 0 end) as '[100-85]',

sum(case when 成绩 >=70 and 成绩<85 then 1 else 0 end) as '[85-70]',

sum(case when 成绩>=60 and 成绩<70 then 1 else 0 end) as '[70-60]',

sum(case when 成绩<60 then 1 else 0 end) as '[<60]'

from score a

right join course b

on a.课程号 = b.课程号

group by a.课程号,b.课程名称;

练习题:原网页的问题描述简直一言难尽。。。

1. 在进球表(goal)中查找德国球队(teamid = 'GER')进球的比赛编号(matchid),进球球员姓名(player)

SELECT matchid, player

FROM goal

WHERE teamid = 'GER';

2. 在比赛信息表(game)查找比赛编号1012的信息

SELECT id, stadium, team1, team2

FROM game

where id = 1012;

3. 查找德国队进球球员姓名,球队编号(在进球信息表goal), 比赛地点,比赛日期(在比赛信息表game)

SELECT b.player, b.teamid, a.stadium, a.mdate

FROM game a

join goal b ON a.id = b.matchid

where teamid = 'GER';

4. 查找姓名中以Mario开头的进球球员,符合条件球员参加比赛的对战双方

select a.player, b.team1, b.team2

from goal a

join game b on a.matchid = b.id

where player like 'Mario%';

5. 查找进球球员的姓名、球队编号、教练、多长时间进球。要求多长时间进球<=10分钟

SELECT player, teamid, coach, gtime

FROM goal a

join eteam b on a.teamid = b.id

WHERE gtime <= 10;

6. 'Fernando Santos'作为教练的比赛日期,球队编号有哪些?

select b.mdate, a.teamname

from eteam a

join game b on a.id = b.team1

where coach = 'Fernando Santos';

7. 在比赛地点'National Stadium, Warsaw'有哪些进球球员?

select b.player

from game a

join goal b on a.id = b.matchid

where stadium = 'National Stadium, Warsaw';

8.射入德国球门的球员姓名

select distinct b.player

from game as a inner join goal as b on a.id = b.matchid

where (b.teamid = a.team1 and a.team2 = 'GER') or (b.teamid = a.team2 and a.team1 = 'GER');

9. 查找出球队名称,和每个球队进球人数

select b.teamname, count(teamid)

from goal a

join eteam b on a.teamid = b.id

group by teamid

order by teamname;

10. 查找出所有比赛地点,每个比赛地点的进球数

select a.stadium, count(b.player) '进球数'

from game a

left join goal b on a.id = b.matchid

group by a.stadium;

11. 查找出有波兰球队'POL'参加的比赛编号,比赛日期,对应这场比赛的进球数

select a.id, a.mdate, count(b.player) '进球数'

from game a

left join goal b on a.id = b.matchid

where team1 = 'POL' or team2 = 'POL'

group by a.id;

12. 对于德国队'GER'得分的每场比赛,显示比赛编号,比赛日期和'GER'得分的进球数

select a.id, a.mdate, count(b.player) '进球数'

from game a

left join goal b on a.id = b.matchid

where b.teamid = 'GER'

group by a.id

having count(b.player) > 0 ;

13. 查找出所有比赛的日期,每场比赛中对战双方各自的进球数(也就是team1进球数,team2进球数)

select a.mdate,

a.team1,

sum(case when a.team1 = b.teamid then 1 else 0 end) '得分1',

a.team2,

sum(case when a.team2 = b.teamid then 1 else 0 end) '得分2'

from game a

left join goal b on a.id = b.matchid

group by a.mdate, a.team1, a.team2

order by a.mdate asc, a.team1, a.team2;

总结

整体来说,多表连接查询这部分,最重要的是:

一定要熟悉各个表之间的关系!

一定要熟悉各个表之间的关系!

一定要熟悉各个表之间的关系!

只要掌握join的逻辑,并且熟悉表之间的关系,就不会很难!

mysql五表查询_5、MySQL多表查询相关推荐

  1. mysql五-1:单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

  2. mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节 ...

  3. 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引...

    一.TCL事务控制语言 ###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. ...

  4. mysql语句中多表查询_6.MySql中的SQL语句(五):多表查询

    多表查询有如下几种: 合并结果集:UNION.UNION ALL 连接查询 内连接[INNER] JOINON 外连接OUTER JOIN ON 左外连接LEFT [OUTER] JOIN 右外连接R ...

  5. mysql 李玉婷网课配套笔记(五) 分页查询,库和表的管理

    -- 进阶8:分页查询 /*应用场景:当要显示得到数据一页显示不全,需要分页提交sql请求语法:select 查询列表from 表[join type join 表2][on 连接条件][where ...

  6. MySQL查询进阶之多表查询

    一.多表查询 1.引出 2.笛卡尔积 3. 笛卡尔积的解决方法 二.多表查询分类 1.等值连接和非等值连接 2.自连接和非自连接 3.内连接和外连接 SQL92:使用(+)创建连接 SQL99语法实现 ...

  7. MySQL基础篇(02):从五个维度出发,审视表结构设计

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据场景 1.表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的 ...

  8. 小汤学编程之MySQL(二)——数据库操作、表结构操作、表数据操作、查询数据和数据类型

    一.数据库操作 1.创建数据库     2.查询数据库     3.修改数据库     4.使用数据库 二.表结构操作 1.创建表     2.查询表     3.修改表     4.删除表 三.表数 ...

  9. mysql查询添加数据库表_MySQL数据库篇之表的增删改查

    主要内容: 一.表介绍 二.创建表 三.查看表结构 四.修改表结构 五.复制表 六.删除表 1️⃣ 表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称 ...

  10. 2019-7-27 [MySQL] DQL 简单查询[别名/去重/运算] 条件查询 排序查询 聚合查询 分组查询 导出与导入 多表操作[一对多/多对多][创外键 创联合主键 约束 添加 删除 测试]

    文章目录 5 SQL语句(DQL) 5.1DQL准备工作和语法 5.1.1准备工作 5.1.2 DQL语法: 5.2 简单查询 5.2.1 查询所有的商品 5.2.2 查询商品名和商品价格. 5.2. ...

最新文章

  1. Application Installation Failed
  2. hive replace替换多个_详解Mysql数据库中replace与replace into的用法及区别
  3. 3.3V稳压IC芯片 1117-3.3V性能测试
  4. 异步多线程(五)多线程异常处理
  5. delphi string.split 按照任意字符串分割语句
  6. 【技术综述】深度学习新手如何开始合适的“调参”任务
  7. mysql5.7 忘记root密码后,如何找回密码?
  8. POJ1204 Word Puzzles
  9. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]
  10. Android学习之调用系统相机实现拍照功能
  11. vscode php函数提醒,解决vscode格式保存后出现的问题
  12. [转载] Python中 hash去重
  13. 大数据时代背景下智能工厂的能源管理系统
  14. 论文常用实验数据收集整理
  15. 正菱台体积在线计算机,棱台体积公式
  16. android win7 共享网络打印机,详解win7共享打印机如何设置
  17. 利用Get-FileHash工具进行哈希验证
  18. MYSQL常见命令-Java学习之数据库学习
  19. rabbitMQ的使用概述及使用rabbitMQ进行短信验证码发送案例
  20. 动态规划法(JavaScript)

热门文章

  1. javascript高级程序设计第3版——第6章 面向对象的程序设计
  2. python之operator操作符函数
  3. 【NOIP2015】【Luogu2661】信息传递(有向图最小环)
  4. 从FCN到DeepLab
  5. CSS知识总结之设计模式(持续学习中)
  6. java个人学习笔记:javaBean
  7. SharePoint:扩展DVWP - 第3部分:把DVWP的功能链接放在同一行中
  8. GPS系统误差的主要来源
  9. 大数据环境下数据科学的知识体系
  10. 强大的德国教育如何锻造孩子的健全人格