MySQL联表查询的简单示例

 更新时间:2019年05月13日 11:33:48   作者:刘哇勇  
这篇文章主要给大家介绍了关于MySQL联表查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度。下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

关系型数据库,免不了表之间存在各种引用与关联。这些关联是通过主键与外键搭配来形成的。所以,取数据时,很大情况下单张表无法满足需求,额外的数据则需要将其他表加入到查询中来,这便是 JOIN 关键字完成的操作。

  • MySQL 中 JOIN, CROSS JOIN 和 INNER JOIN 三者语法功能上相同,可互换,而 SQL 标准中,INNER JOIN 需要搭配 ON 语句。

多表联合查询时,可省略 JOIN 关键字,以逗号分隔多张表,此时默认会当作 INNER JOIN 来处理。比如,

SELECT table1.*, 
  table2.* 
FROM table1, 
  table2; 

等效于:

SELECT table1.*, 
  table2.* 
FROM table1 
  INNER JOIN table2; 
  • 但这种通过逗号隐式指定的联表形式其优先级要低于直接通过关键字(INNER JOIN, CROSS JOIN, LEFT JOIN)指定的形式。所以 t1, t2 JOIN t3 会被解析成 (t1, (t2 JOIN t3)) 而不是 ((t1, t2) JOIN t3)

需要注意的是,当逗号形式与其他联表关键词结合时,在指定了联表条件,比如通过 ON 条件时,会报错。

  • ON 指定的联表条件其语法同 WHERE,所有后者可接受的表达式都可用于 ON。两者看起来功能上雷同,ON 一般用于指定联表条件,即表之间怎么被联合,而 WHERE 则用于过滤结果。
  • LEFT JOIN 时,右边表中不满足 ON 或 USING 指定的条件时,会在结果中以 NULL 呈现。
SELECT left_tbl.*
 FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
 WHERE right_tbl.id IS NULL;

通过此方法可方便地过滤出右边表中不符合条件的记录。

  • 联表查询时可为每张参与进来的表指定别名,方便在其他表达式中引用。两种方式,一个是通过 AS 关键字 tbl_name AS alias_name,另一种是直接在表名后面跟上别名,tbl_name alias_name。
SELECT t1.name, t2.salary
 FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary
 FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
  • 一条查询语句中的子查询必需取一个别名,这样才能在其他表达式中引用。
SELECT * FROM (SELECT 1, 2, 3) AS t1;
  • USING(join_column_list) 语句指定两个表中均包含的列,查询时只针对这里指定的列进行比较。
a LEFT JOIN b USING (c1, c2, c3)
  • NATURAL [LEFT] JOIN 与 INNER JOIN 和 LEFT JOIN 配合使用了 USING 指定表中所有列的情况等效。
  • RIGHT JOIN 与 LEFT JOIN 类似,只是最终结果是依据右边表,将左边表中不符合的在结果中以 NULL 呈现。为了方便在不同数据库间迁移,推荐始终使用 LEFT JOIN。

一些 JOIN 示例:

SELECT * FROM table1, table2;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
 LEFT JOIN table3 ON table2.id = table3.id;
  • NATURAL JOIN 的结果中不会有重复的列。因为其与 USING 雷同,所以 USING 时也没有复杂的列。

考察下面的示例:

CREATE TABLE t1 (i INT, j INT);
CREATE TABLE t2 (k INT, j INT);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t2 VALUES(1, 1);
SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 JOIN t2 USING (j);

查询结果:

+------+------+------+
| j    | i    | k    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+
+------+------+------+
| j    | i    | k    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+

结果中同名的列只出现一次,且都是值相同的那些记录。

通过向两表中插入一条新记录,令它们的 j 不相同,再进行测试。

mysql> INSERT INTO t1 VALUES(2, 2);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t2 VALUES(2, 3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 natural join t2;
+------+------+------+
| j | i | k |
+------+------+------+
| 2 | 2 | 1 |
+------+------+------+
1 row in set (0.00 sec)
  • USING 和 ON 作为条件时其他限制的联合条件是一样的,可互相转换。但在 SELECT * 返回结果时,还是有差异的。前者只在 USING 中指定的列中返回合并后的结果,后者则针对的是表中所有列。
a LEFT JOIN b USING (c1, c2, c3)
a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3

USING 情况下的返回:

COALESCE(a.c1, b.c1), COALESCE(a.c2, b.c2), COALESCE(a.c3, b.c3)

ON 的返回:

a.c1, a.c2, a.c3, b.c1, b.c2, b.c3

ON 语句中只能引用其操作表(operands)中的表。

CREATE TABLE t1 (i1 INT);
CREATE TABLE t2 (i2 INT);
CREATE TABLE t3 (i3 INT);

针对上面的表,以下查询会报错:

mysql> SELECT * FROM t1 JOIN t2 ON (i1 = i3) JOIN t3;
ERROR 1054 (42S22): Unknown column 'i3' in 'on clause'

而以下查询则可以:

mysql> SELECT * FROM t1 JOIN t2 JOIN t3 ON (i1 = i3);
Empty set (0.00 sec)

因为此时 t3 在 ON 语句的操作范围内了。

相关资源

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • Mysql数据库错误代码中文详细说明

    Mysql数据库错误代码中文详细说明

    在mysql开发中出现错误代码各种各样,下面我来给大家收集常用见的mysql使用过程中出错代码的中文说明,希望些文章对各位朋友有所帮助了
    2013-08-08
  • MySQL查询优化之索引的应用详解

    MySQL查询优化之索引的应用详解

    本篇文章是对MySQL查询优化中索引的使用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL中join查询的深入探究

    MySQL中join查询的深入探究

    数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据,下面这篇文章主要给大家介绍了关于MySQL中join查询的深入探究,需要的朋友可以参考下
    2022-11-11
  • 分享MySQL 主从延迟与读写分离的七种解决方案

    分享MySQL 主从延迟与读写分离的七种解决方案

    这篇文章主要介绍了分享MySQL 主从延迟与读写分离的七种解决方案,常见的解决方式是分库分表,每次读写都是操作主库的一个分表,从库只用来做数据备份。当主库发生故障时,主从切换,保证集群的高可用性,下面详细的相关资料介绍,需要的小伙伴可以参考一下
    2022-03-03
  • 通过DML更新MySQL数据库数据的示例代码

    通过DML更新MySQL数据库数据的示例代码

    这篇文章主要给大家介绍了如何通过DML更新MySQL数据库的数据,通过DML来对数据库种地表的数据记录进行增删改查操作,文中给大家了详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • MySQL 8.0 之不可见列的基本操作

    MySQL 8.0 之不可见列的基本操作

    MySQL8.0.23之后引入了不可见列,今天我们来说说这个特性的基本使用,感兴趣的朋友可以了解下
    2021-05-05
  • MySQL笔记之数据类型详解

    MySQL笔记之数据类型详解

    本篇文章对mysql数据类型进行了详细的介绍,需要的朋友参考下
    2013-05-05
  • 简单谈谈MySQL数据透视表

    简单谈谈MySQL数据透视表

    这篇文章主要介绍了简单谈谈MySQL数据透视表的相关资料,需要的朋友可以参考下
    2019-08-08
  • SQL中的distinct的使用方法

    SQL中的distinct的使用方法

    这篇文章主要介绍SQL中的distinct的使用方法,distinct用来查询不重复记录的条数,即用distinct来返回不重复字段的条数,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • mysql如何导出服务器内所有的数据库

    mysql如何导出服务器内所有的数据库

    这篇文章主要介绍了mysql如何导出服务器内所有的数据库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论