1 下列select语句输出的结果是?

有职员表 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

2 关于类型定义Number(9,2),下列说法正确的是

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)表示整数。

3 下列select语句输出的结果是?

对于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

4 简述date和timestamp的区别

参考答案

date的最小单位是秒,timestamp包含小数位的秒。如果需要秒以下的单位,需要用timestamp。

5 按要求完成插入语句(包含日期类型)

向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);

6 按指定输出格式写出select语句(包含日期类型)

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;

7 下列select语句输出的结果是?

对于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日。

8 已知表结构如下,按要求完成select语句

现有数据表Customer,其结构如表-3所示:

表-3 顾客表Customer 信息

构造SQL语句,列出Customer数据表中生日未提供的客户记录。

参考答案

查询的SQL语句如下所示:

select cust_id, cnamefrom Customer where birthday is null;

9 已知表结构如下,按要求完成select语句

对于emp表,构造SQL语句,查询员工编码empno,姓名ename,以及月收入(薪水 + 奖金)。注意:有的员工暂时没有奖金,即,如果comm列为null,则按照数值0计算。

参考答案

SQL语句如下所示:

select empno, ename, sal + nvl(comm, 0) month_salary from emp;

10 已知表结构如下,按要求完成select语句

查询emp表,列出员工的编码、姓名和入职时间。

要求:如果入职时间为null,则显示'not available';如果入职时间不为null,则按照yyyy-mm-dd格式显示。

参考答案

SQL语句如下所示:

select empno, ename, nvl2(hiredate ,to_char(hiredate, 'yyyy-mm-dd'), 'not available') from emp;