有职员表 emp,表结构如表-1所示:
表-1 职员表emp 信息
emp 表中的示例数据如图-1所示:
图-1
对于emp表或者dual表,执行如下查询,请描述各查询的结果。
1.selectjob, length(job) from emp order by job;
2.select ename || ' earns $' || sal ||' monthly but wants $' || sal * 3 as“Dream Salary”from emp;
3.select empno, ename from emp where upper (job)= 'clerk';
4.selectSUBSTR('Doctor Who', 1, 6) from dual;
5.select TRIM('半' FROM '半月二更半') AS"上联"from dual;
6.select TRIM (leading '半' FROM '半月二更半') AS "上联"from dual;
7.select TRIM (trailing '半' FROM '半月二更半') AS "上联"from dual;
8.selectLPAD('TARDIS', 10, '*') from dual;
9.selectLPAD('TARDIS', 3, '*') from dual;
10.select * from emp where length(ename) = 5;
参考答案
各练习的参考答案如下所示:
1.列出job列的值和job的字符数,查询结果如图-2所示。
图-2
2.按照如图-3的格式查询员工数据。
图-3
3.永远没有结果查询出。原因:大写函数和小写数据做比较,永远不匹配。
4.本题中的SUBSTR('Doctor Who', 1, 6)表示从字符串“Doctor Who ”位置1开始截取6个字符,因此查询结果为Doctor。
5.本题中的TRIM('半' FROM '半月二更半')表示从字符串“半月二更半”的前后截去字符串“半”。查询结果如图-4所示。
图-4
6.本题中的TRIM (leading '半' FROM '半月二更半')表示从字符串“半月二更半”的左边截去字符串“半”。查询结果如图-5所示。
图-5
7.本题中的TRIM (trailing '半' FROM '半月二更半')表示从字符串“半月二更半”的右边截去字符串“半”。查询结果如图-6所示。
图-6
8.本题中的LPAD('TARDIS', 10, '*')表示将字符串“TARDIS”使用“*”左补足至10位,因此查询结果为:“****TARDIS”。
9.本题中的LPAD('TARDIS', 3, '*')表示将字符串“TARDIS”使用“*”左补足至3位,由于字符串本身超过3位,因此查询结果为:“TAR”。
10.查找员工姓名的长度是5个字符的员工信息。查询结果如图-7所示。
图-7
A.整数部分9位,小数部分2位,共11位
B.整数部分7位,小数部分2位,共9位
C.整数部分6位,小数点一位,小数部分2位,共9位
D.整数部分5位,小数部分2位,共7位
参考答案
本题正确答案为B。
NUMBER表示数值类型,完整语法为:NUMBER(precision ,scale),其中P表示数字的总位数,取值为1-38。如果没有设置scale,则默认取值0,即NUMBER(p)表示整数。
对于emp表或者dual表,执行如下查询,请描述各查询的结果。
1.select ename , sal , round(sal*1.08) from emp;
2.selectmod(11,4) from dual;
3.selecttrunc(123.123,-1)from dual;
4.select floor(sysdate-hiredate) as "入职天数",ename from emp;
参考答案
上述各查询语句的查询结果如下:
1.列出每个员工的名字,工资、涨薪后工资(涨幅为8%),以元为单位进行四舍五入,查询结果如图-8所示。
图-8
2.本题中的mod(11,4)表示取11除以4的余数,因此查询结果为3。
3.本题中的trunc(123.123,-1)表示将数值123.123截取到个位数,因此查询结果为:120。
4.本题中的floor(sysdate-hiredate)表示取小于或等于(sysdate-hiredate)差的最大整数值,即员工入职天数。查询结果如图-9所示。
图-9
参考答案
date的最小单位是秒,timestamp包含小数位的秒。如果需要秒以下的单位,需要用timestamp。
向Unit01课后练习中,所创建的t_account表中插入一条记录,该记录的数据如表-2所示。
表- 2插入数据明细
参考答案
插入数据的SQL语句如下所示:
insertintoT_ACCOUNT(ID,LOGIN_NAME,LOGIN_PASSWD,CREATE_DATE, REAL_NAME,IDCARD_NO,TELEPHONE) VALUES(1,'shiyl','256528',to_date('2014-03-02','yyyy-mm-dd'),' shiyuanli','410381194302256523',13669351234);
1.按照“2009年4月11日 20时35分10秒”格式显示系统时间。
2.构造查询语句,产生类似于下面形式的结果:
NAME HIREDATE REVIEW
--------------------------------------------------------------------------
ALLEN 1980年12月17日 1980/12/17
参考答案
查询的SQL语句如下所示:
1.
SELECT TO_CHAR(SYSDATE, 'yyyy"年"mm"月"dd"日" hh24"时"mi"分"ss"秒"' ) FROM DUAL;
2.
SELECT ename, TO_CHAR(hiredate, 'yyyy"年"mm"月"dd"日"') as "HIREDATE", TO_CHAR(hiredate, 'yyyy"/"mm"/"dd') as "REVIEW" FROM emp;
对于emp表或者dual表,执行如下查询,请描述各查询的结果。
1.select * from emp where extract(year from hiredate) = '1987';
2.select ename, last_day(hiredate) from emp;
3.select next_day(sysdate, 7) from dual;
4.select ename, add_months(hiredate, 3) from emp;
5.select ename, months_between(sysdate, hiredate) from emp;
6.select greatest(to_date('20070101', 'yyyymmdd'),hiredate) from emp;
参考答案
上述SQL语句的查询结果如下:
1.列出1987年入职的员工信息。
2.列出职员入职时间当月的最后一天
3.返回当前日期开始的的下一个周六的日期。
4.查询emp表中员工姓名及其转正日期,即入职三个月后的日期。
5.查询emp表中员工姓名及已入职的月份数。
6.如果是2007年以后入职的,显示员工的入职时间,否则显示2007年1月1日。
现有数据表Customer,其结构如表-3所示:
表-3 顾客表Customer 信息
构造SQL语句,列出Customer数据表中生日未提供的客户记录。
参考答案
查询的SQL语句如下所示:
select cust_id, cnamefrom Customer where birthday is null;
对于emp表,构造SQL语句,查询员工编码empno,姓名ename,以及月收入(薪水 + 奖金)。注意:有的员工暂时没有奖金,即,如果comm列为null,则按照数值0计算。
参考答案
SQL语句如下所示:
select empno, ename, sal + nvl(comm, 0) month_salary from emp;
查询emp表,列出员工的编码、姓名和入职时间。
要求:如果入职时间为null,则显示'not available';如果入职时间不为null,则按照yyyy-mm-dd格式显示。
参考答案
SQL语句如下所示:
select empno, ename, nvl2(hiredate ,to_char(hiredate, 'yyyy-mm-dd'), 'not available') from emp;