转载地址:https://www.cnblogs.com/yiyide266/p/7594058.html

示例表A:

author_id author_name
1 Kimmy
2 Abel
3 Bill
4 Berton

示例表B:

book_id author_id start_date end_date
9 1 2017-09-25 21:16:04 2017-09-25 21:16:06
10 3    
11 2 2017-09-25 21:21:46 2017-09-25 21:21:47
12 1    
13 8    

示例表C:

order_id book_id price order_date
1 9 0.2 2017-09-24 21:21:46
2 9 0.6 2017-09-25 21:16:04
3 11 0.1 2017-09-25 21:21:46

在以上表中执行AB表关联

1

2

SELECT `authors`.*, `books`.book_id FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

结果

author_id author_name book_id
1 Kimmy 9
3 Bill 10
2 Abel 11
1 Kimmy 12
4 Berton  

结果出现了2条author_id为1的记录,因为右表中存在了两条关联author_id=1的行

右边出现N条关联左边的记录,结果就会相应出现N条关联了右表出现的记录

在以上表中执行ABC表关联

1

2

3

SELECT `authors`.*, `books`.book_id, `orders`.order_id, `orders`.price FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id

结果

author_id author_name book_id order_id order_price
1 Kimmy 9 1 0.2
1 Kimmy 9 2 0.6
2 Abel 11 3 0.1
3 Bill 10    
1 Kimmy 12    
4 Berton      

结果出现了3条author_id=1的记录,因为authors第一次关联了books表book_id为9和12的book关联了author_id为1的作者,而book_id为9的书本则关联了两个orders记录,所以结果集包含3条author_id为1的记录

可以运用

1

count(),sum()

等函数通过

1

group by

来统计结果

1

2

3

4

SELECT `authors`.*, sum(`orders`.price) FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id

GROUP BY `books`.book_id

结果集会基于book_id来统计每一本书的订单总额

author_id author_name book_id sum(order_price)
4 Berton    
1 Kimmy 9 0.80
3 Bill 10  
2 Abel 11 0.10
1 Kimmy 12  

book_id为9的订单总额为0.80,并且9的记录从多条合并为1条。

多条件join

1

2

3

4

SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date

GROUP BY `books`.book_id

选取在一定时间区间范围内的order订单,可以看到订单order_id为1的订单不再纳入book_id为9的统计当中,因为它的时间区间不符合join条件

author_id author_name book_id order_id sum(`order`.price)
4 Berton      
1 Kimmy 9 2 0.60
3 Bill 10    
2 Abel 11 3 0.10
1 Kimmy 12    

关于where的使用,看下面示范

1

2

3

4

5

SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) AS prices FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date

WHERE prices is not NULL

GROUP BY `books`.book_id

以上语句假设选取price不为空的记录,导致了一个错误的出现

1

[Err] 1054 - Unknown column 'prices' in 'where clause'

因为where不能用于选取列的AS别名判断,MYSQL的处理机制是先进行选取,再进行筛选,在选取阶段就启用了where条件,因为这时并不存在prices的筛选结果后才产生的字段,所以这里会抛出错误

我们可以这样做

1

2

3

4

5

SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) AS prices FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date

WHERE `orders`.price is not NULL

GROUP BY `books`.book_id

选取阶段order表是存在price字段的,所以只有price不为空的记录才会被选取

author_id author_name book_id order_id prices
2 Abel 11 3 0.10
1 Kimmy 9 2 0.60

运用

1

having

对那些无法进行 WHERE 的AS别名的字段进行一些筛选查询

1

2

3

4

5

SELECT `authors`.*, `books`.book_id, sum(`orders`.price)AS prices FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id

GROUP BY `books`.book_id

HAVING prices > 0.1

这时只有sum为0.8的结果被选中

author_id author_name book_id sum(order_price)
1 Kimmy 9 0.80

对于组合其他语法查询,也是没问题的

1

2

3

4

5

6

7

SELECT `authors`.*, `books`.book_id, sum(`orders`.price)AS prices FROM `authors`

LEFT JOIN `books` ON `authors`.author_id = `books`.author_id

LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id

GROUP BY `books`.book_id

HAVING prices >= 0.1

ORDER BY prices asc

LIMIT 1,1

【转】mysql多表关联查询相关推荐

  1. MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?

    这里写目录标题 MySQL多表关联查询对比多次单表查询,哪个效率高? 疑问: 高手解答: <阿里巴巴JAVA开发手册>里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写? ...

  2. Mysql多表关联查询

    ​​​​​三表(replay_case.replay_task及general_flow)联合查询,注意select时,如果某个字段在不同的表中有重复的话需要指定具体的表,比如应该使用:select ...

  3. 2022/1/22 北京 mysql 多表关联查询,等值连接、非等值连接,外连接,内连接、自连接

    一.笛卡尔积错误 要查询的俩个字段分别在俩张表 employee_id,department_name.所以要多表关联查询 select * from employees; -- 能查询出107条记录 ...

  4. MYSQL多表关联查询与子查询

    多表关联查询 关联查询又名连接查询,其主要包括了内连接,外连接,自连接,交叉连接等四个大类. 首先我们要清楚我们为什么要使用多表关联查询,肯定是因为我们想要显示的数据来自于两个或多个数据表内部,我们想 ...

  5. MySQL多表关联查询与存储过程

    --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...

  6. mysql 子表 关联查询语句_MySQL-基本查询语句及方法,连表和子查询

    一.基本查询语句 create table emp( id intnotnull unique auto_increment, name varchar(20) notnull, sex enum(' ...

  7. mysql多数据表关联查询慢问题解决方案

    问题一:遇到一个问题,mysql库下表A有几万条数据:表B也有几万条数据,结果两表关联的时候,查询超级慢,30s内没反应. 问题一解决方案: 1. 加索引,但索引不要乱加,两表关联,必须要创建的索引是 ...

  8. mysql 子表 关联查询语句_MySQL基本SQL语句之单表查询、多表查询和子查询

    一.简单查询: 基本语法:SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * FR ...

  9. mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...

  10. 面试官:为什么mysql不建议执行超过3表以上的多表关联查询?

    概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort ...

最新文章

  1. Android应用签名详解 Eclipse+ADT
  2. 多线程基础-基本概念(一)
  3. UVALive 6044(双连通分量的应用)
  4. [破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现
  5. 工作心得_在做算法工程师的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?
  6. 1028: [JSOI2007]麻将 - BZOJ
  7. 计算机网络毕业论文格式模板范文,计算机毕业论文格式模板范文(计算机毕业论文选题)...
  8. 时间序列的平稳性检验方法
  9. 什么是智能建筑,智能建筑系统主要有哪几部分组成?
  10. 氧化三甲胺及相关代谢物检测
  11. vs2019个性化配置
  12. 2022年第十二届APMCM亚太地区数学建模竞赛1月加赛E题翻译以及思路
  13. PDF怎么转图片?快把这些方法收好
  14. maf相关代码和命令
  15. 计算机二级教程书pdf MS,全国计算机等级考试二级教程MS Office高级应用教学大纲4.pdf...
  16. 2021最新微信域名链接检测工具 微信域名拦截检测接口
  17. 刚刚,中兴通讯董事长殷一民道歉!
  18. 做金融直播,这几个问题一定要知道
  19. php定义json类型数据,PHP中使用json数据格式定义字面量对象的方法_PHP
  20. BasicRF之中断接收basicRfRxFrmDoneIsr

热门文章

  1. ai决策_基于经验的决策与基于事实的决策:AI / ML如何改变工程师的工作方式
  2. Ubuntu设置截图的快捷键
  3. 配置好网络文件还是连不上外网
  4. matlab滤除100hz,关于滤波器滤波的问题,要求滤除3000Hz以上,但滤除后只剩下1000Hz以内的...
  5. python:whl包离线下载,pip离线安装whl文件
  6. struts mysql_Struts2连接MySQL数据库(Struts2 MySQL)
  7. 16/32/64位平台下char、short、int、long、指针等类型分别占多少字节,操作系统可以使用的最大内存空间为多大?
  8. awk的关联数组版本支持
  9. 安装libgl1-mesa-dri:i386重启后黑屏问题解决
  10. iOS的UILabel设置居上对齐,居中对齐,居下对齐