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作为主键可能是不是连续增长的列,完整的查询语句如下:
2.
3.selecttop10*fromAwhereID>(selectmax(ID)from(selecttop30IDfromAorderbyA)T)orderbyA
4.
5.2.查询表A中存在ID重复三次以上的记录,完整的查询语句如下:
6.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(cid)=
(selectc