千家信息网

mysql如何查询两个表

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"mysql如何查询两个表",在日常操作中,相信很多人在mysql如何查询两个表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"mysql如何查询两个表"
千家信息网最后更新 2026年10月31日mysql如何查询两个表

这篇文章主要介绍"mysql如何查询两个表",在日常操作中,相信很多人在mysql如何查询两个表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"mysql如何查询两个表"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

查询两个表的方法:1、利用SELECT语句和"CROSS JOIN"关键字进行交叉连接查询;2、利用SELECT语句和"INNER JOIN"关键字进行内连接查询;3、利用SELECT语句和"OUTER JOIN"关键字进行外连接查询。

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。

在 MySQL 中,多表查询主要有交叉连接、内连接和外连接。

MySQL 交叉连接

交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。

交叉连接的语法格式如下:

SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]

或

SELECT <字段名> FROM <表1>, <表2> [WHERE子句]

语法说明如下:

  • 字段名:需要查询的字段名称。

  • <表1><表2>:需要交叉连接的表名。

  • WHERE 子句:用来设置交叉连接的查询条件。

注意:多个表交叉连接时,在 FROM 后连续使用 CROSS JOIN 或,即可。以上两种语法的返回结果是相同的,但是第一种语法才是官方建议的标准写法。

当连接的表之间没有关系时,我们会省略掉 WHERE 子句,这时返回结果就是两个表的笛卡尔积,返回结果数量就是两个表的数据行相乘。需要注意的是,如果每个表有 1000 行,那么返回结果的数量就有 1000×1000 = 1000000 行,数据量是非常巨大的。

示例:

查询学生信息表和科目信息表,并得到一个笛卡尔积。

为了方便观察学生信息表和科目表交叉连接后的运行结果,我们先分别查询出这两个表的数据,再进行交叉连接查询。

1)查询 tb_students_info 表中的数据,SQL 语句和运行结果如下:

mysql> SELECT * FROM tb_students_info;+----+--------+------+------+--------+-----------+| id | name   | age  | sex  | height | course_id |+----+--------+------+------+--------+-----------+|  1 | Dany   |   25 | 男   |    160 |         1 ||  2 | Green  |   23 | 男   |    158 |         2 ||  3 | Henry  |   23 | 女   |    185 |         1 ||  4 | Jane   |   22 | 男   |    162 |         3 ||  5 | Jim    |   24 | 女   |    175 |         2 ||  6 | John   |   21 | 女   |    172 |         4 ||  7 | Lily   |   22 | 男   |    165 |         4 ||  8 | Susan  |   23 | 男   |    170 |         5 ||  9 | Thomas |   22 | 女   |    178 |         5 || 10 | Tom    |   23 | 女   |    165 |         5 |+----+--------+------+------+--------+-----------+10 rows in set (0.00 sec)

2)查询 tb_course 表中的数据,SQL 语句和运行结果如下:

mysql> SELECT * FROM tb_course;+----+-------------+| id | course_name |+----+-------------+|  1 | Java        ||  2 | MySQL       ||  3 | Python      ||  4 | Go          ||  5 | C++         |+----+-------------+5 rows in set (0.00 sec)

3)使用 CROSS JOIN 查询出两张表中的笛卡尔积,SQL 语句和运行结果如下:

mysql> SELECT * FROM tb_course CROSS JOIN tb_students_info;+----+-------------+----+--------+------+------+--------+-----------+| id | course_name | id | name   | age  | sex  | height | course_id |+----+-------------+----+--------+------+------+--------+-----------+|  1 | Java        |  1 | Dany   |   25 | 男   |    160 |         1 ||  2 | MySQL       |  1 | Dany   |   25 | 男   |    160 |         1 ||  3 | Python      |  1 | Dany   |   25 | 男   |    160 |         1 ||  4 | Go          |  1 | Dany   |   25 | 男   |    160 |         1 ||  5 | C++         |  1 | Dany   |   25 | 男   |    160 |         1 ||  1 | Java        |  2 | Green  |   23 | 男   |    158 |         2 ||  2 | MySQL       |  2 | Green  |   23 | 男   |    158 |         2 ||  3 | Python      |  2 | Green  |   23 | 男   |    158 |         2 ||  4 | Go          |  2 | Green  |   23 | 男   |    158 |         2 ||  5 | C++         |  2 | Green  |   23 | 男   |    158 |         2 ||  1 | Java        |  3 | Henry  |   23 | 女   |    185 |         1 ||  2 | MySQL       |  3 | Henry  |   23 | 女   |    185 |         1 ||  3 | Python      |  3 | Henry  |   23 | 女   |    185 |         1 ||  4 | Go          |  3 | Henry  |   23 | 女   |    185 |         1 ||  5 | C++         |  3 | Henry  |   23 | 女   |    185 |         1 ||  1 | Java        |  4 | Jane   |   22 | 男   |    162 |         3 ||  2 | MySQL       |  4 | Jane   |   22 | 男   |    162 |         3 ||  3 | Python      |  4 | Jane   |   22 | 男   |    162 |         3 ||  4 | Go          |  4 | Jane   |   22 | 男   |    162 |         3 ||  5 | C++         |  4 | Jane   |   22 | 男   |    162 |         3 ||  1 | Java        |  5 | Jim    |   24 | 女   |    175 |         2 ||  2 | MySQL       |  5 | Jim    |   24 | 女   |    175 |         2 ||  3 | Python      |  5 | Jim    |   24 | 女   |    175 |         2 ||  4 | Go          |  5 | Jim    |   24 | 女   |    175 |         2 ||  5 | C++         |  5 | Jim    |   24 | 女   |    175 |         2 ||  1 | Java        |  6 | John   |   21 | 女   |    172 |         4 ||  2 | MySQL       |  6 | John   |   21 | 女   |    172 |         4 ||  3 | Python      |  6 | John   |   21 | 女   |    172 |         4 ||  4 | Go          |  6 | John   |   21 | 女   |    172 |         4 ||  5 | C++         |  6 | John   |   21 | 女   |    172 |         4 ||  1 | Java        |  7 | Lily   |   22 | 男   |    165 |         4 ||  2 | MySQL       |  7 | Lily   |   22 | 男   |    165 |         4 ||  3 | Python      |  7 | Lily   |   22 | 男   |    165 |         4 ||  4 | Go          |  7 | Lily   |   22 | 男   |    165 |         4 ||  5 | C++         |  7 | Lily   |   22 | 男   |    165 |         4 ||  1 | Java        |  8 | Susan  |   23 | 男   |    170 |         5 ||  2 | MySQL       |  8 | Susan  |   23 | 男   |    170 |         5 ||  3 | Python      |  8 | Susan  |   23 | 男   |    170 |         5 ||  4 | Go          |  8 | Susan  |   23 | 男   |    170 |         5 ||  5 | C++         |  8 | Susan  |   23 | 男   |    170 |         5 ||  1 | Java        |  9 | Thomas |   22 | 女   |    178 |         5 ||  2 | MySQL       |  9 | Thomas |   22 | 女   |    178 |         5 ||  3 | Python      |  9 | Thomas |   22 | 女   |    178 |         5 ||  4 | Go          |  9 | Thomas |   22 | 女   |    178 |         5 ||  5 | C++         |  9 | Thomas |   22 | 女   |    178 |         5 ||  1 | Java        | 10 | Tom    |   23 | 女   |    165 |         5 ||  2 | MySQL       | 10 | Tom    |   23 | 女   |    165 |         5 ||  3 | Python      | 10 | Tom    |   23 | 女   |    165 |         5 ||  4 | Go          | 10 | Tom    |   23 | 女   |    165 |         5 ||  5 | C++         | 10 | Tom    |   23 | 女   |    165 |         5 |+----+-------------+----+--------+------+------+--------+-----------+50 rows in set (0.00 sec)

由运行结果可以看出,tb_course 和 tb_students_info 表交叉连接查询后,返回了 50 条记录。可以想象,当表中的数据较多时,得到的运行结果会非常长,而且得到的运行结果也没太大的意义。所以,通过交叉连接的方式进行多表查询的这种方法并不常用,我们应该尽量避免这种查询。

MySQL 内连接

内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。

内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。

内连接的语法格式如下:

SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]

语法说明如下:

  • 字段名:需要查询的字段名称。

  • <表1><表2>:需要内连接的表名。

  • INNER JOIN :内连接中可以省略 INNER 关键字,只用关键字 JOIN。

  • ON 子句:用来设置内连接的连接条件。

INNER JOIN 也可以使用 WHERE 子句指定连接条件,但是 INNER JOIN ... ON 语法是官方的标准写法,而且 WHERE 子句在某些时候会影响查询的性能。

多个表内连接时,在 FROM 后连续使用 INNER JOIN 或 JOIN 即可。

内连接可以查询两个或两个以上的表。为了让大家更好的理解,暂时只讲解两个表的连接查询。

示例:

mysql> SELECT s.name,c.course_name FROM tb_students_info s INNER JOIN tb_course c     -> ON s.course_id = c.id;+--------+-------------+| name   | course_name |+--------+-------------+| Dany   | Java        || Green  | MySQL       || Henry  | Java        || Jane   | Python      || Jim    | MySQL       || John   | Go          || Lily   | Go          || Susan  | C++         || Thomas | C++         || Tom    | C++         |+--------+-------------+10 rows in set (0.00 sec)

在这里的查询语句中,两个表之间的关系通过 INNER JOIN 指定,连接的条件使用 ON 子句给出。

注意:当对多个表进行查询时,要在 SELECT 语句后面指定字段是来源于哪一张表。因此,在多表查询时,SELECT 语句后面的写法是表名.列名。另外,如果表名非常长的话,也可以给表设置别名,这样就可以直接在 SELECT 语句后面写上表的别名.列名。

MySQL 外连接

内连接的查询结果都是符合连接条件的记录,而外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录。

外连接可以分为左外连接和右外连接,下面根据实例分别介绍左外连接和右外连接。

左连接

左外连接又称为左连接,使用 LEFT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。

左连接的语法格式如下:

SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> 

语法说明如下。

  • 字段名:需要查询的字段名称。

  • <表1><表2>:需要左连接的表名。

  • LEFT OUTER JOIN:左连接中可以省略 OUTER 关键字,只使用关键字 LEFT JOIN。

  • ON 子句:用来设置左连接的连接条件,不能省略。

上述语法中,"表1"为基表,"表2"为参考表。左连接查询时,可以查询出"表1"中的所有记录和"表2"中匹配连接条件的记录。如果"表1"的某行在"表2"中没有匹配行,那么在返回结果中,"表2"的字段值均为空值(NULL)。

示例:

在进行左连接查询之前,我们先查看 tb_course 和 tb_students_info 两张表中的数据。SQL 语句和运行结果如下。

mysql> SELECT * FROM tb_course;+----+-------------+| id | course_name |+----+-------------+|  1 | Java        ||  2 | MySQL       ||  3 | Python      ||  4 | Go          ||  5 | C++         ||  6 | HTML        |+----+-------------+6 rows in set (0.00 sec)mysql> SELECT * FROM tb_students_info;+----+--------+------+------+--------+-----------+| id | name   | age  | sex  | height | course_id |+----+--------+------+------+--------+-----------+|  1 | Dany   |   25 | 男   |    160 |         1 ||  2 | Green  |   23 | 男   |    158 |         2 ||  3 | Henry  |   23 | 女   |    185 |         1 ||  4 | Jane   |   22 | 男   |    162 |         3 ||  5 | Jim    |   24 | 女   |    175 |         2 ||  6 | John   |   21 | 女   |    172 |         4 ||  7 | Lily   |   22 | 男   |    165 |         4 ||  8 | Susan  |   23 | 男   |    170 |         5 ||  9 | Thomas |   22 | 女   |    178 |         5 || 10 | Tom    |   23 | 女   |    165 |         5 || 11 | LiMing |   22 | 男   |    180 |         7 |+----+--------+------+------+--------+-----------+11 rows in set (0.00 sec)

在 tb_students_info 表和 tb_course 表中查询所有学生姓名和相对应的课程名称,包括没有课程的学生,SQL 语句和运行结果如下。

mysql> SELECT s.name,c.course_name FROM tb_students_info s LEFT OUTER JOIN tb_course c     -> ON s.`course_id`=c.`id`;+--------+-------------+| name   | course_name |+--------+-------------+| Dany   | Java        || Henry  | Java        || NULL   | Java        || Green  | MySQL       || Jim    | MySQL       || Jane   | Python      || John   | Go          || Lily   | Go          || Susan  | C++         || Thomas | C++         || Tom    | C++         || LiMing | NULL        |+--------+-------------+12 rows in set (0.00 sec)

可以看到,运行结果显示了 12 条记录,name 为 LiMing 的学生目前没有课程,因为对应的 tb_course 表中没有该学生的课程信息,所以该条记录只取出了 tb_students_info 表中相应的值,而从 tb_course 表中取出的值为 NULL。

右连接

右外连接又称为右连接,右连接是左连接的反向连接。使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。

右连接的语法格式如下:

SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> 

语法说明如下。

  • 字段名:需要查询的字段名称。

  • <表1><表2>:需要右连接的表名。

  • RIGHT OUTER JOIN:右连接中可以省略 OUTER 关键字,只使用关键字 RIGHT JOIN。

  • ON 子句:用来设置右连接的连接条件,不能省略。

与左连接相反,右连接以"表2"为基表,"表1"为参考表。右连接查询时,可以查询出"表2"中的所有记录和"表1"中匹配连接条件的记录。如果"表2"的某行在"表1"中没有匹配行,那么在返回结果中,"表1"的字段值均为空值(NULL)。

示例:

在 tb_students_info 表和 tb_course 表中查询所有课程,包括没有学生的课程,SQL 语句和运行结果如下。

mysql> SELECT s.name,c.course_name FROM tb_students_info s RIGHT OUTER JOIN tb_course c     -> ON s.`course_id`=c.`id`;+--------+-------------+| name   | course_name |+--------+-------------+| Dany   | Java        || Green  | MySQL       || Henry  | Java        || Jane   | Python      || Jim    | MySQL       || John   | Go          || Lily   | Go          || Susan  | C++         || Thomas | C++         || Tom    | C++         || NULL   | HTML        |+--------+-------------+11 rows in set (0.00 sec)

可以看到,结果显示了 11 条记录,名称为 HTML 的课程目前没有学生,因为对应的 tb_students_info 表中并没有该学生的信息,所以该条记录只取出了 tb_course 表中相应的值,而从 tb_students_info 表中取出的值为 NULL。

多个表左/右连接时,在 ON 子句后连续使用 LEFT/RIGHT OUTER JOIN 或 LEFT/RIGHT JOIN 即可。

使用外连接查询时,一定要分清需要查询的结果,是需要显示左表的全部记录还是右表的全部记录,然后选择相应的左连接和右连接。

到此,关于"mysql如何查询两个表"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

查询 结果 C++ 两个 条件 子句 交叉 语句 语法 关键 关键字 字段 运行 数据 学生 课程 名称 信息 多个 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 天津市摩尔互联网科技 厦门中拓互联网络科技有限公司 智能科技公司是互联网公司吗 科技互联网技术 深圳互联网科技公司 互联网金融公司科技 互联网科技logo设计 苏州大垚互联网科技 科技互联网创业计划书 大白互联网科技 居家互联网科技有限公司 上海电发互联网科技有限公司 阿里巴巴算科技企业还是互联网 厦门千工互联网科技有限公司 知域互联网科技有限公司大骗子 互联网与医疗科技 云南互联网科技学费 每日互联网科技新闻 如何强化互联网金融科技 工业互联网科技新基建 天下捷融互联网科技 多迪互联网科技有限公司 成都互联网科技公司100强 北京华百购互联网科技有限公司 注册互联网科技公司经营范围大全 成都互联网科技公司工作好不好 上海乐五互联网科技有限公司 广州智享互联网科技 每日互联网科技新闻
0