MySQL修炼之联结与集合浅析


Posted in MySQL onOctober 05, 2021

联结查询

联结查询就是指两张或者以上的表之间进行匹配查询,一般称之为水平操作,就是最终结果会包含这几个表中所有的列,MySQL中有三种联结操作,交叉联结、内联结、外联结。

交叉联结叫做CROSS JOIN,他对两个表执行笛卡儿积,他将返回两个表中所有列的组成,比如左表中有n条数据,右表中有m条数据,那么最终结果就是n*m条,但是也可以自己与自己联结,那么最终结果就是n*n条,比如下面语句。

select * from orders as a  cross join orders as b;
+---------+--------+---------+--------+
| orderId | userId | orderId | userId |
+---------+--------+---------+--------+
|   10007 |      2 |   10001 |      1 |
|   10006 |      4 |   10001 |      1 |
.....
|   10002 |      1 |   10007 |      2 |
|   10001 |      1 |   10007 |      2 |
+---------+--------+---------+--------+

49 rows in set (0.01 sec)

由于orders表中有7条数据,那么最后将生成49条数据,还有一种写法是下面这样的。

mysql> select * from orders as a  ,orders as b;

他们的结果都相同,只是写法不同,上面的写法是在1989年,美国国家标准学会对SQL进行的规范,称之为ANSI SQL 89标准,而第一种写法是92年规定的。

交叉联结有个用处就是快速生成重复数据,比如下面语句。

insert orders select a.orderId,a.userId from orders as a ,orders as b limit 10;

下面就是内联结,分为两部,首先产生笛卡儿积,然后在根据后面ON的过滤条件来过滤,他产生两个表中具有相同记录的值。

MySQL修炼之联结与集合浅析

在ON后面除了等于运算符 (=) 之外,还可以使用其他运算符,例如大于 ( >)、小于 ( <) 和不等于 ( <>) 运算符来构成连接条件。

最后一个是OUTER JOIN,可以按照一些过滤条件来匹配表之间的数据,与INNER JOIN不同的是,在通过OUTER JOIN添加的保留表中存在未找到的匹配数据,MySQL支持LEFT OUTER JOIN、RIGHT OUTER JOIN,写的时候可以省略OUTER 。

下面是LEFT JOIN所示图,LEFT JOIN返回左表 (table1) 中的所有记录,以及右表 (table2) 中的匹配记录。

MySQL修炼之联结与集合浅析

下面是RIGHT  JOIN所示图,RIGHT JOIN返回右表 (table2) 中的所有记录,以及左表 (table1) 中的匹配记录。

MySQL修炼之联结与集合浅析

集合操作

MySQL中有个UNION运算符,用于组合2个或多个SELECT结果集,并删除SELECT语句之间的重复行,使用他时候要遵循以下基本规则:

  • 所有SELECT语句中出现的列数和顺序 必须相同。
  • 列也必须具有相同的数据类型。

如现在有以下表

CREATE TABLE t1 (
    id INT PRIMARY KEY
);

CREATE TABLE t2 (
    id INT PRIMARY KEY
);

INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2 VALUES (2),(3),(4);

执行以下SQL

SELECT id FROM t1
UNION
SELECT id FROM t2;

最终结果是这样的。

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

UNION语句默认会从结果行集中删除重复的数据,但是,可以使用UNION ALL获取重复记录。

SELECT id FROM t1
UNION ALL 
SELECT id FROM t2;

结果如下

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  2 |
|  3 |
|  4 |
+----+
6 rows in set (0.00 sec)

UNION 和 JOIN 之间的基本区别在于 UNION 水平组合结果集,而 JOIN 语句垂直组合结果集。

MySQL修炼之联结与集合浅析

总结

到此这篇关于MySQL联结与集合的文章就介绍到这了,更多相关MySQL联结与集合内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
MySQL 计算连续登录天数
May 11 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL分库分表详情
MySQL空间数据存储及函数
Sep 25 #MySQL
MySQL基础快速入门知识总结(附思维导图)
MySQL连接控制插件介绍
Sep 25 #MySQL
Mysql案例刨析事务隔离级别
Sep 25 #MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 #MySQL
MySQL修改默认引擎和字符集详情
Sep 25 #MySQL
You might like
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
基于PHP制作验证码
2016/10/12 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
前端性能优化及技巧
2016/05/06 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
wxPython色环电阻计算器
2019/11/18 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
Python 如何展开嵌套的序列
2020/08/01 Python
python文件排序的方法总结
2020/09/13 Python
承诺书的格式范文
2014/03/28 职场文书
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript