Maison  >  Article  >  base de données  >  Requête de connexion de requête de données MySQL

Requête de connexion de requête de données MySQL

coldplay.xixi
coldplay.xixiavant
2021-03-15 09:05:473168parcourir

Requête de connexion de requête de données MySQL

  • Les relations de connexion sont les principales caractéristiques du modèle de base de données relationnelle. C'est également la requête la plus importante, comprenant principalement les jointures internes, les jointures externes, etc.
  • Des requêtes de tables multiples peuvent être implémentées via des opérateurs de connexion.
  • Dans un système de gestion de base de données relationnelle, la relation entre chaque donnée n'a pas besoin d'être déterminée lors de l'établissement de la table. Toutes les informations d'une entité sont souvent stockées dans une seule table. Lors de l'interrogation de données, les informations stockées dans différentes entités dans plusieurs tables sont interrogées via des opérations de connexion. Lorsqu'il existe des champs ayant la même signification dans deux tables ou plus, vous pouvez utiliser ces champs pour effectuer des requêtes de jointure sur différentes tables.

Ce qui suit présente trois méthodes de connexion entre plusieurs tables :

(1) Requête de jointure interne
(2) Requête de jointure externe
(3) Conditions composées Requête de connexion

(recommandation d'apprentissage gratuite : tutoriel vidéo mysql )


(1), requête de jointure interne (jointure interne)
  • Les jointures internes utilisent des opérateurs de comparaison pour comparer les données de certaines (certaines) colonnes entre les tables et répertorient les lignes de données de ces tables qui correspondent aux conditions de jointure pour former de nouveaux enregistrements, c'est-à-dire que dans la requête de jointure interne, seuls les enregistrements qui remplissent les conditions peut apparaître dans la relation de résultat.

Créez la table de données fournisseurs ci-dessous pour démonstration :

mysql> create table suppliers    -> (
    -> s_id int not null auto_increment,
    -> s_name char(50) not null,
    -> s_city char(50) null,
    -> s_zip char(10) null,
    -> s_call char(50) not null,
    -> primary key(s_id)
    -> );Query OK, 0 rows affected (0.17 sec)mysql> insert into suppliers(s_id,s_name,s_city,s_zip,s_call)
    -> values(101,'FastFruit Inc.','Tianjin','300000','48075'),
    -> (102,'LT Supplies','Chongqing','400000','44333'),
    -> (103,'ACME','Shanghai','200000','90046'),
    -> (104,'FNK Inc.','Zhongshan','528437','11111'),
    -> (105,'Good Set','Taiyuan','030000','22222'),
    -> (106,'Just Eat Ours','Beijing','010','45678'),
    -> (107,'DK Inc','Zhengzhou','450000','33332');Query OK, 7 rows affected (0.07 sec)Records: 7  Duplicates: 0  Warnings: 0

[Exemple 1] Utilisez une requête de jointure interne entre la table des fruits et la table des fournisseurs.

mysql> desc fruits;+---------+--------------+------+-----+---------+-------+| Field   | Type         | Null | Key | Default | Extra |+---------+--------------+------+-----+---------+-------+| f_id    | char(10)     | NO   | PRI | NULL    |       || s_id    | int(11)      | NO   |     | NULL    |       || f_name  | char(255)    | NO   |     | NULL    |       || f_price | decimal(8,2) | NO   |     | NULL    |       |+---------+--------------+------+-----+---------+-------+4 rows in set (0.06 sec)mysql> desc suppliers;+--------+----------+------+-----+---------+----------------+| Field  | Type     | Null | Key | Default | Extra          |+--------+----------+------+-----+---------+----------------+| s_id   | int(11)  | NO   | PRI | NULL    | auto_increment || s_name | char(50) | NO   |     | NULL    |                || s_city | char(50) | YES  |     | NULL    |                || s_zip  | char(10) | YES  |     | NULL    |                || s_call | char(50) | NO   |     | NULL    |                |+--------+----------+------+-----+---------+----------------+5 rows in set (0.00 sec)

Vous pouvez voir que les tables de fruits et de fournisseurs ont le même champ de type de données s_id, et que les deux tables sont connectées via le champ s_id.

Ensuite, interrogez les champs f_name et f_price de la table fruits, et interrogez le s_id et s_name de la table des fournisseurs. L'instruction SQL est la suivante :

mysql> select suppliers.s_id,s_name,f_name,f_price    -> from fruits,suppliers    -> where fruits.s_id=suppliers.s_id;+------+----------------+------------+---------+| s_id | s_name         | f_name     | f_price |+------+----------------+------------+---------+|  104 | FNK Inc.       | lemon      |    6.40 ||  101 | FastFruit Inc. | apple      |    5.20 ||  103 | ACME           | apricot    |    2.20 ||  101 | FastFruit Inc. | blackberry |   10.20 ||  104 | FNK Inc.       | berry      |    7.60 ||  107 | DK Inc         | xxxx       |    3.60 ||  102 | LT Supplies    | orange     |   11.20 ||  105 | Good Set       | melon      |    8.20 ||  101 | FastFruit Inc. | cherry     |    3.20 ||  106 | Just Eat Ours  | mango      |   15.70 ||  105 | Good Set       | xbabay     |    2.60 ||  105 | Good Set       | xxtt       |   11.60 ||  103 | ACME           | coconut    |    9.20 ||  102 | LT Supplies    | banana     |   10.30 ||  102 | LT Supplies    | grape      |    5.30 ||  107 | DK Inc         | xbabay     |    3.60 |+------+----------------+------------+---------+16 rows in set (0.00 sec)
  • Remarque : Parce que. les champs de la table fruits et de la table fournisseurs ont le même champ s_id, donc lors de la comparaison, le nom de la table doit être entièrement qualifié au format "nom de la table.nom de la colonne". Si seul s_id est donné, MySQL ne saura pas lequel. celui auquel il fait référence et renverra un message d’erreur.

[Exemple 2] Utilisez la syntaxe de jointure interne pour effectuer une requête de jointure interne entre la table des fruits et la table des fournisseurs. L'instruction SQL est la suivante :

mysql> select suppliers.s_id,s_name,f_name,f_price    -> from fruits inner join suppliers    -> on fruits.s_id = suppliers.s_id;+------+----------------+------------+---------+| s_id | s_name         | f_name     | f_price |+------+----------------+------------+---------+|  104 | FNK Inc.       | lemon      |    6.40 ||  101 | FastFruit Inc. | apple      |    5.20 ||  103 | ACME           | apricot    |    2.20 ||  101 | FastFruit Inc. | blackberry |   10.20 ||  104 | FNK Inc.       | berry      |    7.60 ||  107 | DK Inc         | xxxx       |    3.60 ||  102 | LT Supplies    | orange     |   11.20 ||  105 | Good Set       | melon      |    8.20 ||  101 | FastFruit Inc. | cherry     |    3.20 ||  106 | Just Eat Ours  | mango      |   15.70 ||  105 | Good Set       | xbabay     |    2.60 ||  105 | Good Set       | xxtt       |   11.60 ||  103 | ACME           | coconut    |    9.20 ||  102 | LT Supplies    | banana     |   10.30 ||  102 | LT Supplies    | grape      |    5.30 ||  107 | DK Inc         | xbabay     |    3.60 |+------+----------------+------------+---------+16 rows in set (0.00 sec)
  • Utilisez la définition de la clause Where. Les conditions de connexion sont relativement simples et claires, et la syntaxe de jointure interne est la spécification standard d'ANSI SQL. L'utilisation de la syntaxe de connexion de jointure interne peut garantir que les conditions de connexion ne sont pas oubliées et que la clause Where affectera les performances de la requête. un certain point.

Si les deux tables impliquées dans une requête de jointure sont la même table, ce type de requête est appelé requête d'auto-jointure. L'auto-jointure est une jointure interne spéciale, ce qui signifie que les tables connectées les unes aux autres sont physiquement la même table, mais peuvent être logiquement divisées en deux tables.

[Exemple 3] Interrogez les types de fruits fournis par le fournisseur de fruits fournissant f_id='a1' L'instruction SQL est la suivante :

mysql> select f1.f_id,f1.f_name    -> from fruits as f1,fruits as f2    -> where f1.s_id =f2.s_id and f2.f_id ='a1';+------+------------+| f_id | f_name     |+------+------------+| a1   | apple      || b1   | blackberry || c0   | cherry     |+------+------------+3 rows in set (0.00 sec)

(2), requête de jointure externe<.>
    Les requêtes de jointure externe interrogeront les lignes associées dans plusieurs tables.
  • Lors de la jointure interne, seules les lignes de l'ensemble de résultats de la requête qui répondent aux conditions de requête et de connexion sont renvoyées. Mais il est parfois nécessaire d'inclure des données dans des lignes non liées, c'est-à-dire que le jeu de résultats de requête renvoyé inclut non seulement les lignes qui remplissent les conditions de jointure, mais inclut également la table de gauche (jointure externe gauche ou jointure gauche), la table de droite (jointure droite jointure externe ou jointure droite)) ou toutes les lignes de données de deux tables périphériques (jointure externe complète). Les jointures externes sont divisées en jointures externes gauches ou jointures gauches et jointures externes droites ou jointures droites :
①Jointure gauche : renvoie tous les enregistrements de la table de gauche et les enregistrements avec des champs de jointure égaux dans la table de droite.

②Jointure à droite : renvoie les enregistrements, y compris les enregistrements de la table de droite et les champs de jointure de la table de gauche qui sont égaux.

1. Joindre à gauche

left join

Créez d'abord la table des commandes, l'instruction SQL est la suivante ;

mysql> create table orders    -> (
    -> o_num int not null auto_increment,
    -> o_date datetime not null,
    -> c_id int not null,
    -> primary key (o_num)
    -> );Query OK, 0 rows affected (0.11 sec)mysql> insert into orders(o_num,o_date,c_id)
    -> values(30001,'2008-09-01',10001),
    -> (30002,'2008-09-12',10003),
    -> (30003,'2008-09-30',10004),
    -> (30004,'2008-10-03',10005),
    -> (30005,'2008-10-08',10001);Query OK, 5 rows affected (0.06 sec)Records: 5  Duplicates: 0  Warnings: 0
[Exemple] Dans la table des clients et la table des commandes, interrogez tous les clients, y compris les clients sans commandes, l'instruction SQL est la suivante :

mysql> select * from customers;+-------+----------+---------------------+---------+--------+-----------+-------------------+| c_id  | c_name   | c_address           | c_city  | c_zip  | c_contact | c_email           |+-------+----------+---------------------+---------+--------+-----------+-------------------+| 10001 | redhool  | 200 Street          | Tianjin | 300000 | LiMing    | LMing@163.com     || 10002 | Stars    | 333 Fromage Lane    | Dalian  | 116000 | Zhangbo   | Jerry@hotmail.com || 10003 | Netbhood | 1 Sunny Place       | Qingdao | 266000 | LuoCong   | NULL              || 10004 | JOTO     | 829 Riverside Drive | Haikou  | 570000 | YangShan  | sam@hotmail.com   |+-------+----------+---------------------+---------+--------+-----------+-------------------+4 rows in set (0.00 sec)mysql> select * from orders;+-------+---------------------+-------+| o_num | o_date              | c_id  |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)mysql>  select customers.c_id , orders.o_num    -> from customers left outer join orders    -> on customers.c_id = orders.c_id;+-------+-------+| c_id  | o_num |+-------+-------+| 10001 | 30001 || 10003 | 30002 || 10004 | 30003 || 10001 | 30005 || 10002 |  NULL |+-------+-------+5 rows in set (0.00 sec)
2. Jointure à droite

right join

    La jointure de droite est la jointure inversée de la jointure de gauche. et renverra toutes les lignes du bon tableau. Si une ligne du tableau de droite n'a aucune ligne correspondante dans le tableau de gauche, le tableau de gauche renverra une valeur nulle.
[Exemple] Dans la table clients et la table commandes, interrogez toutes les commandes, y compris les commandes sans clients, l'instruction SQL est la suivante :

mysql> select customers.c_id, orders.o_num    -> from customers right outer join orders    -> on customers.c_id = orders.c_id;+-------+-------+| c_id  | o_num |+-------+-------+| 10001 | 30001 || 10003 | 30002 || 10004 | 30003 ||  NULL | 30004 || 10001 | 30005 |+-------+-------+5 rows in set (0.00 sec)

(3), conditions composées Requête de connexion
    Une requête de connexion conditionnelle complexe consiste à ajouter des conditions de filtrage pour limiter les résultats de la requête pendant le processus de requête de connexion, rendant les résultats de la requête plus précis.
[Exemple 1] Dans la table clients et la table commandes, utilisez la syntaxe de jointure interne pour interroger la table clients afin de résumer les informations de commande du client avec l'ID 10001. L'instruction SQL est la suivante :

mysql> select customers.c_id,orders.o_num    -> from customers inner join orders    -> on customers.c_id = orders.c_id and customers.c_id = 10001;+-------+-------+| c_id  | o_num |+-------+-------+| 10001 | 30001 || 10001 | 30005 |+-------+-------+2 rows in set (0.00 sec)
[ Exemple 2] Entre la table des fruits et la table des fournisseurs, utilisez la syntaxe de jointure interne pour effectuer une requête de jointure interne et trier les résultats de la requête :

mysql> select suppliers.s_id,s_name,f_name,f_price    -> from fruits inner join suppliers    -> on fruits.s_id = suppliers.s_id    -> order by fruits.s_id;+------+----------------+------------+---------+| s_id | s_name         | f_name     | f_price |+------+----------------+------------+---------+|  101 | FastFruit Inc. | apple      |    5.20 ||  101 | FastFruit Inc. | blackberry |   10.20 ||  101 | FastFruit Inc. | cherry     |    3.20 ||  102 | LT Supplies    | orange     |   11.20 ||  102 | LT Supplies    | banana     |   10.30 ||  102 | LT Supplies    | grape      |    5.30 ||  103 | ACME           | apricot    |    2.20 ||  103 | ACME           | coconut    |    9.20 ||  104 | FNK Inc.       | lemon      |    6.40 ||  104 | FNK Inc.       | berry      |    7.60 ||  105 | Good Set       | melon      |    8.20 ||  105 | Good Set       | xbabay     |    2.60 ||  105 | Good Set       | xxtt       |   11.60 ||  106 | Just Eat Ours  | mango      |   15.70 ||  107 | DK Inc         | xxxx       |    3.60 ||  107 | DK Inc         | xbabay     |    3.60 |+------+----------------+------------+---------+16 rows in set (0.00 sec)
.

Plus de recommandations d'apprentissage gratuites associées :tutoriel mysql(vidéo)

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer