Maison >base de données >tutoriel mysql >Qu'est-ce qui est généralement utilisé pour les requêtes multi-tables MySQL ?

Qu'est-ce qui est généralement utilisé pour les requêtes multi-tables MySQL ?

青灯夜游
青灯夜游original
2020-10-20 10:24:562053parcourir

Les requêtes multi-tables MySQL utilisent généralement des jointures croisées, des jointures internes et des jointures externes. La jointure croisée renvoie le produit cartésien des tables connectées ; la jointure interne combine les enregistrements dans deux tables et renvoie les enregistrements avec les champs associés correspondants, c'est-à-dire qu'elle renvoie l'intersection des deux tables. La jointure externe divise d'abord les tables connectées en tables de base et référence ; table, puis renvoie les enregistrements qui remplissent et ne remplissent pas les conditions basées sur la table de base.

Qu'est-ce qui est généralement utilisé pour les requêtes multi-tables MySQL ?

(Tutoriel recommandé : Tutoriel vidéo mysql)

Dans une base de données relationnelle, il y a Il y a une relation, Ainsi, dans les applications pratiques, les requêtes multi-tables sont souvent utilisées. La requête multi-tables consiste à interroger deux ou plusieurs tables en même temps.

Dans MySQL, les requêtes multi-tables incluent principalement les jointures croisées, les jointures internes et les jointures externes.

Jointure croisée

La jointure croisée (CROSS JOIN) est généralement utilisée pour renvoyer le produit cartésien de la table de jointure. Le format de syntaxe de

interconnexion est le suivant :

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

ou

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

La syntaxe est la suivante :

  • Nom du champ : Le nom du champ à interroger.

  •  : le nom de la table qui nécessite une connexion croisée.
  • Clause WHERE : utilisée pour définir les conditions de requête pour les connexions croisées.

  • Remarque : lorsque plusieurs tables sont jointes de manière croisée, utilisez simplement CROSS JOIN ou, en continu après FROM. Les résultats de retour des deux syntaxes ci-dessus sont les mêmes, mais la première syntaxe est la méthode d'écriture standard officiellement recommandée.

    Lorsqu'il n'y a pas de relation entre les tables connectées, nous omettrons la clause WHERE. Dans ce cas, le résultat renvoyé est le produit cartésien des deux tables, et le nombre de résultats renvoyés est le produit du. lignes de données des deux tables. Il convient de noter que si chaque table comporte 1 000 lignes, alors le nombre de résultats renvoyés sera de 1 000 × 1 000 = 1 000 000 lignes et la quantité de données est très énorme.

    La connexion croisée peut interroger deux tables ou plus Afin de donner aux lecteurs une meilleure compréhension, ce qui suit expliquera d'abord la requête de connexion croisée de deux tables.

    Exemple

    Interrogez le tableau d'informations sur l'élève et le tableau d'informations sur le sujet, et obtenez un produit cartésien.

    Afin de faciliter l'observation des résultats en cours après la connexion croisée entre la table d'informations sur l'étudiant et la table sujet, nous interrogeons d'abord les données de ces deux tables séparément, puis effectuons la requête de connexion croisée.

    1) Interrogez les données dans la table tb_students_info. L'instruction SQL et les résultats d'exécution sont les suivants :

    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) Interrogez les données dans la table tb_course. comme suit :

    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) Utilisez CROSS JOIN pour interroger le produit cartésien des deux tables. L'instruction SQL et les résultats d'exécution sont les suivants :

    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)

    Comme le montrent les résultats d'exécution. , après la requête de jointure croisée des tables tb_course et tb_students_info, 50 éléments ont été renvoyés Record. Comme vous pouvez l'imaginer, lorsqu'il y a beaucoup de données dans le tableau, les résultats courants obtenus seront très longs et les résultats courants obtenus ne sont pas très significatifs. Par conséquent, cette méthode de requête multi-tables via connexion croisée n’est pas couramment utilisée et nous devrions essayer d’éviter ce type de requête.

    Produit cartésien

    Le produit cartésien fait référence au produit de deux ensembles X et Y.

    Par exemple, il existe deux ensembles A et B, leurs valeurs sont les suivantes :

    A = {1,2}
    B = {3,4,5}

    Les ensembles résultats des ensembles A×B et B×A sont respectivement exprimés comme :

    A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };
    B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };

    Les résultats ci-dessus de A×B et B×A sont appelés le produit cartésien des deux ensembles.

    Et, à partir des résultats ci-dessus, nous pouvons voir :

    • La multiplication de deux ensembles ne satisfait pas le taux de change, c'est-à-dire A×B≠B× UN.

    • Le produit cartésien de l'ensemble A et de l'ensemble B est le nombre d'éléments de l'ensemble A × le nombre d'éléments de l'ensemble B.

    L'algorithme suivi par la requête multi-tables est le produit cartésien mentionné ci-dessus. La connexion entre les tables peut être considérée comme une opération de multiplication. Dans les applications pratiques, l'utilisation d'un produit cartésien doit être évitée car le produit cartésien contient facilement une grande quantité de données déraisonnables, ce qui signifie simplement que cela peut facilement conduire à des résultats de requête en double et déroutants.

    Inner JOIN

    INNER JOIN combine les enregistrements dans deux tables et renvoie les champs associés en définissant les conditions de connexion. Enregistrements correspondants, c'est-à-dire l'intersection ( ombré) une partie des deux tableaux est renvoyée.

    Quest-ce qui est généralement utilisé pour les requêtes multi-tables MySQL ?

    La jointure interne utilise le mot-clé INNER JOIN pour connecter deux tables et utilise la clause ON pour définir les conditions de connexion. Sans conditions de jointure, INNER JOIN et CROSS JOIN sont syntaxiquement équivalents et interchangeables. Le format de syntaxe de

    jointure interne est le suivant :

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

    La description de la syntaxe est la suivante.

    • Nom du champ : le nom du champ à interroger.

     : le nom de la table qui nécessite une jointure interne.
  • INNER JOIN : Le mot-clé INNER peut être omis dans les jointures internes, et seul le mot-clé JOIN est utilisé.

  • Clause ON : utilisée pour définir les conditions de connexion des jointures internes.

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

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

    示例:

    在 tb_students_info 表和 tb_course 表之间,使用内连接查询学生姓名和相对应的课程名称,SQL 语句和运行结果如下。

    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 语句后面写上表的别名.列名

    外连接

    外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录。

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

    左连接

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

    左连接的语法格式如下:

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

    语法说明如下。

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

    • :需要左连接的表名。

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

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

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

    示例1

    在进行左连接查询之前,我们先查看 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子句>

    语法说明如下。

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

    • :需要右连接的表名。

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

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

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

    示例2

    在 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 即可。

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn