Mysql编程题示例

这里为你提供100个MySQL编程题目,以及相应的测试数据创建SQL和参考答案。由于篇幅限制,我会分几次提供,首先是前10题。

1. 查询所有员工的姓名和工号

题目:查询表employees中所有员工的姓名(name)和工号(emp_id)。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100)
);

INSERT INTO employees (emp_id, name) VALUES
(1, 'John Doe'),
(2, 'Jane Smith'),
(3, 'Mark Johnson'),
(4, 'Alice Brown');

答案

SELECT emp_id, name FROM employees;

2. 查询所有工资大于5000的员工信息

题目:查询表employees中所有工资大于5000的员工信息。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 4500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 4800);

答案

SELECT * FROM employees WHERE salary > 5000;

3. 查询工资最高的员工

题目:查询表employees中工资最高的员工信息。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 7500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 4800);

答案

SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);

4. 查询每个员工的姓名及其所在部门的部门名称

题目:查询表employees中每个员工的姓名以及其所在的部门名称。假设employees表中有一个dept_id字段,departments表中有dept_iddept_name字段。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'John Doe', 1),
(2, 'Jane Smith', 2),
(3, 'Mark Johnson', 3),
(4, 'Alice Brown', 1);

答案

SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;

5. 查询部门名称及该部门的员工人数

题目:查询每个部门的名称以及该部门的员工人数。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'John Doe', 1),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 2),
(4, 'Alice Brown', 3),
(5, 'Tom White', 3);

答案

SELECT d.dept_name, COUNT(e.emp_id) AS employee_count
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name;

6. 查询每个部门的最高工资

题目:查询每个部门的最高工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 5000, 1),
(2, 'Jane Smith', 7500, 2),
(3, 'Mark Johnson', 6000, 3),
(4, 'Alice Brown', 7000, 1),
(5, 'Tom White', 8000, 2);

答案

SELECT d.dept_name, MAX(e.salary) AS highest_salary
FROM departments d
JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name;

7. 查询每个部门工资的平均值

题目:查询每个部门工资的平均值。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 5000, 1),
(2, 'Jane Smith', 7500, 2),
(3, 'Mark Johnson', 6000, 3),
(4, 'Alice Brown', 7000, 1),
(5, 'Tom White', 8000, 2);

答案

SELECT d.dept_name, AVG(e.salary) AS avg_salary
FROM departments d
JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name;

8. 查询在employees表中工资大于等于5000的员工信息,并按工资从高到低排序

题目:查询employees表中所有工资大于等于5000的员工信息,并按工资从高到低排序。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 5000),
(2, 'Jane Smith', 7500),
(3, 'Mark Johnson', 6000),
(4, 'Alice Brown', 4800);

答案

SELECT * FROM employees WHERE salary >= 5000
ORDER BY salary DESC;

9. 查询员工姓名以及他们的上级的姓名(假设有一个manager_id字段指向上级)

题目:查询每个员工的姓名及其上级的姓名。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 1),
(4, 'Alice Brown', 2);

答案

SELECT e1.name AS employee_name, e2.name AS manager_name
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.emp_id;

10. 查询所有部门没有员工的部门名称

题目:查询没有任何员工的部门名称。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'John Doe', 1),
(2, 'Jane Smith', 1);

答案

SELECT dept_name
FROM departments
WHERE dept_id NOT IN (SELECT

由于篇幅的限制,我会继续提供接下来的30个题目和答案。剩余的70个题目我会分几次提供。如果你需要更多题目,请告诉我。

11. 查询所有员工姓名以及所在部门的部门名称(考虑某些员工没有部门)

题目:查询所有员工姓名和部门名称,即使某些员工没有部门。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id) 
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'John Doe', 1),
(2, 'Jane Smith', 2),
(3, 'Mark Johnson', NULL);

答案

SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;

12. 查询所有部门的员工人数和平均工资

题目:查询每个部门的员工人数及其平均工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 5000, 1),
(2, 'Jane Smith', 7000, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 7500, 1);

答案

SELECT d.dept_name, COUNT(e.emp_id) AS employee_count, AVG(e.salary) AS avg_salary
FROM departments d
JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name;

13. 查询工资排名第2的员工姓名

题目:查询表employees中工资排名第2的员工姓名。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 7500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 5000);

答案

SELECT name FROM employees
ORDER BY salary DESC
LIMIT 1 OFFSET 1;

14. 查询薪资大于5000的员工姓名、工号和部门名称(考虑某些员工没有部门)

题目:查询薪资大于5000的员工姓名、工号和部门名称,考虑某些员工没有部门。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id) 
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 4000, NULL);

答案

SELECT e.name, e.emp_id, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > 5000;

15. 查询每个员工的工资,和他们的上级姓名

题目:查询每个员工的姓名、工资和他们的上级姓名。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    manager_id INT
);

INSERT INTO employees (emp_id, name, salary, manager_id) VALUES
(1, 'John Doe', 6000, NULL),
(2, 'Jane Smith', 7000, 1),
(3, 'Mark Johnson', 7500, 1),
(4, 'Alice Brown', 5000, 2);

答案

SELECT e.name AS employee_name, e.salary, m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.emp_id;

16. 查询没有经理的员工姓名和工号

题目:查询没有经理的员工姓名和工号。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 1),
(4, 'Alice Brown', 2);

答案

SELECT emp_id, name
FROM employees
WHERE manager_id IS NULL;

17. 查询每个部门员工的最高工资

题目:查询每个部门员工的最高工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7500, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 7000, 1);

答案

SELECT d.dept_name, MAX(e.salary) AS highest_salary
FROM departments d
JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name;

18. 查询工资大于平均工资的员工信息

题目:查询所有工资大于部门平均工资的员工信息。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT
);

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 5000, 1),
(3, 'Mark Johnson', 7000, 2),
(4, 'Alice Brown', 4000, 2);

答案

SELECT e.name, e.salary
FROM employees e
WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE dept_id = e.dept_id);

19. 查询在employees表中工资大于5000的员工工号和姓名,并按工资降序排序

题目:查询employees表中所有工资大于5000的员工工号和姓名,并按工资降序排序。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 4500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 4800);

答案

SELECT emp_id, name
FROM employees
WHERE salary > 5000
ORDER BY salary DESC;

20. 查询工资在3000到7000之间的员工姓名及工资

题目:查询工资在3000到7000之间的员工姓名和工资。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 4500),
(3, 'Mark Johnson', 7500),
(4, 'Alice Brown', 3000);

答案

SELECT name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 7000;

为了避免篇幅过长,我将会继续分批次提供剩余的题目及答案。以下是接下来的题目(21 - 40)。

21. 查询所有员工的姓名和他们的上级姓名,如果有上级的话

题目:查询每个员工的姓名及其上级的姓名,如果有上级的话。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 1),
(4, 'Alice Brown', 2);

答案

SELECT e.name AS employee_name, m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.emp_id;

22. 查询员工的姓名、部门名称及所在部门的员工人数

题目:查询每个员工的姓名、部门名称及其所在部门的员工人数。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'John Doe', 1),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 2),
(4, 'Alice Brown', 3),
(5, 'Tom White', 3);

答案

SELECT e.name, d.dept_name, COUNT(e2.emp_id) AS employee_count
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
JOIN employees e2 ON e2.dept_id = e.dept_id
GROUP BY e.emp_id;

23. 查询部门中工资最高的员工姓名和工资

题目:查询每个部门中工资最高的员工的姓名和工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7000, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 7000, 1),
(5, 'Tom White', 7500, 2);

答案

SELECT e.name, e.salary, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE (e.salary, e.dept_id) IN (
    SELECT MAX(salary), dept_id
    FROM employees
    GROUP BY dept_id
);

24. 查询每个部门的最低工资

题目:查询每个部门的最低工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 2),
(3, 'Mark Johnson', 7000, 3),
(4, 'Alice Brown', 5000, 1),
(5, 'Tom White', 3500, 2);

答案

SELECT d.dept_name, MIN(e.salary) AS lowest_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name;

25. 查询薪资在指定范围内的员工姓名和工号

题目:查询薪资在40007000之间的员工姓名和工号。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 4500),
(3, 'Mark Johnson', 7500),
(4, 'Alice Brown', 5000);

答案

SELECT emp_id, name
FROM employees
WHERE salary BETWEEN 4000 AND 7000;

26. 查询员工姓名和薪资,以及是否为最高薪资的员工(TRUE/FALSE)

题目:查询所有员工的姓名和薪资,以及是否为部门中最高薪资的员工(TRUE/FALSE)。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7500, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 7000, 1);

答案

SELECT e.name, e.salary,
       IF(e.salary = (SELECT MAX(salary) FROM employees WHERE dept_id = e.dept_id), 'TRUE', 'FALSE') AS is_highest_salary
FROM employees e;

27. 查询每个员工的姓名和他们所在的部门名称,使用子查询

题目:查询每个员工的姓名和他们所在的部门名称,使用子查询。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'John Doe', 1),
(2, 'Jane Smith', 2),
(3, 'Mark Johnson', 3);

答案

SELECT e.name, 
       (SELECT dept_name FROM departments WHERE dept_id = e.dept_id) AS dept_name
FROM employees e;

28. 查询所有工资大于平均工资的员工信息

题目:查询所有工资大于平均工资的员工信息。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 7000),
(3, 'Mark Johnson', 4000),
(4, 'Alice Brown', 5000);

答案

SELECT * 
FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);

29. 查询部门中工资大于5000的员工

题目:查询每个部门中工资大于5000的员工姓名和工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 2),
(3, 'Mark Johnson', 7000, 3),
(4, 'Alice Brown', 8000, 1);

答案

SELECT e.name, e.salary, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > 5000;

30. 查询员工姓名、工号和工资,并按工资从高到低排序

题目:查询员工姓名、工号和工资,并按工资从高到低排序。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 7000),
(3, 'Mark Johnson', 8000),
(4, 'Alice Brown', 5000);

答案

SELECT emp_id, name, salary
FROM employees
ORDER BY salary DESC;

继续为你提供剩余的题目(31 - 60)。

31. 查询每个部门的平均工资和员工人数

题目:查询每个部门的平均工资和员工人数。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7000, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 5000, 1),
(5, 'Tom White', 7500, 2);

答案

SELECT d.dept_name, AVG(e.salary) AS avg_salary, COUNT(e.emp_id) AS employee_count
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name;

32. 查询每个部门的最低工资、最高工资和平均工资

题目:查询每个部门的最低工资、最高工资和平均工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 1),
(3, 'Mark Johnson', 8000, 2),
(4, 'Alice Brown', 7000, 2),
(5, 'Tom White', 3000, 3);

答案

SELECT d.dept_name, MIN(e.salary) AS min_salary, MAX(e.salary) AS max_salary, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name;

33. 查询每个部门的员工姓名、工资和工资等级(分为"高"、"中"、"低")

题目:查询每个员工的姓名、工资以及工资等级(高:> 7000,中:3000到7000,低:< 3000)。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 8000, 1),
(2, 'Jane Smith', 6500, 2),
(3, 'Mark Johnson', 9000, 3),
(4, 'Alice Brown', 2000, 1);

答案

SELECT e.name, e.salary,
       CASE
           WHEN e.salary > 7000 THEN 'High'
           WHEN e.salary BETWEEN 3000 AND 7000 THEN 'Medium'
           ELSE 'Low'
       END AS salary_grade
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;

34. 查询所有员工的姓名和工号,按工资升序排序

题目:查询所有员工的姓名和工号,并按工资升序排序。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 4500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 5000);

答案

SELECT emp_id, name
FROM employees
ORDER BY salary ASC;

35. 查询每个部门的工资总和,并按工资总和降序排列

题目:查询每个部门的工资总和,并按工资总和降序排列。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 1),
(3, 'Mark Johnson', 8000, 2),
(4, 'Alice Brown', 7000, 3);

答案

SELECT d.dept_name, SUM(e.salary) AS total_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name
ORDER BY total_salary DESC;

36. 查询工资大于部门平均工资的员工信息,并显示部门名

题目:查询工资大于部门平均工资的员工信息,并显示部门名称。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 5000, 2),
(3, 'Mark Johnson', 8000, 3),
(4, 'Alice Brown', 7000, 1);

答案

SELECT e.name, e.salary, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE dept_id = e.dept_id);

37. 查询各部门中工资最低的员工的姓名和工号

题目:查询每个部门中工资最低的员工的姓名和工号。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 1),
(3, 'Mark Johnson', 8000, 2),
(4, 'Alice Brown', 7000, 3),
(5, 'Tom White', 3000, 2);

答案

SELECT e.name, e.emp_id, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE (e.salary, e.dept_id) IN (
    SELECT MIN(salary), dept_id
    FROM employees
    GROUP BY dept_id
);

38. 查询没有上级的员工姓名及工号

题目:查询没有上级的员工姓名及工号。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 1),
(4, 'Alice Brown', 2);

答案

SELECT emp_id, name
FROM employees
WHERE manager_id IS NULL;

39. 查询工资大于所有员工平均工资的员工姓名及工号

题目:查询所有工资大于员工平均工资的员工姓名及工号。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 4500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 5000);

答案

SELECT emp_id, name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

40. 查询员工姓名、工号,及他们的上级姓名

题目:查询员工的姓名、工号及他们的上级姓名。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 1),
(4, 'Alice Brown', 2);

答案

SELECT e.name AS employee_name, e.emp_id, m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.emp_id;

继续提供剩余的题目(41 - 60)。

41. 查询每个员工的姓名及其上级姓名,如果没有上级则显示为“无”

题目:查询每个员工的姓名以及他们的上级姓名,如果没有上级,则显示为“无”。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', 1),
(4, 'Alice Brown', 2);

答案

SELECT e.name AS employee_name,
       IF(m.name IS NULL, '无', m.name) AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.emp_id;

42. 查询薪资低于部门平均薪资的员工姓名和薪资

题目:查询薪资低于其所在部门的平均薪资的员工姓名和薪资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 4500, 1),
(3, 'Mark Johnson', 8000, 2),
(4, 'Alice Brown', 7000, 3);

答案

SELECT e.name, e.salary
FROM employees e
WHERE e.salary < (
    SELECT AVG(salary)
    FROM employees
    WHERE dept_id = e.dept_id
);

43. 查询每个部门的工资总和,且工资总和大于20000的部门

题目:查询每个部门的工资总和,并显示工资总和大于20000的部门。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7500, 2),
(3, 'Mark Johnson', 8500, 3),
(4, 'Alice Brown', 7000, 1);

答案

SELECT d.dept_name, SUM(e.salary) AS total_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name
HAVING total_salary > 20000;

44. 查询每个部门的最大工资和最小工资

题目:查询每个部门的最大工资和最小工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7500, 1),
(3, 'Mark Johnson', 8500, 2),
(4, 'Alice Brown', 7000, 2),
(5, 'Tom White', 10000, 3);

答案

SELECT d.dept_name, MAX(e.salary) AS max_salary, MIN(e.salary) AS min_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name;

45. 查询员工姓名和工资,并显示其工资等级(高于8000为"高",6000到8000为"中",低于6000为"低")

题目:查询每个员工的姓名、工资,并显示其工资等级(高于8000为"高",6000到8000为"中",低于6000为"低")。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 7500),
(3, 'Mark Johnson', 8500),
(4, 'Alice Brown', 5500);

答案

SELECT name, salary,
       CASE
           WHEN salary > 8000 THEN 'High'
           WHEN salary BETWEEN 6000 AND 8000 THEN 'Medium'
           ELSE 'Low'
       END AS salary_grade
FROM employees;

46. 查询没有上级的员工姓名

题目:查询没有上级的员工姓名。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', NULL);

答案

SELECT name
FROM employees
WHERE manager_id IS NULL;

47. 查询每个部门的工资平均值,且只显示平均工资大于5000的部门

题目:查询每个部门的工资平均值,并只显示平均工资大于5000的部门。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name, salary, dept_id) VALUES
(1, 'John Doe', 6000, 1),
(2, 'Jane Smith', 7500, 1),
(3, 'Mark Johnson', 8000, 2),
(4, 'Alice Brown', 7000, 2),
(5, 'Tom White', 3000, 3);

答案

SELECT d.dept_name, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name
HAVING avg_salary > 5000;

48. 查询员工的姓名、工号及他们的上级姓名,显示“无”如果没有上级

题目:查询员工的姓名、工号以及他们的上级姓名,如果没有上级,显示为“无”。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    manager_id INT
);

INSERT INTO employees (emp_id, name, manager_id) VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Mark Johnson', NULL);

答案

SELECT e.name AS employee_name,
       e.emp_id,
       IFNULL(m.name, '无') AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.emp_id;

49. 查询工资大于等于6000的所有员工姓名及薪资

题目:查询所有工资大于等于6000的员工姓名及薪资。

测试数据创建SQL

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (emp_id, name, salary) VALUES
(1, 'John Doe', 6000),
(2, 'Jane Smith', 5500),
(3, 'Mark Johnson', 7000),
(4, 'Alice Brown', 4500);

答案

SELECT name, salary
FROM employees
WHERE salary >= 6000;

50. 查询每个部门中薪资最高的员工姓名和工资

题目:查询每个部门中薪资最高的员工姓名和工资。

测试数据创建SQL

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Finance'),
(3, 'IT');

INSERT INTO employees (emp_id, name,


文章标签:

评论(0)