学习大数据DAY11 SQL最终阶段测试

发布于:2024-07-11 ⋅ 阅读:(22) ⋅ 点赞:(0)

SQL基础试题

目录

一、单选选择题(每题3分,共30分)  

二、简答题(共70分)

错点复习:

                   

一、单选选择题(每题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

  1. 50
  2. 10
  3. 100
  4. 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( AX 正确答案: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分)

  1. year

 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;

  1. 商品销售情况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'));
  1. 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。