数据库面试题Word下载.docx
- 文档编号:22774945
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:28
- 大小:29.67KB
数据库面试题Word下载.docx
《数据库面试题Word下载.docx》由会员分享,可在线阅读,更多相关《数据库面试题Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
2)建立下列两个视图。
社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别);
参加人情况(职工号,姓名,社团编号,社团名称,参加日期)
3)查找参加唱歌队或篮球队的职工号和姓名。
4)求参加人数超过100人的社会团体的名称和负责人。
答:
1)CREAT TABLE 职工(职工号 CHAR(10)NOT NULL ,
姓名 CHAR(8)NOT NULL,
年龄 SMALLINT,
性别 CHAR
(2),
CONSTRAINT C1_PK PRIMARY KEY(职工号);
CREAT TABLE 社会团体(编号 CHAR(8)NOT NULL ,
名称 CHAR(12)NOT NULL,
负责人 CHAR(8),
活动地点 VARCHAR(50),
CONSTRAINT C2_PKPRIMARY KEY(职工号)
CONSTRAINT C2 FOREIGN KEY(负责人)REFERENCES职工 (职工号));
CREAT TABLE 参加(职工号 CHAR(8),
编号 CHAR(8),
参加日期 DATA,
CONSTRAINT C3_PK PRIMARY KEY(职工号,编号),
CONSTRAINC3FOREIGNKEY(职工号)REFERENCES职工(职工号));
2)
CREATVIEW社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别)
AS SELECT编号,名称,负责人,姓名,性别
FROM 社会团体,职工
WHERE 社会团体.负责人=职工.职工号;
CREATVIEW参加人情况(职工号,姓名,社团编号,参加日期)
AS SELECT参加.职员号,姓名,社会团体.编号,名称,参加日期FROM职工,社会团体,参加
WHERE 职工.职工号=参加.职工号AND参加.编号=社会团体.编号;
3)SELECT 职工号,姓名
FROM 职工,社会团体,参加
WHERE 职工.职工号=参加.职工号AND参加.编号=社会团体.编号
AND 社会团体.名称IN('
唱歌队'
,'
篮球队'
);
4) SELECT 社会团体.名称,职工.姓名
FROM 职工,社会团体,参加
WHERE 社会团体.编号=参加.编号 AND 社会团体.负责人=职工.职工号
GROUP BY 参加.编号 HAVING COUNT(参加.编号)>100;
设工程—零件数据库中有四个基本表:
(18分)
供应商(供应商代码,姓名,所在城市,联系电话);
工程(工程代码,工程名,负责人,预算);
零件(零件代码,零件名,规格,产地,颜色);
供应零件(供应商代码,工程代码,零件代码,数量)
试用SQL语句完成下列操作:
1)查找预算在50000~100000元之间的工程的信息,并将结果按预算降序排列。
2
)找出使用上海产的零件的工程名称。
3)
将由供应商S5供给工程代码为J4的零件P6改为由S3供应,并将零件P6的产地改为S3供货商的所在城市。
4)从供应商关系中删除S2的记录,并从供应零件关系中删除相应的记录。
1.SELECT*
FROM工程
WHERE 预算 BETWEEN 50000 AND 100000(或者WHERE预算>
=50000AND预算<
=1000000)
ORDER BY 预算 DESC;
2.SELECT 工程名
FROM 供应商,供应零件,工程
WHERE 供应商.供应商代码=供应零件.供应商代码AND
供应零件.工程代码=工程.工程代码 AND
供应商.所在城市='
上海'
;
3.UPDATE 供应零件
SET 供应商代码='
S3'
WHERE 供应商代码='
S5'
AND工程代码='
J4'
AND零件代码='
P6'
;
UPDATE零件
SET产地=B.所在城市
FROM零件A,供应商B
WHEREA.零件代码='
ANDB.供应商代码='
4.DELETE
FROM供应零件
WHERE供应商代码='
S2'
DELETE
FROM供应商
4.数据库部分
1、存储过程与触发器必须讲,经常被面试到?
createprocedureinsert_Student
(_namevarchar(50),
_ageint,
out_idint
)
begin
insertintostudentvalue(null,_name,_age);
selectmax(stuId)into_idfromstudent;
end;
callinsert_Student('
wfz'
23,@id);
select@id;
mysql>
createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW
->
select*fromstudent;
触发器不允许返回结果
createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW
insertintostudentvalue(null,'
zxx'
28);
mysql的触发器目前不能对当前表进行操作
deletefromarticleswhereid=8;
这个例子不是很好,最好是用删除一个用户时,顺带删除该用户的所有帖子
这里要注意使用OLD.id
其实我认为触发器用处还是很多的,不应该不用,而应该常用。
比如校内网、开心网、Facebook,你发一个日志,自动通知好友,其实就是在增加日志时做一个后触发,再向通知表中写入条目。
因为触发器效率高。
而UCH没有用触发器,效率和数据处理能力都很低。
呵呵,个人意见。
1、数据库三范式是什么?
第一范式(1NF):
字段具有原子性,不可再分。
所有关系型数据库系统都满足第一范式)
数据库表中的字段都是单一属性的,不可再分。
例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。
通常需要为表加上一个列,以存储各个实例的惟一标识。
这个惟一属性列被称为主关键字或主键。
第二范式(2NF)要求实体的属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
简而言之,第二范式就是非主属性非部分依赖于主关键字。
第三范式的要求如下:
满足第三范式(3NF)必须先满足第二范式(2NF)。
简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
1、说出一些数据库优化方面的经验?
看mysql帮助文档子查询章节的最后部分,例如,根据扫描的原理,下面的子查询语句要比第二条关联查询的效率高:
1.selecte.name,e.salarywheree.managerid=(selectidfromemployeewherename='
);
2.selecte.name,e.salary,m.name,m.salaryfromemployeese,employeesmwhere
e.managerid=m.idandm.name='
表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
将姓名和密码单独从用户表中独立出来。
这可以是非常好的一对一的案例哟!
sql语句全部大写,特别是列名和表名都大写。
特别是sql命令的缓存功能,更加需要统一大小写,sql语句发给oracle服务器语法检查和编译成为内部指令缓存和执行指令。
根据缓存的特点,不要拼凑条件,而是用?
和PreparedStatment
还有索引对查询性能的改进也是值得关注的。
备注:
下面是关于性能的讨论举例
4航班3个城市
m*n
select*fromflight,citywhereflight.startcityid=city.cityidandcity.name='
beijing'
m+n
select*fromflightwherestartcityid=(selectcityidfromcitywherecityname='
selectflight.id,'
flight.flightTimefromflightwherestartcityid=(selectcityidfromcitywherecityname='
2、union和unionall有什么不同?
假设我们有一个表Student,包括以下字段与数据:
droptablestudent;
createtablestudent
(
idintprimarykey,
namenvarchar2(50)notnull,
scorenumbernotnull
insertintostudentvalues(1,'
Aaron'
78);
insertintostudentvalues(2,'
Bill'
76);
insertintostudentvalues(3,'
Cindy'
89);
insertintostudentvalues(4,'
Damon'
90);
insertintostudentvalues(5,'
Ella'
73);
insertintostudentvalues(6,'
Frado'
61);
insertintostudentvalues(7,'
Gill'
99);
insertintostudentvalues(8,'
Hellen'
56);
insertintostudentvalues(9,'
Ivan'
93);
insertintostudentvalues(10,'
Jay'
commit;
Union和UnionAll的区别。
select*
fromstudent
whereid<
4
union
whereid>
2andid<
6
结果将是
1
Aaron
78
Bill
76
3
Cindy
89
4
Damon
90
5
Ella
73
如果换成UnionAll连接两个结果集,则返回结果是:
可以看到,Union和UnionAll的区别之一在于对重复结果的处理。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。
如:
select*fromgc_dfys
select*fromls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而UNIONALL只是简单的将两个结果合并后就返回。
这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNIONALL要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNIONALL,
3.分页语句
取出sql表中第31到40的记录(以自动增长ID为主键)
sqlserver方案1:
selecttop10*fromtwhereidnotin(selecttop30idfromtorderbyid)ordebyid
sqlserver方案2:
selecttop10*fromtwhereidin(selecttop40idfromtorderbyid)orderbyiddesc
mysql方案:
select*fromtorderbyidlimit30,10
oracle方案:
select*from(selectrownumr,*fromtwherer<
=40)wherer>
30
3.用一条SQL语句查询出每门课都大于80分的学生姓名
name
kecheng
fenshu
张三
语文
81
数学
75
李四
王五
100
英语
准备数据的sql代码:
createtablescore(idintprimarykeyauto_increment,namevarchar(20),subjectvarchar(20),scoreint);
insertintoscorevalues
(null,'
张三'
'
语文'
81),
数学'
75),
李四'
76),
90),
王五'
100),
王五'
英语'
提示:
当百思不得其解时,请理想思维,把小变成大做,把大变成小做,
答案:
A:
selectdistinctnamefromscore
where
namenotin(selectdistinctnamefromscorewherescore<
=80)
B:
selectdistincenamet1fromscorewhere80<
all(selectscorefromscorewherename=t1);
4.所有部门之间的比赛组合
一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
selecta.name,b.name
fromteama,teamb
wherea.name<
b.name
4.每个月份的发生额都比101科目多的科目
请用SQL语句实现:
从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。
请注意:
TestDB中有很多科目,都有1-12月份的发生额。
AccID:
科目代码,Occmonth:
发生额月份,DebitOccur:
发生额。
数据库名:
JcyAudit,数据集:
Select*fromTestDB
droptableifexistsTestDB;
createtableTestDB(idintprimarykeyauto_increment,AccIDvarchar(20),Occmonthdate,DebitOccurbigint);
insertintoTestDBvalues
101'
1988-1-1'
1988-2-1'
110),
1988-3-1'
120),
1988-4-1'
1988-5-1'
1988-6-1'
1988-7-1'
1988-8-1'
100);
--复制上面的数据,故意把第一个月份的发生额数字改小一点
102'
--复制最上面的数据,故意把所有发生额数字改大一点
103'
150),
160),
180),
120);
104'
130),
140),
170),
140);
--复制最上面的数据,故意把第二个月份的发生额数字改小一点
105'
80),
selectdistinctAccIDfromTestDB
whereAccIDnotin
(selectTestDB.AccIDfromTestDB,
(select*fromTestDBwhereAccID='
)asdb101
whereTestDB.Occmonth=db101.OccmonthandTestDB.DebitOccur<
=db101.DebitOccur
);
4.统计每年每月的信息
year
monthamount
1991
1
1.1
2
1.2
3
1.3
4
1.4
1992
2.1
2.2
2.3
2.4
查成这样一个结果
yearm1
m2
m3
m4
19911.11.21.31.4
19922.12.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 试题