书上习题

  • 1.起列别名是,有三种特殊情况需要加引号,以下不属于这三种情况之一的选项是( )
    A.区分大小写
    B.含有特殊字符
    C.包含空格
    D.包含中文
    答案:D

  • 2.模糊查询的关键字是( )
    A. IN
    B. IS NULL
    C. LIKE
    答案:C

  • 3.如下代码

SELECT *FROM EMP WHERE ENAME LIKE 'S@_ %' ESCAPE '@';

对上述代码描述正确的是( )
A.查询的是姓名中包含S的员工信息
B.姓名是SMITH的员工也会显示在查询结果中
C.查询的是以S_开头的员工姓名
D.S_s_cott不会出现在查询结果中
答案:C

  • 4.查询在1981年到1982年人职的员工信息,下列代码中最正确的是( )
    A. SELECT * FROM EMP WHERE HIREDATE BETWEEN 81 AND 82
    B. SELECT * FROM EMP WHERE HIREDATE LIKE '%1981'
    C. SELECT*FROM EMP WHERE HIREDATE BETWEEN '01-1月-1981 ' AND '31-12月-1982’
    D. SELECT * FROM EMP WHERE SUBSTR(HIREDATE, -4,4) = '1981'
    答案:C

  • 5.下列说法正确的是( )
    A.查询语句如果可以执行,必能找到想要查找的数据
    B.数据库中数据量尚不确定情况下,最好先查一下有多少条数据,以便确定是否适合用*查询
    C.WHERE语句中可以使用列的别名来限制条件
    D. ORDER BY子句执行顺序是在SELECT之前
    答案:B

  • 6.如下代码
    SELECT*FROM emp WHERE ename LIkE 'M_%' AND comm = NULL;

对上述代码描述正确的是()
A.查询的是姓名中包含M的并且奖金为空的员工信息
B.这个查询没有任何返回结果
C.查询的是姓名以M_开头并且奖金为空的员工信息
D.这条查询无法执行
答案:B

  • 7.以上代码,对于去除关键字DISTINCT的使用正确的是(B)
    A.SELECT DISTINCT COUNT (*)FROM emp
    B.SELECT COUNT(DISTINCT deptno)FROM emp
    C.SELECT sal DISTINCT FROM emp
    D.SELECT DISTINCT ,empno,ename FROM emp
  • 8.查询入职时间在1982-8-10之后,并且职位是SALESMAN的员工姓名、入职时间、职位(A)
    A.SELECT ename,hiredate,job FROM emp WHERE hiredate>'10-8月-82'AND job='SALESMAN';
    B.SELECT ename,hiredate,job FROM emp WHERE hiredate>'1982-08-10'AND job='SALESMAN;
    C.SELECT ename,hiredate,job FROM emp WHERE hiredate>'10-8月-82'AND job<>'SALESMAN'';
    D.SELECT ename,hiredate,job FROM emp WHERE hiredate<'1982-08-10'AND job<>'SALESMAN'';
  • 9.查询第一个字母是S的员工的姓名(A)
    A.SELECT ename, FROM emp WHERE ename LIKE 'S%';
    B.SELECT ename, FROM emp WHERE ename LIKE '_S%';
    C.SELECT ename, FROM emp WHERE ename LIKE '__S%';
    D.SELECT ename, FROM emp WHERE ename LIKE '/S%';
  • 10.查询除了10号部门以外的员工姓名、部门编号(A)
    A.SELECT ename,deptno FROM emp WHERE deptno<>10 ;
    B.SELECT ename,deptno FROM emp WHERE deptno=10 ;
    C.SELECT ename,empno FROM emp WHERE deptno<>10 ;
    D.SELECT ename,deptno FROM emp WHERE deptno==10 ;
  • 11.查询部门号为20的员工信息,按工资降序排序(C)
    A.SELECT * FROM emp WHERE deptno=20 GROUP BY sal ;
    B.SELECT * FROM emp WHERE deptno=20 ORDER BY sal ;
    C.SELECT * FROM emp WHERE deptno=20 ORDER BY sal DESC;
    D.SELECT * FROM emp WHERE deptno=20 GROUP BY sal DESC;
  • 12.查询没有上级的员工(经理号为空)的员工姓名(B)
    A. SELECT ename FROM emp WHERE empno Is NULL:
    B. SELECT ename FROM emp WHERE mgr Is NULL:
    C. SELECT ename FROM emp WHERE mgr IS NOT NULL
    D. SELECT ename FROM emp WHERE empno Is NOT NULL
    解题思路限制条件经理号为空应表示为:mgr IS NULL;A选项中,empno IS NULL代表的是员工编号为空,不是经理编号为空;C选项中,ISNOTNULL表示不为空;D选项中,empno IS NOT NULL代表的是员工编号不为空。
  • 13.查询工资大于等于2000并且部门为10员工的姓名、工资、部门编号(A)
    A. SELECT ename,sal,deptno FROM emp WHERE sal> = 2000 AND deptno= 10
    B. SELECT ename, sal,deptno FROM emp WHRER sal> 2000 AND deptno= 10
    C. SELECT ename,sal, deptno FROM emp WHERE sal< = 2000 AND deptno=10
    D. SELECT ename, sal, deptno FROM emp WHERE sal> = 2000 AND deptno <> 解题思路限制条件工资大于等于2000应表示为s)> = 20制0件部门为10应表不为deptno=10,所以A选项正确。
  • 14.关于模糊查询中通配符“”描述正确的是(B)
    A.“”代表多个字符
    B.“”代表一个字符
    C.“”不能与“%”一同使用
    D.“”代表零个或多个个字符
    解题思路“”代表一个字符,“%”代表任意个字符,两者t可以同时使用。
    15.语句WHERE SAL BETWEEN 800 AND 3500与下列哪个子句等价(A)
    A. WHERE SAL> = 800 AND SAL< = 3500
    B. WHERE SAL>800 AND SAL < 3500
    C. WHERE SAL>=800 OR SAL< = 3500
    D. WHERE SAL>= 800 AND SAL < 3500
    解题思路题意SQL表示薪资在800到3500之间,包含800和3500。0BETWEEN AND等同于>= n AND <= mTO3132 8
  • 16.下列SQL是什么含义( )
SELECT * FROM emp WHERE deptno =10 ORsal > 2000

A.查询工资大于2000的员工信息
B.查询部门号为10或者工资大于2000的员工信息
C.运行时错误
D.语法错误
解题思路I根据SQL语义应为:检索10号部门或者薪资大于2000的员工信息。

  • 17.查询公司中有几种工作岗位(A)
    A. SELECT DISTINCT job FROM emp;
    B. SELECT job DISTINCT FROM emp;
    C. SELECT job FROM emp;
    D. SELECT DISTINCT ,job FROM emp;
    解题思路由于emp表的job列中存在重复数据,因此需要使用DISTINCT关键字进行去重。B选项语法错误,DISTINCT应写在SELECT后面;C选项结果中存在重复数据,没有使用DISTINCT关键字,结果会错误;D选项语法错误,DISTINCT后不能有逗号。- -
  • 18.查询公司员工的姓名、月薪、年薪(A)
    A. SELECT ename,sal,sal * 12 FROM emp;
    B. SELECT ename,sal * 12,sal FROM emp;
    C.SELECT ename ,sal,sal+sal12FROM emp;
    D.SELECT ename ,sal,sal
    6 FROM emp;
  • 19.查询公司员工薪资增长500后的年薪(A)
    A. SELECT(sal+500)* 12年薪FROM emp
    B. SELECTsal+500* 12年薪FROM emp
    C. SELECTsal* 12 +500年薪FROM emp
    D. SELECT sal12年薪FROM emp
    解题思路薪资增长500后的年薪表达式应为(sal+500)
    12。
  • 20.查询公司员工的姓名、奖金和一年的总收入(年薪+奖金)(A )
    A. SELECT ename, comm,nvl(comm,0)+sal* 12 FROM emp
    B. SELECT ename,comm,comm* 6+sal * 6 FROM emp
    C. SELECT ename,comm, sal* 12 FROM emp
    D. SELECT ename, comm ,comm* 12+sal* 12 FROM emp
    解题思路年总收人表达式为奖金+年薪,但由于奖金中包含空值无法直接参与运算,使用NVL(comm,0)将空值转换为0。
  • 21.在ORACLE中,表EMP包含以下列:NAME VARCHAR2(20) ADDR VARCHAR2(60)要以NAME's address is ADDR格式返回数据,以下SQL语句正确的是(B )
    A. SELECT NAME + "'s address is' + ADDR FROM EMP;
    B. SELECT NAME 11 "'s address is'll ADDR FROM EMP;
    C. SELECT NAME + "'s address is '+ ADDR FROM EMP;
    D. SELECT NAME 11 'V's address is ' 1 ADDR FROM EMP;
    解题思路将列与原义字符串进行连接时,需要使用连接操作符 || ,所以A.C选项有误,执行SELECT"" FROM emp;结果为’,所以B选项正确。
    1. ORACLE中,执行语句:SELBCT address1||',' ||address2||','||address2 "Address" FROM employi;将会返回( B )列
      A.0
      B. 1
      C.2
      D.3
      解题思路连接操作符||:将多个列连接在一起,结果为1列。
    1. ORACLE数据库中,下面哪个可以作为有效的列名( C )
      A. Column
      B.123_NUM
      C. NUM_#123
      D. # NUM123
      解题思路ORACLE数据库列名的命名规则:必须由字母开始;长度为130个字符;名字中只能包含AZ、az、09、_ (下划线)、$和#;名字不能为ORACLE的关键字或者保留字。
  • 24.用SQL* PLUS的(B )命令 可以查看表的结构信息
    A. DESCRIPTION
    B. DESC
    C SHOW TABLE
    D. SHOW USER
    解题思路:查看表结构关键字:DESC TABLE_NAME
    -25. ORACLE用来判断列是否为空的操作法是( B )
    A. = NULL
    B. IS NULL
    C. AS NULL
    D. NULL IS
    解题思路IS NULL判断是否为空。
  • 26.分析以下SQL命令:
select price
from inventory
where price between 1 and 50
and (price in(55,30,95))

命令执行后的输出结果是(B)
A. 95 B.30 C.95 D.NULL

解题思路:
BETWEEN 1 AND 50 表示 [1,50]之间, 包含1和50;
IN(55, 30, 95)表示与其中任意一个值相等即可;
AND表示两个条件同时成立。
综上所述,结果应为30.

  • 27.分析以下的SQL命令:
select manufacturer_id from inventory 
where menufacturer_id like '%n\%p\%o%'  escape '\';

执行命令返回的结果是(C)
A. 所有包含NPO的记录
B.所有包含N\P\O的记录
C.所有包含N%P%O的记录
D.所有包含%N\P\O%的记录
解题思路:
题意为查询manufacturere_id中包含N%P%O的manufacturer_id,ESCAPE通常与LIKE一起使用,可以将"_""%"两个通配符转换成普通字符

  • 28.如果在WHERE子句中有两个条件要同时满足,应该用以下哪个逻辑符来连接(C)
    A. OR B.NOT C.AND D.NONE
    解题思路:
    OR表示多个条件中一个条件成立,则整个where结果就成立
    NOT表示条件取反
    AND表示两个条件同时成立,则整个where结果就成立
  • 29.显示10号部门的所有经理或则20部门所有职员的详细信息。
select * from emp
where deptno = 10 and job = 'manager'
or
deptno = 20 and job = 'clerk';

解题思路:
10号部门的所有经理是一个条件,应表示为deptno=10 AND job='MANAGER'
20号部门的所有职员是一个条件, 应表示为deptno = 20 and job = ‘clerk’
因为连接条件是或者,所有两个条件之间满足一个即可,使用or关键字

  • 30.显示姓名只能给没有"L"字母的员工的详细信息或含有"SM"字母的员工信息。
select * from emp
where ename not like '%L%'
or ename like '%SM%'

解题思路:
不包含使用Not like,包含应使用like ,两个条件之间是或者,所以使用or关键字连接。

  • 31.显示各个部门经理的工资
select sal from emp where job = 'manager';

解题思路:
题意可以转换成查询岗位是manage的员工的薪资是多少,因为manager分别字不同的部门。

  • 32.查询职位(job)为president的员工工资
select * from emp where job = 'president'

解题思路
职位(job)为president应表示为job = 'president'。

  • 33.查询所有名字长度为4的员工的编号、姓名。
select * from emp where LENGTH(ename)=4;

解题思路:
LENGTH()函数可以返回该列的长度。

  • 34.找出获得奖金的员工的工作是什么。
SELECT DISTINCT(JOB) from emp where comm IS NOT NULL

解题思路:
获得奖金应表示为COMM IS NOT NULL,由于职位存在重复数据,应使用DISTINCT关键字。

单行函数

  • 1.下列与SQL语句等效的语句是(D )
    SELECT * FROM emp WHERE SUBSTR(ename,4,1) ='s'

A.SELECT * FROM emp WHERE INSTR(ename,'s'1,4) =4
B.SELECT * FROM emp WHERE ename LIKE‘'_ _ _s'
C.SELECT * FROM emp WHERE extract('s' FROM ename) =4
D.SELECT * FROM emp WHERE SUBSTR(ename,'s',4,1) =4

解题思路:
题意为查询ename第四个字母是s的员工信息;
SUBSTR(str,n1,n2)返回str中从第n1位开始,长度为n2的子串;
INSTR(s1,s2,n1,n2)返回s1中子串s2,从n1开始,第n2次出现的位置n1,n2默认值为1。

  • 2,查询在1982年入职的员工信息,下列代码中正确的是( D)
    A.SELECT * FROM emp WHERE hiredate < 1982;
    B.SELECT * FROM emp WHERE hiredate LIKE '%1982';
    C.SELECT * FROM emp WHERE BETWEEN'01-1 月-1981' AND '31-12月 -19';
    D.SELECT * FROM emp WHERE TO_CHAR(hiredate,'YYYY') = '1982';

解题思路:
A选项数据类型之间不匹配,错误;
B选项查询不到任何结果;
C选项语句编写有误,条件得到的不是1982年入职的员工;
D选项使用字符转换函数,格式码YYYY表示年份,结果就是1982年入职的员工。

  • 3.下列哪个SQL语句能正确执行(D )
    A.SELECT SYSDATE-to_date('1982-09-08')FROM emp
    B.SELECT ename || job || sal+500 from emp
    C.SELECT hiredate,'01-1月-2017'-hiredate FROM emp
    D.SELECT hiredate,to_date('1985年11月11日','YYYY''年''MM月''DD''日'' ')FROM emp

解题思路:
A选项执行报错,文字与字符串格式不匹配
B选项错误,提示无效数字
C选项数据类型不匹配
D选项为日期转换函数,没有问题

  • 4.下列哪个SQL语句是正确的(C )
    A.SELECT * FROM test WHERE name LIKE in('A%','M%')
    B.SELECT * FROM test WHERE LENGTH(name)='Tom'
    C.SELECT name,age,birthday FROM test WHERE age>20 ORder by 3 desc
    D.SELECT name,age,birthday FROM test WHERE SUBSTR(name,'A',3,2)= 2

解题思路:
A选项语法使用有误,LIKE和IN不能同时使用,提示缺失信息
B选项条件表达式两端结果不匹配,LENGTH()函数返回的是数值,不能和字符串比较;
C选项可正常执行;
D选项SUBSTR返回的是字符串,不是数值,表达式两端数据类型不匹配。

  • 5下列哪个SQL语句是错误的(D)
    A. SELECT * FROM emp WHERE TO_CHAR(hiredate , 'YYYY') = '1981'
    B. SELECT * FROM emp WHERE sal>6000 AND SUBSTR(ename, 4, 1 ) = 'A'
    C. SELECT * FROM emp WHERE hiredate >'01-1月-1981'
    D. SELECT * FROM emp WHERE ename LIKE'S' AND comm = NULL

解题思路:IS NULL 表示是否为空,而不是 = NULL, = NULL查询不到任何结果

  • 6.下述针对SUBSTR使用及描述正确的是(B)
    A. SUBSTR参数中包含4个参数
    B. SUBSTR('abcdef', 3,2)的结果是cd
    C. SELECT * FROM emp WHERE SUBSTR (ename, 2 , 1 ) = 'AB'
    D. SELECT * FROM emp WHERE SUBSTR (ename, 4 , 4 ) = '1981'

解题思路:
A. SUBSTR参数中包含3个参数
C. 选项表示截取长度为1的子串与等号右边值不匹配
D. 选项截取的内容与比较值不匹配

  • 7.下述SQL语句使用正确的是(C)
    A. SELECT total 年薪,age 性别FROM test WHERE 性别 >20 ORDER BY 性别
    B. SELECT total 年薪%,age 性别 & FROM test
    C. SELECT total * 2+20000, age FROM test
    D. SELECT concat(total, age, gender) FROM test WHERE ename LIKE'S_%'

解题思路:
A. 选项WHERE中不能使用列别名
B. 选型列别名含有特殊符号
C. 选项语法没有问题
D. 选项CONCAT中只能存放两个参数

  • 8.SELECT TRIM('e'FROM CONCAT('abc','de'))FROM dual 结果是(C)
    A. abc
    B. bcd
    C. abcd
    D. cde

解题思路:
首先掌握函数的嵌套,由内到外一个一个函数去执行
CONCAT()表示连接两个列或者字符串;TRIM()表示消除字符串

  • 9.查询语句SELECT ROUND(13.57), ROUND(13.57,1), ROUND(13.57,-1), TRUNC(13.57, -2) FFROM DUAL 返回结果,正确的是(C)
    A. 13.57,13.6,10.13
    B. 13, 13.5, 14.0
    C. 14,13.6,10, 0
    D.13.6, 13.5, 11, 13

解题思路:
ROUND():四舍五入到小数点后N位;TRUNC();截取到小数点后N位

-10.查询员工ENAME的第三个字母是A的员工信息(使用单行函数)(A)
A. SELECT * FROM emp WHERE INSTR(ename, 'A', 3) = 3
B. SELECT * FROM emp WHERE INSTR(ename, 'A', 2,2) = 3
C. SELECT * FROM emp WHERE INSTR(ename, 'A', 3, 2) = 3
D. SELECT * FROM emp WHERE INSTR(ename, 'A', 2) = 1

解题思路:INSTR(s1, s2, n1, n2)返回s1从n1开始,第n2次出现的位置

  • 11.在ORACLE中,下面哪条语句当COMM字段为空时显示0,不为空时显示COMM的值(A)
    A. SELECT ename, NVL(comm, 0) FROM emp
    B. SELECT ename, NULL (comm, 0) FROM emp
    C. SELECT ename, NULLIF(comm, 0) FROM emp
    D. SELECT ename, DECODE(comm, NULL, 0) FROM emp

解题思路:NVL(comm, 0)函数表示当COMM字段为NULL时在转换为0

    1. ROUND和TRUNC操作的区别是(A )
      A.ROUND在截掉数据时有四舍五人的判断,TRUNC直接按要求截掉没有进位。
      B.都是将数据按指定的长度截断
      C.TRUNC是四舍五人,ROUND是截断
      D.都会四舍五人

解题思路
ROUND()表示四舍五人到小数点后N位,TRUNC()表示截取到小数点后N位。

编写下列SQL语句:

  • 14.找出每个月倒数第一天受雇的所有员工。
select ename,hiredate from emp wherehiredate = LAST_DAY(hiredate);

解题思路
在emp表中跟受雇日期有关的字段是hiredate, 每个雇员有自己的受雇日期,每个受雇日期所在月的最后一天也一定不相同。如果想要求出某一个受雇日期所在月的最后一天,则使用LAST_DAY()函数即可。where子句的判断条件: hiredate= LAST DAY(hiredate) 。

  • 15.找出每个月倒数第三天受雇的所有员工。
select ename,hiredate from emp where hiredate=LAST_DAY(hiredate) - 2;

解题思路
在emp表中跟受雇日期有关的字段是hiredate, 每个雇员有自己的受雇日期,则每个受雇日期所在月的最后一天也不一定相同;如果想求出某一个受雇日期所在月的最后一天,则使用LAST_DAY()函数即可。
倒数第三天表示为LAST_DAY(hiredate) - 2,where子句的判断条件:hiredate=LAST_DAY(hiredate) - 2;

  • 16.找出早于12年前受雇的员工。
select * from emp where MONTHS_BETWEEN(SYSDATE, hiredate)/12>12;

解题思路
12年前受雇,肯定要求年,求年最精确的做法是按照相隔月数/12计算;
两个日期之间相隔的月数,使用 MONTHS_BETWEEN()函数完成;
where子句中只需要判断计算结果大于12即可

  • 17.找出在(任何年份)12月入职的所有员工。
select * from emp where TO_CHAR(hiredate,'MM') = 2;

解题思路
要想从受雇日期中取出年份,使用TO_CHAR(hiredate,'MM')函数。

  • 18.显示满10年服务年限员工的姓名和受雇日期。
select ename, hiredate from emp where MONTHS_BETWEEN(SYSDATE, hiredate)/12>10;

解题思路MONTHS_BETWEEN(SYSDATE, hiredate)表示极端日期之间相隔的月数,精确到年应为MONTHS_BETWEEN(SYSDATE, hiredate)/12

  • 19.显示所有员工姓名、入职的年份和月份,按入职日期所在月排序,若月份相同则将最早年份的员工排在最前面。
select ename, TO_CHAR(hiredate,'yyyy') year, TO_CHAR(hiredate,'MM') month from emp order by month, year;

解题思路
要想求出年份和月份使用TO_CHAR()函数以及正确 格式码yyyy、MM对日期进行格式转换;按照入职所在月排序,可以在select子句中为查询的结果设置一个别名(月);月如果相同,则继续增加一个排序的字段,这个字段同样使用一个别名(年)

  • 20.显示在一个月内为30天的情况所有员工的日薪,忽略余数
    答案
select ename,TRUNC(sal/30)  from emp;

思路
日薪表达式应为sal/30,忽略余数使用TRUNC()函数,TRUNC(sal,n)截取数值到小数点后n位。

  • 21.将所有雇员姓名按照小写字母返回
    答案
SELECT LOWER(ename) from emp;

思路
使用函数LOWER(),将参数内容转为小写。

  • 22.要求查询出姓名长度正好是5的雇员信息
    答案
SELECT ename,LENGTH(ename) from emp where LENGTH(ename) = 5;

思路
限制条件姓名长度为5,应该使用LENGTH(ename) = 5。

  • 23使用字符"_"替换掉姓名中的所有字母A
    答案
SELECT REPLACE(ename,'A','_') from emp;

思路
使用函数REPLACE(参数1,参数2,参数3),将参数1中的参数2替换为参数3。

  • 24.要求截取每个雇员姓名后的三个字母
    答案
SELECT ename, SUBSTR(ename,-3)  from emp;

SUBSTR(s1,n1,[n2]) 返回第一个参数中,从第n1位开始,长度为n2的子串;
在ORACLE数据库中, SUBSTR()函数从0或1开始都是一样的。

  • 25.求出每个雇员到今天为止的受雇天数
    答案
SELECT ename,hiredate,SYSDATE-hiredate from emp;

思路
日期 - 时间 = 数字,表示的是两个日期间的天数;
但是注意:应使用大日期减去小日期的形式。

  • 26,求出四个月后的日期
    答案
SELECT ADD_MONTHS(SYSDATE,4) from  dual;

思路
ADD_MONTHS(日期,数字) :求出若干月之后的日期;
SYSDATE表示当前系统时间。

  • 27.求出每个雇员到今天为止的受雇月份。
    答案
SELECT ename,hiredate,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp;

思路
MONTHS_BETWEEN(日期1,日期2):求出两个日期之间相隔的月数;

  • 28.要求查询出每个雇员的全部年薪
    答案
SELECT ename,sal * 12+NVL(comm,o) FROM emp;

思路
由于任何包含null的表达式运算结果都是null,因此使用nvl函数将null转为0.

  • 29.把hiredate列看作员工的生日,求本月过生日的员工
    答案
SELECT * FROM emp where to_char(hiredate,'MM') = to_char(SYSDATE,'MM');

思路
根据题意,将hiredate 与 SYSDATE 中的月份进行比较即可,使用 TO_CHAR(日期,'MM')函数解决。

  • 1.求1982年入职的员工
select *from emp where to_char(hiredate,'yyyy')='1982';

解题思路:通过字符串抓换函数to_char(hiredate,'yyyy'),获取年份即可

  • 2.求1981年下半年入职的员工
(1)select * from emp where hiredate between to_date('1981-7-1','yyyy-MM-dd') and to_date('1981-12-31','yyyy-MM-dd') 
(2)select * from emp where hiredate between'01-7月- 81'and'31-12月- 81'

解题思路:限制条件1981年下半年,表示日期在1981-7-1至1981-12-31的区间内

  • 3.显示所有员工姓名的前三个字符
select substr(ename,1,3) from emp

解题思路:substr(ename,1,3)返回ename中从第一位开始,长度为3 的字串.

  • 4.如下代码,对代码描述正确是的(B)
select e.deptno,avg(sal),dname from emp e, dept d where e.depno=d.deptno and e.deptno <>20 group by e.deptno,dname

A.e.deptno=d.deptno条件可以胜略
B.deptno<>20这个条件可以写在having中
C.group by 子句后的deptno,dname只写一个也可以执行
D.以上代码错误,但可以执行

  • 5.什么是笛卡尔积现象(A)
    A.第一张表中的所有行和另一个表中的所有行都发生连接的现象
    B.第一张表中的数据无论按照连接条件都能匹配上都能显示上的现象
    C.第二张表中数据五乱按照连接条件能否匹配上都能显示的现象
    D.两张表中的数据自动匹配的现象
  • 6.查询每个员工的姓名,工资,工资等级,所在工作城市
select e.ename, e.sal,s.salgrade,d.loc from emp e,dapt d, salgrade s where e.deptno=d.deptno and e.sal between s.lsal and s.hsal;
  • 7.列出所有员工的姓名和直接上级的姓名
select e.ename,l.ename from emp e,emp i where e.mgr=i.empno
  • 查询所有工作在NEW YORK和CHICAGO的员工姓名、员工编号。
SELECT ename, empno FROM emp,dept

WHERE e. deptno= d. deptno

AND (d. loc= NEW YORK' OR d. loc = 'CHICAGO')
  • 查询所有工作在NEW YORK和CHICAGO的员工姓名、员工编号,以及他们的经理姓名、经理编号。
SELECT e. ename,e. empno,1. ename,1. empno
FROM emp e, emp l,dept d
WHERE e. mgr= l. empno AND e. deptno= d. deptnoAND (d. loc=' NEW Y0RK'  OR  d. loc= 'CHICAGO')
  • 显示工作在CHICAGO的员工姓名、部门名称、工作地点。答案
SELECT ename,dname,locFROM emp e,dept d
WHERE e. deptno= d. deptno
AND
loc= 'CHICAGO'
  • 显示人职日期在1981年2月1日之后的员工姓名、部门名称、人职日期。
SELECT ename, dname, hiredateFROM emp e,dept d
WHERE
e. deptno= d. deptno
AND e. hiredate > '01-2月-81'
  • 显示员工JONSE的部门名称、直接上级名称。
SELECT dname,1. ename
FROM emp e,emp l,dept d 
WHERE e. mgr = 1. empno
AND e. deptno = d. deptno
AND e. ename = JONSE'
  • 列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称。
SELECT e. empno, e. ename,d. dname
FROM emp e,emp 1 ,dept d 
WHERE e. mgr = l. empno AND e. deptno = d. deptnoAND e. hiredate< 1. hiredate
  • 列出部门名称和这些部门的员工姓名、部门号码。
SELECT d. dname,e. ename,e. deptnoFROM emp e,dept d

WHERE e. deptno= d. deptno

显示所有工作在CHICAGO并且奖金不为空的员工姓名、工作地点、奖金。

SELECT ename, loc, comm 
FROM emp e,dept d
WHERE e.DEPTNO=d.DEPTNO
AND d.LOC='CHICAGO'AND e.COMM IS NOT NULL;

写一个查询,显示所有姓名中含有A字符的员工姓名、工作地点。

SELECT ename FROM emp e,dept d
WHERE e.DEPTNO=d.DEPTNO AND e.ENAME LIKE'%A%';

列出所有'' CLERK''(办事员)的姓名及其部门名称

SELECT e.ename,d.dname
FROM emp e,dept d
WHERE d.DEPTNO=e.deptno AND e.job ='CLERK';

查询语句中用以限定分组条件的子句是( )

A. WHERE B. HAVING

C. GROUP BY D. FROM

答案: B

下列是分组函数的是( )

A. TO_CHAR B. SUBSTR

C. COUNT D. DISTINCT

答案:C

下列语句不能正常执行的是( )

A. SELECT * FROM emp WHERE ename ='KING'
B. SELECT deptno,AVG(sal) FROM emp GROUP BY dname,deptno
C. SELECT deptno, AVG(sal) FROM emp GROUP BY deptno
D. SELECT AVG(sal), dname FROM emp e, dept d WHERE e.deptno= d.deptno GROUP BY dname

答案:B

下列语句可以正确执行的是( )

A. SELECT * WHERE ename = 'KING'
B. SELECT deptno, AVG(sal) FROM emp
C. SELECT deptno, AVG(sal) FROM emp GROUP BY dname
D. SELECT AVG(sal), dname FROM emp e, dept d WHERE e.deptno =d.deptno GROUP BY dname

答案:D

5.下列关于分组函数描述正确的是()
A.AVG和SUM的功能是求平均值以及求和,可以对任何数据类型进行操作
B.MIN和MAX的功能是求最小值及求最大值,不能对日期及字符型数据进行操作
C.COUNT是返回满足条件的记录条数,参数列表中可以写多个列表名及*
D.GROUP BY子句中出现的列不是必须写在SELECT列表中
答案:D
6.对数据库运行下列哪个GROUPBY查询时会从ORACLE产生错误()
A. SELECT deptno, job, SUM(sal) FROM emp GROUP BY job, deptno;
B. SELECT SUM(sal), deptno, job FROM emp GROUP BY job, deptno;
C. SELECT deptno, job, SUM(sal) FROM emp;
D. SELECT deptno, SUM(sal), job FROM emp GROUP BY job, deptno;
答案:C
7.列出最低薪资大于1500 元的各种工作及从事此工作的全部雇员人数。
答案:

SELECT job, COUNT(empno) FROM empGROUP BY job
HAVING MIN(sal)> 1500

8.查询各个部门的平均工资。
答案

SELECT deptno,AVG(sal) FROM emp GROUP by deptno;

9.显示各种职位的最低 工资。

答案

SELECT job,min(sal) from emp  GROUP BY job;

10.显示平均工资为>2000的职位。

答案

SELECT job,AVG(sal) FROM emp
GROUP BY job
having AVG(sal)>2000;

11.找出每个部门的最高和最低工资。

答案

SELECT deptno,MAX( sal) ,MIN( sal)

FROM emp GROUP BY deptno;

12找出每个部门中每种职位的量最高和最低工资。
答案

SELECET depno,MAX(sal),MIN(sal) FROM emp GRUP BY job,deptno;

13.显示出工作名称(job)中包含“MAN”的员工平均工资、最高工资、最低工资及工资的和。

SELECT AVG(sal),MAX(sal),MIN(sal),SUM(sal) FROM  emp
where job like '%MAN%';

14.显示出20号部门的员工人数

SELECT COUNT(*)  FROM emp WHERE deptno=20;

15.显示出平均工资大于2000元的部门名称及平均工资。

SELECT  dname,AVG(sal) FROM dept d,emp e
WHERE e.deptno=d.deptno 
GROUP BY dname HAVING AVG(sal)>2000;

16.显示每个部门每种工作平均工资大太阳2500元的部门及工作。

SELECT deptno,job FROM emp
GROUP BY deptno,job
HAVING AVG(sal)>2500;

17.显示出工作名称中包含"MAN",并且平均工资大于1000元的工作名称及平均工资。

SELECT job,AVG(sal)
FROM emp
WHERE job LIKE'%MAN%'
GROUP BY job
HAVING AVG(sal)>1000;

18.显示出平均工资最高的部门平均工资。

SELECT deptno,MAX(AVG(sal))
FROM emp GROUP BY deptno;

19.列出最低工资大于1500元的各种工作。

SELECT job FROM emp GROUP BY job HAVING MIN(sal)>1500;

20.列出各个部门中的职位是MANAGER的最低薪资。


SELECT deptno,MIN(sal) FROM emp
WHERE job ='MANAGER'
GROUP BY DEPTNO;

21.显示部门名和每个部门的累计薪资,要求每个部门的累计薪资大于3000元。

答案
SELECT dname,SUM(sal)
FROM emp e,dept d
WHERE e.deptno = d.deptno
GROUP BY dname
HAVING SUM(sal)>3000;

解题思路
查询dname、sal来自于两个表,需要多表连接,关联条件为e.deptno = d.deptno;
每个部门应表示为部门分组,语法为GROUP BY deptno,dname;
分组的限制条件是累计薪资大于3000元,表示为HAVING SUM(sal)>3000。
22.如何只显示重复数据,或不显示重复数据?

答案
只显示重复数据:
SELECT * FROM tablename GROUP BY id HAVING COUNT(*)>1
不显示重复数据:
SELECT * FROM tablename GROUP BY id HAVING COUNT(*)=1

解题思路
count(*)表示多个不同记录的统计,不重复等于1,重复大于1。

子查询

1.显示工资比ALLEN高的所有员工的姓名和工资。

答案
SELECT * FROM emp
WHERE sal>(SELECT sal FROM emp WHERE ename = 'ALLEN');

解题思路
主查询的限制条件是比ALLEN薪资高,所以首先要清楚ALLEN的薪资是多少,就可以通过子查询对ALLEN的薪资进行检索。
2.显示与SCOTT从事相同工作的员工的详细信息。

答案
SELECT * FROM emp
WHERE job = (SELECT job FROM emp WHERE ename = 'ALLEN');

解题思路
主查询的限制条件job与SCOTT职业相同,子查询应检索出SCOTT的职位,然后把结果当做主查询的查询条件。
3.显示销售部(SALES)员工姓名

答案
SELECT ename FROM emp e,dept d
WHERE e.deptno AND d.dname = 'SALES';

解题思路
查询语句中涉及部门名称和员工姓名,所以需要多表连接。
4.显示与30号部门MARTIN工资相同的员工姓名额工资。

答案
SELECT ename,sal FROM emp
WHERE sal = (SELECT sal
                         FROM emp
                         WHERE deptno = 30 AND ename = 'MAGTIN');

解题思路
主查询限制条件是薪资与30号部门并且姓名是MAGTIN的相同,所以子查询应检索30号部门并且姓名是MARTIN的薪资是多少。
5.查询所有工资高于平均工资(平均工资包括所有员工)的销售人员(SALESMAN)。

答案
SELECT * FROM emp WHERE job = 'SALESMAN'
AND sal>(SELECT AVG(sal) FROM emp);

解题思路
主查询的限制条件为职位是SALESMAN并且薪资高于平均薪资,所以子查询应检索出所有员工的平均薪资是多少,将结果作为主查询的限制条件来使用。
6.查询各个部门的名称和员工人数。

SELECT e.c,d.dname
FROM(
SELECT count(*) c, deptno FROM emp GROUP BY deptno) e,
dept d
WHERE e.deptno =d.deptno

7.查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位。

SETECT job, count(empno) FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp)
GROUP BY job;

8.查询工资最高的3名员工信息。

SELECT *
FROM (SELECT * FROM emp order by sal desc)
WHERE rownum <=3:

9.查询各部门工资最高的员工信息。

SELECT *
FROM emp e
WHERE e.sal= (SELECT MAX(sal)
FROM emp WHERE deptno =e.deptno);

10.查询每个部门工资最高的前两名员工。

SELECT *
FROM emp e
WHERE
(SELECT count(*)
FROM emp
WHERE sal > e.sal AND e.deptro = deptno) <2

11.查询出有3个以上下属的员工信息。

SELECT *
FROM emp e
WHERE
(SELECT count(*) FROM emp WHERE e.empno = mgr) >2;

12.查询所有大于本部门平均工资的员工信息。

SELECT
    *
FROM
    emp e
WHERE
    SAL > (
        SELECT
            AVG(SAL)
        FROM
            emp
        WHERE
            DEPTNO = e.DEPTNO
    )

13.列出至少有三个员工的所有部门和部门信息。

SELECT
    *
FROM
    dept d
WHERE
    (SELECT count(empno) FROM emp e
WHERE
    e.deptno = d.deptno
) >= 3

数据操作与事务控制

1.有信员工信息如下:empno=200、ENAME=张三、JOB=软件工程师、HIREDATE=2008年4月16日、DEPTNO=10、SAL=3000,请将此员工信息插入EMP表中。

INSERT INTO emp
VALUES
    (
        200,
        '张三',
        '软件工程师',
        NULL,
        '2008-04-16',
        3000,
        NULL,
        10
    )

2.修改EMP表中的数据,为工资小于2000元的员工加500元工资。

UPDATE emp
SET SAL = sal + 500
WHERE
    sal < 2000

3.修改薪资小于2000元的员工的入职日期为当日。

UPDATE emp_copy
SET HIREDATE = SYSDATE()
WHERE
    sal < 2000

4.删除所有入职日期小于2007年1月1日的员工信息。

DELETE
FROM
    emp
WHERE
    hiredate < '2007-01-01'

5.删除所有薪资等于员工平均薪资的员工信息。

DELETE
FROM
    emp
WHERE
    empno IN (
        SELECT
            *
        FROM
            (
                SELECT
                    a.empno
                FROM
                    emp AS a,
                    (
                        SELECT
                            deptno,
                            AVG(sal) AS avgsal
                        FROM
                            emp
                        GROUP BY
                            deptno
                    ) AS b
                WHERE
                    a.deptno = b.deptno
                AND a.sal = b.avgsal
            ) AS QUERY
    )

6.简述ORACLE中DML、DDL、DCL的使用。

DML 数据操纵语言,如 update、delete、insert;
DDL 数据定义语言,如 create table、drop table;
DCL 数据控制语言,如 commit、rollback、grant、invoke。

面试题

1.索引的优缺点是什么?

  • 优点:
    (1)创建唯一性索引,保证数据库表中每一行数据的唯一性
    (2)大大加快数据的检索速度,这也是创建索引的最主要的原因
    (3)加速表之间的连接,特别实在实现数据的参考完整性方面特别有意义
    (4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
  • 缺点:
    (1)索引创建在表上,不能创建在视图上
    (2)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
    (3)索引需要占有物理空间,除了数据表占据数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
    (4)当对表中的数据进行增、删和改的时候,索引也要动态地维护,降低了数据的维护速度

2.怎样创建一个视图,视图的好处是什么,视图可以控制权限吗?

CREATE VIEW 视图名 AS SELECT 列名[别名]?...? FROM 表 [union [all] SELECT ...]
  • 好处:
    (1)可以简单地将视图理解为SQL查询语句,视图最大的好处是不占有系统空间
    (2)一些安全性很高的系统不会公布系统的表结构,可能会使用视图将一些敏感信息过滤或者重命名公布结构
    (3)控制权限:会使用的时候需要将视图的使用权限grant给用户

3.当ORACLE服务器启动时,下列哪种文件不是必须的(D)
A.数据文件
B.控制文件
C.日志文件
D.归档日志文件
解析:
启动时需检查数据一致性,就需要读取数据文件以及控制文件,需要打开日志文件,因为要进行示例恢复,日志文件是必须的。归档知识历史日志文件的备份。

4.在ORACLE 10g 中创建用户时,若未提及DEFAULT TABLESPACE 关键字,则ORACLE 就将(A )表空间分配给用户作为默认表空间
A.USERS
B.SYSTEM
C.SYS
D.DEFAULT
解析:
在ORACLE 9i 数据库中,创建数据库用户时,如果没有指定默认的永久性表空间,则使用SYSTEM 表空间作为该用户的默认永久表空间,默认的临时表空间为TEMP,在ORACLE 10/11g 中,如果不指定默认永久表空间,则是USERS默认的临时表空间为TEMP。
6.如果a表原本是空表,请问执行下列语句后,以下哪个表述正确( B)
INSERT INTO a VALUES(1,'abe','1);
INSERT INTO a VALUES(2,'abe','2);
CREATES TABLE b AS SELECT * FROM a;
A.a表b表都没有数据
B.a表 b表都有两行数据
C.a表有数据,b表没有数据
D.a表没有数据,b表有数据
解题思路:
建表语句是DDL语言,会默认提交事务,所以两个表都有数据。

7.为了恢复数据库,需要用到以下哪一类文件(C
A.数据文件
B.控制文件
C.重做日志文件
D.参数文件
解题思路:
重做日志文件又叫联机日志文件,记录了对数据库修改的信息,包括用户对数据的修改和数据库管理员对数据库结构的修改,它主要用于在ORACLE发生故障的时候和数据库备份文件配合恢复数据库。

8.创建用户时 ,需要授予新用户什么权限方能使其连上数据库?

答案:create session权限。
答题思路:
createsession权限表示连接数据库,createtabl是创建表权限;unlimitedtablespace是使用表空间的权限。

9.比较truncate和delete命令的区别?
两者都可以用来删除表中所有的记录。thub.MORtCIWOs p riJH物truncate是DDL操作,不需要rlback;
delete是DML操作,需要rllback,且花费较长的时间。

10.ORACLE数据库的约束条件有哪些?
答案:
有5个约束条件:主键、外键、非空、唯一、条件。

11.日志的作用是什么?
答案:
记录数据库事务,最大限度地保证数据的一致性 与安全性。重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复

12.在ORACLE中,关于锁,下列描述不正确的是(D)
A.锁用于在用户之间控制对数据的并发访问
B.可以将锁归类为行级锁和表级锁
C. insert、update、delete语句自动获得行级锁
D.同一时间只能有一个用户锁定一个特定的表
解题思路:
多个用户可以同时在同一个表上应用此锁。

13.在ORACLE中,序列venseq使用下面的语句创建:
CREATE SEQUENCE venseq
INCREMENT BY 1
START WITH 10
MAXVALUE 100
MINVALUE 10;
下面对序列venseq修改的语句,错误的是(A
A. ALTER SEQUENCE venseq START WITH1;
B. ALTER SEQUENCE venseqMAXVALUE 90;
C. ALTERSEQUENCE venseq NOMINVALUE;
D. ALTER SEQUENCE venseqNOCACHE;
解题思路:
初始值不能小于最小值。
14.在ORACLE中,通过命令( )可 以释放锁
A.INSERT
B.DELETE
C.ROLLBACK
D.UNLOCK
答案C
解题思路
COMMIT,ROLLBACK提交和回滚事务。
15.在Oracle中,事务中使用下列SQL语句不会引起锁定()
A.SELECT
B.INSERT
C.UPDATE
D.DELETE
答案A
解题思路
DQL操作不会产生事务,DML操作会产生事务。
16.在ORACLE中,使用下列的语句产生序列: CREATE SEQUENCE id; ORACLE服务器会预开辟内存并维持的序列值有()个
A.0
B.10
C.20
D.100
答案
解题思路
CACHE表示序列值被服务器预先分配并存储的内存,默认20。

18.在ORACLE中,在执行SQL语句时,若不小心使用Update命令将所有的ID值设置成了1111,那么使用()命令可以取消这-操作
A. EXIT
B. COMMIT
C. ROLLBACK
D. UNDO
答案C
解题思路
ROLLBACK进行事务回滚。
19.在ORACLE中,使用了如下的语句创建用户TOM,则对于该用户而言,以下说:错误的是()

CREATE USER TOM IDENTIFIED BY TOMSYS

A.该用户的口令为TOMSYS
B. TOM默认表空间为SYSTEM
C.TOM的临时表空间为TEMP
D.使用ORANT UPDATE命令可以修改TOM的口令
答案C
解题思路
ALTER USER user IDENTIFIED BY新密码是修改口令的语法。
20.在ORACLE中,下述()命令会使挂起的事务完成
A. COMMIT
B. DELETE
C. UPDATE
D. SELECT
答案A
解题思路
结束事务使用COMMIT或ROLLBACK。

21.哪中类型的约束只能定义在列级( )
A. CHECK
B. NOT NULL
C. PRIMART KEY
D. FOREIGN KEY
答案A
解题思路
约束分为:列级约束和表级约束,只有NOT NULL是列级约束,其他既是列级又是表级。

22.在建表时如果希望某列的值在一定的范围内,应建什么样的约束(
A. CHECK
B. NOT NULL
C. PRIMART KEY
D. FOREIGN KEY
答案
解题思路
NOT NULL非空约束;
PRIMART KEY主键约束,特点是非空且唯一:
FOREIGN KEY外键约束,与其他表的主键相关联:
CHECK检查性约束。
23.()是ORACLE提供的一个对象,可以生成唯一的连续的整数
A.同义词
B.序列
C.视图 D.索引
答案 B
解题思路
序列是按照一定规则,能自动增加/减少数字的一种数据库对象。
24.关于视图的说法正确的是(
A.视图与表一样,也占用系统空间
B.视图实际上只是在需要时,执行它所代表的SQL语句
C.视图不用记录在数据字典中
D.视图其实就是表
答案 B
解题思路
视图不占用物理空间,视图本身的定义语句还是要存储在数据字典里。
25.关于索引的说法错误的是( )
A.索引对于表来说,可有可无
B.索引是用来提高查询速度的
C.索引用来装饰表,使表格好看一点
D.索引会影响更新的速度
答案 C
解题思路
索引是对数据库表中一个或多个列的值进行排序的一种数据库对象;在数据库中,通过索引可以加速对表的查询速度,但会占用空间,降低DML.操作的速度。
26.ORACLE中定义 SQL查询下列( )数据库对象不能直接从SELECT语句中引用
A.表
B.序列
C. 索引
D.视图
答 案 C
解题思路
索引定义在列上,无法直接通过SELECT查询。

综合填空

1.ORACLE数据库系统的物理存储结构主要由3类文件组成,分别是和_
答案 数据文件、重做日志文件、控制文件
解题思路
ORACLE物理存储结构主要包括三种类型的物理文件,分别是数据文件(.dbf)、 控制文件(.ctl)和重做日志文件(*.log),数据文件主要是存储数据的文件;
控制文件是一个很小的二进制文件,主要包含有关于数据库物理结构的重要信息,
重做日志文件即日志文件,主要记录用户对数据库的操作信息。
2.使用_ 命令可以显示表的结构信息。
答案:DESCRIBE/DESC
3.在创建不同类型的表空间时,create后面使用的关键字不同,创建临时表空间,使用 _关键字。
答案 TEMPORARY
解题思路
deafult tablespace:用户的默认表空间;temporary tablespace:用户的临时表空间。

4.按照约束的作用域可将表的约束分为以下两类:_ 和_
答案 列级约束、表级约束
约束既可以写在每个对应列的后面,称之为列级别约束;也可以写完所有列之后,再写 解题思路
约束,称之为表级别约束。只有NOT NULL是列级约束,其他既是列级又是表级。 约束

5.按照约束的用途可将表的完整性约束分为以下5类: 约束、约束、 _约束和CHECK约束。
答案 NOTNULL约束、UNIQUE约束、PRIMARY KEY约束、FOREIGN KEY约束

6.为了在自己的模式中创建新表,用户必须具有_系统权限,如果要在其他用户模式中创建表,必须具有 _系统权限。
答 案 CREATE TABLE、CREATE ANY TABLE
解题思路
用户一般是由DBA来创建和维护的,创建用户后,用户不可以执行任何ORACLE善作,只有赋予用户相关的权限,用户才能执行权限允许范围内的操作。

7._ 约束要求表中一个字段或一组字段中的每一个值都是唯一的;_约束用来约束表的一个字段或者几个字段的取值是唯一的并且不为null; _约束是个关系表达式,它规定了一个字段的数据必须满足条件。
答案 UNIQUE、PRIMARY KEY、CHECK
解题思路
NOT NULL约束:也叫非空约束,确保被约束列的所有行记录都不能为空值。
UNIQUE 约束:也叫唯一约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一。
PRIMARY KEY 约束:主键约束,用来确保表中的某一列或者某几列组合的数据行必须唯一,并且确保作为逐渐一部分的列不能包含空值。
FOREIGN KEY 约束:也叫外键约束,外键确保了相关联的两个字段的关系。
CHECK 约束:也叫检查性约束,确保某个列的所有行数据都必满足条件。
8.可以通过数据字典______来了解视图中哪些字段是可以更新的.
答案 user_updatable_columns
解题思路
有一张视图,记录所有可以更新和不可以更新的视图(和数据表)。
9._____是表、索引、视图或其他模式对象的别名。
答案 同义词
解思思路
同义词是指向数据库对象(如表、图、序列,存储过程等)的数据库指针。
10.在使用序列号时,可以使用序列中的伪例获取相应序列值。_____用于获取序列的下一个序号值,_____用于获取当前序号值。
答案 nextval、currval
解题思路
数据库对象序列的两个属性:序列名.NEXTVAL指下一个值;序列名.CURRVAL指当前值。
11.如果需要在SELECT子句中也包括一个表的所有列,可以使用符号_____。
答案 * 表示所有列
12.在SELECT语句中,分组条件的子句是_____,对显示的数据进行排序的子句是_____。
答案 GROUPBY、ORDER
13.在DML语句中,INSERT语句可以实现插入记录,_____语句可以实现更新记录,_____语句和_____语句可以实现除记录。
答案 UPDATE、DELETE、TRUNCATE
14.使用_____函数,可以把数字或日期类型的数据转换成字符串;使用TO_DATE函数,可以把_____转换成_____,默认的日期格式为_____。
答案 TO_CHAR、字符串、日期数据、DD-MON-YY
15.DDL和DML分别表示_____和_____。
答案 数据定义语言、数据操作语言
16.子查询按使用比较操作符可分为_____和_____。
答案 单行操作符、多行操作符
解题思路
单行运算符:>,=>=、<、<>、<=
多行运算符:IN、ANY、ALL
17.SELECT语句的WHERE子句中可以使用子查询,表示将_____作为外部的WHERE条件。
答案 子查询返回的结果
解题思路
注意子查询的返回结果与WHERE条件的对应关系。
18.在子查询的SELECT语句中,可以指定FROM子句、_____子句、_____子句和HAVING子句等。
答案 WHERE、GROUPBY
19.使用IN操作符实现指定匹配查询;使用_____操作符实现任意匹配查询;使用_____操作符实现全部匹配查询。
答案 ANY、ALL
解题思路
ANY:表示和子查询的任意一行结果进行比较,有一个满足条件即可。
ALL:表示和子查询的所有行结果进行比较,每一行必须都满足条件。
20.常用的表的连接类型有_____(内连接)、_____(外连接)和_____(交叉连接)。
答案 INNER JOIN、OUTER JOIN、CROSS JOIN
21.集合运算符_____实现了集合的并运算;集合运算符INTERSECT实现了对集合的交运算;而集合运算符_____则实现了集合的减运算。
答案 UNION、MINUS

综合练习

学生表

课程表

成绩表

教师表

1、查询“c001”课程比“c002”课程成绩高的同一个学生的学号

答案

SELECT DISTINCT c.sno FROM scores c WHERE(SELECT a.score FROM scores 
a WHERE a.sno=c.sno AND a.cno -='c001')>(SEIECT  a.score FROM scores a 
WHERE  a.sno=c.sno  AND a.cno-'c0002')

解题思路

一个学生的两门课程的成绩进行比较,相关子查询以主查询的学号作为子查询的检索条件;where 语句表示,如果这名学生的“c001”课程比“c002”成绩高,则返回学号
2、查询平均成绩大于60分的学生的学号和平均成绩

答案

SEIECT *FROM (SELECT a.sno,AVG(score)  avgscore FROM  scores  a  GROUP BY a.sno) WHERE  avgscore >60;

解题思路

根据题意应表示为以学号进行分组,查询学号和平均成绩;
因为需要显示平均成绩,所以需要将子查询写在FROM 中。
3、查询所有学生的学号,姓名,选课数,总成绩

答案

SELECT sno,sname.c.snum,c.sc 
FROM student s,
(SELECT sno,COUNT( sno) snum,SUM( score) sc
FROM scores
GROUP BY sno) c
WHERE s.sno=c.sno

解题思路

将学号、姓名,选课数,总心绩以学号分组,用子查询的方式进行检索,得到的结果集作为数据表与学生表通过学号进行多表连接。
4、查询姓“刘”的老师个数

答案

SELECT count (tname)FROM teacher a
WHERE a.tname LIKE‘刘%'

解题思路

统计教师人数count(tname)部分匹配LIKE
5、查询学过“谌燕"”老师所教的所有课的学生的学号、姓名。

答案

SELECT a.sno,a.sname FROM student a
WHERE a.sno in (
SELECT d.sno FROM scores d  WHERE d.cno in (
SELECT c.cno FROM teacher b,course c
WHERE b.tno=c.tno AND b.tname='谌燕'));

解题思路

先检索出教师编号﹐根据教师编号再检索课程编号;
根据课程编号,检索对应的学生编号;
主查询根据学生编号检索符合条件的数据。
6、查询课程编号“c002”的成绩比课程编号“c001”的成绩低的所有学生的学号、姓名。

答案

SEIECT a.sno,a.sname
FROM student  a
WHERE a.sno IN(
SELECT b.sno FROM scores  b,scores c
WHERE b.cno='c001' AND c.cno= 'c002'
AND  b.sno = c.sno
AND b.score > c.score);

解题思路

一个学生的两门课程的成绩进行比较,子查询以成绩进行自连接,检索符合条件的同学号,主查询根据结果进行匹配

7.查询所有课程成绩小于60分的学生的学号、姓名。

答案:

SELECT a.sno,a.sname
FROM student a
WHERE a.sno IN (SELECT b.sno FROM scores b WHERE b.score<60);

解题思路:
子查询检索成绩小于60分的学号有哪些,主查询检索符合学号的数据。

8.删除学习“谌燕”老师课程的COURSE表记录。

答案:

Delete FROM course c
WHERE tno=( SELECT tno FROM teacher WHERE tname='谌燕');

解题思路:
子查询检索出谌燕的教师编号,在课程表中删除对应的课程。

9.查询各科成绩最高和最低的分数,以如下形式显示:课程ID、最高分、最低分。

答案:

SELECT cno 课程ID,MAX(score) 最高分,MIN(score) 最低分
FROM scores GROUP BY cno

解题思路:
各科成绩表示为以学号进行分组,即GROUP BY cno;最高和最低的分为MAX(score)、 MING score) ;注意列别名的使用规则。

10.查询每门课程被选修的学生数。

答案:

SELECT COUNT(sno) 
FROM scores
GROUP BY cno

解题思路:
以课程编号分组GROUP BY cno,统计人数COUNT(sno)。

11.查询出只选修了一门课程的全部学生的学号和姓名。

答案:

SELECT sno,sname
FROM student
WHERE sno IN (
        SELECT sno
        FROM scores
        GROUP BY sno
        HAVING COUNT(cno)=1
       )

解题思路:
统计成绩表中只出现一次的学号即可,以学号分组 GROUP BY sno,限制条件是统计人数HAVING COUNT(cno)=1,检索符合学号的学生信息。

12.查询男生、女生人数。

答案:

SELECT COUNT(sname)
FROM student 
GROUP BY ssex

解题思路:
根据题意以性别分组GROUP BY ssex,统计人数COUNT(sname)。

13.查询姓“张”的学生名单。

答案:

SELECT sname 
FROM student 
WHERE sname LIKE '张%'

解题思路:
根据题意,使用部分匹配LIKE。

14.查询每门课程的平均成绩,结果按平均成绩升序排列;平均成绩相同时,按课程号降序排列。

答案:

SELECT AVG(score) avgs
FROM scores
GROUP BY cno
ORDER BY avgs,cno DESC;

解题思路:
以课程编号分组GROUP BY cno,统计平均成绩AVG(score),多列排序需要逗号分隔,注意排序关键字。

15.查询平均成绩大于85分的所有学生的学号、姓名和平均成绩。

答案:

SELECT s.sno,sname,sc.AVGs
FROM student s,(
      SELECT sno,AVG(score) avgs
      FROM scores
      GROUP BY sno
      ) sc
WHERE s.sno=sc.sno AND sc.avgs>85;

解题思路:
检索的列中存在平均成绩,需要通过在FROM中写子查询进行检索;
FROM子句中使用子查询检索学号、平均成绩;
在通过学号进行多表关联,注意平均成绩大于85分,只能通过别名显示。

student 表

CREATE TABLE `student` (
  `SNO` varchar(20) NOT NULL,
  `SNAME` varchar(20) NOT NULL,
  `SAGE` int(20) DEFAULT NULL,
  `SSEX` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `student` VALUES ('s001', '张三', 23, '男');
INSERT INTO `student` VALUES ('s002', '李四', 23, '男');
INSERT INTO `student` VALUES ('s003', '吴鹏', 25, '男');
INSERT INTO `student` VALUES ('s004', '琴沁', 20, '女');
INSERT INTO `student` VALUES ('s005', '王丽', 20, '女');
INSERT INTO `student` VALUES ('s006', '李波', 21, '男');
INSERT INTO `student` VALUES ('s007', '刘玉', 21, '男');
INSERT INTO `student` VALUES ('s008', '萧蓉', 21, '女');
INSERT INTO `student` VALUES ('s009', '陈萧晓', 23, '女');
INSERT INTO `student` VALUES ('s010', '陈美', 22, '女');

course表

CREATE TABLE `course` (
  `CNO` varchar(20) NOT NULL,
  `CNAME` varchar(20) NOT NULL,
  `TNO` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `course` VALUES ('c001', 'J2SE', 't002');
INSERT INTO `course` VALUES ('c002', 'Java Web', 't002');
INSERT INTO `course` VALUES ('c003', 'SSH', 't001');
INSERT INTO `course` VALUES ('c004', 'Oracle', 't001');
INSERT INTO `course` VALUES ('c005', 'SERVER 2', 't003');
INSERT INTO `course` VALUES ('c006', 'C#', 't003');
INSERT INTO `course` VALUES ('c007', 'JavaScript', 't002');
INSERT INTO `course` VALUES ('c008', 'DIV+CSS', 't001');
INSERT INTO `course` VALUES ('c009', 'PHP', 't003');
INSERT INTO `course` VALUES ('c010', 'EJB3.0', 't002');

scores表

CREATE TABLE `scores` (
  `SNO` varchar(20) NOT NULL,
  `CNO` varchar(20) NOT NULL,
  `SCORE` double(20,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `scores` VALUES ('s001', 'c001', 80.9);
INSERT INTO `scores` VALUES ('s002', 'c001', 82.9);
INSERT INTO `scores` VALUES ('s003', 'c001', 83.9);
INSERT INTO `scores` VALUES ('s004', 'c001', 62.9);
INSERT INTO `scores` VALUES ('s001', 'c002', 84.9);
INSERT INTO `scores` VALUES ('s002', 'c002', 74.9);
INSERT INTO `scores` VALUES ('s005', 'c003', 80.9);
INSERT INTO `scores` VALUES ('s006', 'c004', 52.9);
INSERT INTO `scores` VALUES ('s007', 'c005', 83.9);
INSERT INTO `scores` VALUES ('s008', 'c006', 52.9);
INSERT INTO `scores` VALUES ('s005', 'c007', 44.9);
INSERT INTO `scores` VALUES ('s006', 'c008', 74.9);
INSERT INTO `scores` VALUES ('s005', 'c009', 54.9);
INSERT INTO `scores` VALUES ('s006', 'c010', 94.9);

teacher表

CREATE TABLE `teacher` (
  `TNO` varchar(20) NOT NULL,
  `TNAME` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `teacher` VALUES ('t001', '刘阳');
INSERT INTO `teacher` VALUES ('t002', '谌燕');
INSERT INTO `teacher` VALUES ('t003', '胡明星');

你可能感兴趣的:(书上习题)