MySQL多表关联查询

MySQL多表关联查询SQL连接(JOIN)子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能

大家好,又见面了,我是你们的朋友全栈君。

SQL 连接(JOIN) 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。


不同的 SQL JOIN

在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:

 INNER JOIN:如果表中有至少一个匹配,则返回行

  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN:只要其中一个表中存在匹配,则返回行(MySQL不支持FULL JOIN)
实例表1:

mysql> select * from websites;
+----+---------------+---------------------------+-------+---------+
| id | name          | url                       | alexa | country |
+----+---------------+---------------------------+-------+---------+
|  1 | Google        | https://www.google.cm/    |     1 | USA     |
|  2 | 淘宝          | https://www.taobao.com/   |    13 | CN      |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |
|  4 | 微博          | http://weibo.com/         |    20 | CN      |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |
|  6 | stackoverflow | http://stackoverflow.com/ |     0 | IND     |
|  7 | 百度          | https://www.baidu.com/    |     4 | CN      |
+----+---------------+---------------------------+-------+---------+
7 rows in set

实例表2:

mysql> select * from access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set

取交集:

mysql> SELECT w.name, a.count, a.date FROM websites w, access_log a WHERE w.id = a.site_id;
+----------+-------+------------+
| name     | count | date       |
+----------+-------+------------+
| Google   |    45 | 2016-05-10 |
| 菜鸟教程 |   100 | 2016-05-13 |
| Google   |   230 | 2016-05-14 |
| 淘宝     |    10 | 2016-05-14 |
| Facebook |   205 | 2016-05-14 |
| 微博     |    13 | 2016-05-15 |
| 菜鸟教程 |   220 | 2016-05-15 |
| Facebook |   545 | 2016-05-16 |
| 菜鸟教程 |   201 | 2016-05-17 |
+----------+-------+------------+
9 rows in set
mysql> SELECT w.name, a.count, a.date FROM websites w INNER JOIN access_log a ON w.id = a.site_id;
+----------+-------+------------+
| name     | count | date       |
+----------+-------+------------+
| Google   |    45 | 2016-05-10 |
| 菜鸟教程 |   100 | 2016-05-13 |
| Google   |   230 | 2016-05-14 |
| 淘宝     |    10 | 2016-05-14 |
| Facebook |   205 | 2016-05-14 |
| 微博     |    13 | 2016-05-15 |
| 菜鸟教程 |   220 | 2016-05-15 |
| Facebook |   545 | 2016-05-16 |
| 菜鸟教程 |   201 | 2016-05-17 |
+----------+-------+------------+
9 rows in set

MySQL多表关联查询

注释:
INNER JOIN 与 JOIN 是相同的。


取左并集:
MySQL多表关联查询
注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL

mysql> SELECT w.name, a.count, a.date FROM websites w LEFT JOIN access_log a ON w.id = a.site_id;
+---------------+-------+------------+
| name          | count | date       |
+---------------+-------+------------+
| Google        |    45 | 2016-05-10 |
| 菜鸟教程      |   100 | 2016-05-13 |
| Google        |   230 | 2016-05-14 |
| 淘宝          |    10 | 2016-05-14 |
| Facebook      |   205 | 2016-05-14 |
| 微博          |    13 | 2016-05-15 |
| 菜鸟教程      |   220 | 2016-05-15 |
| Facebook      |   545 | 2016-05-16 |
| 菜鸟教程      |   201 | 2016-05-17 |
| stackoverflow | NULL  | NULL       |
| 百度          | NULL  | NULL       |
+---------------+-------+------------+
11 rows in set


取右并集:



MySQL多表关联查询

注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

mysql> SELECT Websites.name, access_log.count, access_log.date
FROM access_log
RIGHT JOIN Websites
ON access_log.site_id=Websites.id;
+---------------+-------+------------+
| name          | count | date       |
+---------------+-------+------------+
| Google        |    45 | 2016-05-10 |
| 菜鸟教程      |   100 | 2016-05-13 |
| Google        |   230 | 2016-05-14 |
| 淘宝          |    10 | 2016-05-14 |
| Facebook      |   205 | 2016-05-14 |
| 微博          |    13 | 2016-05-15 |
| 菜鸟教程      |   220 | 2016-05-15 |
| Facebook      |   545 | 2016-05-16 |
| 菜鸟教程      |   201 | 2016-05-17 |
| stackoverflow | NULL  | NULL       |
| 百度          | NULL  | NULL       |
+---------------+-------+------------+
11 rows in set


取全集:


MySQL Full Join的实现因为MySQL不支持FULL JOIN,下面是替代方法

left join + union(可去除重复数据)+ right join

select * from A left join B on A.id = B.id (where 条件)union

select * from A right join B on A.id = B.id (where条件);

mysql> SELECT * FROM websites LEFT JOIN access_log ON Websites.id=access_log.site_id 
UNION SELECT * FROM websites RIGHT JOIN access_log ON Websites.id=access_log.site_id;
+----+---------------+---------------------------+-------+---------+------+---------+-------+------------+
| id | name          | url                       | alexa | country | aid  | site_id | count | date       |
+----+---------------+---------------------------+-------+---------+------+---------+-------+------------+
|  1 | Google        | https://www.google.cm/    |     1 | USA     |    1 |       1 |    45 | 2016-05-10 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    2 |       3 |   100 | 2016-05-13 |
|  1 | Google        | https://www.google.cm/    |     1 | USA     |    3 |       1 |   230 | 2016-05-14 |
|  2 | 淘宝          | https://www.taobao.com/   |    13 | CN      |    4 |       2 |    10 | 2016-05-14 |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |    5 |       5 |   205 | 2016-05-14 |
|  4 | 微博          | http://weibo.com/         |    20 | CN      |    6 |       4 |    13 | 2016-05-15 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    7 |       3 |   220 | 2016-05-15 |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |    8 |       5 |   545 | 2016-05-16 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    9 |       3 |   201 | 2016-05-17 |
|  6 | stackoverflow | http://stackoverflow.com/ |     0 | IND     | NULL | NULL    | NULL  | NULL       |
|  7 | 百度          | https://www.baidu.com/    |     4 | CN      | NULL | NULL    | NULL  | NULL       |
+----+---------------+---------------------------+-------+---------+------+---------+-------+------------+
11 rows in set

SQL UNION 操作符合并两个或多个 SELECT 语句的结果。


SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT 
column_name(s) FROM 
table1

UNION

SELECT 
column_name(s) FROM 
table2;

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT 
column_name(s) FROM 
table1

UNION ALL

SELECT 
column_name(s) FROM 
table2;

注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

mysql> SELECT * FROM websites LEFT JOIN access_log ON Websites.id=access_log.site_id 
UNION ALL SELECT * FROM websites RIGHT JOIN access_log ON Websites.id=access_log.site_id;
+----+---------------+---------------------------+-------+---------+------+---------+-------+------------+
| id | name          | url                       | alexa | country | aid  | site_id | count | date       |
+----+---------------+---------------------------+-------+---------+------+---------+-------+------------+
|  1 | Google        | https://www.google.cm/    |     1 | USA     |    1 |       1 |    45 | 2016-05-10 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    2 |       3 |   100 | 2016-05-13 |
|  1 | Google        | https://www.google.cm/    |     1 | USA     |    3 |       1 |   230 | 2016-05-14 |
|  2 | 淘宝          | https://www.taobao.com/   |    13 | CN      |    4 |       2 |    10 | 2016-05-14 |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |    5 |       5 |   205 | 2016-05-14 |
|  4 | 微博          | http://weibo.com/         |    20 | CN      |    6 |       4 |    13 | 2016-05-15 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    7 |       3 |   220 | 2016-05-15 |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |    8 |       5 |   545 | 2016-05-16 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    9 |       3 |   201 | 2016-05-17 |
|  6 | stackoverflow | http://stackoverflow.com/ |     0 | IND     | NULL | NULL    | NULL  | NULL       |
|  7 | 百度          | https://www.baidu.com/    |     4 | CN      | NULL | NULL    | NULL  | NULL       |
|  1 | Google        | https://www.google.cm/    |     1 | USA     |    1 |       1 |    45 | 2016-05-10 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    2 |       3 |   100 | 2016-05-13 |
|  1 | Google        | https://www.google.cm/    |     1 | USA     |    3 |       1 |   230 | 2016-05-14 |
|  2 | 淘宝          | https://www.taobao.com/   |    13 | CN      |    4 |       2 |    10 | 2016-05-14 |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |    5 |       5 |   205 | 2016-05-14 |
|  4 | 微博          | http://weibo.com/         |    20 | CN      |    6 |       4 |    13 | 2016-05-15 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    7 |       3 |   220 | 2016-05-15 |
|  5 | Facebook      | https://www.facebook.com/ |     3 | USA     |    8 |       5 |   545 | 2016-05-16 |
|  3 | 菜鸟教程      | http://www.runoob.com/    |  4689 | CN      |    9 |       3 |   201 | 2016-05-17 |
+----+---------------+---------------------------+-------+---------+------+---------+-------+------------+
20 rows in set



 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137897.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 工业大数据的价值体现_如何分析转型带来的价值

    工业大数据的价值体现_如何分析转型带来的价值工业视角的转变        如果说前三次工业革命分别从机械化、规模化、标准化、和自动化等方向大幅度地提高了生产力,那么第四次工业革命与前面三次最大的区别在于:不再以制造端的生产力需求为出发点,而是将客户端价值作为整个产业链的核心,改变以往的工业价值链从生产端向消费端、上游向下游推动的模式,从客户端的价值需求出发提供客制化的产品和服务,并以此作为整个产业链的共同目标使整个产业链的各个环节实现协同优…

    2022年9月27日
    4
  • 构建LAMP架构_lamp和lnmp区别

    构建LAMP架构_lamp和lnmp区别LAMP架构LAMP架构简介Apache简介编译安装Apache编译安装Mysql编译安装PHP编译安装phpMyadminLAMP架构简介LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(或Perl、Python)网页编程语言。Apache简介ApacheHTTPServer是开源软件项目的杰出

    2022年10月9日
    2
  • python中的type和object详解

    python中的type和object详解关于这篇博客这篇博客主要描述Python的新风格对象(newstyleobjects),如下:1.和分别是什么?2.用户自定义的类和实例之间是怎么联系的?它们和内置类型又是怎么联系的?

    2022年7月5日
    23
  • PHP小程序开发_微信小程序后端语言

    PHP小程序开发_微信小程序后端语言想要快速地开发一个小程序,很多环节都需要注意,微信小程序php后端的开发估计很多人都还很陌生,但是这也是至关重要的,一起来看看开发实例详解吧。1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局、事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但是所有的数据都要以JSON的形式返回给小程序。2.昨天写了登录注册、忘记密码功能,…

    2022年9月17日
    2
  • 计算机里libcurl.dll,Update.exe系统错误 由于找不到libcurl.dll,无法继续执行代码。重新安装程序可能会解决此问题。 – Microsoft Community…

    计算机里libcurl.dll,Update.exe系统错误 由于找不到libcurl.dll,无法继续执行代码。重新安装程序可能会解决此问题。 – Microsoft Community…您好,了解到您Windows10遇到系统错误的问题。请问您是在做什么操作遇到该问题的呢?您也可以尝试以下方法:1.从其他相同系统的计算机的C:\Windows\SysWOW64(64位win10)或C:\Windows\System32(32位win10)录路径中复制libcurl.dll动态链接库文件,也可以从百度下载对应版本系统的libcurl32.dll;2、得到该文件后,我们将其复制…

    2022年7月26日
    22
  • 【Java】输入—Scanner用法(全)[通俗易懂]

    【Java】输入—Scanner用法(全)[通俗易懂]Scanner用法目录1、输入整数、字符串数组2、输入二维数组3、输入字符串4、输入字符串分割为数组5、连续输入数字和字符串6、换行输入数字和字符串7、换行输入数字和字符串(需要包含空格)1、输入整数、字符串数组第一行输入n,m第二行输入n个整数第三行输入m个字符串//导入包importjava.util.Scanner;import…

    2022年7月16日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号