Maison > base de données > tutoriel mysql > mysql gauche, droite, jointure interne

mysql gauche, droite, jointure interne

黄舟
Libérer: 2017-01-16 13:06:08
original
1465 Les gens l'ont consulté

Connexions gauche et droite

Méthode de multiplication complète (très inefficace)

mysql> select * from test10;
+------+-------+
| id | sname |
+------+-------+
| 1 | 云彩 | 
| 2 | 月亮 | 
| 3 | 星星 | 
+------+-------+
Copier après la connexion

3 lignes par ensemble (0,00 sec)

mysql> select * from test11;
+--------+-------+
| cat_id | cname |
+--------+-------+
| 95 | 猴子 | 
| 96 | 老虎 | 
+--------+-------+
Copier après la connexion

2 lignes dans un ensemble (0,00 sec)

L'effet de la réalisation de deux tables* dans la base de données

mysql> select * from test10,test11;
+------+-------+--------+-------+
| id | sname | cat_id | cname |
+------+-------+--------+-------+
| 1 | 云彩 | 95 | 猴子 | 
| 1 | 云彩 | 96 | 老虎 | 
| 2 | 月亮 | 95 | 猴子 | 
| 2 | 月亮 | 96 | 老虎 | 
| 3 | 星星 | 95 | 猴子 | 
| 3 | 星星 | 96 | 老虎 | 
+------+-------+--------+-------+
Copier après la connexion

6 lignes dans un ensemble (0,03 sec)

Analyse :
test10 est considéré comme un ensemble à trois éléments
test11 est considéré comme un ensemble à deux éléments

test10*test11 est un nouvel ensemble à six éléments
Les rangées de les deux tables sont identiques. Multipliez la colonne
et additionnez les numéros de colonne des deux tables (peut être répété)

Lorsque les noms de colonnes sont répétés lors d'une requête multi-tables, vous devez l'indiquer clairement. quelle table est obtenue

mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category limit 3;
+----------+--------+--------------------+--------+----------+
| goods_id | cat_id | goods_name | cat_id | cat_name |
+----------+--------+--------------------+--------+----------+
| 1 | 4 | KD876 | 1 | 手机类型 | 
| 4 | 8 | htcN85原装充电器 | 1 | 手机类型 | 
| 3 | 8 | 诺基亚原装5800耳机 | 1 | 手机类型 | 
+----------+--------+--------------------+--------+----------+
Copier après la connexion

Astuce : Créez une table avec la même structure, créez une table [nouveau nom de la table] comme [ancien nom de la table]
créez une table de mini-biens comme des marchandises ;

Copier une partie du contenu de la table

mysql> insert into minigoods
-> select * from goods limit 3;
Copier après la connexion

Obtenir le minigoods.cat_id=category.cat_id correspondant de deux tables significatives

mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category where minigoods.cat_id=category.cat_id ;
+----------+--------+--------------------+--------+----------+
| goods_id | cat_id | goods_name | cat_id | cat_name |
+----------+--------+--------------------+--------+----------+
| 1 | 4 | KD876 | 4 | 3G手机 | 
| 4 | 8 | htcN85原装充电器 | 8 | 耳机 | 
| 3 | 8 | 诺基亚原装5800耳机 | 8 | 耳机 | 
+----------+--------+--------------------+--------+----------+
Copier après la connexion

3 lignes dans set (0,00 sec)

Syntaxe de jointure à gauche
La table a est à gauche, ne bouge pas
La table b est à droite, se déplace
La table a et la table b utilisent une relation (set par vous-même) pour filtrer les lignes de b requises par a

a left join b sur [Condition] ----Si la condition est vraie, retirez la ligne de b

a left join b on [Condition] L'ensemble de résultats peut également être considéré comme une table (supposée être la table c), oui Interrogez-le à nouveau

mysql> select goods_id,goods_name,cat_name 
-> from
-> (minigoods left join category on minigoods.cat_id=category.cat_id); 
+----------+--------------------+----------+
| goods_id | goods_name | cat_name |
+----------+--------------------+----------+
| 1 | KD876 | 3G手机 | 
| 4 | htcN85原装充电器 | 耳机 | 
| 3 | 诺基亚原装5800耳机 | 耳机 | 
+----------+--------------------+----------+
Copier après la connexion

[les minigoods ont quitté la catégorie des minigoods .cat_id=category.cat_id considéré comme une table c]
Vérification : vous pouvez toujours utiliser où plus tard, etc. Condition de filtre

mysql> select goods_id,goods_name,cat_name from 
(minigoods left join category on minigoods.cat_id=category.cat_id )
where 1 order by goods_id desc limit 2; 
+----------+--------------------+----------+
| goods_id | goods_name | cat_name |
+----------+--------------------+----------+
| 4 | htcN85原装充电器 | 耳机 | 
| 3 | 诺基亚原装5800耳机 | 耳机 | 
+----------+--------------------+----------+
Copier après la connexion

2 lignes dans l'ensemble (0,00 sec)

Vous pouvez joindre plusieurs tables à gauche, c'est-à-dire que le résultat est considéré comme une table
Table

{{a left join b on [条件]} left join c on [条件]} 
mysql> select goods.goods_id,goods.goods_name,goods.cat_id,cat_name
-> from
-> minigoods left join category on minigoods.cat_id=category.cat_id
-> left join goods on minigoods.cat_id=4 limit 4;
+----------+--------------------+--------+----------+
| goods_id | goods_name | cat_id | cat_name |
+----------+--------------------+--------+----------+
| 1 | KD876 | 4 | 3G手机 | 
| 4 | htcN85原装充电器 | 8 | 3G手机 | 
| 3 | 诺基亚原装5800耳机 | 8 | 3G手机 | 
| 5 | 索爱原装M2卡读卡器 | 11 | 3G手机 | 
+----------+--------------------+--------+----------+
Copier après la connexion

La différence entre les connexions gauche et droite==== ============================ ======================= ============================ =================

a jointure gauche b on signifie une requête basée sur a lors de l'interrogation
a jointure droite b on signifie requête lors d'une interrogation avec b comme base

a jointure gauche b on est équivalente à b jointure droite a (les deux sont interrogés avec a comme base)

Conseils : En termes de compatibilité et de compréhension du portage, le meilleur Il est préférable de toujours utiliser les jointures gauches pour obtenir

create table boy(
bname varchar(20),
other char(1)
)engine myisam charset utf8;
insert into boy
values
('屌丝','A'),
('李四','B'),
('王五','C'),
('高富帅','D'),
('郑七','E');
Copier après la connexion
create table girl(
gname varchar(20),
other char(1)
)engine myisam charset utf8;
insert into girl
values
('空姐','B'),
('大S','C'),
('阿娇','D'),
('张柏芝','D'),
('林黛玉','E'),
('宝钗','F');
Copier après la connexion

Supprimer les conjoints de tous les garçons (rejoindre à gauche)

select boy.*,girl.* from
boy left join girl on
boy.other=girl.other;
+--------+-------+--------+-------+
| bname | other | gname | other |
+--------+-------+--------+-------+
| 屌丝 | A | NULL | NULL | 
| 李四 | B | 空姐 | B | 
| 王五 | C | 大S | C | 
| 高富帅 | D | 阿娇 | D | 
| 高富帅 | D | 张柏芝 | D | 
| 郑七 | E | 林黛玉 | E | 
+--------+-------+--------+-------+
Copier après la connexion

Supprimer les conjoints de toutes les filles (rejoindre à gauche)

mysql> select girl.*,boy.* from
-> girl left join boy on 
-> boy.other=girl.other;
+--------+-------+--------+-------+
| gname | other | bname | other |
+--------+-------+--------+-------+
| 空姐 | B | 李四 | B | 
| 大S | C | 王五 | C | 
| 阿娇 | D | 高富帅 | D | 
| 张柏芝 | D | 高富帅 | D | 
| 林黛玉 | E | 郑七 | E | 
| 宝钗 | F | NULL | NULL | 
+--------+-------+--------+-------+
Copier après la connexion

Retirer les conjoints de toutes les filles (jointure à droite, cohérente avec la jointure à gauche ci-dessus)

mysql> select girl.* ,boy.* from
-> boy right join girl on
-> boy.other=girl.other;
+--------+-------+--------+-------+
| gname | other | bname | other |
+--------+-------+--------+-------+
| 空姐 | B | 李四 | B | 
| 大S | C | 王五 | C | 
| 阿娇 | D | 高富帅 | D | 
| 张柏芝 | D | 高富帅 | D | 
| 林黛玉 | E | 郑七 | E | 
| 宝钗 | F | NULL | NULL | 
+--------+-------+--------+-------+
Copier après la connexion

Jointure interne ===== =============== =================================== ================ =============================

Sortir le conjoint

select girl.*,boy.* from
boy inner join girl on 
boy.other=girl.other;
+--------+-------+--------+-------+
| gname | other | bname | other |
+--------+-------+--------+-------+
| 空姐 | B | 李四 | B | 
| 大S | C | 王五 | C | 
| 阿娇 | D | 高富帅 | D | 
| 张柏芝 | D | 高富帅 | D | 
| 林黛玉 | E | 郑七 | E | 
+--------+-------+--------+-------+
Copier après la connexion

La jointure interne est l'intersection des jointures gauche et droite
(la jointure externe est l'union des jointures gauche et droite, qui n'est pas prise en charge par MySQL. Vous pouvez utiliser l'union pour y parvenir<🎜). >
Application de jointure à gauche=========================================== === ================================================ === ======

create table match_t(
match_id int primary key auto_increment,
host_team_id int,
guest_team_id int,
match_result varchar(20),
match_time date
)engine myisam charset utf8;
insert into match_t
values
(1,1,2,&#39;2:0&#39;,&#39;2006-05-21&#39;),
(2,2,3,&#39;1:2&#39;,&#39;2006-06-21&#39;),
(3,3,1,&#39;2:5&#39;,&#39;2006-07-21&#39;),
(4,1,1,&#39;3:2&#39;,&#39;2006-08-21&#39;);
create table team_t(
team_id int primary key auto_increment,
team_name varchar(20)
)engine myisam charset utf8;
insert into team_t
values
(1,&#39;恒大&#39;),
(2,&#39;国安&#39;),
(3,&#39;申花&#39;),
(4,&#39;大连&#39;);
mysql> select * from match_t;
+----------+--------------+---------------+--------------+------------+
| match_id | host_team_id | guest_team_id | match_result | match_time |
+----------+--------------+---------------+--------------+------------+
| 1 | 1 | 2 | 2:0 | 2006-05-21 | 
| 2 | 2 | 3 | 1:2 | 2006-06-21 | 
| 3 | 3 | 1 | 2:5 | 2006-07-21 | 
| 4 | 4 | 1 | 3:2 | 2006-08-21 | 
+----------+--------------+---------------+--------------+------------+
mysql> select * from team_t;
+---------+-----------+
| team_id | team_name |
+---------+-----------+
| 1 | 恒大 | 
| 2 | 国安 | 
| 3 | 申花 | 
| 4 | 大连 | 
+---------+-----------+
Copier après la connexion
Technique : Tapez et donnez à la table son alias


Remplacez la bataille dans la table par le nom de l'équipe après la date de 2006-06-21

select host_t.team_name,guest_t.team_name,match_result,match_time from
match_t left join (team_t as host_t) on match_t.host_team_id=host_t.team_id
left join (team_t as guest_t) on match_t.guest_team_id=guest_t.team_id
where match_time>=&#39;2006-06-21&#39;;
+--------------+-----------+---------------+-----------+--------------+------------+
| host_team_id | team_name | guest_team_id | team_name | match_result | match_time |
+--------------+-----------+---------------+-----------+--------------+------------+
| 1 | 恒大 | 2 | 国安 | 2:0 | 2006-05-21 | 
| 2 | 国安 | 3 | 申花 | 1:2 | 2006-06-21 | 
| 3 | 申花 | 1 | 恒大 | 2:5 | 2006-07-21 | 
| 4 | 大连 | 1 | 恒大 | 3:2 | 2006-08-21 | 
+--------------+-----------+---------------+-----------+--------------+------------+
Copier après la connexion
Ce qui précède est le contenu des connexions mysql gauche, droite et interne. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn). )!


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal