数据库SQL命令经典面试题65道

员工表
部门表
在这里插入图片描述
工种表
在这里插入图片描述
位置表
在这里插入图片描述

以下65道经典题目都是围绕这四张表进行的操作

1.查询员工的姓、名和薪资,并且姓和名拼接起来 (别名:AS 或者as可以省略)

SELECT CONCAT(first_name,last_name) AS 姓名,salary*12 AS 年薪,salary AS 月薪 
FROM employees;

2.查询薪资大于10000的员工

SELECT * 
FROM employees
WHERE salary >10000;

3…查询工种id为不是“AD_VP”员工名字和jobid

SELECT job_id,last_name 
FROM employees 
WHERE job_id <> 'AD_VP'; 

4.查询员工薪资大于10000而且小于20000的员工名字和薪资

SELECT last_name AS 员工姓名,salary AS 薪资 
FROM employees 
WHERE salary>10000 AND salary<20000;

#或者
SELECT last_name ,salary 
FROM employees
WHERE NOT(salary<=10000 OR salary>=20000);

5.查询员工信息表中名字的第一个字符为e的员工信息

SELECT * 
FROM employees 
WHERE last_name 
LIKE 'e%';

6.查询员工表中名字的第二个字符是e第五个字符是a的员工信息

SELECT * 
FROM employees 
WHERE last_name 
LIKE '_e__a%';

7.查询员工名字中第二个字符是下划线的员工信息

SELECT * 
FROM employees 
WHERE last_name
LIKE '_\_%';

#或者 是让$作为转义符
SELECT *
FROM employees
WHERE last_name LIKE '_$_%'ESCAPE '$';

8.查询年薪在100000到200000之间的员工名字和年薪

#between...and 含头也含尾 between后边给小值 and后边跟大值
/*
函数:
if null(参数1,参数2);
如果该字段值为null 取值参数2 如果改字段不为null取值参数1

*/
SELECT last_name AS 名字,salary*12*(1+'commission_pct') AS 年薪
FROM employees
WHERE salary*12 BETWEEN 100000 AND 200000;

9.(题目8的加强版,有奖金的乘以奖金率,没有奖金的为0)查询年薪在100000到200000之间的员工名字和年薪**

SELECT last_name 名字,salary*12*(1+IFNULL('commission_pct',0)) 年薪,'commision_pct'
FROM employees
WHERE salary *12*(1+IFNULL('commission_pct',0)) 
BETWEEN 100000 AND 200000;

10.查询员工编号为1003、1004、1005的员工的id和名字

SELECT employee_id,last_name
FROM employees
WHERE employee_id =103 OR employee_id=104 OR employee_id=105;

11.查询没有奖金的员工信息

SELECT *
FROM employees
WHERE commsssion_pct IS NOT NULL;

13.按照薪资由低到高得顺序排序

SELECT *
FROM employees
ORDER BY salary ASC;

14.按照薪资由高到低排序

SELECT *
FROM employees
ORDER BY salary DESC,last_name DESC;

15.将名字中包含e得员工得年薪和姓名显示出来,按照年薪降序

SELECT last_name,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE last_name LIKE '%e%'
ORDER BY 年薪 DESC;

16.查询员工表中员工得名字 和名字得长度,并且按照名字长度升序

SELECT last_name,LENGTH(last_name)
FROM employees
ORDER BY LENGTH (last_name) ASC;

17.查询员工的入职时间 显示为‘2020-04-07 ’

SELECT DATE_FORMAT(`hiredate`,'%Y-%m-%d %H时%i分%s秒') AS 入职时间,last_name
FROM employees;

18.查询员工的名字和旧薪资和新的薪资。

#薪资变动规则:
#如果部门编号大于100 薪资提高为3倍
#如果部门编号大于80 薪资为2倍
#如果部门编号大于50 薪资为1倍
#否则薪资为1/2

SELECT last_name,salary ,department_id,
CASE
WHEN department_id>100 THEN salary *3
WHEN department_id>80 THEN salary*2
WHEN department_id>50 THEN salary*1
ELSE salary/2
END AS 新的薪资
FROM employees;

19.查询员工的工种编号、姓名、旧工资,新薪资。
薪资改变规则:
工种为’IT_PROG’,薪资为原来的5倍
工种为’AD_VP’,薪资为原来的3倍
工种为’FI_MGR’,薪资为原来的2倍
工种为’PU_CLERK’,薪资为原来不变
否则,薪资为原来的一半

SELECT job_id,last_name,salary,
CASE job_id
WHEN 'IT_PROG' THEN salary*5
WHEN 'AD_VP' THEN salary*3
WHEN 'FI_MGR' THEN salary*2
WHEN 'PU_CLERK' THEN salary
ELSE salary/2
END AS 新薪资
FROM employees;

20.查询员工表中前5条数据

SELECT * 
FROM employees
LIMIT 0,5;

21.查询员工表汇总第6-10条数据

SELECT * 
FROM employees
LIMIT 5,5;

22.查询员工表第10-15条数据

SELECT *
FROM employees
LIMIT 10,5;

23.查询第n页的数据 10条数据为一页

SELECT * 
FROM employees
LIMIT 10*(n-1),10;

24.查询员工的薪资总和、平均薪资、最大薪资、最小薪资员工个数

select SUM(salary) 薪资总和,AVG(salary) 平均薪资,MAX(salary) 最大薪资,MIN(salary)最小薪资,COUNT(salary)员工个数
FROM employees;

25.查询有奖金的员工的平均薪资

SELECT AVG(salary) 平均薪资
FROM employees
WHERE commission_pct IS NOT NULL;

26.查询员工的年薪的最大值

SELECT MAX(salary*12*(1+IFNULL(commission_pct,0))) 最大年薪
FROM employees;

27.查询员工的奖金率

SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/107,MIN(commission_pct),COUNT(commission_pct)
FROM employees;
sum(),avg(),min(),max(),count()忽略null#支持类型
#sum avg支持数值类型,不支持字符类型
#max 支持所有类型

28.计算数据库表(员工表)中数据的个数

SELECT COUNT(*) FROM employees;
#count() 计算个数 * 数字 统计数据的行数(一般使用)

29.查询每个部门的平均薪资

SELECT department_id,AVG(salary) 平均薪资
FROM employees
GROUP BY department_id;

30.查询每个部门的员工个数

SELECT department_id,COUNT(*)员工个数
FROM employees
GROUP BY department_id;

31.查询有奖金的每个部门的平均薪资

SELECT department_id ,AVG(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id;

32.查询那些部门的最低薪资大于5000

SELECT department_id 部门编号,MIN(salary) 最低薪资
FROM employees
GROUP  BY department_id
HAVING MIN(salary)>5000;

33.查询员工的名字中包含a字符的那个部门的平均薪资小于5000

SELECT department_id,AVG(salary)
FROM employees
WHERE last_name LIKE "%a%"
GROUP BY department_id
HAVING AVG(salary)<5000;

34.查询员工的名字中包含a字符的那个部门的平均薪资小于5000,并且按照平均薪资升序

SELECT department_id,AVG(salary)
FROM employees
WHERE last_name LIKE "%a%"
GROUP BY department_id
HAVING AVG(salary)<5000
ORDER BY AVG(salary) ASC;

35.查询员工的编号不在100到120之间每个工种每个部门的平均工资,按照平均工资升序

SELECT AVG(salary),job_id 工种id,department_id 部门id,COUNT(*)
FROM employees
WHERE employee_id NOT BETWEEN 100 AND 120
GROUP BY job_id,department_id
ORDER BY AVG(salary) ASC;

36.查询员工表中员工员工姓名、入职日期并按照入职日期升序排列

SELECT last_name 员工姓名,hiredate 入职日期
FROM employees
ORDER BY hiredate ASC;

37.将当前日期显示成 xxxx年xx月xx日

SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日");

38.查询各个管理者手下员工的最低工资,其中最低工资不能低于 6000,没有管理者的员工不计算在内

SELECT manager_id 管理者id,MIN(salary)最低工资
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY(manager_id)
HAVING MIN(salary)>=6000;

或者
SELECT manager_id 管理者id, MIN(salary) 最低工资
FROM employees
GROUP BY (manager_id)
HAVING  MIN(salary)>=6000 
AND manager_id  IS NOT NULL;

这两种方式推荐使用第二种,效率要比第一种高

39.查询有奖金的员工的每个部门的最低薪资>5000,按照最低薪资升序

SELECT department_id 分组字段部门id,MIN(salary) 分组函数最低薪资
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id
HAVING MIN(salary)>5000
ORDER BY MIN(salary) ASC;

40.查询员工的名字和其对应部门的名字

SELECT e.last_name,d.department_name
FROM  employees	e,departments d
WHERE e.department_id = d.department_id;

#两表可以交换顺序
SELECT e.`last_name`,d.`department_name`
FROM departments d,employees e
WHERE d.`department_id` = e.`department_id`;

41.查询有奖金并且邮箱中包含a字符的员工的名字,邮箱,年薪,工种名

SELECT e.`last_name`,e.`email`,e.`salary`*12*(1+IFNULL(commission_pct,0)) 年薪,j.`job_title`
FROM employees e, jobs j
WHERE e.`job_id`=j.`job_id`
AND e.`commission_pct` IS NOT NULL 
AND e.`email` LIKE '%a%';

42.查询那个城市的部门个数>5

SELECT COUNT(*) 部门个数,l.`city` 城市
FROM locations l,departments d
WHERE l.location_id = d.`location_id`
GROUP BY l.`city`
HAVING 部门个数>5;

43.查询每个工种的平均薪资、工种名,并按照平均薪资实现降序

SELECT job_title 工种名,AVG(salary) 平均薪资
FROM jobs j,employees e
WHERE j.`job_id` = e.`job_id`
GROUP BY j.`job_title`
ORDER BY 平均薪资 DESC;

44.查询员工对应的员工名、部门名和工种名

SELECT e.`last_name` 员工名,d.`department_name`部门名,j.`job_title` 工种名
FROM employees e,departments d,jobs j
WHERE e.`department_id` = d.`department_id`
AND e.`job_id` = j.`job_id`;

45.查询员工的名字和其对应的领导的名字、薪资

SELECT e2.`last_name` 员工名字,e.`last_name` 领导名字 ,e.`salary` 领导薪资
FROM employees e,employees e2
WHERE e.`employee_id` = e2.`manager_id`

46.查询员工名和其对应的部门的名字

SELECT e.`last_name`,d.department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id` = d.department_id;

47.查询有奖金的员工的工种名、员工名和薪资

SELECT j.`job_title`工种名,e.`last_name`员工名,e.`salary`薪资
FROM jobs j
INNER JOIN employees e
ON j.`job_id` = e.`job_id`
WHERE commission_pct IS NOT NULL;

48.每个部门的部门名和员工的最低薪资,筛选出最低薪资小于5000的

SELECT d.`department_name`,MIN(salary)
FROM departments d
INNER JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY d.`department_name`
HAVING MIN(salary) <5000;

49.查询每个城市的部门个数,按照个数降序

SELECT l.`city`,COUNT(*)
FROM locations l
INNER JOIN departments d
ON l.`location_id` = d.`location_id`
GROUP BY l.`city`
ORDER BY COUNT(*) DESC;

50.查询员工名以及对应的部门名和工种名

SELECT e.`last_name`,d.`department_id`,j.`job_title` 
FROM employees e
INNER JOIN departments d
ON e.`department_id` = d.`department_id`
INNER JOIN jobs j 
ON e.`job_id` = j.`job_id`;

51.查询员工名和对应的领导名和薪资

SELECT e.`employee_id`员工id,e.`last_name`员工名,m.`last_name`领导名,m.`employee_id` 领导id
FROM employees e
INNER JOIN employees m
ON e.`manager_id` = m.`employee_id`;

52.查询所有部门对应的员工信息

SELECT d.`department_id`,e.*
FROM departments d
LEFT OUTER JOIN employees e
ON e.`department_id` = d.`department_id`;

53.查询那个部门中没有员工

SELECT d.`department_id`,e.*
FROM employees e
RIGHT OUTER JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`employee_id` IS NULL;

54.查询没有员工的部门个数

SELECT COUNT(*) 没有员工的部门个数
FROM departments d
LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`department_id` IS NULL;

或者
SELECT COUNT(department_id) 没有员工的部门个数
FROM departments d
LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY d.`department_id`
HAVING COUNT(employee_id) = 0;

55.将两个表的所有数据都查询出来,有对应关系的显示出来,没有对应关系的显示null(注意mysql中没有全连接)

SELECT e.`employee_id`,e.`last_name`,d.`department_id`,d.`department_name`
FROM employees e
LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION 
SELECT e.`employee_id`,e.`last_name`,d.`department_id`,d.`department_name`
FROM employees e
RIGHT JOIN  departments d
ON e.`department_id` = d.`department_id`;

56.查询比"Austin"的薪资低的员工信息

#1.查询“Austin”的薪资
SELECT salary
FROM employees
WHERE last_name = 'Austin';

#2.将1作为条件
SELECT *
FROM employees
WHERE salary<(
SELECT salary
FROM employees
WHERE last_name = 'Austin'
);

57.查询location_id 是1700或1400部门中的所有员工姓名

#1.查询location_id 时1700或1400的部门编号
SELECT location_id,department_id
FROM departments
WHERE location_id IN(1700,1400)
ORDER BY department_id ASC;

#2.将第一步作为条件
SELECT last_name,department_id 
FROM employees
WHERE department_id IN(
SELECT department_id
FROM departments
WHERE location_id IN(1700,1400)
)
ORDER BY department_id ASC;

58.查询其他工种比job_id为‘IT_PROG’工种中任一员工高的员工的员工号以及工种号和薪资

#1.查询工种为it_prog的员工的薪资
SELECT MIN(salary)
FROM employees e
WHERE e.`job_id` = 'IT_PROG';

#2.将1作为条件
SELECT e.`employee_id`,e.`last_name`,e.`department_id`,e.`salary`
FROM employees e
WHERE salary >(
	SELECT MIN(salary)
	FROM employees e
	WHERE e.`job_id` = 'IT_PROG'

)AND job_id<>'IT_PROG';

59.查询每个国家下的部门个数大于 2 的国家编号

SELECT l.`country_id` 国家编号,COUNT(*)部门个数
FROM locations l,departments d
WHERE l.`location_id` = d.`location_id`
GROUP BY l.`country_id`
HAVING 部门个数>2;

60.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号

SELECT e.`last_name` 员工姓名,e.`employee_id` 员工id,m.`last_name`管理者姓名,m.`employee_id` 管理者id
FROM employees e,employees m
WHERE e.`manager_id` = m.`employee_id`;

61.查询工资最高的员工的姓名,要求 first_name 和 last_name 显示为一列,列名为 姓.名

#1.查询最高工资
SELECT MAX(salary)
FROM employees;
#2.查询姓名
SELECT CONCAT(first_name,'.',last_name) "姓.名"
FROM employees
WHERE salary =(
SELECT MAX(salary)
FROM employees
);

62.查询管理者是 K_ing 的员工姓名和工资

SELECT e.`last_name`员工姓名,e.`salary`工资,m.`last_name`领导名
FROM employees e,employees m
WHERE e.`manager_id` = m.`employee_id`
AND m.`last_name`="K_ing";

63.查询和姓名中包含字母 u 的员工在相同部门的员工的员工号和姓名

SELECT e.`employee_id`员工id,e.`last_name`员工名,e.`department_id`部门id
FROM employees e
WHERE e.`department_id` IN(
	SELECT department_id
	FROM employees e
	WHERE e.`last_name` LIKE '%u%'
);

64.查询工资比公司平均工资高的员工的员工号,姓名和工资。

#1.查询公司的平均工资
SELECT AVG(salary) 平均工资
FROM employees;
#2.根据子查询判断
SELECT e.`employee_id`,e.`last_name`,e.`salary`
FROM employees e
WHERE e.salary>(
SELECT AVG(salary) 平均工资
FROM employees
);

65.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资

#1.将部门编号和部门得平均薪资
SELECT department_id,AVG(salary)
FROM employees 
GROUP BY department_id;


#2.将1当成表和员工表建立关系
SELECT e.`department_id` 员工id,e.`last_name`员工姓名,e.`salary` 员工薪资,dep_avg.平均薪资
FROM employees e
INNER JOIN (
	SELECT department_id,AVG(salary) 平均薪资
	FROM employees 
	GROUP BY department_id
)dep_avg
ON e.`department_id` = dep_avg.department_id
WHERE e.`salary`>dep_avg.平均薪资;
发布了29 篇原创文章 · 获赞 9 · 访问量 811

猜你喜欢

转载自blog.csdn.net/qq_41488299/article/details/105523608
今日推荐