广告位联系
返回顶部
分享到

MySQL之union联合查询的实现介绍

Mysql 来源:互联网 作者:佚名 发布时间:2024-04-21 09:06:10 人浏览
摘要

UNION 的含义是联合,并集,结合,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了并集 查询的短板。 联合查询: 关键字union,作用就是将多

UNION 的含义是“联合,并集,结合”,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了“并集” 查询的短板。

联合查询:

关键字union,作用就是将多条查询语句的结果合并成一个结果集。

案例:(查询部门编号大于100或名字中含有a字符的员工信息)

1

select * from employees where department_id>100 or last_name like '%a%';

用联合查询演示:

1

2

3

select * from employees where department_id>100

union

select * from employees where last_name like '%a%';

union是应用场景:

比如在我们有个数据库中的老师表和学生表,两者之间没有直接的关联关系,但是又有一些共通性,但是现在我们想要查询学校所有男老师和男学生的信息(学生和老师的编号,姓名,出现日期,性别),这个时候就是应用union的时候。

1

2

3

4

5

6

7

SELECT `tno` 编号,`tname`,`tsex`,`tbirthday`

FROM `teachers`

WHERE `tsex`='男'

UNION

SELECT `sno`,`sname`,`ssex`,`sbirthday`

FROM `students`

WHERE `ssex`='男';

联合查询的特点:

  • 联合查询的两个子查询的查询字段个数要一致
  • 要求联合查询的子查询的查询列表顺序要在内容上保持一致
  • 使用union联合默认会自动去重,如果不想去重可以将union改为union all

联合查询的规则

联合查询是有一定使用规则的,如果不加注意,MySQL就有可能执行报错,或意义混乱

1、多条查询语句的查询列数必须保持一致,否则报错。

2、多条查询语句的列值类型和顺序最好保持一致。

3、UNION 关键字默认不查询重复记录,但只要有一个字段不一样就认为是两条记录。

规则一:查询列数必须保持一致

其实很好理解,如果要将两个结果集合并,那么就需要将列数统一,MySQL对此作了严格的限制,不会以 NULL 值显示没有查询该列的查询记录,这是为了保证数据的准确性,原因是 NULL 也是一种值。

1

2

3

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级, manager_id FROM emp

UNION

SELECT stu_id 编号, stu_name 姓名, class_id 所属部门或班级 FROM student

规则二:列值类型和顺序最好保持一致

“最好” 的意思是 “我们可以不这样做,但皮一下并没有什么意义”。

比如,我们将stu_name 与 class_id 调换顺序:

1

2

3

4

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp

UNION

SELECT stu_id 编号, class_id 姓名, stu_name 所属部门或班级 FROM student

LIMIT 15

 MySQL虽然不会报错,但结果已经不具有什么使用意义了。另外,列的别名其实并不需要完全统一,多条查询语句中如果出现不统一的列名,MySQL会默认使用第一条查询语句的列名。如:

1

2

3

4

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp

UNION

SELECT stu_id, stu_name, class_id FROM student

LIMIT 15

但为了保证可读性,建议为每条查询语句指定相同的列名,保持统一格式。

规则三:UNION 默认去重

UNION 关键字不会查询重复的记录,但重复的记录并不是简简单单的“看上去重复”或“主键重复”,记录中只要有一个字段不一致,UNION 就会老老实实的将他们都查询出来。

UNION 与 UNION ALL

UNION 关键字是去重的联合查询,如果非要将所有记录都查询出来,不忽略重复的记录,那么可以使用 UNION ALL ,对比来看一下:

1

2

3

SELECT * FROM emp

UNION

SELECT * FROM emp

UNION 的结果: 

1

2

3

SELECT * FROM emp

UNION ALL

SELECT * FROM emp

UNION  ALL 的结果:


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • MySQL导出ER图为图片或PDF的操作方法

    MySQL导出ER图为图片或PDF的操作方法
    1、Navicat 生成ER图 1、选择数据库,逆向数据库到模型 2、查看ER图 3、导出ER图 当我们选pdf格式的时候,发现导出的pdf不是一整张,而是分成
  • MySQL之union联合查询的实现介绍

    MySQL之union联合查询的实现介绍
    UNION 的含义是联合,并集,结合,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了并集
  • mysql8.0.29卸载问题小结介绍

    mysql8.0.29卸载问题小结介绍
    提要(废话): 最近我将笔记本重装了,为了保留之前的程序,我把相关的注册表和环境备份了下来,重装之后重新导入成功再现了部分软
  • Navicat连接远程服务器里docker中mysql的方法(已解决

    Navicat连接远程服务器里docker中mysql的方法(已解决
    1. 开启端口映射 在docker中,我们需要将允许外界访问的端口通过配置文件映射出来,本文不需要将3306端口映射,但是该部分还是有实际用途
  • Mysql CASE IF 判空的具体使用介绍
    MySQL 中的条件表达式用于根据条件的结果选择不同的值或执行不同的操作。条件表达式可以在 SELECT 语句中生成计算字段、在 WHERE 语句中过
  • MySQL中匹配年月的教程方法
    一般数据库中给到的时间都是年-月-日形式的,那怎么匹配年-月/的形式? 如2021年8月怎么写(怎么在数据库中查询到关于2021年8月的数据)
  • mysql5.7.42到mysql8.2.0的升级(rpm方式)

    mysql5.7.42到mysql8.2.0的升级(rpm方式)
    注:本文在测试环境升级测试,建议先在测试环境验证。mysql-5.7.42为rpm安装,所以用rpm方式升级 1、升级准备 1、数据备份:在升级之前,务
  • mysql-5.7.42升级到mysql-8.2.0(二进制方式)

    mysql-5.7.42升级到mysql-8.2.0(二进制方式)
    8注:本文在测试环境升级测试,建议先在测试环境验证。在生产环境下还是先评估下,mysql-5.7.42为二进制方式安装,所以用mysql-8.2.0二进制
  • 利用Mysql定时+存储过程创建临时表统计数据的过

    利用Mysql定时+存储过程创建临时表统计数据的过
    1.mysql定时任务简单介绍 mysql的定时任务是使用event(事件)来实现的,自mysql5.1.6版本起,增加了这个功能 - 事件调度器(event scheduler),它
  • MySQL如何查询Binlog生成时间

    MySQL如何查询Binlog生成时间
    本篇文章介绍如何查询 Binlog 的生成时间。云上 RDS 有日志管理,但是自建实例没有,该脚本可用于自建实例闪回定位 Binlog 文件。 脚本介绍
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计