Maison  >  Article  >  base de données  >  L'utilisation de base de mysql left join et la différence entre on etwhere

L'utilisation de base de mysql left join et la différence entre on etwhere

WBOY
WBOYavant
2023-06-02 23:54:361700parcourir

Préface

Lorsque nous écrivons des instructions SQL, nous ne pouvons pas éviter d'utiliser des mots-clés de connexion, tels que des connexions internes et des connexions externes. Il en existe de nombreux types, je posterai ici une photo que j'ai trouvée ailleurs :

Lutilisation de base de mysql left join et la différence entre on etwhere

Je trouve que cette photo est très détaillée, elle montre Hors du commun types dans les instructions SQL, prenez la jointure gauche dans cet article comme exemple. Elle est définie en ligne comme ceci : Le mot-clé LEFT JOIN renverra toutes les lignes de la table de gauche, même s'il n'y a aucune ligne correspondante dans la table de droite.

En fait, en termes de sens littéral, left join est relativement facile à comprendre, mais dans le processus d'utilisation, il y aura encore quelques problèmes, comme l'état après et après où , leurs résultats sont complètement différents. Ensuite, nous découvrirons la jointure gauche de superficielle à profonde.

Instance

CREATE TABLE `class` (
  `class_id` int NOT NULL,
  `class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `class_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`class_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

tableau de score :

CREATE TABLE `score` (
  `class_id` int NOT NULL,
  `stu_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `score` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

Ils ont chacun des données :

Lutilisation de base de mysql left join et la différence entre on etwhere#🎜🎜 #

Lutilisation de base de mysql left join et la différence entre on etwhere

Q1 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c, rejoignez le score s sur c.class_id =s.class_id.

Cette phrase peut être réécrite comme suit : Nous avons analysé cette instruction. La table de gauche est la table des classes, la table de droite est la table des scores et leur champ associé est class_id. Lorsque le class_id dans la table de gauche est 1, il y a deux enregistrements dans la table de droite avec class_id 1 ; lorsque le class_id dans la table de gauche est 2, le class_id dans les deux enregistrements de la table de droite est 2 ; la table de gauche est 3, il y a un enregistrement dans la table de droite. Le class_id de l'enregistrement est 3, nous devrions donc obtenir cinq enregistrements :

1	语文	A	A002	82
1	语文	A	A001	91
2	数学	B	A002	87
2	数学	B	A001	95
3	英语	C	B003	65

Q2 : sélectionnez c.class_id,c.class_name,c. class_grade,s.stu_id,s.score de la classe c ont rejoint le score s sur c.class_id=s.class_id et s.score=90.

Sur la base de l'exemple de la première question, celle-ci a une condition supplémentaire de s.score=90. Cela signifie que le champ de score du tableau de droite est de 90, mais quand on regarde les données du tableau. , on constate qu'il n'y a pas de score dans le tableau de droite 90, OK, le résultat sera-t-il vide ? Après tout, le tableau de droite ne contient pas de données répondant aux conditions.

En fait, si vous exécutez cette instruction SQL, vous finirez par obtenir le résultat, mais vous n'obtiendrez que trois données. Tous les champs du tableau de gauche sont affichés, et tous les champs du tableau de gauche. la table de droite correspond à Vide, car il n'y a aucun enregistrement dans la table de droite avec un score de 90, donc les champs de la table de droite sont vides.

on filtre d'abord les données, puis les connecte, tandis que Where filtre les données après avoir effectué une requête associée entre les deux tables. La différence entre on et Where est ici, et les exemples suivants sont également ces deux. des différences seront impliquées.

1	语文	A		
2	数学	B		
3	英语	C

Q3 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c, rejoignez le score s sur c.class_id=s.class_id où c.class_name =«chinois» et s.score=90.

Vous devez faire attention à la différence entre Where et On, car cette instruction implique le mot-clé Where. Le résultat de la requête de ce SQL est vide. En effet, les deux tables sont d'abord connectées pour interroger les résultats, puis filtrées. Le résultat de la requête de la table connectée est qu'il n'y a aucun enregistrement correspondant à class_name=‘中文’ , et score=90, donc le résultat de la requête est vide.

Q4 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c, rejoignez le score s sur c.class_id=s.class_id et 1=0.

On ajoute parfois 1=1 après la condition Where de SQL, et 1=0 signifie ici que l'association entre les deux tables a échoué, le résultat n'affichera donc que les données de la table de gauche.

1	语文	A	null	null
2	数学	B	null	null
3	英语	C	null	null

Q5 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c gauche rejoindre le score s sur 1=0.

Le résultat de l'exécution est le même que l'instruction SQL ci-dessus. En fait, tout le contenu de la table de gauche est affiché.

1	语文	A	null	null
2	数学	B	null	null
3	英语	C	null	null

Q6 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c, rejoignez le score s sur c.class_id=s.class_id et c.class_name =«chinois».

Cela doit filtrer les enregistrements avec class_name comme langue dans la table de droite, il y en a deux, puis relier les deux enregistrements dans la table de gauche, il n'est donc pas difficile de voir qu'il y en a quatre résultats :

1	语文	A	A002	82
1	语文	A	A001	91
2	数学	B	null	null
3	英语	C	null	null

Q7 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c, rejoignez le score s sur c.class_id=s.class_id et c .class_name=‘Anglais’.

L'analyse est la même que la question précédente (le résultat dans la zone vide est nul) :

1	语文	A		
2	数学	B		
3	英语	C	B003	65

Q8 : sélectionnez c.class_id,c.class_name,c.class_grade ,s.stu_id, s.score de la classe c ont rejoint le score s sur c.class_id=s.class_id et c.class_name=‘sports’.

Il n'y a pas de données dans le tableau de droite et le nom_classe est sports, donc le tableau de droite est vide et toutes les données du tableau de gauche sont affichées. Les champs correspondants dans le tableau de droite sont vides : #. 🎜🎜#
1	语文	A		
2	数学	B		
3	英语	C

Q9 : sélectionnez c.class_id,c.class_name,c.class_grade,s.stu_id,s.score de la classe c, rejoignez le score s sur c.class_id=s.class_id et c.class_name= «中文’ et s.

右表中只有一条记录的score为91,所以需要拿左表与右表的这一条数据进行关联,左表只有语文可以与右表的那一条数据对上,所以结果为:

1	语文	A	A001	91
2	数学	B		
3	英语	C

Q10:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘体育’ and s.score=90。

右表中没有数据的score为90,同样左表中也没有class_name为体育,但是这并不意味着最后的结果就是空了,只要没有where条件,最终的结果数量最起码也会是左表中原先的数据数量,所以这条sql会返回左表的全部数据。

1	语文	A		
2	数学	B		
3	英语	C

Q11:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘英语’。

需要注意的点:条件是在where中的,也就是在表关联之后,再进行过滤的,所以最终的结果只会有一条:

3	英语	C	B003	65

Q12:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where s.score=91。

和上面一样,是在连表查询之后,找出score=90的数据:

1	语文	A	A001	91

Q12;select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘语文’ and s.score=91。

我们将两表连接查询后,找出结果中class_name为语文,score为91的记录,只有一条:

1	语文	A	A001	91

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