Base de données MySQL - requête multi-table (3) - auto-jointure, requête conjointe, sous-requête

Table des matières

auto-connexion 

Syntaxe de requête

Démonstration d'auto-connexion

Requête syndicale

Syntaxe de requête

sous-requête

introduire

sous-requête scalaire

sous-requête de colonne

sous-requête de ligne

Sous-requête de table


auto-connexion 

Grâce à l’étude précédente, nous avons déjà une certaine compréhension des connexions. L'auto-adhésion, en termes simples, signifie se joindre à elle-même, c'est-à-dire interroger une table plusieurs fois.

Dans le processus d'auto-jointure, une table doit être traitée comme deux tables, c'est-à-dire avec un alias.

Syntaxe de requête

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;

La requête d’auto-jointure peut être une requête de jointure interne ou une requête de jointure externe.

Démonstration d'auto-connexion

1. Recherchez les noms des employés et de leurs dirigeants

On observe le tableau, on retrouve les conditions de connexion correspondant aux questions, et on les trie :

  • Structure du tableau : emp
  • Condition de connexion : id = managerid
select a.name '员工',b.name '领导' from emp a ,emp b where a.managerid = b.id;

résultat de la recherche:

2. Recherchez les noms de tous les employés et de leurs dirigeants. Si l'employé n'a pas de leader, vous devez également les interroger.

Si les employés n'ont pas de leader, ils doivent être interrogés. Des jointures externes doivent être utilisées, des jointures externes gauche ou droite.

La structure de la table et les conditions de connexion restent inchangées.

select a.name '员工',b.name '领导' from emp a left outer join emp b on a.managerid = b.id;

résultat de la recherche: 

Requête syndicale

Regardons un petit point de connaissance

Union requête-union, union tout

Pour les requêtes union, les résultats de plusieurs requêtes sont combinés pour former un nouvel ensemble de résultats de requête.

Syntaxe de requête

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;

Pour les requêtes conjointes, le nombre de colonnes dans plusieurs tables doit être cohérent, tout comme les types de champs.

Union all fusionnera toutes les données directement ensemble et union dédupliquera les données fusionnées.

sous-requête

introduire

1. Concept

L'imbrication d'une instruction SELECT dans une instruction SQL est appelée requête imbriquée , également appelée sous-requête .

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

 L'instruction en dehors de la sous-requête peut être INSERT/UPDATE/DELETE/SELECT.

2. Selon les différents résultats de la sous-requête, elle se divise en :

  • Sous-requête scalaire (le résultat de la sous-requête est une valeur unique)
  • Sous-requête de colonne (le résultat de la sous-requête est une colonne)
  • Sous-requête de ligne (le résultat de la sous-requête est une ligne)
  • Sous-requête de table (les résultats de la sous-requête comportent plusieurs lignes et colonnes)

3. Selon la position de la sous-requête, elle est divisée en : après WHERE, après FROM et après SELECT.

sous-requête scalaire

Le résultat renvoyé par une sous-requête est une valeur unique (nombre, chaîne, date, etc.). Dans sa forme la plus simple, cette sous-requête est appelée sous- requête scalaire.

Opérateurs couramment utilisés : = <> < <= > >=

Faisons-le en pratique :

1. Recherchez toutes les informations sur les employés du « Département des ventes »

La requête est d'abord divisée en deux étapes : premièrement, interroger l'ID de service du service commercial, et deuxièmement, interroger les informations sur l'employé correspondant à l'ID de service ;

Imbibez-le à nouveau et utilisez des sous-requêtes scalaires.

-- 1.查询销售部的所有员工信息
-- a.查询'销售部'的部门ID
select id from dept where name = '销售部'; -- 返回结果为 4

-- b.根据销售部部门ID,查询员工信息
select * from emp e where e.dept_id = 4;

-- 标量子查询
select * from emp e where e.dept_id = (select id from dept where name = '销售部');

2. Interrogez les informations sur les employés après que « Fang Dongbai » ait rejoint l'entreprise

Résolu par la même méthode

-- 2.查询在'方东白'入职之后的员工信息
-- a.查询'方东白'的入职日期
select entrydate from emp where name = '方东白';

-- b.查询指定入职日期之后入职的员工信息
select * from emp where entrydate > '2009-02-12';

-- 标量子查询
select * from emp where entrydate > (select entrydate from emp where name = '方东白');

sous-requête de colonne

Le résultat renvoyé par une sous-requête est une colonne (peut comporter plusieurs lignes). Cette sous-requête est appelée sous-requête de colonne .

Opérateurs couramment utilisés : IN, NOT IN, ANY, SOME, ALL

Opérateur décrire
DANS Dans la plage de collecte spécifiée, sélectionnez-en un parmi plusieurs
PAS DEDANS Pas dans la plage de collecte spécifiée
N'IMPORTE LEQUEL Dans la liste renvoyée par la sous-requête, n'importe lequel d'entre eux peut être satisfait
QUELQUES Comme ANY, ANY peut être utilisé partout où SOME est utilisé.
TOUS Toutes les valeurs de la liste renvoyée par la sous-requête doivent satisfaire

Démo :

 1. Rechercher des informations sur les employés dont le salaire est supérieur à celui de tous les membres du service financier

Vérifiez d’abord les salaires de tout le personnel du service financier

select salary from emp e where e.dept_id = (select id from dept where name = '财务部');

Imbibez-le à nouveau

select * from emp e
    where salary >
        all(select salary from emp e where e.dept_id = (select id from dept where name = '财务部'));
-- 相当于 salary > all(8500,48000,5250)

2. Rechercher des informations sur les employés dont le salaire est supérieur à celui de toute personne du département R&D

select * from emp
    where salary > any
                    (select salary from emp where dept_id =
                            (select id from dept where name = '研发部'));
-- 这里any也可以使用some,效果是一样的

sous-requête de ligne

Le résultat renvoyé par une sous-requête est une ligne (peut contenir plusieurs colonnes). Cette sous-requête est appelée sous-requête de ligne .

Opérateurs couramment utilisés : =, <>, IN, NOT IN 

Exemple de démonstration :

Interroger les informations des employés ayant le même salaire et le même leadership direct que « Zhang Wuji »

Vérifiez d’abord le salaire et le leadership direct de « Zhang Wuji »

select salary,managerid from emp where name = '张无忌';

 

Ensuite, interrogez les informations des employés ayant le même salaire et le même leadership direct que « Zhang Wuji »

select * from emp where salary = 12500 and managerid = 1;
-- 另一种写法
select * from emp where (salary,managerid) = (12500,1);
-- 行子查询
select * from emp where (salary,managerid) = 
    (select salary,managerid from emp where name = '张无忌');

Sous-requête de table

Le résultat renvoyé par une sous-requête est constitué de plusieurs lignes et de plusieurs colonnes. Cette sous-requête est appelée sous-requête de table .

Opérateurs couramment utilisés : IN

Généralement placée après from, elle peut être interrogée comme une nouvelle table temporaire.

Exemple de démonstration

1. Recherchez les informations sur les employés ayant le même poste et le même salaire que « Luzhangke » et « Song Yuanqiao »

Vérifiez d'abord les postes et les salaires de « Luzhangke » et « Song Yuanqiao »

select job,salary from emp where name = '鹿杖客' or '宋远桥';

Effectuer à nouveau la sous-requête de table

select * from test.emp where
    (job,salary) in (select job,salary from test.emp where name = '鹿杖客' or '宋远桥');

2. Recherchez les informations sur les employés et les services dont la date d'adhésion est postérieure au « 01/01/2006 ».

Interrogez également étape par étape :

select * from emp where entrydate > '2006-01-01';

 résultat de la recherche:

Utilisez ensuite ceci comme une nouvelle table à interroger. Étant donné que toutes les informations sur le service doivent être interrogées, une jointure gauche est utilisée ici.

select e.*,d.* from (select * from emp where entrydate > '2006-01-01') e
    left join dept d on e.dept_id = d.id;

résultat de la recherche:


fin 


Apprenez de : Programmeur Dark Horse - Cours de base de données MySQL

Je suppose que tu aimes

Origine blog.csdn.net/li13437542099/article/details/132481695
conseillé
Classement