Connexion MySQL (Join) et intersection et différence MySQL


Relations de collection communes

Insérez la description de l'image ici

Image reproduite à partir de: https://blog.csdn.net/wizblack/article/details/78796557?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161640078616780261998398%2522%252C%2522s201%325cm%30425% 2522% 257D & request_id = 161640078616780261998398 & biz_id = 0 & utm_medium = distribuer.pc_search_result.none-task-blog-2 all baidu_landing_v2 ~ default-1-78796557.first_rank_v2_pc_rank_v29 & utm_rank_v2_pc_rank_v29 & utm% A5% 9% E9% E9% E9% E9% A5% E9% E9% E9% 9B% 86


Les connexions (Join) prévues dans la norme SQL sont à peu près divisées en quatre types suivants:

  • 1. 内联结: Les enregistrements des deux tables dont les champs de la relation de connexion correspondent à la relation de connexion forment la connexion du jeu d'enregistrements.
  • 2. 外联结: Divisé en connexion externe gauche et connexion externe droite.
    • 左联结Les tableaux A et B désignent la connexion du jeu d'enregistrements formé en reliant tous les enregistrements de la table A et les champs de la table B aux enregistrements dans lesquels le champ de connexion de la table A remplit les conditions de connexion. Notez ici que le dernier jeu d'enregistrements comprend tous les enregistrements du tableau A.
    • 右联结A, B résultats et a quitté la table rejoindre B, un résultat est le même, c'est-à-dire: Select A.name B.name From A Left Join B On A.id=B.idet la Select A.name B.name From B Right Join A on B.id=A.idmise en œuvre des résultats est la même.
  • 3. 全联结: Retirez tous les enregistrements des champs dans les deux tables qui ont la relation de connexion pour former la connexion du jeu d'enregistrements (cela n'a pas besoin d'être rappelé, tant que le champ de la table mentionné dans la requête sera pris que les conditions de connexion soient remplies ou non, cela n'a donc pas beaucoup d'importance).
  • 4. 无联结: Il n'est pas nécessaire de l'expliquer, même si la fonction de connexion n'est pas utilisée, il y a aussi une vue de l'auto-connexion.

UTILISATION (liste_colonne): Sa fonction est de faciliter l'écriture de plusieurs correspondances de la connexion. Dans la plupart des cas, la phrase USING peut être remplacée par la phrase ON, comme le montre l'exemple suivant :,
a LEFT JOIN b USING (c1,c2,c3)sa fonction est équivalente à la phrase suivante en utilisant uniquement ON à la place d'écriture, ce sera plus gênant à écrire.
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3

mysql> desc A;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES |     | NULL    |       |
| name | varchar(10) | YES | MUL | NULL    |       |
| addr | varchar(5) | YES |     | NULL    |       |
| age   | int(11)     | YES |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> desc B;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES |     | NULL    |       |
| name | varchar(10) | YES | MUL | NULL    |       |
| addr | varchar(5) | YES |     | NULL    |       |
| age   | int(11)     | YES |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> select * from A;
+------+------------+------+------+
| id   | name       | addr | age |
+------+------------+------+------+
|    1 | kenthy     | wh   |   25 |
|    2 | jimmy      | wh   |   26 |
|    3 | kenthyzhan | sz   |   26 |
|    4 | jiemzhang | sh   |   24 |
+------+------------+------+------+
4 rows in set (0.00 sec)
mysql> select * from B;
+------+------------+------+------+
| id   | name       | addr | age |
+------+------------+------+------+
|    1 | kenthy     | wh   |   25 |
|    2 | jimmy      | wh   |   28 |
|    3 | kenthyzhan | sz   |   26 |
+------+------------+------+------+
3 rows in set (0.00 sec)

Intersection

mysql> select A.* from A inner join B using(name,addr,age);
+------+------------+------+------+
| id   | name       | addr | age |
+------+------------+------+------+
|    1 | kenthy     | wh   |   25 |
|    3 | kenthyzhan | sz   |   26 |
+------+------------+------+------+
2 rows in set (0.00 sec)

Différence A:

(S'il apparaît dans A mais n'apparaît pas dans B, vous pouvez remplacer la jointure gauche par la jointure droite en conséquence)

mysql> select A.* from A left join B using(name,addr,age) where B.name is NULL;
+------+-----------+------+------+
| id   | name      | addr | age |
+------+-----------+------+------+
|    2 | jimmy     | wh   |   26 |
|    4 | jiemzhang | sh   |   24 |
+------+-----------+------+------+
2 rows in set (0.00 sec)

Différence B

(Apparaît en B mais n'apparaît pas en A)

mysql> select B.* from B left join A using(name,addr,age) where A.id is NULL;
+------+-------+------+------+
| id   | name | addr | age |
+------+-------+------+------+
|    2 | jimmy | wh   |   28 |
+------+-------+------+------+
1 row in set (0.00 sec)

Différence partielle: (Les données de A n'existent pas dans la partie spécifique de B)

select A.name,A.addr,A.age from A left join (select * from B where name='kenthy') as C using(name, addr, age) where C.id is NULL;
+------------+------+------+
| name       | addr | age |
+------------+------+------+
| jiemzhang | sh   |   24 |
| jimmy      | wh   |   26 |
| kenthyzhan | sz   |   26 |
+------------+------+------+
3 rows in set (0.00 sec)

En termes simples:

A   left   join   B   的连接的记录数与A表的记录数同 
A   right  join   B   的连接的记录数与B表的记录数同    
A   left   join   B   等价  B   right   join   A

Je suppose que tu aimes

Origine blog.csdn.net/qq_45797116/article/details/115082375
conseillé
Classement