mysql五表查询_5、MySQL多表查询
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多表查询相关推荐
- mysql五-1:单表查询
一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...
- mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节 ...
- 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引...
一.TCL事务控制语言 ###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. ...
- mysql语句中多表查询_6.MySql中的SQL语句(五):多表查询
多表查询有如下几种: 合并结果集:UNION.UNION ALL 连接查询 内连接[INNER] JOINON 外连接OUTER JOIN ON 左外连接LEFT [OUTER] JOIN 右外连接R ...
- mysql 李玉婷网课配套笔记(五) 分页查询,库和表的管理
-- 进阶8:分页查询 /*应用场景:当要显示得到数据一页显示不全,需要分页提交sql请求语法:select 查询列表from 表[join type join 表2][on 连接条件][where ...
- MySQL查询进阶之多表查询
一.多表查询 1.引出 2.笛卡尔积 3. 笛卡尔积的解决方法 二.多表查询分类 1.等值连接和非等值连接 2.自连接和非自连接 3.内连接和外连接 SQL92:使用(+)创建连接 SQL99语法实现 ...
- MySQL基础篇(02):从五个维度出发,审视表结构设计
本文源码:GitHub·点这里 || GitEE·点这里 一.数据场景 1.表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的 ...
- 小汤学编程之MySQL(二)——数据库操作、表结构操作、表数据操作、查询数据和数据类型
一.数据库操作 1.创建数据库 2.查询数据库 3.修改数据库 4.使用数据库 二.表结构操作 1.创建表 2.查询表 3.修改表 4.删除表 三.表数 ...
- mysql查询添加数据库表_MySQL数据库篇之表的增删改查
主要内容: 一.表介绍 二.创建表 三.查看表结构 四.修改表结构 五.复制表 六.删除表 1️⃣ 表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称 ...
- 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. ...
最新文章
- Application Installation Failed
- hive replace替换多个_详解Mysql数据库中replace与replace into的用法及区别
- 3.3V稳压IC芯片 1117-3.3V性能测试
- 异步多线程(五)多线程异常处理
- delphi string.split 按照任意字符串分割语句
- 【技术综述】深度学习新手如何开始合适的“调参”任务
- mysql5.7 忘记root密码后,如何找回密码?
- POJ1204 Word Puzzles
- [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]
- Android学习之调用系统相机实现拍照功能
- vscode php函数提醒,解决vscode格式保存后出现的问题
- [转载] Python中 hash去重
- 大数据时代背景下智能工厂的能源管理系统
- 论文常用实验数据收集整理
- 正菱台体积在线计算机,棱台体积公式
- android win7 共享网络打印机,详解win7共享打印机如何设置
- 利用Get-FileHash工具进行哈希验证
- MYSQL常见命令-Java学习之数据库学习
- rabbitMQ的使用概述及使用rabbitMQ进行短信验证码发送案例
- 动态规划法(JavaScript)