MySql集合查询
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。
集合操作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT。
注意,参加集合操作的各查询结果的列数必须相同;对应的数据类型也必须相同。
本示例中的数据表有student,sc,course三个,数据表的具体内容请看:Mysql数据库中的EXISTS和NOT
EXISTS
UNION示例:
例子1.1
题目:查询计算机科学系的学生及年龄不大于19岁的学生。
SQL语句:
SELECT * FROM Student WHERE Sdept='CS' UNION
SELECT * FROM Student WHERE Sage<=19
查询结果:
本查询实际上是求计算机系的所有学生与年龄不大于19岁的学生的并集。
与它等效的SQL语句是:
SELECT * FROM Student WHERE Sdept='CS' OR Sage<=19
注意:虽然这个两个SQL语句是等效的,但是本质上是不一样的,第一个SQL语句是分别进行两次SELECT然后将结果取并集;第二个SQL语句是直接进行了一次SELECT语句查询。
INTERSECT示例:
MySql语句并不至此INTERSECT,所以只能使用其替代语句
例子2.1
题目:查询计算机科学系中年龄不大于19岁的学生。
对应的SQL语句应该是:
SELECT * FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT * FROM Student
WHERE Sage<=19;
替代的SQL语句:
SELECT *
FROM student
WHERE Sdept = 'CS'
AND Sage <=19
查询结果:
例子2.2
题目:查询即选修了课程1又选修了课程2的学生。(就是查询选修课程1的学生集合与选修课程2的学生集合的交集)
对应的SQL语句应该是:
SELECT Sno FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno FROM SC
WHERE Cno='2';
替代的SQL语句为:
(使用IN)
SELECT Sno
FROM SC
WHERE Cno = '1'
AND Sno
IN (
SELECT Sno
FROM SC
WHERE Cno = '2'
)
或者为:
(使用EXISTS)
SELECT Sno
FROM SC SCX
WHERE Cno = '1'
AND EXISTS (
SELECT Sno
FROM SC SCY
WHERE Cno = '2'
AND SCX.Sno = SCY.Sno
)
查询结果为:
或者为:
(使用JOIN ON)
SELECT *
FROM SC SCX
JOIN SC SCY ON ( SCX.Cno = '1'
AND SCY.Cno = '2'
AND SCX.Sno = SCY.Sno )
EXCEPT操作:
很不幸,MySql也不支持EXCEPT操作,只能使用替代的语句。
例子3.1
查询计算机科学系的学生与年龄不大于19岁的学生的差集。
对应的SQL语句为:
SELECT * FROM Student WHERE Sdept='CS'
EXCEPT
SELECT * FROM Student WHERE Sage<=19;
也就是查询计算机科学系中年龄大于19岁的学生。
替换语句为:
(直接使用WHERE,不得不说这么做很简单,但是意思上不是很好理解)
SELECT *
FROM Student
WHERE Sdept = 'CS'
AND Sage >19
查询结果为:
或者替换语句为:
(使用NOT IN)
SELECT *
FROM Student
WHERE Sdept = 'CS'
AND Sno NOT
IN (
SELECT Sno
FROM Student
WHERE Sage <=19
)
查询结果为:
或者使用替换语句为:
(使用NOT EXISTS)
SELECT *
FROM Student SX
WHERE Sdept = 'CS'
AND NOT
EXISTS (
SELECT *
FROM Student SY
WHERE SY.Sage <=19
AND SX.Sno = SY.Sno
)
查询结果为:
对集合操作结果的排序
ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序。
任何情况下,ORDER BY子句只能出现在最后;对集合操作结果排序时,ORDER BY子句中用数字指定排序属性。
下面是一种错误的写法:
SELECT * FROM Student
WHERE Sdept='CS'
ORDER BY Sno
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY Sno;
正确的应该是:
SELECT * FROM Student
WHERE Sdept='CS'
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY 2;
输出结果:
如果写成:
SELECT * FROM Student
WHERE Sdept='CS'
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY 1;
输出结果为:
MySql集合查询的更多相关文章
- MySQL<表单&集合查询>
表单查询 简单查询 SELECT语句 查询所有字段 指定所有字段:select 字段名1,字段名2,...from 表名; select * from 表名; 查询指定字段 select 字段名1,字 ...
- MySQL模糊查询:LIKE模式和REGEXP模式
MySQL模糊查询提供了两种模式:LIKE模式和REGEXP模式. LIKE模式 LIKE模式是使用的LIKE 或 NOT LIKE 比较运算符进行模糊查询. SELECT 字段 FROM 表 WHE ...
- Mysql数据库连接查询
Mysql数据库连接查询 连接是关系数据库模型的主要特点.连接查询是关系数据库中最主要的查询,主要包括内连接.外连接等.通过连接运算可以 ...
- Oracle和MySQL分组查询GROUP BY
Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...
- MySQL数据查询之单表查询
单表查询 简单查询 - 创建表 DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCREMEN ...
- mysql的查询
1.单表查询 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 ...
- mysql基础查询语法
一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count( ...
- Day3 MySql高级查询
DQL高级查询 多表查询(关联查询.连接查询) 1.笛卡尔积 emp表15条记录,dept表4条记录. 连接查询的笛卡尔积为60条记录. 2.内连接 不区分主从表,与连接顺序无关.两张表均满足条件则出 ...
- MySql学习—— 查询性能优化 深入理解MySql如何执行查询
本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...
随机推荐
- Data Structure Binary Tree: Inorder Tree Traversal without recursion and without stack!
http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/ #include &l ...
- VC2010编译时提示:转换到 COFF 期间失败: 文件无效或损坏
有时候新安装好VS2010后编译时就提示上述错误,罗列一下从网上查找到的几种解决方案: 方案1: 点击“项目”-->“属性”--> “清单工具”, 然后选择"输入和输出’--&g ...
- C# 半角?全角
/// <summary> /// 将资料表中已修改的资料行数据去左右空格.全角转半角 /// </summary> public sealed class FieldFitS ...
- 【leetcode刷题笔记】Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Linux 中 bashrc 中的 rc 是什么意思
刚刚配置 .bashrc 文件时,突然想,这里面的 rc 是什么意思? 使用了这么长时间,这个都不知道,这是醉了.Google 之,还真有不少人探究过,哈哈. 这个 ubuntu 中文论坛里,有人回答 ...
- EntityFramework 学习 一 Persistence in Entity Framework
实体框架的持久化 当用EntityFramework持久化一个对象时,有两种情形:连接的和断开的 1.连接场景:使用同一个context上下文从数据库中查询和持久化实体时,查询和持久化实体期间,con ...
- F1 score,micro F1score,macro F1score 的定义
F1 score,micro F1score,macro F1score 的定义 2018年09月28日 19:30:08 wanglei_1996 阅读数 976 本篇博客可能会继续更新 最近在 ...
- 十四 Django框架,中间件
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的se ...
- Twitter的流处理器系统Heron——升级的storm,可以利用mesos来进行资源调度
2011年,Twitter发布了开源的分布式流计算系统Storm.四年后,随着用户数量的急剧增加,Twitter每天要处理的事件已经增加到十亿以上.Storm系统应对如此庞大而复杂多样的流数据变得十分 ...
- Saiku_学习_02_Schema Workbench 开发mdx和模式文件
一.前言 saiku的查询都是通过cube来进行的.因此每当我们要进行一次多维度查询时,都要先修改xml.上传.重启才能生效,不仅效率低,还不利于学习和理解MDX和模式文件. 通过 workbench ...