//--------------requête de groupe--------------//
1. Grammaire
select 分组函数,分组的列表
from 表
【where 筛选条件】
group by 分组的列表
【order by 排序的字段】;
Remarque : La liste de requêtes doit être spéciale et il doit s'agir du champ qui apparaît après la fonction de regroupement et le groupe par ;
2. Caractéristiques
1. Le champ interrogé avec la fonction de regroupement doit être le champ qui apparaît après regrouper par ;
2. Le dépistage est divisé en deux catégories : le dépistage pré-groupe et le dépistage post-groupe ;
Tableau filtré par mot-clé Localisation
Filtrer WHERE avant la table d'origine GROUP BY avant le regroupement
Filtrer après regroupement AYANT regroupé les résultats après GROUP BY
Remarque : la condition de la fonction de regroupement doit être placée dans la clause have, qui peut être filtrée avant le regroupement, et le filtre avant le regroupement est préféré ;
Question 1 : La fonction de regroupement peut-elle être utilisée pour filtrer après où ? Réponse : Non ;
Question 2 : où——regrouper par——avoir ? De manière générale, si vous pouvez utiliser le dépistage pré-groupe, essayez d'utiliser le dépistage pré-groupe pour améliorer l'efficacité ;
3. Le regroupement peut être effectué par un seul champ ou par plusieurs champs, et les multiples champs sont séparés par des virgules et sans ordre ;
4. Il peut être utilisé avec le tri ;
3. Utilisation spécifique
1. Introduction : Interrogez le nombre d'employés dans chaque service
SELECT COUNT(*) FROM employees WHERE department_id=90;
2. Regroupement simple
(1) Cas 1 : Interroger le salaire moyen des salariés pour chaque type de travail
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
(2) Cas 2 : Interroger le nombre de départements dans chaque emplacement
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
(3) Cas 3 : Interroger le salaire maximum des salariés de chaque type de travail
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
3. Filtrage avant que le regroupement puisse être réalisé
(1) Cas 1 : Interroger le salaire maximum de chaque département contenant le caractère a dans la boîte aux lettres
SELECT MAX(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
(2) Cas 2 : Interroger le salaire moyen des employés de chaque dirigeant bénéficiant de primes
SELECT AVG(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
4. Dépistage après regroupement
(1) Ajouter des conditions de filtre simples
1) Cas : Rechercher quel service compte plus de 5 employés
#(1)查询每个部门的员工个数
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
#(2)根据(1)的结果进行筛选,查询哪个部门的员工个数>2
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;#having用于分组后的筛选,where用于分组前对原始表的筛选
(2) Ajoutez des conditions de filtrage complexes, si les conditions sont trop complexes, elles peuvent être divisées et exécutées séparément
Remarque : Certains dans le tableau d'origine utilisent où filtrer, comme : avoir des primes, et ceux qui ne figurent pas dans le tableau d'origine utilisent devoir filtrer, comme : le salaire le plus élevé > 12 000 ;
1) Cas 2 : Salaire le plus élevé des salariés avec primes pour chaque type de travail > 12000 numéro de type et salaire maximum
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
2) Cas 3 : Le numéro de leader et le salaire minimum de chaque leader dont le numéro de leader > 102 est supérieur à 5000
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;
5. Ajouter un tri
Cas : Salaire le plus élevé des salariés avec primes pour chaque type de travail > 6000 numéro de type et salaire maximum, par ordre croissant du salaire le plus élevé
SELECT job_id,MAX(salary) m
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING m>6000
ORDER BY m ;
6. Regrouper par plusieurs champs
Cas : Interrogez le salaire minimum de chaque type de travail et de chaque département, et triez par salaire minimum
SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;
7. Regrouper par expression ou fonction
Cas : regroupez par la longueur du nom de l'employé, interrogez le nombre d'employés dans chaque groupe et filtrez le nombre d'employés > 5
SELECT COUNT(*),LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;
#可以使用别名
SELECT COUNT(*) c,LENGTH(last_name) la_name
FROM employees
GROUP BY la_name
HAVING c>5;