Questions pratiques sur les requêtes complexes de la base de données MYSQL (difficulté modérée)

Ceux qui peuvent insister pour tout faire sont des maîtres

Allez droit au but

Créer une base de données, créer une table, insérer des données

Le code peut être copié directement dans l'ordre

-- 建库
CREATE DATABASE `emp`;
-- 打开库
USE emp;
-- 建dept表
CREATE TABLE `dept`( `deptno` INT(2) NOT NULL, `dname` VARCHAR(14), `loc` VARCHAR(13), CONSTRAINT pk_dept PRIMARY KEY(deptno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 键emp表
CREATE TABLE `emp` ( `empno` int(4) NOT NULL PRIMARY KEY, `ename` VARCHAR(10), `job` VARCHAR(9), `mgr` int(4), `hiredate` DATE, `sal` float(7,2), `comm` float(7,2), `deptno` int(2), CONSTRAINT fk_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 建salgrade表
CREATE TABLE `salgrade` ( `grade` int, `losal` int, `hisal` int ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'); 
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES (30,'SALES','CHICAGO'); 
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); 
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); 
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); 
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); 
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); 
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); 
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20); 
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-07',5000,NULL,10); 
INSERT INTO EMP VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); 
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20); 
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); 
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); 
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
INSERT INTO SALGRADE VALUES (1,700,1200); 
INSERT INTO SALGRADE VALUES (2,1201,1400); 
INSERT INTO SALGRADE VALUES (3,1401,2000); 
INSERT INTO SALGRADE VALUES (4,2001,3000); 
INSERT INTO SALGRADE VALUES (5,3001,9999);

table dept : table
insérez la description de l'image ici
emp : table
insérez la description de l'image ici
salgrade :
insérez la description de l'image ici

Question test

1. Énumérez tous les employés et départements qui sont engagés dans le même travail que "SCOTT", et le nombre de départements.
2. Indiquez le nombre et le salaire moyen des employés dans chaque classe salariale de l'entreprise.
3. Énumérez les noms et les salaires des employés, les noms des départements dont les salaires sont supérieurs aux salaires de tous les employés travaillant dans le département 30.
4. Indiquez le nombre d'employés travaillant dans chaque service, le salaire moyen et la durée moyenne de service.
5. Dressez la liste des noms, des services et des salaires de tous les employés.
6. Répertoriez tous les détails du département et l'effectif du département.
7. Indiquez le salaire minimum pour chaque emploi et le nom de l'employé effectuant le travail.
8. Énumérez le salaire minimum, le nom, le nom du département et le nombre de personnes du GESTIONNAIRE de chaque département (gestionnaire).
9. Énumérez le salaire annuel de tous les employés, le nom du service auquel ils appartiennent et classez-les du salaire annuel le plus bas au plus élevé.
10. Découvrez le nom du superviseur et du département d'un employé et demandez que le salaire de ces superviseurs dépasse 3000.
11. Découvrez le nom du département avec le caractère "S" dans le nom du département, le salaire total et l'effectif du département.
12. Accorder une augmentation de salaire aux employés qui ont plus de 30 ans de service ou qui ont été embauchés en 1987. Le principe de l'augmentation de salaire : 10 % pour 10 départements, 20 % pour 20 départements, 30 % pour 30 départements, etc. .
13. Liste des informations pour tous les départements avec au moins un employé :
14. Liste de tous les employés avec un salaire supérieur à SMITH :
15. Liste des noms de tous les employés et de leurs superviseurs immédiats :
16. Liste des dates d'emploi antérieures à Les numéros, noms, et les noms de département de tous les employés de leurs supérieurs
directs , le nombre de départements

19. Énumérez divers emplois dont le salaire minimum est supérieur à 1 500 et le nombre total d'employés qui y travaillent
20. Énumérez les noms des employés qui travaillent dans le département "VENTES", en supposant que le numéro du département des ventes n'est pas connu
21. Énumérez les salaires supérieur à Tous les employés avec le salaire moyen de l'entreprise, leur département, les dirigeants supérieurs et le niveau de salaire de l'entreprise
22. Énumérez tous les numéros et noms de département avec au moins un employé, et comptez le salaire moyen, le salaire minimum et le salaire maximum de ces départements.
23. Indiquez le nombre, le nom, le nom du département et le nom du chef de tous les employés dont le salaire est supérieur à "SMITH" ou "ALLEN".
24. Énumérez les numéros et les noms de tous les employés et les numéros et les noms de leurs supérieurs immédiats.Les résultats affichés sont classés par ordre décroissant du salaire annuel du chef.
25. Indiquez le nombre, le nom, le nom du département, l'emplacement du département, l'effectif du département de tous les employés dont la date d'embauche est antérieure à celle de leur superviseur immédiat.
26. Énumérez les noms des départements et les informations sur les employés (nombre, salaire moyen) dans ces départements, ainsi que les départements qui n'ont pas d'employés.
27. Énumérez les noms de tous les « COMMIS » (commis) et leurs noms de département, le nombre de personnes dans le département et les niveaux de salaire.
28. Énumérez divers emplois avec un salaire minimum de plus de 1500 et le nombre de tous les employés engagés dans ce travail et le nom du département, l'emplacement et le salaire moyen.
29. Indiquez le nom, le salaire de base, la date d'embauche, le nom du département de l'employé travaillant dans le département "VENTES", en supposant que le numéro de département du département des ventes n'est pas connu.
30. Énumérez tous les employés dont le salaire est supérieur au salaire moyen de l'entreprise, leur département, leurs supérieurs et le niveau de salaire de l'entreprise.
31. Énumérez tous les employés et départements qui sont engagés dans le même travail que "SCOTT", et le nombre de départements.
32. Interrogez la structure de la table dept
33. Récupérez la table emp et utilisez la chaîne is a pour connecter les deux champs du nom de l'employé et du type de travail
34. Récupérez le nom de l'employé, son revenu mensuel et sa commission dans la table emp.

La réponse n'est pas unique, juste pour référence

C'est un peu brouillon, le format du directement collé est différent

– 2. Indiquez le nombre et le salaire moyen des employés dans chaque classe salariale de l'entreprise. afficher les tableaux ; sélectionner * à partir de salgrade ; sélectionner s.grade,count( ),avg(e.sal) à partir d'emp e gauche rejoindre salgrade s sur e.sal entre s.losal et s.hisal grouper par s.grade ;
- 3 Listez les noms et les salaires des employés, les noms des départements dont les salaires sont supérieurs aux salaires de tous les employés travaillant dans le département 30. select ename,sal,d.dname,d.deptno from emp e left join dept d on e.deptno = d.deptno where e.sal > (select max(sal) from emp where deptno = 30);
– 4. Colonnes Le nombre d'employés travaillant dans chaque service, le salaire moyen et l'ancienneté moyenne. sélectionnez count(
),avg(sal),avg(year(now())-year(hiredate)) from emp group by deptno ;
– 5. Énumérez les noms, les départements et les salaires de tous les employés. Comptabilité de recherche de VENTES sélectionnez e.ename,d.dname,e.sal from emp e left join dept d on d.deptno = e.deptno ;
- 6. Énumérez tous les détails du département et l'effectif du département. OPÉRATIONS sélectionner d. ,count(e.ename) de dept d gauche rejoindre emp e sur e.deptno = d.deptno grouper par d.deptno ;
– 7. Indiquez le salaire minimum pour chaque emploi et le nom de l'employé qui exécute le travail.
select a.ename,t.
from emp a left join (select e.job,min(e.sal) from emp e group by e.job) t on a.job = t.job;
– 8. Lister chaque département Le MANAGER (manager) salaire minimum, nom, nom du département, numéro du département. – l'implémentation binaire est sensible à la casse – sélectionnez ename from emp where job = binary 'MANAGER' ; – select binary 'a' = 'a' ; – select binary 'a' ; – select binary 'A' ; select * from emp where job = binaire 'MANAGER' ; sélectionnez a.mm,c.ename,c.job,b.dname,b.cc from (select d.deptno,min(sal) mm from emp e left join dept d on e.deptno = d.deptno where job = 'MANAGER' group by deptno) a left join (select d.deptno,d.dname,count( ) cc from emp e left join dept d on e.deptno = d.deptno group by d.deptno ) b sur a.deptno = b.deptno gauche joindre emp c sur c.sal = a.mm et b.deptno = c.deptno ;
– 9. Énumérez le salaire annuel de tous les employés, le nom du service auquel ils appartiennent et classez-les par ordre croissant de salaire annuel. sélectionnez empno,ename,sal
12,d.dname from emp left join dept d on d.deptno = emp.deptno order by sal 12 asc;
– 10. Découvrez le nom du superviseur et du département d'un employé et demandez le salaire dans ces superviseurs il y a plus de 3000 select a.empno,a.ename,b.ename,b.sal from emp a left join emp b on a.mgr = b.empno where b.sal>3000 and a.empno = 7566 ; select a.empno,a.ename,b.ename,b.sal from emp a left join emp b on a.mgr = b.empno where b.sal>3000; select a.empno,a.ename,b.ename ,b.sal de emp a join gauche emp b on a.mgr = b.empno;
– 11. Trouvez le nom du département, le salaire total et l'effectif du département pour les employés du département avec les caractères 'S'. sélectionnez d.dname, count(
),sum(e.sal) from emp e left join dept d on e.deptno = d.deptno where d.dname like '%s%' group by d.deptno; select * from emp; – 12. Donner le rendez-vous date Pour les salariés de plus de 30 ans ou embauchés en 1987, l'augmentation de salaire est basée sur le principe de l'augmentation de salaire : augmentation de 10 % dans 10 départements, augmentation de 20 % dans 20 départements, augmentation de 30 % dans 30 départements, etc. select empno,ename,sal,sal+sal*(deptno/100) from emp where year(curdate()) - year(hiredate)>30 or year(hiredate)=2022 ; mettre à jour emp set sal = sal+sal*( deptno/100) où year(curdate()) - year(hiredate)>30 ou year(hiredate)=2022 ; sélectionnez * de emp ;
- 13. Listez tous les départements avec au moins un employé sélectionnez distinct d.* de dept d join emp e on d.deptno = e.deptno; – 14. Lister tous les employés dont le salaire est inférieur à SMITH select * from emp where sal < (select sal from emp where ename = 'SMITH')
– 15. Colonne Lister les noms de tous les employés et leurs supérieurs immédiats : sélectionnez a.empno,a.ename,b.ename from emp a left join emp b on a.mgr = b.empno ;
– 16. Énumérez les numéros, noms et noms de service de tous les employés dont la date d'embauche est antérieure à celle de leur superviseur immédiat. Sélectionnez a.empno,a.ename,b.ename,d.dname from emp a left join emp b on a .mgr = b.empno and a.hiredate<b.hiredate left join dept d on d.deptno = a.deptno;
– 17. Répertoriez les noms des départements et les informations sur les employés de ces départements, et répertoriez les départements sans employés sélectionnez * dans dept d left join emp e on d.deptno = e.deptno ;
– 18. Énumérez tous les noms de "COMMIS (personnel)" et les noms de département, sélectionnez a.ename,a.job,b.dname,b pour le nombre de départements .cc from emp a join (select d.deptno,d.dname,count( ) cc from dept d left join emp e on d.deptno = e.deptno group by d.deptno) b on b.deptno = a.deptno et a.job = 'CLERK' ;
– 19. Listez les différents emplois avec un salaire minimum supérieur à 1500 et le nombre total d'employés engagés dans cet emploi select job,max(sal),min(sal),avg(sal), count(
) from emp where sal>1500 group by job;
– 20. Énumérez les noms des employés travaillant dans le département "SALES", en supposant que le numéro de département du département des ventes est inconnu select ename from emp where deptno in (select deptno from dept where dname='sales'); select e.ename from emp e join dept d on e.deptno = d.deptno and d.dname='sales';
– 21. Lister tous les employés dont le salaire est supérieur au salaire moyen de l'entreprise, leur département, leurs supérieurs et le niveau de salaire de l'entreprise select a.ename ,a.en,d.dname,a.sal,s.grade from (select a.deptno,a.ename,b.ename en,a.sal from emp a join emp b on a.mgr = b .empno et a.sal>(select avg(sal) from emp)) a left join dept d on a.deptno=d.deptno left join salgrade s on a.sal between s.losal and s.hisal; select a. ename,b .ename from emp a join emp b on a.mgr = b.empno and a.sal> (select avg(sal) from emp);
– 22. Énumérez tous les numéros et noms de département avec au moins un employé, et comptez-les Salaires moyens, minimum et maximum pour ces secteurs. select e.deptno,d.dname,avg(e.sal),max(e.sal),min(sal),count( ) from dept d join emp e on e.deptno = d.deptno group by e.deptno ;
– 23. Indiquez le nombre, le nom, le nom du service et le nom du chef de tous les employés dont le salaire est supérieur à « SMITH » ou « ALLEN ». select a.empno,a.ename,d.dname,b.ename from (select * from emp where sal >(select min(sal) from emp where ename in ('smith','allen'))) une jointure gauche emp b on a.mgr = b.empno left join dept d on d.deptno = a.deptno;
– 24. Indiquez les numéros et les noms de tous les employés ainsi que les numéros et les noms de leurs supérieurs immédiats. Les résultats affichés sont basés sur le salaire annuel du dirigeant par ordre décroissant. sélectionnez a.empno,a.ename,a.sal
12,b.empno,b.ename,b.sal 12 depuis emp a left join emp b on a.mgr = b.empno trier par b.sal 12 ;
– 25 Indiquez le nombre, le nom, le nom du département, l'emplacement du département, l'effectif du département de tous les employés dont la date d'embauche est antérieure à celle de leur superviseur immédiat.
sélectionnez a.empno,a.ename,b.ename,d.dname from emp a left join emp b on a.mgr = b.empno and a.hiredate<b.hiredate left join dept d on d.deptno = a. deptno ;
– 26. Énumérez les noms des départements et les informations sur les employés (nombre, salaire moyen) dans ces départements, et listez également les départements qui n'ont pas d'employés. select d.deptno,d.dname,count(e.ename),avg(sal) from dept d left join emp e on d.deptno = e.deptno group by d.deptno;
– 27. List all "CLERK" ( Employé) nom et nom du service, nombre de personnes dans le service, niveau de salaire. select a.ename,a.job,b.dname,b.cc from emp a join (select d.deptno,d.dname,count( ) cc from dept d left join emp e on d.deptno = e.deptno group par d.deptno) b on b.deptno = a.deptno and a.job = 'CLERK' ; sélectionnez e.deptno,count(e.deptno) from (select a.deptno,a.ename,d.dname,s .grade from (select deptno,ename,sal from emp where job='CLERK') a left join dept d on a.deptno=d.deptno left join salgrade s on a.sal between s.losal and s.hisal) aa Joindre à gauche emp e sur aa.deptno = e.deptno grouper par e.deptno ; sélectionner t1.,t2.deptcount from (select d.deptno,e.ename,e.job,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s. losal et s.hisal où e.job = 'CLERK') t1 join (select deptno, count( ) as deptcount from emp group by deptno) t2 on t1.deptno = t2.deptno;
– 28. Liste salaire minimum supérieur à 1500 Les différents emplois et le nombre total d'employés engagés dans cet emploi et le nom du département, l'emplacement, le salaire moyen. select job,max(sal),min(sal),avg(sal),count(
) from emp where sal>1500 regrouper par job ;
– ​​29. Lister les noms des employés qui travaillent dans le département "SALES" (Ventes), salaire de base, date d'embauche, nom du service, en supposant que le numéro de service du service des ventes est inconnu. select e.ename,e.sal,e.hiredate,d.dname from emp e join dept d on d.deptno = e.deptno and d.dname='sales' ;
– 30. Énumérez tous les employés dont le salaire est supérieur au salaire moyen de l'entreprise, leur département, leurs supérieurs et le niveau de salaire de l'entreprise. select a.ename,a.en,d.dname,a.sal,s.grade from (select a.deptno,a.ename,b.ename en,a.sal from emp a join emp b on a.mgr = b.empno et a.sal>(select avg(sal) from emp)) a left join dept d on a.deptno=d.deptno left join salgrade s on a.sal between s.losal and s.hisal;
– 31 Listez les noms de tous les employés et départements engagés dans le même travail que "SCOTT", et le nombre de départements. créer la vue v1 en tant que select b.ename,d.dname,a.cc from (select deptno,count(*) cc from emp group by deptno) a join (select ename,deptno from emp where job = (select job from emp where ename = 'scott')) b on b.deptno=a.deptno
left join dept d on d.deptno = b.deptno; select * from v1;
– 32. Interroger la structure de la table dept desc emp; décrire emp; afficher la table de création emp ; afficher les colonnes de emp ;
– 33. Récupérez la table emp et utilisez la chaîne is a pour connecter les deux champs du nom de l'employé et du type de travail is a est la base de données oracle select concat(empno,ename,job) from emp; select concat_ws('-',empno ,ename, job) à partir de emp ; sélectionner un travail distinct à partir de emp ; sélectionner group_concat(travail distinct) à partir de emp ; sélectionner group_concat(distinct ename) à partir de emp ; sélectionner group_concat(distinct job order by job asc separator '=') from emp ;
– 34. Récupération La table emp contient le nom de l'employé, son revenu mensuel et sa commission. sélectionnez ename,sal,comm de emp où comm n'est pas nul ; sélectionnez ename,sal,comm de emp où comm n'est pas nul et comm>0 ;

Questions dans la section des commentaires

Je suppose que tu aimes

Origine blog.csdn.net/weixin_50843918/article/details/123086590
conseillé
Classement