SQL练习题复习课程.docx

上传人:b****7 文档编号:26502867 上传时间:2023-06-20 格式:DOCX 页数:31 大小:30.83KB
下载 相关 举报
SQL练习题复习课程.docx_第1页
第1页 / 共31页
SQL练习题复习课程.docx_第2页
第2页 / 共31页
SQL练习题复习课程.docx_第3页
第3页 / 共31页
SQL练习题复习课程.docx_第4页
第4页 / 共31页
SQL练习题复习课程.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

SQL练习题复习课程.docx

《SQL练习题复习课程.docx》由会员分享,可在线阅读,更多相关《SQL练习题复习课程.docx(31页珍藏版)》请在冰豆网上搜索。

SQL练习题复习课程.docx

SQL练习题复习课程

例题

1、写出一条Sql语句:

取出表A中第31到第40记录(Mysql)

select*fromA limit30,10

MS-SQLServer

解1:

selecttop10*fromAwhereidnotin(selecttop30idfromA)

解2:

selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA)

解3:

select*from(select*,Row_Number()OVER(ORDERBYidasc)rowidFROMA)asAwhererowidbetween31and40

Oracle

select*

from(selectA.*,

   row_number()over(orderbyidasc)rank

    FROMA)  

whererank>=31ANDrank<=40;

2、用一条SQL 语句查询出每门课都大于80 分的学生姓名

name  kecheng  fenshu

张三    语文      81

张三     数学      75

李四     语文      76

李四     数学      90

王五     语文      81

王五     数学      100

王五     英语      90

A:

selectdistinctnamefromtablewherenamenotin(selectdistinctnamefromtablewherefenshu<=80)

selectnamefromtablegroupbynamehavingmin(fenshu)>80

3、学生表如下:

自动编号   学号   姓名课程编号课程名称分数

1       2005001 张三 0001     数学   69

2       2005002 李四 0001      数学   89

3       2005001 张三 0001      数学   69

删除除了自动编号不同, 其他都相同的学生冗余信息

A:

deletetablenamewhere 自动编号 notin(selectmin( 自动编号)fromtablenamegroupby学号, 姓名, 课程编号, 课程名称, 分数)

4、请用SQL 语句实现:

从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。

请注意:

TestDB 中有很多科目,都有1 -12 月份的发生额。

AccID :

科目代码,Occmonth :

发生额月份,DebitOccur :

发生额。

数据库名:

JcyAudit ,数据集:

Select*fromTestDB

答:

selecta.*

fromTestDBa 

(selectOccmonth,max(DebitOccur)Debit101ccurfromTestDBwhereAccID='101'groupbyOccmonth)b

wherea.Occmonth=b.Occmonthanda.DebitOccur>b.Debit101ccur

5、一个叫 team 的表,

里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.

你先按你自己的想法做一下,看结果有我的这个简单吗?

selecta.name,b.name

fromteama,teamb 

wherea.name

6、面试题:

怎么把这样一个表儿

year  monthamount

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

查成这样一个结果

yearm1  m2  m3  m4

19911.11.21.31.4

19922.12.22.32.4 

答案一、

selectyear, 

(selectamountfrom  aaamwheremonth=1  andm.year=aaa.year)asm1,

(selectamountfrom  aaamwheremonth=2  andm.year=aaa.year)asm2,

(selectamountfrom  aaamwheremonth=3  andm.year=aaa.year)asm3,

(selectamountfrom  aaamwheremonth=4  andm.year=aaa.year)asm4

fromaaa  groupbyyear

7、说明:

复制表( 只复制结构, 源表名:

a新表名:

b) 

SQL:

select*intobfromawhere1<>1      (where1=1,拷贝表结构和数据内容)

Oracle:

createtableb

As

Select*fromawhere1=2

 

[<>(不等于)(SQLServerCompact)

比较两个表达式。

当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为TRUE。

否则,结果为FALSE。

]

8、说明:

拷贝表( 拷贝数据, 源表名:

a目标表名:

b) 

SQL:

insertintob(a,b,c)selectd,e,ffroma; 

9、说明:

显示文章、提交人和最后回复时间

SQL:

selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b

10. 说明:

外连接查询( 表名1 :

a表名2 :

b)

SQL:

selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTERJOINbONa.a=b.c

ORACLE:

selecta.a,a.b,a.c,b.c,b.d,b.ffroma,b

wherea.a=b.c(+)

11. 说明:

日程安排提前五分钟提醒

SQL:

select*from 日程安排 wheredatediff('minute',f 开始时间,getdate())>5

12. 说明:

两张关联表,删除主表中已经在副表中没有的信息

SQL:

 

Deletefrominfowherenotexists(select*frominfobzwhereinfo.infid=infobz.infid)

13.有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value

这道题的SQL 语句怎么写?

updatebsetb.value=(selecta.valuefromawherea.key=b.key)whereb.idin(selectb.idfromb,awhereb.key=a.key);

高级sql 面试题

14.原表:

courseidcoursenamescore

-------------------------------------

1 Java 70

2oracle90

3xml40

4jsp30

5servlet80

-------------------------------------

为了便于阅读, 查询此表后的结果显式如下( 及格分数为60):

courseidcoursenamescoremark

---------------------------------------------------

1 Java 70pass

2oracle90pass

3xml40fail

4jsp30fail

5servlet80pass

---------------------------------------------------

写出此查询语句

selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfromcourse

(SQL:

selectcourseid,coursename,score,(casewhenscore<60then'fail'else'pass'end)asmarkfromcourse)

ORACLE:

selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfromcourse

(DECODE函数是ORACLEPL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数)

完全正确

SQL>desccourse_v

NameNull?

Type

-----------------------------------------------------------------------------

COURSEIDNUMBER

COURSENAMEVARCHAR2(10)

SCORENUMBER

SQL>select*fromcourse_v;

COURSEIDCOURSENAMESCORE

------------------------------

1java70

2oracle90

3xml40

4jsp30

5servlet80

SQL>selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfromcourse_v;

COURSEIDCOURSENAMESCOREMARK

----------------------------------

1java70pass

2oracle90pass

3xml40fail

4jsp30fail

5servlet80pass

15.SQL面试题

(1)

createtabletesttable1

idintIDENTITY,

departmentvarchar(12) 

select*fromtesttable1

insertintotesttable1values('设计')

insertintotesttable1values('市场')

insertintotesttable1values('售后')

/*

结果

iddepartment

1  设计

2  市场

3  售后 

*/

createtabletesttable2

idintIDENTITY,

dptIDint,

namevarchar(12)

insertintotesttable2values(1,'张三')

insertintotesttable2values(1,'李四')

insertintotesttable2values(2,'王五')

insertintotesttable2values(3,'彭六')

insertintotesttable2values(4,'陈七')

/*

用一条SQL语句,怎么显示如下结果

iddptIDdepartmentname

1  1     设计       张三

2  1     设计       李四

3  2     市场       王五

4  3     售后       彭六

5  4     黑人       陈七

*/

答案:

SELECTtesttable2.*,ISNULL(department,'黑人')

FROMtesttable1rightjointesttable2ontesttable2.dptID=testtable1.ID

也做出来了可比这方法稍复杂。

/

16.sql面试题

(2)

有表A,结构如下:

 

A:

p_IDp_Nums_id 

11001 

11202 

2801 

31101 

3803 

其中:

p_ID为产品ID,p_Num为产品库存量,s_id为仓库ID。

请用SQL语句实现将上表中的数据合并,合并后的数据为:

 

p_IDs1_ids2_ids3_id 

110120 

2800 

31108 

其中:

s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。

如果该产品在某仓库中无库存量,那么就是0代替。

结果:

selectp_id,

sum(casewhens_id=1thenp_numelse0end)ass1_id

sum(casewhens_id=2thenp_numelse0end)ass2_id

sum(casewhens_id=3thenp_numelse0end)ass3_id

frommyProgroupbyp_id

什么是相关子查询?

如何使用这些查询?

经验更加丰富的开发人员将能够准确地描述这种类型的查询。

相关子查询是一种包含子查询的特殊类型的查询。

查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。

19、为管理业务培训信息,建立3个表:

    S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄

    C(C#,CN)C#,CN分别代表课程编号,课程名称

     SC(S#,C#,G)S#,C#,G分别代表学号,所选的课程编号,学习成绩

   

(1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?

         答案:

selects#,snfromswhereS#in(selectS#fromc,scwherec.c#=sc.c#andcn=’税收基础’)

     

(2)使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?

答:

selectsn,sdfroms,scwheres.s#=sc.s#andsc.c#=’c2’

     (3)使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?

答:

selectsn,sdfromswheres#notin(selects#fromscwherec#=’c5’)

      (4)查询选修了课程的学员人数

答:

select学员人数=count(distincts#)fromsc

      (5)查询选修课程超过5门的学员学号和所属单位?

答:

selectsn,sdfromswheres#in(selects#fromscgroupbys#havingcount(distinctc#)>5)

18、SQL面试题(4)

1.查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:

selecttop10*fromAwhereID>(selectmax(ID)from(selecttop30IDfromAorderbyA)T)orderbyA

2.查询表A中存在ID重复三次以上的记录,完整的查询语句如下:

select*from(selectcount(ID)ascountfromtablegroupbyID)TwhereT.count>3

简答题部分

1.触发器的作用?

  答:

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。

它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。

可以联级运算。

如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

2。

什么是存储过程?

用什么来调用?

答:

存储过程是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。

如果某次操作需要执行多次SQL ,使用存储过程比单纯SQL 语句执行要快。

可以用一个命令对象来调用存储过程。

3。

索引的作用?

和它的优点缺点是什么?

答:

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。

它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。

索引可以是唯一的,创建索引允许指定单个列或者是多个列。

缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

3。

什么是内存泄漏?

答:

一般我们所说的内存泄漏指的是堆内存的泄漏。

堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。

当应用程序用关键字new 等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free 或者delete 释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

4。

维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?

为什么?

答:

我是这样做的,尽可能使用约束,如check, 主键,外键,非空字段等来约束,这样做效率最高,也最方便。

其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。

最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

5。

什么是事务?

什么是锁?

答:

事务就是被绑定在一起作为一个逻辑工作单元的SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。

为了确保要么执行,要么不执行,就可以使用事务。

要将有组语句作为事务考虑,就需要通过ACID 测试,即原子性,一致性,隔离性和持久性。

  锁:

在所以的 DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。

与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。

当然锁还分级别的。

6。

什么叫视图?

游标是什么?

答:

视图是一种虚拟的表,具有和物理表相同的功能。

可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。

对视图的修改不影响基本表。

它使得我们获取数据更容易,相比多表查询。

  游标:

是对查询出来的结果集作为一个单元来有效的处理。

游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。

可以对结果集当前行做修改。

一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

SQL数据库面试题以及答案(50例题)

Student(Sid,Sname,Sage,Ssex)学生表

Sid:

学号

Sname:

学生姓名

Sage:

学生年龄

Ssex:

学生性别

Course(Cid,Cname,T#)课程表

Cid:

课程编号

Cname:

课程名称

Tid:

教师编号

SC(Sid,Cid,score)成绩表

Sid:

学号

Cid:

课程编号

score:

成绩

Teacher(Tid,Tname)教师表

Tid:

教师编号:

Tname:

教师名字

问题:

1、查询“001”课程比“002”课程成绩高的所有学生的学号

selecta.sidfrom

(selectsid,scorefromscwherecid='001')a,

(selectsid,scorefromscwherecid='002')b

wherea.sid=b.sidanda.score>b.score;

2、查询平均成绩大于60分的同学的学号和平均成绩

selectsid,avg(score)fromsc

groupbysid

havingavg(score)>60;

3、查询所有同学的学号、姓名、选课数、总成绩

selects.sid,s.sname,count_cidas选课数,

sum_scoreas总成绩

fromstudents

leftjoin

(selectsid,count(cid)ascount_cid,sum(score)assum_score

fromscgroupbysid)sc

ons.sid=sc.sid;

4、查询姓‘李’的老师的个数:

selectcount(tname)

fromteacher

wheretnamelike'李%';

5、查询没有学过“叶平”老师可的同学的学号、姓名:

selects.sid,s.sname

fromstudentass

wheres.sidnotin(

selectDISTINCTsid

fromscassc

wheresc.cidin(

selectcid

fromcourseasc

leftjointeacherastonc.tid=t.tid

wheret.tname='叶平')

);

6、查询学过“叶平”老师所教的所有课的同学的学号、姓名:

selects.sid,s.sname

fromstudentass

wheres.sidin(

selectdistinctsc.sid

fromscassc

wheresc.cidin(

selectcid

fromcourseasc

leftjointeacherastonc.tid=t.tid

wheret.tname='叶平')

groupbysc.sid

HAVINGcount(ci

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1