mysql 多表查询、子查询、自关联查询

一、多表查询

包含连接查询合并方案、联合查询合并方案

1、连接查询合并方案(水平连接) JOIN…on…

内连接
SELECT * FROM dispatch_list JOIN man 
ON man.responsibility_man=dispatch_list.responsibility_man;
外连接

包含左外连接、右外连接;
没有值的栏位用null显示 (例子:没有派工单的工号也显示出来)
连接查询合并方案,使用外连接(确保“需要帮助表”的所有数据行都要进入到合法临时表)过滤合法数据;

左外连接: FROM 需要帮助表  LEFT JOIN 不需要帮助表  ON 条件
SELECT * FROM man LEFT JOIN dispatch_list 
ON man.responsibility_man=dispatch_list.responsibility_man;
右外连接: FROM 不需要帮助表  RIGHT JOIN 需要帮助表  ON 条件
SELECT * FROM dispatch_list RIGHT JOIN man 
ON man.responsibility_man=dispatch_list.responsibility_man;

2、联合查询合并方案(垂直合并)

两张临时表结构必须一致,生成临时表字段只能来自第一个临时表;
UNION ALL不会去重,UNION会去重;联合查询合并方案只用于行转列查询;

SELECT responsibility_man, responsibility_name FROM dispatch_list 
UNION 
SELECT responsibility_man, man_name FROM man;

二、子查询

子查询:包含独立子查询、依赖子查询(一般不使用)

1、独立子查询

独立子查询规则:(不需要帮助就可以执行)
1、独立子查询返回的结果相当于一个常量
2、独立子查询在被帮助命令前执行一次
3、在被帮助命令执行期间,独立子查询不会执行;

SELECT doc_no, responsibility_man, use_work_hour, (SELECT AVG(use_work_hour) FROM dispatch_list) AS avg_hour 
FROM dispatch_list 
WHERE use_work_hour>(SELECT AVG(use_work_hour) FROM dispatch_list);

2、依赖子查询

依赖子查询:必须得到被帮助命令提供服务才能正常执行;
依赖子查询规则:
1、依赖子查询根据接收参数不同,返回结果不同;
2、依赖子查询在被帮助的命令执行时被调用,会无限增加加载表文件的次数,严重影响效率;
3、在实际开发过程中禁止使用依赖子查询;可以使用连接查询、自关联查询替代

例子:获取所用工时大于该人员平均工时的派工单;
SELECT t2.doc_no,t2.responsibility_man,t2.use_work_hour, (SELECT AVG(t1.use_work_hour) AS avg_hour FROM dispatch_list t1 WHERE t1.responsibility_man=t2.responsibility_man) AS avg_hour  
FROM dispatch_list t2 
WHERE t2.use_work_hour>(SELECT AVG(t1.use_work_hour) FROM dispatch_list t1 WHERE t1.responsibility_man=t2.responsibility_man) 
ORDER BY t2.responsibility_man, avg_hour, use_work_hour DESC, doc_no;

用连接代替依赖子查询,效率更快;如:

SELECT t1.doc_no, t1.responsibility_man, t1.use_work_hour, t2.avg_hour 
FROM dispatch_list t1 
JOIN (SELECT responsibility_man, AVG(use_work_hour) AS avg_hour 
	  FROM dispatch_list 
	  GROUP BY responsibility_man ) t2 
ON t1.responsibility_man=t2.responsibility_man 
WHERE t1.use_work_hour>t2.avg_hour;

三、自关联查询

自关联查询:
1、是连接查询的一种特殊表现形式;
2、将同一张表分别加载到内存中两次,再进行合并;
3、从一张临时表读取数据,另一张临时表提供参考数据;
4、不是每张表都适合使用自关联查询;有隶属关系才适合;

SELECT t1.responsibility_man, t1.review_man, t2.responsibility_man, t2.doc_no, t2.assign_content 
FROM dispatch_list t1 JOIN dispatch_list t2 
	ON t1.review_man=t2.responsibility_man 
GROUP BY t2.doc_no, t2.responsibility_man 
ORDER BY t2.responsibility_man;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值