不谈数据库,我们还是好朋友,“宝宝做不到…”

union和union all的用法

union all是将连接的两个查询结果表连接起来;

union是将连接的两个查询结果表连接起来并做去重处理;

UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复

1、UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]

2、UNION ALL 的语法如下:
[SQL 语句 1]
UNION ALL
[SQL 语句 2]

效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。

2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。

exists效率优于in

SQL查询中in和exists的区别分析
select * from A where id in (select id from B);select * from A where exists (select 1 from B where A.id=B.id);

对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in。

1. 查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数

SELECT * FROM (
SELECT s1.SId sid1,s1.CId cid1,s1.score score1,s2.SId sid2,s2.CId cid2,s2.score score2
FROM sc s1 LEFT JOIN sc s2 ON s1.SId = s2.SId
WHERE s1.score > s2.score AND s1.CId = '01' AND s2.CId = '02'
)scc
LEFT JOIN student st ON scc.sid1 = st.SId;

步骤:
先查出查询" 01 “课程比” 02 "课程关联

SELECT s1.SId sid1,s1.CId cid1,s1.score score1,s2.SId sid2,s2.CId cid2,s2.score score2
FROM sc s1 LEFT JOIN sc s2 ON s1.SId = s2.SId
WHERE  s1.CId = '01' AND s2.CId = '02'

再比较成绩

SELECT s1.SId sid1,s1.CId cid1,s1.score score1,s2.SId sid2,s2.CId cid2,s2.score score2
FROM sc s1 LEFT JOIN sc s2 ON s1.SId = s2.SId
WHERE s1.score > s2.score AND s1.CId = '01' AND s2.CId = '02'

最后与学生表关联

SELECT * FROM (
SELECT s1.SId sid1,s1.CId cid1,s1.score score1,s2.SId sid2,s2.CId cid2,s2.score score2
FROM sc s1 LEFT JOIN sc s2 ON s1.SId = s2.SId
WHERE s1.score > s2.score AND s1.CId = '01' AND s2.CId = '02'
)scc
LEFT JOIN student st ON scc.sid1 = st.SId;

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

SELECT st.SId sid2,st.Sname,sc1.score1 FROM (
SELECT s1.SId sid1,AVG(score) score1 FROM sc s1 GROUP BY s1.SId HAVING AVG(score)>=60
)sc1
LEFT JOIN student st ON sc1.sid1 = st.SId;

步骤:
先查成绩表查出平均成绩大于等于60分的Sid和平均成绩,这里需要分组,因为是多组

SELECT s1.SId sid1,AVG(score) score1
FROM sc s1
GROUP BY s1.SId
HAVING AVG(score)>=60;

然后于学生表进行关联

SELECT st.SId sid2,st.Sname,sc1.score1 FROM (
SELECT s1.SId sid1,AVG(score) score1 FROM sc s1 GROUP BY s1.SId HAVING AVG(score)>=60
)sc1
LEFT JOIN student st ON sc1.sid1 = st.SId;

3.查询在 SC 表存在成绩的学生信息

SELECT DISTINCT st.SId,st.Sname,st.Sage,st.Ssex
FROM sc s1,student st
WHERE s1.SId = st.SId;

因为在SC成绩表中有同一同学的不同成绩,所以查出来要去重,用DISTINCT

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和

SELECT st.Sname,st.SId stsid,sc1.ccid,sc1.cscore FROM (
SELECT s1.SId sid1,COUNT(CId) ccid,COUNT(score) cscore FROM sc s1 GROUP BY s1.SId
)sc1 RIGHT JOIN student st ON sc1.sid1 = st.SId;

5.查询「李」姓老师的数量

SELECT COUNT(TId) FROM teacher WHERE tname LIKE '李%';

6. 查询学过「张三」老师授课的同学的信息

效率较高:

select distinct s.*
from test.student s
inner join test.sc sc on s.SId=sc.SId
inner join test.course c on sc.CId=c.CId
inner join test.teacher t on c.TId=t.TId
where t.Tname='张三'

效率较低:

mysql> select distinct st.* from
(select s.* from sc s,(SELECT c.CId FROM course c ,(SELECT TId FROM teacher  where Tname = "张三") twhere c.TId = t.TId) cidwhere s.CId = cid.CId
)r
join student st on st.SId = r.SId;

7.查询没有学全所有课程的同学的信息

SELECT * FROM test.student t
where t.SId not in
(select s.SId  from test.sc s group by s.SId having count(s.CId)>=(SELECT COUNT() FROM )
);

8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

SELECT distinct s.SId,t.* FROM sc s , student t
where CId in
(select CId from sc where sc.SId='01')
and s.SId = t.SId and s.SId !="01";

UNION和UNION ALL用法和效率比较、exists和in效率比较相关推荐

  1. Oracle中的Union、Union All、Intersect、Minus 使用用法区别

      Oracle中的Union.Union All.Intersect.Minus 众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包 ...

  2. Oracle中的Union、Union All、Intersect、Minus

    Oracle中的Union.Union All.Intersect.Minus  众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括 ...

  3. union 与 union all 及其他并集操作说明

    Union 与 Union ALL 的作用都是合并 SELECT 的查询结果集,那么它们有什么不同呢? Union 将查询到的结果集合并后进行重查,将其中相同的行去除.缺点:效率低: 而Union A ...

  4. mysql中union与union all的区别

    UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1.UNION 的语法如下:[SQL 语句 1]UNION[SQL 语句 2]2 ...

  5. UNION 和UNION ALL的区别

    Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样,而且字段类型要"相容"(一致): ...

  6. mysql all语法怎么用_MySQL UNION 与 UNION ALL 语法与用法

    MySQL UNION 语法 MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中.语法为:SELECT column,... FROM table1 UNION [A ...

  7. union 和 union all 有什么不同?

    假设我们有一个表 Student, 包括以下字段与数据: drop table student; create table student ( id int primary key, name nva ...

  8. sqlserver 查询中使用Union或Union All

    在 程序人生网站上 看到了 这篇文章 就收藏了 哈 http://www.ourcodelife.com/article-415-1.html 首先,在程序人生网站上,需要负责任的指出的是在SQL S ...

  9. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别...

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

最新文章

  1. Docker 安装JDK1.8
  2. 摄像头夜间拍摄画面有拖影_iQOO 3延续vivo人像拍摄基因 这些技术必须了解
  3. DOM-动态操作心得
  4. 抢疯了!字节、美团《人人都要学的架构思维》完整版PDF开放下载!
  5. python的枚举和for循环_python入门与进阶篇(三)之分支、循环、条件与枚举,python枚举...
  6. 利用MATLAB对乐曲进行钢琴演奏【matlab调音_1】
  7. 【图像配准】基于sift算法实现图像配准matlab源码
  8. E - Enigma Gym - 101889E dp求可除一个整数的最小数
  9. 亲测win10安装mac虚拟机+网络配置完整过程
  10. 非root用户安装命令
  11. spring应用手册-IOC(XML配置实现)-(8)-bean中的scop属性
  12. 中科大脑知识图谱平台建设及业务实践
  13. SQL Server profile使用技巧
  14. Python竞猜商品价格
  15. (图)HOLD住!aiwi最新体感游戏强势来袭!!
  16. firefox56 版插件 httprequester
  17. unity制作交互视频/互动视频
  18. 社交网站需管理 网络监控软件有备无患
  19. r7 2700X装Linux,R7-2700X配什么主板?AMD锐龙7 2700X主板推荐
  20. 营销策略策划的方法汇总(下)

热门文章

  1. nginx配置前端不缓存
  2. 可替换商业软件的开源免费软件集总
  3. 【机器学习sklearn】高斯朴素贝叶斯 Gaussian naive bayes
  4. 汽车毫米波雷达的规定和标准(四)
  5. 27m3氨基酸发酵反应釜设计
  6. 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再
  7. 工作一年之后的记录与总结
  8. [网络安全学习篇附]:利用5次shift漏洞破解win7密码(详)
  9. 处理中文乱码和中文部分乱码 .
  10. 读书笔记-许式伟的架构课-我的想到