SQL基础试题
目录
一、单选选择题(每题3分,共30分)
1.第一步执行了DELETE命令,删除了某表中的一条记录.第二步执行了COMMIT命令.最后又执行了ROLLBACK命令.请问以下叙述正确的是(B )
(A) 被删除的记录又被恢复回来,仍然存放在数据库的表中 (B) 被删除的记录彻底从数据库中被删除掉了
(C) 被删除的记录只是当前用户看不到了,而其它用户还能看到 (D) 被删除的记录当前用户可以看到,而其它用户却看不到了
(E) 以上所述都不正确
2.若想要修改一个表的结构,应该用以下哪个命令( A)
(A) ALTER TABLE (B) DEFINE TABLE (C) MODIFY TABLE (D) REBUILD TABLE (E) REVISE TABLE
3.查找出SCOTT所在部门的所有职工信息( D)
(A) select count(*) from emp where deptno= (select deptno from emp where ename='SCOTT');
(B) select sum(*) from emp where deptno=(select deptno from emp where ename='SCOTT');
(C) select * from emp where empno=(select empno from emp where ename='SCOTT');
(D) select * from emp where deptno=(select deptno from emp where ename='SCOTT');
4.user表中有字段uname、uage、uaddress,现在想删除uaddress这个列,语句正确的是( C)
(A) drop colunm uaddrss (B) alter column uaddress
(C) alter table user drop column uaddress (D) alter table user drop uaddress
5.下列关于表和视图的说法正确的是(D )
(A) 每个视图对应一个表 (B) 视图是表的一个备份
(C) 对所有视图都可以执行UPDATE操作 (D) 创建视图需要权限
6.有一个学生表student, 包含主键sno,有一个成绩表sc包含学号sno,成绩score。已知student里面有100个学生,有80个参加了考试(分数存在sc中),其中有10个人不及格。执行以下SQL语句:select * from student where exists(select sno from sc where score<60),可返回(B)条结果。X 正确答案C
- 50
- 10
- 100
- 80
7.以下对于SQL比较运算符ANY和ALL的说法正确的是( E)
(A) <ANY 表示小于最小值 (B) >ANY 表示大于最大值 (C) <ALL 表示小于最大值
(D) >ALL 表示大于最小值 (E) 以上说法都不正确
8.在Oracle中,执行下面的语句:
SELECT ceil(-97.342),floor(-97.342),round(-97.342),trunc(-97.342) FROM dual;
哪个函数的返回值不等于-97( A)X 正确答案:B
(A) ceil()
(B) floor()
(C) round()
(D)trunc()
9.在Oracle中,用以下SQL命令创建了一个序列:
CREATE SEQUENCE my_seq START WITH 394 INCREMENT BY 12 NOMINVALUE NOMAXVALUE NOCYCLE NOCACHE;
用户执行包含my_seq.NEXTVAL的SQL语句三次,然后执行包含my_seq.CURRVAL的SQL语句四次,请问序列my_seq的当前值是( B).
A.416 B.418 C.434 D.442
10.Oracle数据库中,下面描述不正确的是( B)。X 正确答案:D
A.not exists比 not in 的效率高
B.表A有30条数据,表B有20条数据,select * from A,B 的结果有600条
C.union all 比union 查询效率高
D.尽量多的创建索引来提高查询效率
二、简答题(共70分)
1.将emp表中所有人员姓名前两个字母小写后面的字母大写显示(5分)
select concat(substr(lower(ename),1,2),substr(upper(ename),3)) from emp;
2.使用开窗函数求出emp表中每一个部门工资第二高的人员姓名ename和人员工资sal,以及他所在部门的平均工资。(5分)
select * from(
select dense_rank()over(partition by deptno order by sal desc) r,
ename,sal,avg(sal)over(partition by deptno)
from emp
) where r=2 ;
3.请通过SQL语句,筛选出表格中连续登录3天的用户。(5分)
X 参考答案:
with a as (
select
uname, utime,
lead(utime, 1) over (partition by uname order by utime) as next_day,
lead(utime, 2) over (partition by uname order by utime) as second_next_day from usetable ),
b as ( select uname, utime from a where
(utime + interval '1' day = next_day)
and (next_day + interval '1' day = second_next_day) )
select distinct uname from b
4.有一张article_history表存放文章的修改记录,有以下字段title(文章标题),last_time(修改时间),username(修改人姓名),source(文章来源),pin_name(作者笔名),要求写一个sql语句查询出每一个文章的最后修改人和修改时间。(5分)
Select title,last_time,username from article_history
Where last_time in
(
Select max(last_time) from article_history
Group by title
);
X 参考答案:
Select * from article_history where (title,last_time)
in (Select title, max(last_time )
from article_history group by title)
5.如下图所示,使用merge into语句将TABLE2表中SETUP_DATE、MATURE_DATE更新到TABLE1表中 。(10分)
TABLE1:
ID | CODE | NAME | SETUP_DATE | MATURE_DATE |
1 | A0001 | 账户1 | ||
2 | A0002 | 账户2 | ||
3 | A0003 | 账户3 | ||
4 | A0004 | 账户4 |
TABLE2:
ID | SETUP_DATE | MATURE_DATE |
1 | 2021/1/7 | 2025/3/3 |
2 | 2020/1/8 | 2028/3/3 |
3 | 2019/1/9 | 2035/3/3 |
5 | 2018/1/10 | 2031/3/3 |
merge into Table1 using Table2
on(table1.id=table2.id)
when matched then update set table1.setup_date=table2.setup_date,
table1.mature_date=table2.mature_date
when not matched then insert
values(table2.id,null,null,table2.setup_date,table2.mature_date);
6、怎么把这样一个表a(10分)
| month | amount |
1991 | 1 | 1.1 |
1991 | 2 | 1.2 |
1991 | 3 | 1.3 |
1991 | 4 | 1.4 |
1992 | 1 | 2.1 |
1992 | 2 | 2.2 |
1992 | 3 | 2.3 |
1992 | 4 | 2.4 |
查成这样一个结果
year | m1 | m2 | m3 | m4 |
1991 | 1.1 | 1.2 | 1.3 | 1.4 |
1992 | 2.1 | 2.2 | 2.3 | 2.4 |
select year,
sum(case when month=1 then amount end) m1,
sum(case when month=2 then amount end) m2,
sum(case when month=3 then amount end) m3,
sum(case when month=4 then amount end) m4
from A group by year;
- 从商品销售情况表T1中查询出所有月份的销售额都比sku为8001相应月份的销售额高的商品。
注:商品销售情况表T1中有多种商品,每个商品1-12月都有对应的销售额。(10分)
T1表:
skuid(商品SKU编码) | occmonth(月份) | debitoccur(销售额) |
8001 | 1 | 34 |
8001 | 2 | 56 |
... | ... | ... |
8002 | 1 | 56 |
8003 | 2 | 67 |
select skuid,count(1) from
(select t1.skuid from t1 join t2 on t1.occmonth=t2.occmonth
and t2.skuid='8001'
where t1.debitoccur>t2.debitoccur)
group by skuid having count(1)=12
8.简答(20)
1)创建表
表名 | member | ||||||
列名 | MEMBER_ID | FIRST_NAME | LAST_NAME | ADDRESS | CITY | PHONE | JOIN_DATE |
主键 | yes | ||||||
非空 | yes | yes | yes | ||||
唯一 | yes | ||||||
默认值 | sysdate | ||||||
数据类型 | number | Varchar2 | Varchar2 | Varchar2 | Varchar2 | Varchar2 | date |
长度 | 10 | 25 | 25 | 100 | 30 | 15 |
Create table member(
Member_id number(10) primary key,
First_name varchar2(25) not null,
Last_name varchar2(25),
Address varchar2(100),
City varchar2(30),
Phone varchar2(15),
Join_date date default(sysdate) not null
);
2)创建序列MEMBER_ID_SEQ,由101开始,每次增长1,无最大值限制。
create sequence MEMBER_ID_SEQ
start with 101
increment by 1
3)利用创建的序列向表member中添加数据
First_Name | Last_Name | Address | City | Phone | Join_Date |
Carmen | Velasquez | 283 King Street | Seattle | 206-899-6666 | 08-12-1990 |
Insert into member
values(MEMBER_ID_SEQ.nextval,'Carmen','Velasquez','283 King Street',
'Seattle','206-899-6666',to_date('08-12-1990','dd-mm-yyyy'));
- 4)给表member创建只读视图。
Create view member_view
As
Select * from member read only;(漏加 read only)
5.新增一列age 数字类型,并限制该列取值在20到60岁之间。
alter table member add age number(3) check(age between 20 and 60);
错点复习:
Exist:当Exist中的值不为空时,查询语句继续执行,否则置空。注意,Exist不会影响整个查询语句的查询数据,只会决定它是否执行。
Ceil()向上取整,floor()向下取整。
例:ceil(89.8)=90,floor(-89.8)=-90
查询表为select...from A,B 查询结果A,B中的所有数据量相乘,符合笛卡尔积。
只读视图的创建要加read only。