Requête multi-table MySQL (requête jointe, requête jointe, sous-requête)

Table des matières

Requête conjointe multi-tables

Type de requête d'union

Requête de jointure multitable

Classification des requêtes multi-tables

Requête croisée (produit cartésien)

requête de jointure interne

Requête de jointure externe

requête d'auto-jointure

Règles de sous-requête

Classification des sous-requêtes

Différents résultats pour les sous-requêtes

EXISTE和N'EXISTE PAS

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éduplication

select 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   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 suivants

select 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.id

jointure 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

  1. Les sous-requêtes doivent être placées entre ()
  2. 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
  3. 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
  4. 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
  5. 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 heure

Sous-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 salaire > tous ( sélectionnez salaire de emp dept_id =( sélectionnez id de dept 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 Si

Sous-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 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 table

Sous-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,5

Sous-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

Je suppose que tu aimes

Origine blog.csdn.net/m0_49864110/article/details/131944306
conseillé
Classement