数据库第三章编程作业答案
数据库第三章编程作业,共 10道SQL评测题 ,涵盖UPDATE、GROUP_CONCAT、ORDER BY、子查询、JOIN、视图创建、聚合函数等核心知识点。
题目与答案
第1题:将所有获取奖金的员工当前的薪水增加10%
题目描述: 将所有获取奖金的员工当前的薪水增加10%。
表结构:
CREATE TABLE emp_bonus( emp_no int NOT NULL , recevied datetime NOT NULL , btype smallint NOT NULL ); CREATE TABLE salaries ( emp_no int (11 ) NOT NULL , salary int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, from_date) );
答案:
UPDATE salaries SET salary = salary * 1.1 WHERE emp_no IN (SELECT emp_no FROM emp_bonus)AND to_date = '9999-01-01' ;
第2题:按照dept_no进行汇总
题目描述: 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees。
表结构:
CREATE TABLE dept_emp ( emp_no int (11 ) NOT NULL , dept_no char (4 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, dept_no) );
输出格式:
dept_no employees d001 10001,10002 d002 10006 d003 10005 d004 10003,10004 d005 10007,10008,10010 d006 10009,10010
答案:
SELECT dept_no, GROUP_CONCAT(emp_no ORDER BY emp_no SEPARATOR ',' ) AS employeesFROM dept_empGROUP BY dept_noORDER BY dept_no;
第3题:获取Employees中的first_name
题目描述: 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列。
表结构:
CREATE TABLE employees ( emp_no int (11 ) NOT NULL , birth_date date NOT NULL , first_name varchar (14 ) NOT NULL , last_name varchar (16 ) NOT NULL , gender char (1 ) NOT NULL , hire_date date NOT NULL , PRIMARY KEY (emp_no) );
答案:
SELECT first_name FROM employeesORDER BY RIGHT (first_name, 2 ) ASC , first_name ASC ;
第4题:查找最晚入职员工的所有信息
题目描述: 查找最晚入职员工的所有信息。
表结构:
CREATE TABLE employees ( emp_no int (11 ) NOT NULL , birth_date date NOT NULL , first_name varchar (14 ) NOT NULL , last_name varchar (16 ) NOT NULL , gender char (1 ) NOT NULL , hire_date date NOT NULL , PRIMARY KEY (emp_no) );
输出格式:
emp_no birth_date first_name last_name gender hire_date 10008 1958-02-19 Saniya Kalloufi M 1994-09-15
答案:
SELECT * FROM employeesWHERE hire_date = (SELECT MAX (hire_date) FROM employees);
第5题:查找所有员工入职时候的薪水情况
题目描述: 查找所有员工入职时候的薪水情况,给出emp_no以及salary,并按照emp_no进行逆序。
表结构:
CREATE TABLE employees ( emp_no int (11 ) NOT NULL , birth_date date NOT NULL , first_name varchar (14 ) NOT NULL , last_name varchar (16 ) NOT NULL , gender char (1 ) NOT NULL , hire_date date NOT NULL , PRIMARY KEY (emp_no) ); CREATE TABLE salaries ( emp_no int (11 ) NOT NULL , salary int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, from_date) );
输出格式:
emp_no salary 10011 25828 ... 10001 60117
答案:
SELECT e.emp_no, s.salaryFROM employees eJOIN salaries sON e.emp_no = s.emp_no AND e.hire_date = s.from_dateORDER BY e.emp_no DESC ;
第6题:获取所有部门当前manager的当前薪水情况
题目描述: 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=‘9999-01-01’。
表结构:
CREATE TABLE dept_manager ( dept_no char (4 ) NOT NULL , emp_no int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, dept_no) ); CREATE TABLE salaries ( emp_no int (11 ) NOT NULL , salary int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, from_date) );
输出格式:
dept_no emp_no salary d001 10002 72527 d004 10004 74057 d003 10005 94692 d002 10006 43311 d006 10010 94409
答案:
SELECT dm.dept_no, dm.emp_no, s.salaryFROM dept_manager dmJOIN salaries sON dm.emp_no = s.emp_noWHERE dm.to_date = '9999-01-01' AND s.to_date = '9999-01-01' ;
第7题:获取所有员工当前的manager
题目描述: 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date=‘9999-01-01’。结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。
表结构:
CREATE TABLE dept_emp ( emp_no int (11 ) NOT NULL , dept_no char (4 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, dept_no) ); CREATE TABLE dept_manager ( dept_no char (4 ) NOT NULL , emp_no int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, dept_no) );
输出格式:
emp_no manager_no 10001 10002 10003 10004 10009 10010
答案:
SELECT de.emp_no, dm.emp_no AS manager_noFROM dept_emp deJOIN dept_manager dmON de.dept_no = dm.dept_noWHERE de.to_date = '9999-01-01' AND dm.to_date = '9999-01-01' AND de.emp_no <> dm.emp_noORDER BY de.emp_no;
第8题:针对actor表创建视图actor_name_view
题目描述: 针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v。
表结构:
CREATE TABLE IF NOT EXISTS actor ( actor_id smallint (5 ) NOT NULL PRIMARY KEY , first_name varchar (45 ) NOT NULL , last_name varchar (45 ) NOT NULL , last_update timestamp NOT NULL DEFAULT (datetime('now' ,'localtime' )) );
答案:
CREATE VIEW actor_name_view AS SELECT first_name AS first_name_v, last_name AS last_name_vFROM actor;
第9题:统计各个部门对应员工涨幅的次数总和
题目描述: 统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum。
表结构:
CREATE TABLE departments ( dept_no char (4 ) NOT NULL , dept_name varchar (40 ) NOT NULL , PRIMARY KEY (dept_no) ); CREATE TABLE dept_emp ( emp_no int (11 ) NOT NULL , dept_no char (4 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, dept_no) ); CREATE TABLE salaries ( emp_no int (11 ) NOT NULL , salary int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, from_date) );
输出格式:
dept_no dept_name sum d001 Marketing 24 d002 Finance 14 d003 Human Resources 13 d004 Production 24 d005 Development 25 d006 Quality Management 25
答案:
SELECT d.dept_no, d.dept_name, COUNT (s.salary) AS sumFROM departments dJOIN dept_emp de ON d.dept_no = de.dept_noJOIN salaries s ON de.emp_no = s.emp_noGROUP BY d.dept_no, d.dept_nameORDER BY d.dept_no;
第10题:统计出当前各个title类型对应的员工当前薪水对应的平均工资
题目描述: 统计出各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。
表结构:
CREATE TABLE salaries ( emp_no int (11 ) NOT NULL , salary int (11 ) NOT NULL , from_date date NOT NULL , to_date date NOT NULL , PRIMARY KEY (emp_no, from_date) ); CREATE TABLE IF NOT EXISTS titles ( emp_no int (11 ) NOT NULL , title varchar (50 ) NOT NULL , from_date date NOT NULL , to_date date DEFAULT NULL );
输出格式:
title avg Engineer 94409.0 Senior Engineer 69009.2 Senior Staff 91381.0 Staff 72527.0
答案:
SELECT t.title, AVG (s.salary) AS avgFROM titles tJOIN salaries sON t.emp_no = s.emp_noGROUP BY t.titleORDER BY t.title;
知识点总结
常用SQL函数
函数
说明
示例
GROUP_CONCAT()
将分组中的值连接成字符串
GROUP_CONCAT(emp_no SEPARATOR ',')
COUNT()
统计行数
COUNT(*) 或 COUNT(column)
AVG()
计算平均值
AVG(salary)
MAX()
获取最大值
MAX(hire_date)
RIGHT()
从右侧截取字符串
RIGHT(first_name, 2)
JOIN连接类型
类型
说明
INNER JOIN
返回两表中匹配的行
LEFT JOIN
返回左表所有行,右表匹配的行
RIGHT JOIN
返回右表所有行,左表匹配的行
SQL执行顺序
FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
视图操作
CREATE VIEW view_name AS SELECT column1, column2 FROM table_name;DROP VIEW view_name;
子查询使用场景
SELECT * FROM employeesWHERE hire_date = (SELECT MAX (hire_date) FROM employees);UPDATE salaries SET salary = salary * 1.1 WHERE emp_no IN (SELECT emp_no FROM emp_bonus);