无论是初学者还是资深工程师,熟练掌握MySQL语句是提升数据处理能力和系统性能的关键
本文精选了一系列MySQL语句笔试题,并附上详细解析与答案,旨在帮助读者巩固理论基础,提升实战技能
一、基础查询篇 题目1: 描述如何从名为`employees`的表中查询所有员工的姓名(`name`字段)和薪资(`salary`字段)
答案及解析: sql SELECT name, salary FROM employees; 解析:这是MySQL中最基本的SELECT查询语句,用于从指定表中检索一个或多个列的数据
在此例中,我们选择了`employees`表中的`name`和`salary`两列
题目2: 查询`employees`表中薪资大于5000的员工的姓名和部门(`department`字段)
答案及解析: sql SELECT name, department FROM employees WHERE salary >5000; 解析:通过添加`WHERE`子句,我们可以对查询结果进行条件筛选
这里的条件是薪资大于5000
二、聚合函数与分组篇 题目3: 计算`employees`表中所有员工的平均薪资
答案及解析: sql SELECT AVG(salary) AS average_salary FROM employees; 解析:`AVG()`是MySQL中的一个聚合函数,用于计算指定列的平均值
`AS`关键字用于给结果列命名,便于阅读
题目4: 按部门分组,计算每个部门的员工数量
答案及解析: sql SELECT department, COUNT() AS employee_count FROM employees GROUP BY department; 解析:`GROUP BY`子句用于将结果集按一个或多个列进行分组
这里我们按`department`分组,并使用`COUNT()`函数计算每个部门的员工数量
三、排序与限制篇 题目5: 查询`employees`表中薪资最高的前5名员工的姓名和薪资,并按薪资降序排列
答案及解析: sql SELECT name, salary FROM employees ORDER BY salary DESC LIMIT5; 解析:`ORDER BY`子句用于对结果集进行排序,`DESC`表示降序
`LIMIT`子句用于限制返回的记录数,这里限制了为5
题目6: 查询薪资在3000到5000之间的员工,按入职日期(`hire_date`字段)升序排列
答案及解析: sql SELECT - FROM employees WHERE salary BETWEEN3000 AND5000 ORDER BY hire_date ASC; 解析:`BETWEEN ... AND ...`用于指定一个范围,`ASC`表示升序排列
这条语句结合了条件筛选和排序功能
四、连接查询篇 题目7: 有两个表:`employees`(员工表)和`departments`(部门表),它们通过`department_id`字段关联
查询所有员工及其所属部门的名称
答案及解析: sql SELECT e.name AS employee_name, d.name AS department_name FROM employees e JOIN departments d ON e.department_id = d.id; 解析:这里使用了`JOIN`操作来实现表之间的连接查询
`ON`子句指定了连接条件,即两个表中用于关联的字段
题目8: 查询没有分配到任何部门的员工姓名
答案及解析: sql SELECT name FROM employees WHERE department_id IS NULL; 解析:使用`IS NULL`条件可以筛选出那些`department_id`字段为空的记录,即未分配部门的员工
五、子查询篇 题目9: 查询薪资高于公司平均薪资的员工的姓名和薪资
答案及解析: sql SELECT name, salary FROM employees WHERE salary >(SELECT AVG(salary) FROM employees); 解析:这是一个子查询的例子,内层查询计算了所有员工的平均薪资,外层查询则筛选出薪资高于这个平均值的员工
题目10: 找出每个部门薪资最高的员工的姓名和薪资
答案及解析: sql SELECT e1.name, e1.salary, e1.department_id FROM employees e1 JOIN( SELECT department_id, MAX(salary) AS max_salary FROM employees GROUP BY department_id ) e2 ON e1.department_id = e2.department_id AND e1.salary = e2.max_salary; 解析:这个问题稍微复杂一些,需要用到子查询和自连接
内层子查询首先按部门分组并找到每个部门的最高薪资,然后外层查询通过连接操作找到对应这些最高薪资的员工
六、高级功能篇 题目11: 创建一个存储过程,用于插入新员工记录到`employees`表中,并返回新员工的ID
答案及解析: sql DELIMITER // CREATE PROCEDURE AddEmployee( IN emp_name VARCHAR(100), IN emp_salary DECIMAL(10,2), IN emp_department_id INT, OUT new_emp_id INT ) BEGIN INSERT INTO employees(name, salary, department_id) VALUES(emp_name, emp_salary, emp_department_id); SET new_emp_id = LAST_INSERT_ID(); END // DELIMITER ; 解析:存储过程是一种封装了SQL语句的数据库对象,可以接收输入参数和输出参数
这里我