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
上面的行可能没有用处,因为它可以执行以下两个操作之一:

  • 它可能会在所有工资中增加2000英镑,然后结果也会相同,所有数据的顺序也会增加
  • “Order By”子句中可能不允许“Additon”操作

  • 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
    子句上进行的。我的意思是,结果不会显示添加值。你在第一次评论中没有提到这一点。