Maison > base de données > tutoriel mysql > le corps du texte

Comment analyser les problèmes de sous-requêtes imbriquées dans Mysql

PHPz
Libérer: 2023-05-27 23:46:27
avant
1148 Les gens l'ont consulté

Sous-requête imbriquée MySQL

La sous-requête fait référence à une forme d'écriture dans laquelle plusieurs petites requêtes avec des fonctions différentes sont imbriquées dans une instruction de requête complète pour compléter des requêtes complexes ensemble afin de rendre la sous-requête plus claire pour le concept des lecteurs.

La sous-requête renvoie des résultats
Les types de données que les sous-requêtes peuvent renvoyer sont divisés en quatre types :

  • Une seule ligne et une seule colonne : ce qui est renvoyé est le contenu d'une colonne spécifique, qui peut être comprise comme un données à valeur unique ;

  • Ligne unique et colonnes multiples : renvoie le contenu de plusieurs colonnes dans une ligne de données

  • Lignes multiples et colonnes uniques : renvoie le contenu de la même colonne dans plusieurs lignes d'enregistrements ; équivaut à donner une plage de fonctionnement ;

  • Plusieurs lignes Plusieurs colonnes : Le résultat renvoyé par la requête est une table temporaire

Utiliser des sous-requêtes dans la clause WHERE

Traiter les sous-requêtes à une seule ligne et à une seule colonne ; , les sous-requêtes à plusieurs lignes et à une seule colonne, ainsi que les sous-requêtes à une seule ligne et à plusieurs colonnes dans la clause WHERE .

Sous-requête à une seule ligne et à une seule colonne

**Exemple 1, **Interroger les informations complètes de l'employé avec le salaire le plus bas de l'entreprise

--查询公司之中工资最低的雇员的完整信息
SELECT * 
FROM emp e
WHERE e.sal=(
  SELECT MIN(sal) 
  FROM emp);
Copier après la connexion

**Exemple 2, **Interroger les informations de tous les employés dont le salaire de base le salaire est inférieur à ALLEN

-- 查询出基本工资比ALLEN低的全部雇员信息
SELECT * 
FROM emp e
WHERE e.sal<(
 SELECT sal 
 FROM emp 
 WHERE ename=&#39;ALLEN&#39;
);
Copier après la connexion

**Exemple 3, **Interrogez les informations de tous les employés dont le salaire de base est supérieur au salaire moyen de l'entreprise

--查询基本工资高于公司平均薪金的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal>(
SELECT AVG(sal)
FROM emp);
Copier après la connexion
Sous-requête à une seule ligne et multi-colonnes.

**Exemple 4, **Découvrez les informations de tous les employés qui ont le même emploi qu'ALLEN et dont le salaire de base est supérieur au numéro d'employé 7521,

--查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,
SELECT *
FROM emp e
WHERE e.job=(
  SELECT job
  FROM emp 
  WHERE ename=&#39;ALLEN&#39;) 
  AND e.sal>(
  SELECT sal
  FROM emp 
  WHERE empno=7521);
Copier après la connexion

**Exemple 5, **Interrogez les informations de tous les employés qui ont le même emploi que SCOTT et ont le même salaire Informations sur les employés

SELECT *
FROM emp e
WHERE (e.job,e.sal) = (
  SELECT job,sal
  FROM emp 
  WHERE ename=&#39;SCOTT&#39;)
  AND ename<>&#39;SCOTT&#39;;
Copier après la connexion

**Exemple 6, **Rechercher les informations de tous les employés qui occupent le même emploi que l'employé 7566 et ont le même leadership

  --查询与雇员7566从事同一工作且领导相同的全部雇员信息
SELECT *
FROM emp e
WHERE (e.job,e.mgr) =(
        SELECT job,mgr
        FROM emp
      WHERE empno=7566
);
Copier après la connexion

**Exemple 7, **Interrogez tous les employés qui occupent le même poste qu'ALLEN et sont employés la même année Informations sur les employés (y compris ALLEN)

--查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
SELECT *
FROM emp e
WHERE (e.job,to_char(e.hiredate,&#39;yyyy&#39;))=(
           SELECT job,to_char(hiredate,&#39;YYYY&#39;)
            FROM emp
            WHERE ename=&#39;ALLEN&#39;
);
Copier après la connexion
Sous-requête à colonne unique multi-lignes

Utilise principalement trois opérateurs : IN, ANY, ALL

EN opération

**Exemple 8, **Requête des informations relatives à chaque département Toutes les informations sur les employés ayant le même salaire minimum

--查询出与每个部门中最低工资相同的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal IN(
     SELECT MIN(sal)
    FROM emp
    GROUP BY deptno
);
Copier après la connexion

**Exemple 9. **Requête sur toutes les informations sur les employés qui n'ont pas le même minimum salaire dans chaque département

--查询出不与每个部门中最低工资相同的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal NOT IN(
     SELECT MIN(sal)
    FROM emp
    GROUP BY deptno
);
Copier après la connexion

Sous-requête FROM :

Source de données suivant la clause FROM Non seulement une table de données, il peut également s'agir d'un résultat de requête Il s'agit d'une sous-requête FROM
Habituellement, le type de retour d'une sous-requête FROM est. un ensemble de résultats multi-lignes et multi-colonnesjavascript

Interrogez les titres d'emploi avec un salaire moyen supérieur à 2 000 et Le salaire moyen de ce poste java

第一种方式:能够使用HAVING字句实现

SELECT job,AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>2000;

第二种方式:使用FROM子查询

SELECT job,avgsal
FROM (
  SELECT job,AVG(sal) AS avgsal
    FROM emp
      GROUP BY job) temp
WHERE temp.avgsal>2000;
Copier après la connexion

Interrogez les informations des employés qui ont des commissions et dont le salaire est supérieur à commission : web

SELECT e1.empno,e1.ename,e1.comm,e2.sal
FROM emp e1,emp e2
WHERE e1.comm IS NOT NULL AND e1.comm<e2.sal
AND e1.empno=e2.empno;
Copier après la connexion

Résumé :

1.FROM La source de données de la sous-requête est le résultat d'une autre requête. Le résultat est équivalent à une table de données temporaire

2. Un alias doit être défini pour la sous-requête

.

3. Si vous souhaitez utiliser les champs dans la sous-requête, vous devez utiliser la méthode "alias.field name" pour référencer

select sous-requête

La sous-requête après la sélection ne peut être utilisée que comme une requête scalaire

#. Cas : Recherchez le nombre d'employés dans chaque département

SELECT d.*,(
    SELECT COUNT(*)
    FROM employees
    WHERE employees.`department_id`=d.department_id
)

FROM
    departments d;
Copier après la connexion

#Case : Recherchez le nom du département avec le numéro d'employé = 102

SELECT department_name
FROM
employees e
INNER JOIN
    departments d
ON
    e.`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102;
Copier après la connexion

Utilisez la sous-requête

SELECT (
SELECT department_name
FROM
    employees e
INNER JOIN
    departments d
ON
    e.`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102
);
`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102;
Copier après la connexion

Utilisez la sous-requête

SELECT (
SELECT department_name
FROM
    employees e
INNER JOIN
    departments d
ON
    e.`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102
);
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal