Sql 如果我在ORDERBY子句中添加一些列,这意味着什么?
我要问的是这个问题-Sql 如果我在ORDERBY子句中添加一些列,这意味着什么?,sql,oracle,Sql,Oracle,我要问的是这个问题- select * from emp order by sal + 2000; select * from emp order by sal; 给出与此查询完全相同的结果- select * from emp order by sal + 2000; select * from emp order by sal; 那么在计算方面有什么不同呢? sal+2000的订单是什么意思? 这将如何影响结果 order by sal + 2000 上面的行可能没有用处,因为它可
select * from emp order by sal + 2000;
select * from emp order by sal;
给出与此查询完全相同的结果-
select * from emp order by sal + 2000;
select * from emp order by sal;
那么在计算方面有什么不同呢?
sal+2000的订单是什么意思?
这将如何影响结果
order by sal + 2000
上面的行可能没有用处,因为它可以执行以下两个操作之一:
ORDERBY子句用于根据指定的列对结果进行排序 在您的情况下,默认情况下,您的结果将按Sal排序为ASC(升序)顺序
按order by执行计算对结果本身没有影响。考虑查询中的以下结果集,按薪资升序排序(默认情况下):
select name, salary from emp order by sal;
+------+--------+
| name | salary |
+------+--------+
| John | 10000 |
| Mike | 15000 |
| Joe | 30000 |
+------+--------+
以下是使用sal+2000的顺序的结果集:
select name, salary, (salary+2000) as new_salary from emp order by new_salary;
+------+--------+------------+
| name | salary | new_salary |
+------+--------+------------+
| John | 10000 | 12000 |
| Mike | 15000 | 17000 |
| Joe | 30000 | 32000 |
+------+--------+------------+
向薪资中添加2000不会改变您获得的顺序。如果SAL存储为字符串,则这些查询不会给出相同的结果。
create table emp as
select '90000' sal from dual union all
select '100000' sal from dual union all
select '110000' sal from dual;
select * from emp order by sal;
SAL
---
100000
110000
90000
select * from emp order by sal + 2000;
SAL
---
90000
100000
110000
create table emp2(id number, sal number not null);
select 1 id, 90000 sal from dual union all
select 2 id, 100000 sal from dual union all
select 3 id, 110000 sal from dual;
create index emp2_idx on emp2(sal);
explain plan for select * from emp2 order by sal;
select * from table(dbms_xplan.display(format => 'basic'));
Plan hash value: 1831800775
------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP2 |
| 2 | INDEX FULL SCAN | EMP2_IDX |
------------------------------------------------
explain plan for select * from emp2 order by sal + 2000;
select * from table(dbms_xplan.display(format => 'basic'));
Plan hash value: 2441141433
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT ORDER BY | |
| 2 | TABLE ACCESS FULL| EMP2 |
-----------------------------------
我希望这是不寻常的,但严格类型的数据模型太常见了
使用表达式可能会更改执行计划并避免索引。
create table emp as
select '90000' sal from dual union all
select '100000' sal from dual union all
select '110000' sal from dual;
select * from emp order by sal;
SAL
---
100000
110000
90000
select * from emp order by sal + 2000;
SAL
---
90000
100000
110000
create table emp2(id number, sal number not null);
select 1 id, 90000 sal from dual union all
select 2 id, 100000 sal from dual union all
select 3 id, 110000 sal from dual;
create index emp2_idx on emp2(sal);
explain plan for select * from emp2 order by sal;
select * from table(dbms_xplan.display(format => 'basic'));
Plan hash value: 1831800775
------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP2 |
| 2 | INDEX FULL SCAN | EMP2_IDX |
------------------------------------------------
explain plan for select * from emp2 order by sal + 2000;
select * from table(dbms_xplan.display(format => 'basic'));
Plan hash value: 2441141433
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT ORDER BY | |
| 2 | TABLE ACCESS FULL| EMP2 |
-----------------------------------
通常还有其他更好的方法来避免索引,但有些人使用这种方法。它毫无意义。您只是为所有
sal
@JohnWoo添加了一个2000
的值,而不是为所有sal添加2000。它完全符合萨尔的命令。(结果透视)@szakwani我不知道你这是什么意思。据我所知,它将为工资添加一个值,但它不会显示sal
列的新值,因为计算是在ORDER BY
子句上进行的,而不是在SELECT
子句上进行的。我的意思是,结果不会显示添加值。你在第一次评论中没有提到这一点。