史上最简单的 MySQL 教程(三十)「联合查询」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

联合查询

联合查询union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接。

基本语法

联合查询由多条select语句构成,每条select语句获取的字段数相同,但与字段类型无关。

  • 基本语法select 语句1 + union + [union选项] + select 语句2 + ...;
  • union 选项:与select选项一样有两种
    • all:无论重复与否,保留所有记录;
    • distinct:表示去重,为默认选项。

执行如下 SQL 语句,进行测试:

-- 联合查询,默认去重
select * from class
union distinct
select * from class;

-- 联合查询,保留所有记录
select * from class
union all
select * from class;
union1

如上图所示,展示了联合查询的两种形式。特别地,联合查询只要求字段数相同,而跟类型无关。执行如下 SQL 语句,进行测试:

-- 联合查询,字段数相同,类型不同
select id, grade, room from class
union distinct
select name, age, id from student;
UNION2

如上图所示,联合查询只保留了第一张表的字段,而不保留第二张表的字段。

意义

联合查询的意义有两种,分别为:

  • 查询同一张表,例如查询学生信息,要求男生按年龄升序排序,女生按年龄降序排序;
  • 多表查询,多张表的结构是完全一样的,保持的数据结构也是一样的。

此外,如果数据量非常的大,就要进行分表(垂直分表和水平分表),而分表的依据无外乎数据多不多和常不常用。

排序

首先,让我们看看student表中的数据:

student

接下来,给出一个需求:student表中,让男生按年龄升序排序,让女生按年龄降序排序。根据我们刚刚学到的联合查询,貌似很容易啊!执行如下 SQL 语句,进行测试:

-- 在 student 表中,按年龄,男升女降
select * from student where gender = "boy" order by age asc
union
select * from student where gender = "girl" order by age desc;
order1

如上图所示,呃,好吧,貌似出错啦!这是因为要想在联合查询中使用order by,我们必须将select语句用括号括起来。执行如下 SQL 语句,进行测试:

-- 在 student 表中,按年龄,男升女降
(select * from student where gender = "boy" order by age asc)
union
(select * from student where gender = "girl" order by age desc);
order2

如上图所示,啊,我们都已经将select语句用括号括起来了,但是男生和女生也没有按我们的目的实现啊!好吧,这是因为要想在联合查询中使order by生效,我们必须将其与limit搭配使用,而limit的限定数,我们设置为一个非常大的数即可。执行如下 SQL 语句,进行测试:

-- 在 student 表中,按年龄,男升女降
(select * from student where gender = "boy" order by age asc limit 666)
union
(select * from student where gender = "girl" order by age desc limit 666);
order

如上图所示,显然,这次咱们的目的实现啦!


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数说戏聊

07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据

上述例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化...

812
来自专栏机器学习算法与Python学习

SQL Server常用命令(平时不用别忘了)

SQL Server 2008 在Microsoft的数据平台上发布,可以组织管理任何数据。可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。可以对...

2777
来自专栏数据之美

一例 Hive join 优化实战

由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用。关于 hive ...

2538
来自专栏光变

MySQL编程规范

641
来自专栏维C果糖

史上最简单的 MySQL 教程(十四)「列属性 之 主键」

主键:primary key,表中主要的键,每张表只能有一个字段(复合主键,可以多个字段)使用此属性,用来唯一的约束该字段里面的数据,不能重复。

39911
来自专栏蓝天

MySQL中MyISAM引擎与InnoDB引擎性能简单测试

[硬件配置] CPU : AMD2500+ (1.8G) 内存: 1G/现代 硬盘: 80G/IDE [软件配置] OS : Windows XP SP2 S...

602
来自专栏ml

mysql知识初篇(一)

mysql介绍 (1) mysql数据库是瑞典AB开发。 (2) mysql--> sun --> oracle。 (3) mysql数据库的...

3277
来自专栏13blog.site

Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的...

2958
来自专栏架构师之路

赶集mysql军规

总是在灾难发生后,才想起容灾的重要性。 总是在吃过亏后,才记得曾经有人提醒过。 一,核心军规 不在数据库做计算,cpu计算务必移至业务层 控制单表数据量,单表...

41210
来自专栏编程

JAVA面试常考系列八

题目一 JDBC是什么? JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为...

32811

扫码关注云+社区