MySQL教程-练习篇

建表语句下载:https://pan.baidu.com/s/1LvmDPuv87ws-0lt3ypXbeQ

提取码:lusu

也可以微信扫码下载:

所用到的表如下:

mysql> desc departments;
+-----------------+------------+------+-----+---------+----------------+
| Field           | Type       | Null | Key | Default | Extra          |  部门表
+-----------------+------------+------+-----+---------+----------------+
| department_id   | int(4)     | NO   | PRI | NULL    | auto_increment |  部门编号
| department_name | varchar(3) | YES  |     | NULL    |                |  部门名称
| manager_id      | int(6)     | YES  |     | NULL    |                |  部门领导的员工编号
| location_id     | int(4)     | YES  | MUL | NULL    |                |  位置编号
+-----------------+------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> desc employees;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |  员工表
+----------------+--------------+------+-----+---------+----------------+
| employee_id    | int(6)       | NO   | PRI | NULL    | auto_increment |  员工编号
| first_name     | varchar(20)  | YES  |     | NULL    |                |  员工的名
| last_name      | varchar(25)  | YES  |     | NULL    |                |  员工的姓
| email          | varchar(25)  | YES  |     | NULL    |                |  邮箱
| phone_number   | varchar(20)  | YES  |     | NULL    |                |  手机号
| job_id         | varchar(10)  | YES  | MUL | NULL    |                |  工种编号
| salary         | double(10,2) | YES  |     | NULL    |                |  工资
| commission_pct | double(4,2)  | YES  |     | NULL    |                |  奖金率
| manager_id     | int(6)       | YES  |     | NULL    |                |  上级领导的员工编号
| department_id  | int(4)       | YES  | MUL | NULL    |                |  部门编号
| hiredate       | datetime     | YES  |     | NULL    |                |  入职时间
+----------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
mysql> desc jobs;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |  工种表
+------------+-------------+------+-----+---------+-------+
| job_id     | varchar(10) | NO   | PRI | NULL    |       |  工种编号
| job_title  | varchar(35) | YES  |     | NULL    |       |  工种名称
| min_salary | int(6)      | YES  |     | NULL    |       |  最低工资
| max_salary | int(6)      | YES  |     | NULL    |       |  最高工资
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> desc locations;
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |  位置表
+----------------+-------------+------+-----+---------+----------------+  
| location_id    | int(11)     | NO   | PRI | NULL    | auto_increment |  位置编号
| street_address | varchar(40) | YES  |     | NULL    |                |  街道
| postal_code    | varchar(12) | YES  |     | NULL    |                |  邮编
| city           | varchar(30) | YES  |     | NULL    |                |  城市
| state_province | varchar(25) | YES  |     | NULL    |                |  州/省
| country_id     | varchar(2)  | YES  |     | NULL    |                |  国家编号
+----------------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> desc job_grades;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |  工资级别定义表
+-------------+------------+------+-----+---------+-------+
| grade_level | varchar(3) | YES  |     | NULL    |       |  工资级别代码
| lowest_sal  | int(11)    | YES  |     | NULL    |       |  当前级别的最低薪资
| highest_sal | int(11)    | YES  |     | NULL    |       |  当前级别的最高薪资
+-------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

 

mysql> desc boys;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |  男神表
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |  ID
| boyName | varchar(20) | YES  |     | NULL    |                |  姓名
| userCP  | int(11)     | YES  |     | NULL    |                |  CP值
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> desc beauty;
+--------------+-------------+------+-----+---------------------+----------------+
| Field        | Type        | Null | Key | Default             | Extra          |  女神表
+--------------+-------------+------+-----+---------------------+----------------+
| id           | int(11)     | NO   | PRI | NULL                | auto_increment |  ID
| name         | varchar(50) | NO   |     | NULL                |                |  姓名
| sex          | char(1)     | YES  |     | 女                  |                |  性别
| borndate     | datetime    | YES  |     | 1987-01-01 00:00:00 |                |  生日
| phone        | varchar(11) | NO   |     | NULL                |                |  电话
| photo        | blob        | YES  |     | NULL                |                |  照片
| boyfriend_id | int(11)     | YES  |     | NULL                |                |  男朋友的ID
+--------------+-------------+------+-----+---------------------+----------------+
7 rows in set (0.00 sec)

练习语句如下:

#查询工资>12000的员工信息
SELECT * FROM employees WHERE salary > 12000;

#查询部门编号不等于90的员工名和部门编号
SELECT last_name, department_id FROM employees WHERE department_id != 90;

#查询工资在10000到20000之间的员工名、工资以及奖金
SELECT last_name, salary, commission_pct FROM employees WHERE salary >= 10000 AND salary <= 20000;

#查询部门编号不是在90到100之间,或者工资高于15000的员工信息
SELECT * FROM employees WHERE NOT(department_id > 90 AND department_id < 100) OR salary > 15000;

#查询员工last_name中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';

#查询员工last_name的第二个字符为a,第五个字符为e的员工信息
SELECT * FROM employees WHERE last_name LIKE '_a__a%' ;

#查询员工last_name的第二个字符为_的员工信息
SELECT * FROM employees WHERE last_name LIKE '_\_%';

#查询工资在10000到20000之间的员工名、工资以及奖金
SELECT last_name, salary, commission_pct FROM employees WHERE salary BETWEEN 10000 AND 20000;

#查询员工的工种编号为 IT_PROG,AD_VP,AD_PRES中的一个的员工信息
SELECT * FROM employees WHERE job_id IN('IT_PROG', 'AD_VP', 'AD_PRES');

#查询没有奖金的员工信息
SELECT * FROM employees WHERE commission_pct IS NULL;

#查询有奖金的员工信息
SELECT * FROM employees WHERE commission_pct IS NOT NULL;
SELECT * FROM employees WHERE commission_pct <=> NULL;

#查询员工号为176的员工的姓名、部门号和年薪
SELECT first_name, last_name, department_id, salary*12*(1 + IFNULL(commission_pct, 0)) AS '年薪' FROM employees WHERE employee_id = '176';

#查询员工信息,按照工资从高到低进行排序
SELECT * FROM employees ORDER BY salary ASC;

#查询部门编号 >= 90 的员工信息,按入职时间进行降序排序
SELECT * FROM employees WHERE department_id >= 90 ORDER BY hiredate DESC;

#按年薪的高低显示员工的姓名和年薪【按表达式排序】
SELECT first_name, last_name, salary*12*(1 + IFNULL(commission_pct, 0)) AS 年薪 FROM employees ORDER BY salary*12*(1 + IFNULL(commission_pct, 0)) DESC;
SELECT first_name, last_name, salary*12*(1 + IFNULL(commission_pct, 0)) AS 年薪 FROM employees ORDER BY '年薪'  DESC;

#按姓氏长度显示员工的姓名和工资【按函数排序】
SELECT LENGTH(first_name) AS '姓名长度', first_name, salary FROM employees ORDER BY LENGTH(first_name) DESC;

#查询员工信息,要求先按工资升序排列,再按员工编号排序降序排列【多个字段的排序】
SELECT * FROM employees ORDER BY salary ASC, employee_id DESC;

#查询工资不在 8000到 17000 范围内的员工的姓名和工资,按工资降序排列
#第一种写法:不包含边界值 8000 和 17000
SELECT first_name, last_name,salary FROM employees WHERE salary NOT BETWEEN 8000 AND 17000 ORDER BY salary DESC;
#第二种写法:包含边界值 8000 和 17000
SELECT first_name, last_name,salary FROM employees WHERE NOT (salary >8000 AND salary <17000) ORDER BY salary DESC;

#查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC, department_id ASC;

#查询有奖金的员工名和入职日期(XX月/XX日  XX年)
SELECT last_name, DATE_FORMAT(hiredate,'%m月/%d日 %Y年') AS '入职日期' FROM employees WHERE commission_pct IS NOT NULL;

#查询员工的名字和奖金情况,如果没奖金,显示 '没奖金,呵呵' ,如果有奖金,显示 '有奖金,嘻嘻'
SELECT last_name, commission_pct, IF(commission_pct IS NULL, '没奖金,呵呵', '有奖金,嘻嘻') AS '奖金情况' FROM employees ;

#查询员工的工资,要求:
部门号=30,显示的工资为 1.1倍
部门号=40,显示的工资为 1.2倍
部门号=50,显示的工资为 1.3倍
其他部门显示原工资
SELECT last_name, salary,department_id,
(
    CASE department_id
    WHEN 30 THEN salary*1.1
    WHEN 40 THEN salary*1.2
    WHEN 50 THEN salary*1.3
    ELSE salary
    END
) AS '备注'
FROM employees;

#查询员工的工资情况
如果工资 >20000,显示A级别
如果工资 >15000,显示B级别
如果工资 >10000,显示C级别
其余的显示D级别
SELECT salary,
CASE 
    WHEN salary > 20000 THEN 'A'
    WHEN salary > 15000 THEN 'B'
    WHEN salary > 10000 THEN 'C'
    ELSE 'D'
END AS '级别'
FROM employees;

#查询工号、姓名,工资,以及工资提高20%的结果(NEW salary)
SELECT employee_id AS '工号', last_name AS '姓名', salary AS '工资', salary*1.2 AS '新工资' FROM employees;

#将员工姓名按首字母排序,并写出姓名的长度
SELECT last_name AS '姓名', LENGTH(last_name) AS '姓名长度' FROM employees ORDER BY LENGTH(last_name) DESC;

#查询员工表中的最大入职时间和最小入职时间的相差天数
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) FROM employees;

#查询每个部门的平均工资
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;

#查询每个位置上的部门个数
SELECT location_id, COUNT(*) FROM departments GROUP BY location_id;

#查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary) , department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;

#查询每个领导手下有奖金的员工的最高工资(添加分组前的筛选条件)
SELECT MAX(salary) , manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;

#查询有哪些部门的员工数量 > 2 (添加分组后的筛选条件)
步骤1:查询每个部门的员工个数
SELECT COUNT(*) AS num, department_id FROM employees GROUP BY department_id;
步骤2:根据1的结果进行筛选,查询哪个部门的员工个数 >2
SELECT COUNT(*) AS num, department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 2;

#查询每个工种有奖金的最高工资 > 12000的工种编号和其最高工资
步骤1:查询每个工种有奖金的员工的工种编号和其最高工资
SELECT job_id, MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id ;
步骤2:根据1的结果进行筛选,查询最高工资 > 12000 的结果
SELECT job_id, MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary) > 12000;

#查询领导编号 > 102 的每个领导手下的最低工资 > 5000 的领导编号,以及其最低工资
步骤1:查询领导编号 > 102 的每个领导的编号,以及该领导下的员工的最低工资
SELECT manager_id, MIN(salary) FROM employees WHERE manager_id > 102 GROUP BY manager_id ;
步骤2:在1的基础上,进一步筛选最低工资 > 5000的
SELECT manager_id, MIN(salary) FROM employees WHERE manager_id > 102 GROUP BY manager_id HAVING MIN(salary) > 5000;

#按员工姓名长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
步骤1::按员工姓名长度分组,查询每一组的员工个数
SELECT COUNT(*) FROM employees GROUP BY LENGTH(last_name) ;
步骤2:在步骤1的基础上,筛选员工个数 > 5 的
SELECT COUNT(*) c FROM employees GROUP BY LENGTH(last_name) HAVING c > 5;

#查询每个部门每个工种的员工的平均工资
SELECT AVG(salary), job_id, department_id FROM employees GROUP BY department_id, job_id;

#查询每个部门每个工种的员工的平均工资,并按平均工资的从高到低显示出来
SELECT AVG(salary), job_id, department_id FROM employees GROUP BY department_id, job_id ORDER BY AVG(salary) DESC;

#查询每个部门每个工种的员工的平均工资,将平均工资 > 10000 的从高到低显示出来
SELECT AVG(salary), job_id, department_id FROM employees GROUP BY department_id, job_id HAVING AVG(salary) > 10000 ORDER BY AVG(salary) DESC;

#查询各job_id的员工工资的最大值、最小值、平均值、总和,并按 job_id 排序
SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary) FROM employees GROUP BY job_id;

#查询员工最高工资和最低工资的差距
SELECT MAX(salary), MIN(salary), MAX(salary) - MIN(salary) AS '差距' FROM employees;

#查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT MIN(salary), manager_id FROM employees WHERE manager_id IS NOT NULL GROUP BY manager_id HAVING MIN(salary) >= 6000;

#查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT department_id, COUNT(*), AVG(salary) FROM employees GROUP BY manager_id ORDER BY AVG(salary) DESC;

#选择具有各个job_id的员工人数
SELECT COUNT(*), job_id FROM employees GROUP BY job_id;

#查询女神名和对应的男神名
SELECT name, boyname from beauty, boys WHERE beauty.boyfriend_id = boys.id;

#查询员工名、工种号、工种名(并为表起别名)
SELECT last_name, e.job_id, jobs.job_title FROM employees e, jobs WHERE e.job_id = jobs.job_id;

#查询城市名中第二个字符为o的部门名和城市名
SELECT d.department_name, l.city FROM departments d, locations l WHERE d.location_id = l.location_id AND l.city LIKE '_o%';

#查询每个城市的部门个数
SELECT COUNT(*), l.city FROM locations l, departments d WHERE l.location_id = d.location_id GROUP BY l.city;

#查询有奖金的每个部门的部门名称、部门的领导编号和该部门的最低工资
SELECT d.department_name, d.manager_id, MIN(salary) FROM departments d, employees e WHERE d.department_id    = e.department_id AND e.commission_pct IS NOT NULL GROUP BY d.department_name;

#查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECT COUNT(*), job_title FROM employees e, jobs j WHERE e.job_id = j.job_id GROUP BY e.job_id ORDER BY COUNT(*) DESC;

#查询员工的工资和工资级别
SELECT salary, grade_level FROM employees e, job_grades g WHERE e.salary BETWEEN g.lowest_sal AND g.highest_sal;

#查询员工和上级的名称
SELECT e.employee_id '员工的ID', e.last_name '员工的名字', m.employee_id '领导的ID', m.last_name '领导的名字' FROM employees e, employees m WHERE e.manager_id = m.employee_id;

#显示员工表的最大工资,工资平均值
SELECT MAX(salary), AVG(salary) FROM employees;

#查询员工表的employee_id,job_id,last_name,按department_id降序,按salary升序
SELECT employee_id, job_id, last_name FROM employees ORDER BY department_id DESC, salary ASC;

#查询员工表中 jobs_id 中包含 a 和 e 的,并且 a 在 e 的前面
SELECT job_id FROM employees where job_id LIKE '%a%e%';

#显示当前日期,以及去前后空格,截取子字符串的函数
SELECT CURRENT_DATE();
SELECT TRIM(" 123 ");
SELECT SUBSTR("123456",2);

#查询90号部门员工的job_id和90号部门的location_id
SELECT e.job_id, d.location_id FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_id = '90';

#查询所有有奖金的员工的last_name,departmeng_name,location_id,city
SELECT e.last_name, d.department_name, l.location_id, l.city FROM employees e, departments d, locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id AND e.commission_pct IS NOT NULL;

#查询每个工种、每个部门的部门名、工种名和最低工资
SELECT j.job_title, d.department_name, MIN(salary) FROM employees e, departments d, jobs j WHERE e.department_id = d.department_id AND e.job_id = j.job_id GROUP BY d.department_name, j.job_title 

#查询city在Toronto工作的员工的last_name,job_id,department_id,department_name
SELECT e.last_name, e.job_id, d.department_id, d.department_name FROM employees e, departments d, locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id AND l.city = 'Toronto';

#选择指定员工的姓名、员工号,以及他的上级的姓名和工号,结果类似如下格式
# employees  Emp#    manager   Mgr#
#   john         101      king      100
SELECT e.last_name AS 'employees', e.employee_id AS 'Emp#', m.last_name AS 'manager', m.employee_id AS 'Mgr#' FROM employees e, employees m WHERE e.manager_id = m.employee_id; 

#查询每个国家下的部门个数大于2的国家编号
SELECT l.country_id AS '国家编号', COUNT(*) FROM departments d, locations l WHERE d.location_id = l.location_id GROUP BY country_id HAVING COUNT(*) >2;

#查询员工名、部门名
SELECT last_name, department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;

#查询名字中包含a的员工名和工种名(筛选)
SELECT last_name, job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id WHERE last_name LIKE '%e%';

#查询部门个数>3的城市名和部门个数(分组+筛选)
SELECT city, COUNT(*) FROM departments d INNER JOIN locations l ON d.location_id = l.location_id GROUP BY city HAVING COUNT(*) > 3;

#查询哪个部门的部门员工个数>3的部门名和员工个数,并按个数降序(排序)
SELECT department_name, COUNT(*) FROM employees e INNER JOIN departments d ON e.department_id = d.department_id GROUP BY department_name HAVING COUNT(*) >3 ORDER BY COUNT(*) DESC;

#查询员工名、部门名、工种名,并按部门名降序(三表连接的话,需要考虑连接顺序是否能保证有结果)
SELECT last_name, department_name, 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 ORDER BY department_name DESC; 

#查询员工的工资级别
SELECT last_name, salary, grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal HAVING grade_level = 'E';

#查询工资级别对应的员工个数>20的工资级别和对应的员工数量,并按工资级别降序排列
SELECT grade_level, COUNT(grade_level) FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.h;

#查询员工的名字和对应的上级的名字,按员工的名字升序排列
SELECT e.last_name '员工', m.last_name '领导' FROM employees e JOIN employees m ON e.manager_id = m.employee_id ORDER BY e.last_name ASC;

#查询男朋友不在男神表(boys)的女神名(beauty)
SELECT bea.name, bo.id, bo.boyName FROM beauty bea LEFT JOIN boys bo ON bea.boyfriend_id = bo.id WHERE bo.id IS NULL;

#查询女朋友不在女神表(beauty)的男神名(boys)
SELECT bo.*, bea.* FROM boys bo LEFT JOIN beauty bea ON bo.id = bea.boyfriend_id WHERE bea.id IS NULL;

#查询哪个部门没有员工
SELECT department_name, e.* FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id WHERE e.employee_id IS NULL GROUP BY department_name;

#查询男朋友不在男神表(boys)的女神名(beauty)
SELECT bea.name, bo.id, bo.boyName FROM boys bo RIGHT JOIN beauty bea ON bea.boyfriend_id = bo.id WHERE bo.id IS NULL;

#查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,则用null填充
SELECT be.name, b.* FROM beauty be LEFT JOIN boys b ON b.id = be.boyfriend_id WHERE be.id >3;

#查询哪个城市没有部门
SELECT l.city, d.* FROM locations l LEFT JOIN departments d ON d.location_id = l.location_id WHERE d.department_id IS NULL;

#查询部门名为SAL或IT的员工信息
【这里部门名为 IT 的部门总共有两个,其中两个没有对应的员工信息】
SELECT d.department_id, d.department_name, e.* FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id WHERE d.department_name IN ('SAL','IT');

#谁的工资比Abel高?
SELECT * FROM employees e WHERE e.salary > (SELECT salary FROM employees WHERE last_name = 'Abel');

#查询job_id与141号员工相同,salary比143号员工多的员工姓名、job_id和工资
SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = '141') AND salary > (SELECT salary FROM employees WHERE employee_id = '143');

#查询工资最少的员工的last_name,job_id,salary
SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);

#查询最低工资大于(部门编号为50的部门最低工资)的部门ID和其最低工资
①查询所有的部门ID与其最低工资
SELECT e.department_id, MIN(salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY e.department_id;
②查询编号为50的部门的最低工资
SELECT MIN(salary) FROM employees WHERE department_id = '50';
③在①的基础上,使用HAVING筛选条件②
SELECT e.department_id, MIN(salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = '50');

#查询location_id 是1400或1700的部门中的所有员工姓名
①查询location_id 是1400或1700的部门ID
SELECT location_id FROM departments d WHERE d.location_id IN ('1400', '1700');
②查询部门编号是①列表中的所有部门对应的员工姓名
SELECT last_name FROM employees WHERE department_id IN (SELECT department_id FROM departments d WHERE d.location_id IN ('1400', '1700'));

#查询其他工种中比 job_id为'IT_PROG'部门任一工资低的员工的:工号、姓名、job_id以及salary
#①查询job_id为'IT_PROG'部门任一工资
SELECT salary FROM employees WHERE job_id = 'IT_PROG';
#②查询工号、姓名、job_id以及salary,增加筛选条件:salary < (①)的任意一个,使用 ANY
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ANY(SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id != 'IT_PROG';

#查询其他工种中比 job_id为'IT_PROG'部门所有工资低的员工的:工号、姓名、job_id以及salary
#①查询job_id为'IT_PROG'部门所有工资
SELECT salary FROM employees WHERE job_id = 'IT_PROG';
#②查询工号、姓名、job_id以及salary,增加筛选条件:salary < (①)的所有,使用 ALL
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL(SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id != 'IT_PROG';

#查询员工编号最小且工资最高的员工信息
#①查询员工最小编号
SELECT MIN(employee_id) FROM employees;
#②查询最高工资
SELECT MAX(salary) FROM employees;
#③查询员工信息,过滤条件为①和②
SELECT * FROM employees WHERE employee_id = (SELECT MIN(employee_id) FROM employees) AND salary = (SELECT MAX(salary) FROM employees);
#使用行自查询实现(必须多个筛选条件都是 = 连接)
SELECT * FROM employees WHERE (employee_id, salary) = (SELECT MIN(employee_id), MAX(salary) FROM employees);

#查询每个部门的员工个数
SELECT d.*, (
    SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id
) AS '员工个数'
FROM departments d;

#查询员工号=102的部门名
SELECT (
    SELECT department_name FROM departments d
    WHERE d.department_id = e.department_id
) FROM employees e WHERE e.employee_id = 102;

#查询每个部门的平均工资的工资等级
#①查询每个部门的平均工资
SELECT AVG(salary) FROM employees GROUP BY department_id;
#②将①的结果集作为查询的表,查询平均工资对应的等级
SELECT grade_level, s.`平均工资` FROM (SELECT AVG(salary) AS '平均工资' FROM employees GROUP BY department_id) s, job_grades j WHERE s.`平均工资` BETWEEN lowest_sal AND highest_sal;

#查询有员工的部门名
#①查询所有的部门名
SELECT department_name FROM departments;
#②在①的基础上,筛选有员工的部门名
SELECT department_name FROM departments d WHERE EXISTS

    SELECT * FROM employees e WHERE e.department_id = d.department_id 
);
#用IN来实现
SELECT department_name FROM departments WHERE department_id IN (SELECT department_id FROM employees);

#查询没有女朋友的男神信息
#用 IN 实现
SELECT * FROM boys bo WHERE bo.id NOT IN (SELECT boyfriend_id FROM beauty);
#用 EXISTS 实现
SELECT * FROM boys bo WHERE NOT EXISTS (SELECT boyfriend_id FROM beauty bea WHERE bo.id = bea.boyfriend_id);

#查询和Zlotkey相同部门的员工姓名和工资
SELECT last_name, salary FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE last_name = 'Zlotkey');

#查询工资比平均工资高的员工的员工号,姓名和工资
SELECT employee_id, last_name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

#查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资
#①查询各部门的平均工资
SELECT AVG(salary), department_id FROM employees GROUP BY department_id;
#②将①的结果集作为表,与employees e2 进行内连接,连接条件为 e.department_id = ①.department_id,同时,通过salary进行筛选过滤
SELECT employee_id, last_name, salary FROM employees e1 INNER JOIN (SELECT AVG(salary) ag, department_id FROM employees GROUP BY department_id) e2 ON e1.department_id = e2.department_id WHERE e1.salary > e2.ag;
#也可以用如下的方式实现
SELECT employee_id, last_name, salary, department_id FROM employees e1 WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e1.department_id = e2.department_id GROUP BY e2.department_id );

#查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名(注意用 DISTINCT 去重)
SELECT employee_id, last_name FROM employees WHERE department_id IN (SELECT DISTINCT(department_id) FROM employees WHERE last_name LIKE '%u%');

#查询在部门的location_id为1700的部门工作的员工的员工号和姓名
SELECT employee_id, last_name FROM employees WHERE    department_id IN (SELECT department_id FROM departments WHERE location_id = '1700');

#查询管理者是K_ing的员工姓名和工资
SELECT last_name, salary FROM employees WHERE manager_id IN (SELECT employee_id FROM employees WHERE last_name = 'K_ing');

#查询工资最高的员工的姓名,要求first_name和last_name显示为一列,列名为 '姓名'
SELECT CONCAT(last_name,first_name) AS '姓.名' FROM employees WHERE salary = (SELECT MAX(salary) FROM employees); 

#查询前五条员工信息
SELECT  * FROM employees LIMIT 0, 5;

#查询有奖金的员工信息,并且工资较高的前10名显示出来
SELECT * FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC LIMIT 0,10;

#查询工资最低的的员工信息
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);

#查询平均工资最低的部门信息
SELECT * FROM departments WHERE department_id = (SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 1);

#查询平均工资最低的部门信息和该部门的平均工资
#①查询平均工资最低的部门ID和平均工资,结果集为表1
SELECT AVG(salary) ag, department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 1;
#②查询所有部门的部门信息,结果集为表2
SELECT * FROM departments;
#③表1与表2连接,连接条件为 department_id
SELECT d1.*, d2.ag AS '平均工资' FROM departments d1, (SELECT AVG(salary) ag, department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 1) d2 WHERE d1.department_id = d2.department_id;


#查询平均工资最高的job信息
#①查询平均工资最高的job_id
SELECT job_id FROM employees GROUP BY job_id ORDER BY AVG(salary) DESC LIMIT 1
#②查询job信息,job_id =①
SELECT * FROM jobs WHERE job_id = (SELECT job_id FROM employees GROUP BY job_id ORDER BY AVG(salary) DESC LIMIT 1)

#查询平均工资高于公司平均工资的部门有哪些
#①查询每个部门的department_id,筛选出大于公司平均工资的
SELECT department_id FROM employees GROUP BY department_id HAVING AVG(salary) > (SELECT MIN(salary) FROM employees);
#查询department_id IN(①)的部门信息
SELECT * FROM departments WHERE department_id IN (
    SELECT department_id FROM employees GROUP BY department_id HAVING AVG(salary) > (SELECT MIN(salary) FROM employees)
);

#查询公司所有manager的详细信息
SELECT * FROM employees WHERE employee_id IN (SELECT DISTINCT(manager_id) FROM employees);    

#各个部门中,最高工资最低的部门是哪个?其最低工资是多少
#①查询各个部门的最高工资,最低工资和部门编号
SELECT MAX(salary) max, MIN(salary) min, department_id FROM employees GROUP BY department_id;
#②将部门表与①进行表连接,连接条件为department_id,并通过排序找出部门最高工资中最低的一行
SELECT d.*, s.min AS '部门最低工资' FROM departments d, (SELECT MAX(salary) max, MIN(salary) min, department_id FROM employees GROUP BY department_id) s WHERE d.department_id = s.department_id ORDER BY s.max ASC LIMIT 1;
                      
#查询平均工资最高的部门的manager的详细信息:last_name, department_id, email, salary
#①查询平均工资最高的部门编号
SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) DESC LIMIT 1 
#②查询所有的manager信息
SELECT last_name, e.department_id, email, salary FROM employees e INNER JOIN departments d ON e.employee_id = d.manager_id;
#在②的基础上,过滤出department_id = ①的结果
SELECT last_name, e.department_id, email, salary FROM employees e INNER JOIN departments d ON e.employee_id = d.manager_id WHERE e.department_id = (SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) DESC LIMIT 1 ) AND employee_id IN (SELECT DISTINCT(manager_id) FROM employees);

#联合查询
#查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE department_id > 90 UNION SELECT * FROM employees WHERE email LIKE '%a%';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值