根据给定的SQL练习题目,我们可以深入探讨一系列重要的SQL知识点,这些知识点对于初学者和有经验的数据库管理员来说都是至关重要的。以下是对每个练习题目的详细解析,旨在帮助读者理解和掌握基本的SQL查询技巧。
### 1. 基本的选择语句与计算
题目要求查询`emp`表中所有员工的编号(`EMPNO`)和工资的80%。这涉及到使用`SELECT`语句结合算术运算。
```sql
SELECT EMPNO, SAL * 0.8 FROM emp;
```
这里的关键是理解如何在`SELECT`语句中进行数值计算。
### 2. 字符串连接
题目要求显示员工编号,名称前加上“Name is”。这涉及字符串连接操作。
```sql
SELECT EMPNO, 'Name is: ' || ENAME FROM emp;
```
使用双竖线`||`操作符将字符串与字段值连接起来。
### 3. 别名的使用
题目要求显示员工姓名、工资,并给它们分别命名为`employee_name`和`salary`。
```sql
SELECT ENAME AS employee_name, SAL AS salary, JOB FROM emp;
```
`AS`关键字用于为列指定别名,使输出更具有可读性。
### 4. 字符串函数的使用
题目要求将员工姓名和工资连接,并以特定格式显示。
```sql
SELECT ENAME || ':1 month salary=' || SAL AS MONTHY FROM emp;
```
再次使用`||`操作符,并结合字符串与数值的连接,展示员工的月工资。
### 5. DISTINCT关键字
题目要求列出不同的工作职位。
```sql
SELECT DISTINCT JOB FROM emp;
```
`DISTINCT`关键字用于去除重复记录,只显示唯一的工作职位。
### 6. 条件过滤
题目要求查询部门编号为10的所有员工信息。
```sql
SELECT EMPNO, ENAME, SAL FROM emp WHERE DEPTNO = 10;
```
`WHERE`子句用于过滤满足条件的行,此处筛选部门编号为10的员工。
### 7. 范围查询
题目要求查询工资高于1500的员工信息。
```sql
SELECT EMPNO, ENAME, SAL FROM emp WHERE SAL > 1500;
```
使用`>`比较运算符来筛选工资高于1500的员工。
### 8. NOT BETWEEN条件
题目要求查询工资不在1000到2000之间的员工信息。
```sql
SELECT EMPNO, ENAME, SAL, DEPTNO FROM emp WHERE SAL NOT BETWEEN 1000 AND 2000;
```
`NOT BETWEEN`用于排除某个范围内的值。
### 9. IN与NOT IN条件
题目要求查询部门编号为10或30的员工信息。
```sql
SELECT EMPNO, ENAME, SAL, DEPTNO FROM emp WHERE DEPTNO IN (10, 30);
```
`IN`子句用于检查某列的值是否存在于一个指定的集合中。
### 10. LIKE模式匹配
题目要求查询名字以"S"开头的员工信息。
```sql
SELECT EMPNO, ENAME, SAL, DEPTNO FROM emp WHERE ENAME LIKE 'S%';
```
`LIKE`操作符允许使用通配符进行模式匹配,`%`代表任意数量的字符。
### 11. IS NOT NULL判断
题目要求查询有佣金的员工信息。
```sql
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO FROM emp WHERE COMM IS NOT NULL;
```
`IS NOT NULL`用于判断某一列是否有非空值。
### 12. 多条件组合
题目要求查询佣金不为空且工资高于1500的员工信息。
```sql
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO FROM emp WHERE COMM IS NOT NULL AND SAL > 1500;
```
多个`WHERE`条件可以使用逻辑运算符`AND`进行组合。
### 13. IN与AND结合
题目要求查询职位为SALESMAN或CLERK且工资高于1500的员工信息。
```sql
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO FROM emp WHERE JOB IN ('SALESMAN', 'CLERK') AND SAL > 1500;
```
`IN`与`AND`条件的结合使用,筛选出特定职位且满足其他条件的员工。
### 14. 排序
题目要求按工资降序排列员工信息。
```sql
SELECT EMPNO, ENAME, JOB, SAL FROM emp ORDER BY SAL DESC;
```
`ORDER BY`子句用于对结果集进行排序,`DESC`表示降序。
### 15. 多列排序
题目要求按部门编号升序,同部门内按工资降序排列员工信息。
```sql
SELECT ENAME, SAL, DEPTNO FROM emp ORDER BY DEPTNO, SAL DESC;
```
多列排序可以同时指定多个列,先按部门编号升序,同部门内再按工资降序。
### 16. 聚合函数
题目要求查询平均工资、最大工资、最小工资和总工资。
```sql
SELECT AVG(SAL), MAX(SAL), MIN(SAL), SUM(SAL) FROM emp WHERE JOB LIKE 'SALES%';
```
`AVG`, `MAX`, `MIN`, `SUM`等聚合函数用于统计分析。
### 17. 时间戳查询
题目要求查询最早和最晚的雇佣日期。
```sql
SELECT MIN(HIREDATE), MAX(HIREDATE) FROM emp;
```
时间戳字段也可以使用`MIN`和`MAX`进行分析。
### 18. 部门员工计数
题目要求查询部门编号为30的员工总数。
```sql
SELECT COUNT(*) FROM emp WHERE DEPTNO = 30;
```
`COUNT`函数用于计数满足条件的行数。
### 19. 平均佣金
题目要求查询所有员工的平均佣金。
```sql
SELECT AVG(NVL(COMM, 0)) FROM emp;
```
`NVL`函数用于处理可能的`NULL`值,将其转换为0进行计算。
### 20. 部门平均工资
题目要求查询每个部门的平均工资。
```sql
SELECT DEPTNO, AVG(SAL) FROM emp GROUP BY DEPTNO;
```
`GROUP BY`子句用于按部门分组数据,然后计算每组的平均工资。
以上练习涵盖了SQL的基本查询、条件过滤、排序、聚合函数以及模式匹配等多种操作,通过实践这些题目,可以大大增强对SQL语言的理解和应用能力。