### SQL经典语句面试大全解析 #### 一、理解ROWNUM与ORDER BY的结合使用 在SQL查询中,`ROWNUM`是一个非常有用的伪列,它可以帮助我们限制查询结果的数量。例如,在给定的部分内容中,第一条SQL命令是: ```sql SELECT ROWNUM, LAST_NAME, SALARY FROM (SELECT LAST_NAME, SALARY FROM S_EMP ORDER BY SALARY DESC) WHERE ROWNUM <= 3; ``` 这条语句的功能是从`S_EMP`表中选取前三位薪资最高的员工,并返回他们的姓名和薪资。这里的关键点在于`ORDER BY SALARY DESC`子句放在了子查询中,确保了按照薪资降序排列。外层查询则通过`ROWNUM <= 3`来限制只返回前三条记录。 需要注意的是,如果`ORDER BY`子句放在了外层查询中,那么`ROWNUM`的排序可能不会按照预期进行。例如: ```sql SELECT ROWNUM, LAST_NAME, SALARY FROM S_EMP WHERE ROWNUM <= 3 ORDER BY SALARY DESC; ``` 这条语句虽然看起来与第一条类似,但由于`ORDER BY`放在了`WHERE`条件之后,所以`ROWNUM`可能不会按薪资降序排列返回前三条记录。 #### 二、ROWNUM与其他逻辑操作符的配合使用 ROWNUM可以与其他逻辑操作符(如`<`, `<=`, `>`等)配合使用,以实现更复杂的查询需求。例如,想要获取第3到第5条记录,可以采用以下方式: ```sql SELECT * FROM ( SELECT ROWNUM A, B.* FROM S_EMP B ) WHERE A BETWEEN 3 AND 5; ``` 这条语句首先创建了一个包含`ROWNUM`的视图,然后在外层查询中使用`BETWEEN`操作符来选择所需的记录范围。这种方式可以有效地避免数据的重复,同时保证了查询的灵活性。 #### 三、使用子查询进行部门内薪资比较 当需要对特定部门内的员工薪资进行比较时,可以使用子查询。例如,下面这条SQL语句: ```sql SELECT LAST_NAME, DEPT_ID, SALARY FROM S_EMP A WHERE SALARY > (SELECT AVG(SALARY) FROM S_EMP WHERE DEPT_ID = A.DEPT_ID); ``` 这条语句将筛选出所有薪资高于所在部门平均薪资的员工。这里的关键在于子查询 `(SELECT AVG(SALARY) FROM S_EMP WHERE DEPT_ID = A.DEPT_ID)` 计算了每个部门的平均薪资,并在外层查询中进行比较。 #### 四、更复杂的多表连接和条件过滤 对于更复杂的情况,比如需要找到薪资高于自己经理薪资的所有员工,可以使用如下SQL语句: ```sql SELECT ID, LAST_NAME, SALARY, MANAGER_ID FROM S_EMP A WHERE SALARY > (SELECT SALARY FROM S_EMP WHERE ID = A.MANAGER_ID); ``` 这条语句首先根据`MANAGER_ID`从`S_EMP`表中找出每位员工的经理,然后通过子查询获取每位经理的薪资,最后在外层查询中比较员工与其经理的薪资,从而筛选出符合条件的记录。 这些经典案例不仅展示了SQL的强大功能,也为我们提供了丰富的面试题素材。理解和掌握这些案例,有助于加深对SQL语言的理解,并能够在实际工作中更加灵活地应用SQL解决各种问题。
SQL> select rownum, last_name, salary
2 from (select last_name, salary
3 from s_emp
4 order by salary desc)
5 where rownum<=3;
ROWNUM LAST_NAME SALARY
---------- ------------------------- ----------
1 Velasquez 4750
2 Ropeburn 2945
3 Nguyen 2897.5
注意:请大家分析一下一下语句为什么不对:
SQL> select rownum, last_name, salary
2 from s_emp
3 where rownum<=3
4 order by salary desc;
ROWNUM LAST_NAME SALARY
---------- ------------------------- ----------
1 Velasquez 4750
3 Nagayama 2660
2 Ngao 2000
2: 找出表中的某一行或某几行的数据:
(1):找出表中第三行数据:
- nihaojava32014-11-03还好,看着还好!
- 粉丝: 67
- 资源: 45
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助