Table des matières
Requête conjointe multi-tables
Requête de jointure multitable
Classification des requêtes multi-tables
Requête croisée (produit cartésien)
Classification des sous-requêtes
Différents résultats pour les sous-requêtes
Différents endroits où les sous-requêtes sont appliquées
Application de sous-requêtes dans différentes instructions externes
Requête conjointe multi-tables
1. Grâce à une requête conjointe, vous pouvez obtenir l'ensemble d'enregistrements dans deux tables ou l'ensemble d'enregistrements communs, ou l'ensemble d'enregistrements dans l'une des tables
2. La requête conjointe opère sur la table en unités de lignes, principalement pour augmenter ou diminuer le nombre de lignes
3. Le nombre de colonnes et le type du nombre de colonnes entre plusieurs tables utilisées comme requête conjointe doivent être identiques (par exemple : quelles colonnes sont interrogées dans la table 1, quelles colonnes sont interrogées dans la table 2)
4. La requête conjointe supprimera les enregistrements en double par défaut
5. La requête conjointe peut utiliser n'importe quelle instruction SELECT, mais la clause ORDER BY ne peut être utilisée qu'à la dernière fois
Type de requête d'union
UNION ajoute des enregistrements de certains champs de deux tables (union)
ALL est utilisé comme mot-clé, indiquant que le résultat de l'opération d'ensemble conserve les lignes en double (généralement UNION ALL)
INTERSECT extrait (intersection) les enregistrements communs de certains champs de deux tables (MySQL n'existe pas, vous pouvez utiliser la requête de connexion suivante à la place)
EXCEPT soustrait les enregistrements communs de certains champs des deux tables, puis renvoie les enregistrements restants (ensemble de différences) d'une table (MySQL n'existe pas, utilisez le champ NOT IN pour y parvenir)
Format de requête d'union
Forme syndicale
SELECT liste de champs FROM table A ... UNION SELECT liste de champs FROM table B ...;
Renvoie l'union de la requête de la table A et de la requête de la table B (et déduplique le traitement)
Union tout format
Par rapport à la requête Union, cette requête ne peut pas dédupliquer les données fusionnées
Démo de requête d'union
Nous utilisons les deux tableaux suivants pour la démonstration
select name , age from staff1 where origo = ' Chongqing ' union select name , age from user; # query table 1 origo est le nom de Chongqing , le résultat du champ age plus le résultat de la table 2 query name , age et déduplication traitement ( les types de données de nom et d'âge des deux tables doivent être cohérents)select name , age from staff1 where origo = ' Chongqing ' union all select name , age from user; #Aucun traitement de déduplicationselect name , age from staff1 where ( name , age ) not in ( select name , age from user ) ; # Interroger la différence entre la table 1 et la table 2 ( soustraire le résultat de la requête de la table 1 de l'intersection de la table 1 et de la table 2 )
Requête de jointure multitable
La requête multi-tables est basée sur des colonnes horizontales, ajoutant principalement des colonnes d'autres tables
Lors de l'exécution de requêtes multi-tables, les colonnes de la clause SELECT sont généralement écrites au format de nom de table alias.nom de colonne
Nous utilisons deux tables pour la démonstration
Classification des requêtes multi-tables
requête croisée
En regroupant tous les enregistrements des deux tables, le nombre d'enregistrements obtenu est le produit du nombre de lignes des deux tables
requête de jointure interne
Interroger les données à l'intersection des tables A et B
Requête de jointure externe
Jointure externe gauche : interroge toutes les données de la table de gauche et les données à l'intersection des deux tables
Jointure externe droite : interroge toutes les données de la table de droite et les données à l'intersection des deux tables
requête d'auto-jointure
Il n'y a qu'une seule table, et la table courante est connectée à elle-même (la sous-jointure doit utiliser l'alias de la table)
Requête croisée (produit cartésien)
Les jointures croisées sont effectuées à l'aide de l'opérateur d'ensemble GROSS JOIN (produit cartésien)
En croisant tous les enregistrements des deux tables, tout en ajoutant d'autres champs de table, le nombre d'enregistrements obtenu est le produit du nombre de lignes dans les deux tables
Format
SELECT field list FROM table 1, table 2 ; le volume de données affiché est le volume de données de la table 1 * le volume de données de la table 2
Précautions
Nous pouvons voir à travers le phénomène qu'il y a trop de résultats et qu'il y a des erreurs, qu'il n'y a pas beaucoup de valeur pratique et que cela prend beaucoup de temps de calcul ; donc cette requête ne sera pas utilisée dans les affaires réelles
Mais cette requête est la base de toutes les requêtes de table
sélectionnez utilisateur . nom , carrière. nom de l'utilisateur , carrière ; #Aucun alias n'est utilisé sélectionnez u. nom , c. nom de l'utilisateur u , carrière c ; #Utilisez des alias pour les requêtes croisées
requête de jointure interne
Les données qui existent dans les deux tables peuvent être sélectionnées, c'est-à-dire les données d'intersection des deux tables
Divisés en connexion interne implicite et connexion interne explicite, les deux sont juste écrits différemment, et les résultats obtenus sont exactement les mêmes
jointure interne implicite
SELECT liste de champs FROM table 1, table 2 WHERE liste de conditions ;
jointure interne explicite
SELECT liste de champs FROM table 1 [INNER] JOIN table 2 ON liste de conditions de connexion [WHERE instruction de jugement] ;
INNER peut être omis
Si vous souhaitez ajouter Where à cette instruction, vous devez faire attention à ce que l'instruction ON soit comprise entre FROM et WHERE
La séquence d'exécution est la suivante : affichez d'abord la connexion interne, puis effectuez Où sur le résultat de la connexion.
Précautions
Il peut y avoir des données manquantes à l'aide de jointures internes et les valeurs NULL seront manquées
sélectionnez u. nom , u. âge , c. nom de l'utilisateur u , carrière c où u. career_id = c. id ; # requête implicite ; sélectionnez les enregistrements avec le même user.career_id et career.id , et affichez les enregistrements correspondants Les champs user.name , user, age , career.name ; à ce moment, si user.career_id a une valeur nulle ou career.id a une valeur nulle, les données correspondant à la valeur nulle seront manquées (à ce moment, le sixième Les données)select u. name , u. age , c. name from user u join career c on u. career_id = c. id ; #requête explicite ; les résultats des deux requêtes sont les suivantsselect u. name , u. age , c. name from user u join career c on u. career_id = c. id where u. age > 20 ; #Requête explicite pour filtrer les résultats ci-dessus, sélectionner les données dont l'âge est supérieur à 20
Requête de jointure externe
Sélectionnez toutes les informations d'une seule table (table principale), puis ajoutez les informations de l'intersection des deux tables
jointure externe gauche
SELECT liste de champs FROM table 1 LEFT [OUTER] JOIN table 2 ON liste de conditions ;
[OUTER] peut être omis
Interroger toutes les données du tableau 1, y compris les données à l'intersection du tableau 1 et du tableau 2
select u. name , u. age , c. name from user u left join career c on u. career_id = c. id ; #Left outer join affiche toutes les informations des champs correspondants de nom et d'âge de la table des utilisateurs , puis ajoute un utilisateur. L'intersection de et career.idjointure externe droite
SELECT liste de champs FROM table 1 RIGHT [OUTER] JOIN table 2 ON liste de conditions ;
[OUTER] peut être omis
Interroger toutes les données du tableau 2, y compris les données à l'intersection du tableau 1 et du tableau 2
select u. name , u. age , c. name from user u right join career c on u. career_id = c. id ; #La jointure externe droite affiche toutes les informations de la section de nom correspondante de la table des carrières , puis ajoute user.career_id et Intersection de career.id
requête d'auto-jointure
Utilisez cette table pour faire une démonstration de la requête d'auto-jointure (cette table enregistre la table ID des employés et leurs superviseurs correspondants, c'est-à-dire que le nom de l'ID correspondant à managerid est le nom du superviseur)
Connectez-vous pour interroger par vous-même, qui peut être une connexion interne ou une connexion externe
Format
SELECT liste de champs FROM table A alias A JOIN table A alias B ON liste de conditions ;
select e1.name , e2.name ' supervisor ' from emp e1 join emp e2 on e1.managerid = e2.id ; #Display query , requête qui est le superviseur correspondant à chaque employé ; cela peut être compris comme la copie de emp comme table e1 et la table e2 a deux tables, associez le managerid de la table e1 à l'id de e2 en tant que clé étrangère , puis affichez le nom de la table e1 et le nom de la table e2 (ici, il y aura des omissions lors de l'utilisation de la méthode de jointure interne explicite )sélectionnez e1.name , e2.name ' Boss ' from emp e1 left join emp e2 on e1.managerid = e2.id ; #Connexion externe gauche , les employés sans leader sont également affichés
Règles de sous-requête
Une sous-requête (Sub Query) peut également être appelée une requête imbriquée, qui est une requête imbriquée dans la clause Where d'autres requêtes SQL ; une instruction contenant une sous-requête est appelée une instruction externe
- Les sous-requêtes doivent être placées entre ()
- Généralement, l'instruction SELECT d'une sous-requête n'a qu'un seul champ, à moins qu'il y ait plusieurs colonnes dans l'instruction externe qui doivent être comparées avec les colonnes de la sous-requête
- Les sous-requêtes ne peuvent pas être directement appliquées aux fonctions d'agrégation et les sous-requêtes ne peuvent pas utiliser ORDER BY
- Les types de données ntext, text et image ne peuvent pas être utilisés dans la liste de sélection d'une sous-requête
- Le mot-clé DISTINCT ne peut pas être utilisé avec des sous-requêtes contenant GROUP BY
Classification des sous-requêtes
Selon les différents résultats de la sous-requête, celle-ci peut être divisée en 4 catégories
sous-requête scalaire résultats de la sous-requête sous la forme d'une valeur unique
Sous-requête de colonne Le résultat de la sous-requête est une colonne et plusieurs lignes
Sous-requête de ligne Le résultat de la sous-requête est une ligne avec plusieurs colonnes
Sous-requête de table Le résultat de la sous-requête est plusieurs lignes et plusieurs colonnes
Selon les différentes positions de la sous-requête, celle-ci peut être grossièrement divisée en trois catégories
Il existe trois cas principaux où les sous-requêtes s'appliquent :
Ils sont après WHERE, après FROM et après SELECT.
Selon les différentes déclarations externes de la sous-requête, celle-ci peut être grossièrement divisée en quatre catégories
Les instructions en dehors de la sous-requête peuvent être
N'importe lequel des éléments INSERT / UPDATE / DELETE / SELECT
Différents résultats pour les sous-requêtes
Interroger les deux tables suivantes
Sous-requête scalaire - le résultat de la requête ne doit renvoyer qu'une ligne et une colonne de résultats, c'est-à-dire une certaine valeur
Étant donné que le résultat de sa sous-requête est une valeur unique, il peut être utilisé pour effectuer des opérations arithmétiques
Opérateurs communs : = , <> , > , >= , < , <=
select * from emp where dept_id =( select id from dept where name = ' sales department ' ) ; #Interroger tous les employés correspondant au service des ventes (rechercher d'abord l'identifiant correspondant au service des ventes , puis interroger les employés en fonction de l'identifiant ) select * from emp where entrydate >= ( select entrydate from emp where name = ' Zhang San ' ) ; #Requête sur toutes les informations sur les employés après l'entrée de Zhang San (requête d'abord sur les informations d'entrée de Zhang San, puis sur les informations sur les employés après cette heureSous-requête de colonne - le résultat renvoyé est une colonne avec plusieurs lignes
Opérateurs couramment utilisés :
IN Sélectionnez-en un dans la plage définie spécifiée par IN
NOT IN n'est pas dans la plage définie spécifiée
N'importe laquelle des listes de retour de sous-requêtes ANY est suffisante
SOME est équivalent à ANY
Toutes les valeurs de la liste renvoyée par la sous-requête ALL doivent satisfaire
sélectionnez * de emp où salaire > tous ( sélectionnez salaire de emp où dept_id =( sélectionnez id de dept où nom = ' département R & D ' ) ) ; interrogez l' identifiant correspondant du service financier , utilisez cet identifiant pour interroger le salaire des employés du service financier, puis recherchez les informations des employés dont le salaire est supérieur à celui-ci)Sous-requête de ligne - le résultat renvoyé est une ligne avec plusieurs colonnes
Opérateurs communs : =, <>, IN, NOT IN
select * from emp where ( salaire , managerid ) = ( sélectionner le salaire , managerid from emp where name = ' Li Si ' ) ; #Interroger les informations d'autres employés avec le même salaire et le même leadership que Li SiSous-requête de table - le résultat de retour est plusieurs lignes et plusieurs colonnes
Opérateurs couramment utilisés : IN
apparaît souvent après de
select * from emp where ( dept_id , employee ) in ( select dept_id , employee from emp where name = ' Old Five ' or name = ' Li Si ' ) ; #Requête sur le même service et le même salaire que le cinquième ou les autres informations sur l'employé de Li Si sélectionnez e.* , nom du service de ( sélectionnez * de emp où date d'entrée > '2001-01-01' ) eleft join dept on e.dept_id = dept.id ; #Interroger les informations sur les employés et les informations sur le service correspondant dont l'heure de saisie est supérieure à 2001-01-01
EXISTE和N'EXISTE PAS
Le format est : EXISTE (sous-requête)
EXISTS est utilisé pour vérifier si la sous-requête renvoie au moins une ligne de données ; si la sous-requête renvoie au moins une ligne de données, c'est Vrai ; si la sous-requête ne renvoie pas de données, c'est Faux
Dans certains cas, les champs IN ou ANY peuvent également être utilisés à la place
NON EXISTE est le contraire d'EXISTE
select * from emp where exists ( select * from emp where id = 10 ) ; # Tant qu'il y a une valeur de id=10 , interrogez la table emp et le résultat n'est pas de données select * from emp where exists ( select * from emp where id = 1 ) ; #Tant qu'il y a une valeur de id=1 , interrogez la table emp et le résultat est les données de la table emp
Différents endroits où les sous-requêtes sont appliquées
Il existe trois situations principales dans lesquelles la sous-requête est appliquée : après WHERE, après FROM et après SELECT.
Dans la clause Where - les sous-requêtes générales sont appliquées après where
Ce que nous avons démontré ci-dessus sont toutes les sous-requêtes après où
Généralement formel : SELECT * FROM t1 WHERE colonne1= ( SELECT colonne1 FROM t2 );
Dans la clause From - le jeu de résultats renvoyé par la sous-requête à ce moment sera utilisé comme table temporaire, également appelée table dérivée
La table dérivée doit être configurée avec un alias et les noms de colonne de la table dérivée doivent être uniques
select * from ( select origo , count ( * ) as number from staff1 group by origo ) as emp where emp.number > 2 ; #Group by lieu of residence, and query the number of people in residence superior than 2 (the l'alias de la table dérivée est emp)Après la sélection - seule la sous-requête scalaire est prise en charge, la sous-requête renvoie une seule valeur
SELECT (sous-requête) FROM table1 ;
La valeur unique renvoyée par la sous-requête est un champ de la table 1 ; cette requête est rarement utilisée
Application de sous-requêtes dans différentes instructions externes
L'instruction en dehors de la sous-requête peut être l'une des INSERT/UPDATE/DELETE/SELECT
Expériences basées sur les deux tableaux suivants
Sous-requête dans l'instruction SELECT
select * from user where career_id =( select id from career where name = ' chef ' ) ; #query who is a chef in user (sous-requête de l' identifiant du chef , puis une instruction externe pour interroger la personne correspondant à cet identifiant )Sous-requêtes dans les instructions INSERT
insert into user1 ( name , age , career_id ) select * from user where career_id in ( select id from career) ; #Add data to the user1 table, the added data is the person with a position in the user tableSous-requêtes dans les instructions UPDATE
update user set age = age * 1.5 where career_id = ( select id from career where name = ' chef ' ) ; #multiplier l'âge du chef par 1,5Sous-requête dans l'instruction DELETE
delete from user where career_id = ( select id from career where name = ' chef ' ) ; #Expliquez les informations selon lesquelles la profession dans la table des utilisateurs est un chef