<p>本篇带大家了解一下MySQL中的联结查询和集合操作,希望对大家有所帮助!</p>
<p><img src="https://img.php.cn/upload/article/000/000/024/6145d21cb7577613.jpg" alt="MySQL学习之浅析联结查询和集合操作" ></p>
<h2><strong>联结查询</strong></h2>
<p>联结查询就是指两张或者以上的表之间进行匹配查询,一般称之为水平操作,就是最终结果会包含这几个表中所有的列,MySQL中有三种联结操作,交叉联结、内联结、外联结。【相关推荐:<a href="//m.sbmmt.com/course/list/51.html" target="_blank" textvalue="mysql视频教程">mysql视频教程</a>】</p>
<p>交叉联结叫做<code>CROSS JOIN</code>,他对两个表执行笛卡儿积,他将返回两个表中所有列的组成,比如左表中有n条数据,右表中有m条数据,那么最终结果就是<code>n*m</code>条,但是也可以自己与自己联结,那么最终结果就是<code>n*n</code>条,比如下面语句。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">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)</pre><div class="contentsignin">登录后复制</div></div><p>由于orders表中有7条数据,那么最后将生成49条数据,还有一种写法是下面这样的。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">mysql> select * from orders as a ,orders as b;</pre><div class="contentsignin">登录后复制</div></div><p>他们的结果都相同,只是写法不同,上面的写法是在1989年,美国国家标准学会对SQL进行的规范,称之为ANSI SQL 89标准,而第一种写法是92年规定的。</p><p>交叉联结有个用处就是快速生成重复数据,比如下面语句。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">insert orders select a.orderId,a.userId from orders as a ,orders as b limit 10;</pre><div class="contentsignin">登录后复制</div></div><p>下面就是内联结,分为两部,首先产生笛卡儿积,然后在根据后面ON的过滤条件来过滤,他产生两个表中具有相同记录的值。</p><p><img src="https://img.php.cn/upload/image/218/908/717/1631965602120211.png" title="1631965602120211.png" alt="1 (2).png"/></p><p>在ON后面除了等于运算符 (=) 之外,还可以使用其他运算符,例如大于 ( <code>></code>)、小于 ( <code><</code>) 和不等于 ( <code><></code>) 运算符来构成连接条件。</p><p>最后一个是OUTER JOIN,可以按照一些过滤条件来匹配表之间的数据,与INNER JOIN不同的是,在通过OUTER JOIN添加的保留表中存在未找到的匹配数据,MySQL支持LEFT OUTER JOIN、RIGHT OUTER JOIN,写的时候可以省略OUTER 。</p><p>下面是LEFT JOIN所示图,LEFT JOIN返回左表 (table1) 中的所有记录,以及右表 (table2) 中的匹配记录。</p><p><img src="https://img.php.cn/upload/image/297/131/340/1631965607545060.png" title="1631965607545060.png" alt="2.png"/></p><p>下面是RIGHT JOIN所示图,RIGHT JOIN返回右表 (table2) 中的所有记录,以及左表 (table1) 中的匹配记录。</p><p><img src="https://img.php.cn/upload/image/383/403/226/1631965611260763.png" title="1631965611260763.png" alt="3.png"/></p><h2><strong>集合操作</strong></h2><p>MySQL中有个UNION运算符,用于组合2个或多个SELECT结果集,并删除SELECT语句之间的重复行,使用他时候要遵循以下基本规则:</p><ul><li>所有<code>SELECT</code>语句中出现的列数和顺序 必须相同。</li><li>列也必须具有相同的数据类型。</li></ul><p>如现在有以下表</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">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);</pre><div class="contentsignin">登录后复制</div></div><p>执行以下SQL</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">SELECT id FROM t1
UNION
SELECT id FROM t2;</pre><div class="contentsignin">登录后复制</div></div><p>最终结果是这样的。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)</pre><div class="contentsignin">登录后复制</div></div><p>UNION语句默认会从结果行集中删除重复的数据,但是,可以使用UNION ALL获取重复记录。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">SELECT id FROM t1
UNION ALL
SELECT id FROM t2;</pre><div class="contentsignin">登录后复制</div></div><p>结果如下</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 2 |
| 3 |
| 4 |
+----+
6 rows in set (0.00 sec)</pre><div class="contentsignin">登录后复制</div></div><p>UNION 和 JOIN 之间的基本区别在于 UNION 水平组合结果集,而 JOIN 语句垂直组合结果集。</p>
<p><img src="https://img.php.cn/upload/image/410/849/290/1631965648883159.png" title="1631965648883159.png" alt="4.png"></p>
<blockquote>
<p>原文地址:https://juejin.cn/post/7001772087534682143</p>
<p>作者:i听风逝夜</p>
</blockquote>
<p>更多编程相关知识,请访问:<a href="//m.sbmmt.com/course.html" target="_blank" textvalue="编程视频">编程视频</a>!!</p>
以上是MySQL学习之浅析联结查询和集合操作的详细内容。更多信息请关注PHP中文网其他相关文章!