Instructions de requête avancées SQL de base de données : requête d'agrégation, requête multi-table, requête de jointure

Créer une table d'étudiant

Créer des tableaux d'étudiants et de cours

CREATE TABLE Students (
    StudentID int PRIMARY KEY,
    Name varchar(255),
    Gender varchar(1),
    Age int,
    City varchar(255)
);
INSERT INTO Students VALUES(1, 'David', 'M', 21, 'Shanghai');
INSERT INTO Students VALUES(2, 'Kevin', 'M', 19, 'Beijing');
INSERT INTO Students VALUES(3, 'Emily', 'F', 22, 'Shanghai');
INSERT INTO Students VALUES(4, 'William', 'M', 20, 'New York City');
INSERT INTO Students VALUES(5, 'Alice', 'F', 19, 'Los Angeles');
INSERT INTO Students VALUES(6, 'Frank', 'F', 22, 'Los Angeles');
CREATE TABLE Courses (
    CourseID int PRIMARY KEY,
    CourseName varchar(255)
);
INSERT INTO Courses VALUES(1, 'CS101');
INSERT INTO Courses VALUES(2, 'CS202');
INSERT INTO Courses VALUES(3, 'EE101');

Requête d'agrégation

Insérer la description de l'image ici

fonction d'agrégation

demande directe

SELECT COUNT(*) FROM Students;

Insérer la description de l'image ici

Configurer une requête d'alias

SELECT COUNT(*) AS StudentsNum FROM Students;

Définir une requête conditionnelle

L'utilisation de COUNT(*) et COUNT(StudentID) a le même effet, car StudentID est la clé primaire et la clé primaire de chaque ligne d'enregistrements est différente. De plus, nous pouvons toujours utiliser la clause WHERE dans la requête d'agrégation. Par exemple, si nous voulons connaître le nombre d'étudiants dont l'âge est supérieur à 20 ans , nous pouvons utiliser l'instruction SQL suivante :

SELECT COUNT(*) FROM Students AS s WHERE s.age > 20; 

Fonctions d'agrégation couramment utilisées

Description de la fonction
SUM Calculer la somme d'une colonne, la colonne doit être de type numérique
AVG Calculer la moyenne d'une colonne, la colonne doit être de type numérique
MAX Calculer la valeur maximale d'une colonne
MIN Calculer la valeur minimale d'une colonne

Interroger l'âge moyen des étudiants

SELECT AVG(Age) FROM Students;

Utilisation des fonctions d'agrégation AVG
Insérer la description de l'image ici

Requête de groupe

Champ uniqueRegrouper par

Regroupez les étudiants en fonction de la ville et devez demander combien d'étudiants se trouvent dans chaque ville.

SELECT City, COUNT(*) FROM Students GROUP BY City;

Insérer la description de l'image ici

Requête du groupe de rapports d'erreurs

Si le nom est également indiqué dans le résultat de la requête, une erreur sera signalée, car il peut y avoir de nombreux étudiants de la même ville avec des noms différents, donc la déclaration suivante est illégale :

SELECT City, COUNT(*), Name FROM Students GROUP BY City;

Le message d'erreur est le suivant :
Insérer la description de l'image ici
L'expression n°3 de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée "tuling.Students.Name", qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY. ; ceci est cohérent avec sql_mode= only_full_group_by n'est pas compatible.

#3 fait référence à la colonne Nom

Requête de groupe multi-champs

GROUP BY peut également mettre plusieurs champs. Par exemple, si nous voulons regrouper les étudiants par ville d'abord, puis par sexe , nous pouvons utiliser l'instruction suivante :

SELECT City, Gender, COUNT(*) FROM Students GROUP BY City, Gender;

Insérer la description de l'image ici
Dans la table des étudiants, les deux personnes à Los Angeles ont le même sexe, l'affichage du groupe est F et le décompte est 2.
Insérer la description de l'image ici
Maintenant, je change le sexe de l'une d'elles en M. Le résultat de la requête changera-t-il ?

Ceux ayant le même emplacement mais des sexes différents ont été distingués.
Insérer la description de l'image ici
Vous pouvez voir que le nombre original pour Los Angeles est 2, mais maintenant il est devenu deux 1, et les genres M et F sont distingués.
Insérer la description de l'image ici

Requête multi-tables

En plus d'interroger les données d'une seule table, les requêtes SELECT peuvent également interroger les données de plusieurs tables. La syntaxe est la suivante :

demande directe

SELECT * FROM Students, Courses;

Le résultat de la requête est le produit cartésien des deux tables

En supposant que les étudiants ont 5 colonnes et 7 lignes et que les cours ont 2 colonnes et 3 lignes, le résultat est un tableau bidimensionnel avec 21 (3 * 7) lignes et 7 (5 + 2) colonnes, c'est-à-dire Étudiants Chaque ligne du tableau est associé à chaque ligne du tableau Cours. Le nombre de colonnes dans le jeu de résultats sera la somme du nombre de colonnes dans les deux tables et le nombre de lignes sera le produit du nombre de lignes dans les deux tables.
Insérer la description de l'image ici

Renommer la requête

Parfois, deux tables peuvent avoir des champs portant le même nom, et le résultat sera déroutant. Nous pouvons utiliser AS pour alias les champs afin de les distinguer. Par exemple, utilisez l’instruction suivante pour renommer StudentID et CourseID en StudentId et CourseId :

SELECT Students.StudentID AS StudentId, Courses.CourseID AS CourseId FROM Students, Courses;

La syntaxe d'alias des champs est similaire à column_name AS new_column_name. L'instruction ci-dessus alias StudentID et CoursesID respectivement en tant que StudentId et CourseId, bien que dans cet exemple, nous mettions simplement en minuscule la lettre finale D. Mais considérons une autre situation : supposons que le champ de clé primaire des étudiants et des cours s'appelle ID, alors cet alias est très utile, nous pouvons utiliser l'instruction suivante pour rendre les résultats de la requête plus clairs :

SELECT Students.ID AS StudentId, Courses.ID AS CourseId FROM Students, Courses;

En plus d'aliaser le champ de sortie, il est également utile d'aliaser la table. La syntaxe est similaire à l'alias table_name AS. Nous pouvons écrire l'instruction ci-dessus comme suit :

SELECT S.ID AS StudentId, C.ID AS CourseId FROM Students AS S, Courses AS C;

Créez une nouvelle colonne CourseID dans la table Étudiants

Dans les requêtes multi-tables, la clause WHERE peut toujours être utilisée. Afin d'aider tout le monde à comprendre le contenu suivant, nous devons ajouter un nouveau champ CourseID à Students, qui représente le cours choisi par cet étudiant :

Créer une nouvelle colonne de CourseID après City

alter table Students add column CourseID int(4) not null after City;

Insérer la description de l'image ici
La valeur de CouseID est définie sur la moitié de la valeur de StudentID

update Students set CourseID = StudentID/2

Insérer la description de l'image ici

Interrogez StudentID et le nom du cours correspondant

SELECT S.StudentID,C.CourseName 
FROM Students AS S,Courses AS C
WHERE S.CourseID = C.CourseID;

Insérer la description de l'image ici
Signalez une erreur ! ! ! Savez-vous pourquoi ? Généralement, les erreurs de syntaxe sont un problème avec les caractères chinois.

Students as S,Courses as C 这个逗号是中文字符,改成英文字符后运行成功啦

Insérer la description de l'image ici
En plus de la clause WHERE, d'autres clauses similaires à ORDER BY et GROUP BY conviennent également aux requêtes multi-tables.

En plus de la clause WHERE, d'autres clauses similaires à ORDER BY et GROUP BY conviennent également aux requêtes multi-tables.

Requête REJOINDRE

JOINTURE INTERNE

La requête de jointure est un autre type de requête multi-tables, qui effectue des opérations JOIN sur plusieurs tables. C'est-à-dire qu'il faut d'abord déterminer une table principale comme ensemble de résultats, puis « intégrer » sélectivement les enregistrements d'autres tables dans l'ensemble de résultats de la table principale.

Supposons que nous voulions connaître le nom du cours choisi par chaque étudiant. En plus de la requête multi-tables plus la clause WHERE mentionnée ci-dessus, nous pouvons également utiliser la clause INNER JOIN :

SELECT S.StudentID, C.CourseName 
FROM Students AS S 
INNER JOIN Courses AS C ON S.CourseID = C.CourseID;

Insérer la description de l'image ici
Cette instruction peut interroger chaque StudentID et son nom de cours correspondant. Veuillez noter que le processus d'exécution interne de l'instruction INNSER JOIN est le suivant :

  • 1 Déterminez la table principale, utilisez FROM table_name
  • 2 Confirmez ensuite la table connectée et utilisez INNER JOIN table_name
  • 3 Déterminez les conditions de connexion et utilisez la condition ON. La condition de l'instruction ci-dessus est S.CourseID = C.CourseID
  • 4 Enfin, nous pouvons ajouter : WHERE, ORDER BY et d'autres clauses
    . En plus de INNER JOIN, nous avons également LEFT JOIN, RIGHT JOIN et FULL JOIN.

Supplément : les alias ne sont pas requis, uniquement pour augmenter la lisibilité.

REJOINDRE À DROITE, REJOINDRE À GAUCHE

Si nous changeons l'instruction en RIGHT JOIN :

SELECT S.StudentID, C.CourseName
FROM Students AS S 
RIGHT JOIN Courses AS C ON S.CourseID = C.CourseID;

Insérer la description de l'image ici

Modifiez la table Étudiants, laissez 5 et 6 sélectionner le cours 1 et rejoignez à droite la requête.
Insérer la description de l'image ici
Après avoir exécuté l'instruction ci-dessus, si aucun étudiant ne rejoint un cours, nous aurons une ligne supplémentaire avec uniquement CourseName dans l'enregistrement, mais StudentID est NULL.
Insérer la description de l'image ici
Pourquoi cela est-il ainsi? INNER JOIN renverra les données qui existent dans deux tables en même temps. Si les étudiants ont 1, 2, 3, 5 numéros de cours et que les cours ont également 1, 2, 3, 4 numéros de cours, alors le résultat est l'ensemble d'intersections. 1, 2, 3. RIGHT JOIN renvoie les enregistrements qui existent dans la table de droite. Si certaines lignes de la table de droite n'existent pas dans la table de gauche, ces lignes du résultat seront NULL.

Et LEFT JOIN renverra les nombres qui existent dans le tableau de gauche. Si vous ajoutez CourseID=10 aux étudiants, même s'il n'y a pas d'enregistrement de cours avec l'ID 10 dans le tableau Cours, alors le résultat de LEFT JOIN aura toujours une ligne supplémentaire. d'enregistrements et le CourseName correspondant est NULL. (Supplément : LEFT JOIN est appelé LEFT OUT JOIN dans certaines bases de données. De même, RIGHT JOIN peut également être appelé RIGHT OUT JOIN.)

REJOINDRE COMPLÈTEMENT

Le dernier type de JOIN est FULL JOIN. Le jeu de résultats sélectionne tous les enregistrements des deux tables et ajoute automatiquement NULL aux colonnes qui n'existent pas dans les deux tables.

Afin de vous aider à comprendre la logique des requêtes de jointure, vous pouvez vous référer aux illustrations suivantes. Le cercle de gauche peut être compris comme le tableau de gauche et le cercle de droite peut être compris comme le tableau de droite.
Insérer la description de l'image ici
Ce qui précède est le didacticiel de base de la syntaxe SQL. Vous avez maintenant appris à utiliser SQL pour créer des tables et des enregistrements, et à utiliser des instructions SQL avancées pour effectuer des requêtes complexes. Dans le chapitre suivant, nous commencerons à apprendre à utiliser le véritable logiciel de base de données. MySQL.

Devoirs

Veuillez écrire une instruction SQL pour connaître le nombre d'étudiants dont le CourseID est 1 et le nom du cours. Il est à noter que nous recherchons uniquement le nombre d'étudiants de sexe masculin dont l'âge est supérieur à 20.

Méthode 1 sur 3: utiliser où

SELECT COUNT(*) AS StudentsNum,CourseName 
FROM Students AS S,Courses AS C
WHERE S.CourseID = C.CourseID AND S.CourseID = 1 AND S.Age > 20 AND S.Gender = 'M';

Méthode 2 Regrouper par + où

SELECT COUNT(*) AS StudentsNum, CourseName 
FROM Students LEFT JOIN Courses ON Students.CourseID = Courses.CourseID 
WHERE Students.Age > 20 AND Students.Gender = 'M'
GROUP BY Students.CourseID;

revoir

  • 1 Déterminez la table principale, utilisez FROM table_name
  • 2 Confirmez ensuite la table connectée et utilisez INNER JOIN table_name
  • 3 Déterminez les conditions de connexion et utilisez la condition ON. La condition de l'instruction ci-dessus est S.CourseID = C.CourseID
  • 4 Enfin, nous pouvons ajouter : WHERE, ORDER BY et d'autres clauses
    . En plus de INNER JOIN, nous avons également LEFT JOIN, RIGHT JOIN et FULL JOIN.

référence

【Instructions de requête SQL avancées : requête d'agrégation, requête multi-tables, requête de jointure【Tutoriel SQL de base de données relationnelle 5】】 https://www.bilibili.com/video/BV1Zp4y1Q7mj/?share_source=copy_web&vd_source=fe6c23f6f1353ed1eff5d5e866171572

Je suppose que tu aimes

Origine blog.csdn.net/qq_41398619/article/details/132263105
conseillé
Classement