Maison > Article > base de données > L'utilisation de base de mysql left join et la différence entre on etwhere
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 :
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.
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 :
#🎜🎜 #
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 65Q2 : 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.
1 语文 A 2 数学 B 3 英语 CQ3 : 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 nullQ5 : 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 nullQ6 : 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 nullQ7 : 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 65Q8 : 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!