--查找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,为了优化 应尽量避免隐式转换,否则会全表扫描降低效率。
第二题中不涉及相等或比较,系统不会隐式转换,所以如果想要按照数值进行排序 需要显式转换。