引言
Oracle数据库,作为企业级数据库的佼佼者,不仅拥有强大的功能,还蕴含着丰富的编程技巧。通过解决一系列趣味编程谜题,你可以更好地理解Oracle数据库的特性和优化技巧。本文将带你挑战20个Oracle数据库编程谜题,让你在乐趣中提升技术。
谜题一:查找重复值
描述:给定一个员工表(Employee),其中包含员工ID(ID)和姓名(Name)字段。请编写SQL查询,找出重复的姓名。
SELECT Name, COUNT(*) AS重复次数
FROM Employee
GROUP BY Name
HAVING COUNT(*) > 1;
谜题二:员工薪水排名
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,按薪水从高到低排序员工,并限制结果只显示前5名。
SELECT ID, Name, Salary
FROM Employee
ORDER BY Salary DESC
FETCH FIRST 5 ROWS ONLY;
谜题三:查询今年生日
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和生日(Birthday)字段。请编写SQL查询,找出今年过生日的员工。
SELECT ID, Name, Birthday
FROM Employee
WHERE EXTRACT(YEAR FROM Birthday) = EXTRACT(YEAR FROM SYSDATE);
谜题四:查询员工部门
描述:给定一个员工表(Employee)和一个部门表(Department),其中员工表包含员工ID(ID)、姓名(Name)和部门ID(DepartmentID),部门表包含部门ID(ID)和部门名称(Name)。请编写SQL查询,找出每个部门的员工数量。
SELECT D.Name AS 部门名称, COUNT(E.ID) AS 员工数量
FROM Department D
LEFT JOIN Employee E ON D.ID = E.DepartmentID
GROUP BY D.Name;
谜题五:查询员工薪水区间
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,统计每个薪水区间的员工数量(薪水区间如下:0-5000、5000-10000、10000-20000、20000以上)。
SELECT
CASE
WHEN Salary BETWEEN 0 AND 5000 THEN '0-5000'
WHEN Salary BETWEEN 5000 AND 10000 THEN '5000-10000'
WHEN Salary BETWEEN 10000 AND 20000 THEN '10000-20000'
ELSE '20000以上'
END AS 薪水区间,
COUNT(*) AS 员工数量
FROM Employee
GROUP BY 薪水区间;
谜题六:查询员工姓名中包含特定字符
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和部门ID(DepartmentID)字段。请编写SQL查询,找出姓名中包含“张”的员工。
SELECT Name
FROM Employee
WHERE Name LIKE '%张%';
谜题七:查询员工薪水排名前10%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前10%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.1 FROM Employee);
谜题八:查询员工薪水排名后10%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后10%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.9 FROM Employee);
谜题九:查询员工薪水排名前20%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前20%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.2 FROM Employee);
谜题十:查询员工薪水排名后20%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后20%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.8 FROM Employee);
谜题十一:查询员工薪水排名前50%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前50%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.5 FROM Employee);
谜题十二:查询员工薪水排名后50%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后50%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.5 FROM Employee);
谜题十三:查询员工薪水排名前75%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前75%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.75 FROM Employee);
谜题十四:查询员工薪水排名后25%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后25%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.25 FROM Employee);
谜题十五:查询员工薪水排名前80%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前80%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.8 FROM Employee);
谜题十六:查询员工薪水排名后20%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后20%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.2 FROM Employee);
谜题十七:查询员工薪水排名前90%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前90%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.9 FROM Employee);
谜题十八:查询员工薪水排名后10%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后10%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.1 FROM Employee);
谜题十九:查询员工薪水排名前95%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名前95%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) * 1.95 FROM Employee);
谜题二十:查询员工薪水排名后5%
描述:给定一个员工表(Employee),其中包含员工ID(ID)、姓名(Name)和薪水(Salary)字段。请编写SQL查询,找出薪水排名后5%的员工。
SELECT ID, Name, Salary
FROM Employee
WHERE Salary < (SELECT AVG(Salary) * 0.05 FROM Employee);
总结
通过挑战这20个Oracle数据库编程谜题,你将更好地理解Oracle数据库的特性和优化技巧。在解决这些谜题的过程中,你可以发现自己在SQL编程方面的不足,并不断学习和提升。祝你挑战成功!