Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menanyakan dua jadual dalam mysql

Bagaimana untuk menanyakan dua jadual dalam mysql

青灯夜游
青灯夜游asal
2021-12-07 10:51:0121113semak imbas

Cara untuk menanyakan dua jadual: 1. Gunakan pernyataan SELECT dan kata kunci "CROSS JOIN" untuk melakukan pertanyaan silang silang 2. Gunakan pernyataan SELECT dan kata kunci "INNER JOIN" untuk melakukan inner sertai pertanyaan; 3. Gunakan penyataan PILIH dan kata kunci "Outer JOIN" melaksanakan pertanyaan gabungan luar.

Bagaimana untuk menanyakan dua jadual dalam mysql

Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.

Dalam pangkalan data hubungan, jadual adalah berkaitan, jadi dalam aplikasi praktikal, pertanyaan berbilang jadual sering digunakan. Pertanyaan berbilang jadual adalah untuk menanya dua atau lebih jadual pada masa yang sama.

Dalam MySQL, pertanyaan berbilang jadual terutamanya termasuk sambung silang, sambung dalam dan sambung luar.

MySQL cross join

Cross join (CROSS JOIN) biasanya digunakan untuk mengembalikan hasil Cartesan bagi jadual yang dicantum. Format sintaks

sambungan silang adalah seperti berikut:

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

atau

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

Huraian sintaks adalah seperti berikut:

  • Nama medan: nama medan yang hendak disoal.

  • 206c433fe0e5b24acee550b4ec025992c8e711545e12e2bbd98c8732c66f2933: Nama jadual yang memerlukan sambungan silang.

  • Klausa WHERE: digunakan untuk menetapkan syarat pertanyaan untuk sambungan silang.

Nota: Apabila berbilang jadual dicantum silang, hanya gunakan CROSS JOIN atau , secara berterusan selepas FROM. Hasil pemulangan kedua-dua sintaks di atas adalah sama, tetapi sintaks pertama ialah kaedah penulisan standard yang disyorkan secara rasmi.

Apabila tiada hubungan antara jadual yang disambungkan, kami akan meninggalkan klausa WHERE Dalam kes ini, hasil yang dikembalikan ialah hasil darab Cartesian bagi kedua-dua jadual, dan bilangan hasil yang dikembalikan adalah hasil darab. baris data kedua-dua jadual. Perlu diingatkan bahawa jika setiap jadual mempunyai 1000 baris, maka bilangan hasil yang dikembalikan akan menjadi 1000 × 1000 = 1000000 baris, dan jumlah data adalah sangat besar.

Contoh:

Soal jadual maklumat pelajar dan jadual maklumat subjek, dan dapatkan produk Cartesian.

Untuk memudahkan pemerhatian hasil yang dijalankan selepas sambungan silang antara jadual maklumat pelajar dan jadual subjek, kami mula-mula menanyakan data kedua-dua jadual ini secara berasingan, dan kemudian melakukan pertanyaan sambungan silang.

1) Soal data dalam jadual tb_students_info Penyataan SQL dan hasil larian adalah seperti berikut:

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) Soal data dalam jadual tb_course keputusan adalah seperti berikut:

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) Gunakan CROSS JOIN untuk menanyakan produk Cartesian bagi kedua-dua jadual Penyataan SQL dan hasil yang dijalankan adalah seperti berikut:

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)

Seperti yang boleh. dilihat daripada keputusan larian, jadual tb_course dan tb_students_info dicantum silang Selepas itu, 50 rekod telah dikembalikan. Seperti yang anda boleh bayangkan, apabila terdapat banyak data dalam jadual, hasil larian yang diperolehi akan menjadi sangat panjang, dan hasil larian yang diperolehi tidak begitu bermakna. Oleh itu, kaedah pertanyaan berbilang jadual melalui sambungan silang tidak biasa digunakan, dan kita harus cuba mengelakkan pertanyaan seperti ini.

MySQL Inner Join

Inner JOIN mengalih keluar data tertentu daripada hasil pertanyaan dengan menetapkan syarat sambungan Sambungan silang baris. Ringkasnya, ungkapan bersyarat digunakan untuk menghapuskan baris data tertentu dalam sambungan silang.

Inner join menggunakan kata kunci INNER JOIN untuk menyambung dua jadual dan menggunakan klausa ON untuk menetapkan syarat sambungan. Tanpa syarat cantum, INNER JOIN dan CROSS JOIN adalah setara secara sintaksis dan boleh ditukar ganti. Format sintaks

cantuman dalaman adalah seperti berikut:

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

Penerangan sintaks adalah seperti berikut:

  • Nama medan: nama medan yang hendak disoal.

  • 206c433fe0e5b24acee550b4ec025992c8e711545e12e2bbd98c8732c66f2933: Nama jadual yang memerlukan cantuman dalaman.

  • INNER JOIN: Kata kunci INNER boleh diabaikan dalam inner join, dan hanya kata kunci JOIN digunakan.

  • Klausa HIDUP: digunakan untuk menetapkan syarat sambungan cantuman dalam.

INNER JOIN juga boleh menggunakan klausa WHERE untuk menentukan syarat sambungan, tetapi sintaks INNER JOIN ... ON ialah kaedah penulisan standard rasmi, dan klausa WHERE akan kadangkala Menjejaskan prestasi pertanyaan.

Apabila menyambungkan berbilang jadual, hanya gunakan INNER JOIN atau JOIN secara berterusan selepas FROM.

Gabungan dalaman boleh menanyakan dua atau lebih jadual. Untuk memberikan pemahaman yang lebih baik kepada semua orang, kami hanya akan menerangkan pertanyaan sambungan antara dua jadual buat masa ini.

Contoh:

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)

Dalam pernyataan pertanyaan di sini, perhubungan antara kedua-dua jadual ditentukan melalui INNER JOIN, dan syarat untuk cantuman diberikan menggunakan klausa ON.

Nota: Apabila menanyakan berbilang jadual, anda mesti menentukan jadual mana medan datang selepas pernyataan SELECT. Oleh itu, apabila menanyakan berbilang jadual, kaedah penulisan selepas pernyataan SELECT ialah nama jadual.nama lajur. Di samping itu, jika nama jadual sangat panjang, anda juga boleh menetapkan alias untuk jadual, supaya anda boleh menulis alias jadual dan nama lajur terus selepas pernyataan SELECT.

Caburan luar MySQL

Hasil pertanyaan cantuman dalam ialah semua rekod yang memenuhi syarat sambungan, dan cantuman luar akan mula-mula membahagikan jadual yang disambungkan ke dalam adalah jadual asas dan jadual rujukan, dan kemudian gunakan jadual asas sebagai asas untuk mengembalikan rekod yang memenuhi dan tidak memenuhi syarat.

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

左连接

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

左连接的语法格式如下:

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

语法说明如下。

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

  • cc850cc925b27bf1d57f25e37031a14d400ebfdb8c111565a1c54094f4979ff6:需要左连接的表名。

  • 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> <ON子句>

语法说明如下。

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

  • cc850cc925b27bf1d57f25e37031a14d400ebfdb8c111565a1c54094f4979ff6:需要右连接的表名。

  • 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视频教程

Atas ialah kandungan terperinci Bagaimana untuk menanyakan dua jadual dalam mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn