• ADADADADAD

    mysql如何查询两个表[ mysql数据库 ]

    mysql数据库 时间:2024-11-25 18:01:00 热度:1℃

    作者:文/会员上传 下载docx

    简介:

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

    以下为本文的正文内容,请查阅,本站为公益性网站,复制本文以及下载DOC文档全部免费。

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

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

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

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

    MySQL 交叉连接

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

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

    SELECT<字段名>FROM<表1>CROSSJOIN<表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*FROMtb_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|+----+--------+------+------+--------+-----------+10rowsinset(0.00sec)

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

      mysql>SELECT*FROMtb_course;+----+-------------+|id|course_name|+----+-------------+|1|Java||2|MySQL||3|Python||4|Go||5|C++|+----+-------------+5rowsinset(0.00sec)

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

      mysql>SELECT*FROMtb_courseCROSSJOINtb_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|+----+-------------+----+--------+------+------+--------+-----------+50rowsinset(0.00sec)

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

      MySQL 内连接

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

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

      内连接的语法格式如下:

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

      语法说明如下:

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

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

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

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

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

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

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

        示例:

        mysql>SELECTs.name,c.course_nameFROMtb_students_infosINNERJOINtb_coursec->ONs.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++|+--------+-------------+10rowsinset(0.00sec)

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

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

        MySQL 外连接

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

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

        左连接

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

        左连接的语法格式如下:

        SELECT<字段名>FROM<表1>LEFTOUTERJOIN<表2><ON子句>

        语法说明如下。

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

          <表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*FROMtb_course;+----+-------------+|id|course_name|+----+-------------+|1|Java||2|MySQL||3|Python||4|Go||5|C++||6|HTML|+----+-------------+6rowsinset(0.00sec)mysql>SELECT*FROMtb_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|+----+--------+------+------+--------+-----------+11rowsinset(0.00sec)

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

          mysql>SELECTs.name,c.course_nameFROMtb_students_infosLEFTOUTERJOINtb_coursec->ONs.`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|+--------+-------------+12rowsinset(0.00sec)

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

          右连接

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

          右连接的语法格式如下:

          SELECT<字段名>FROM<表1>RIGHTOUTERJOIN<表2><ON子句>

          语法说明如下。

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

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

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

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

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

            示例:

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

            mysql>SELECTs.name,c.course_nameFROMtb_students_infosRIGHTOUTERJOINtb_coursec->ONs.`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|+--------+-------------+11rowsinset(0.00sec)

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

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

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

    mysql如何查询两个表.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysql
    ADADAD