SQL练习题

--查找12年前入职的员工
SELECT * 
FROM EMP 
WHERE TO_CHAR(SYSDATE,'YYYY')- TO_CHAR(HIREDATE,'YYYY')=12;


--有一列数据为 xx-aa 现按照前半部分升序 并且 后半部分降序排列(建表语句)。

CREATE TABLE NUMS(
LISTNUM VARCHAR2(10));

INSERT INTO NUMS VALUES('13-1');
INSERT INTO NUMS VALUES('13-2');
INSERT INTO NUMS VALUES('13-5');
INSERT INTO NUMS VALUES('13-18');
INSERT INTO NUMS VALUES('14-1');
INSERT INTO NUMS VALUES('14-100');
INSERT INTO NUMS VALUES('13-100');
INSERT INTO NUMS VALUES('14-15');
INSERT INTO NUMS VALUES('14-21');
INSERT INTO NUMS VALUES('14-8');

SELECT * FROM NUMS
ORDER BY TO_NUMBER(SUBSTR(LISTNUM,1,INSTR(LISTNUM,'-')-1)),
         TO_NUMBER(SUBSTR(LISTNUM,INSTR(LISTNUM,'-')+1));

第一题本来写的是 SELECT *  FROM EMP 
WHERE TO_CHAR(SYSDATE-HIREDATE,'YYYY)=12;

但是报错,后来发现sysdate的格式和hiredate不同,不能直接相减,所以分别转换为字符型再相减。

本来第二题没加TO_NUMBER转数值函数,结果跟预料的不一样,感觉应该是substr截取出来的还是字符形式,无法按照数值排序,转数值后即可。

例如   select * from emp order by to_char(sal);   字符型排序如果有数字,按照首位的数字排序。


        在做记录的时候突然发现第一题和第二题好像有点像,都用到了转换,

        第一题中to_char = 12 为隐式转换,实际上是to_char = ’12‘ 而不是to_char转换为数字等于12,为了优化 应尽量避免隐式转换,否则会全表扫描降低效率。

        第二题中不涉及相等或比较,系统不会隐式转换,所以如果想要按照数值进行排序 需要显式转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值