- 相關推薦
2016年最新數(shù)據庫面試題
下面是CN人才網提供的2016年最新數(shù)據庫面試題,歡迎閱讀。
sql面試題
1,寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增長的ID作為主鍵,注意:ID可能不是連續(xù)的。
答:
→ 解1: select top 10 * from A where id not in (select top 30 id from A)
演變步驟:
1)select top 30 id from T_FilterWords–取前條
2)select * from T_FilterWords where id not in (select top 30 id from T_FilterWords)–取id不等于前三十條的–也就是把前條排除在外
3)select top 10 * from T_FilterWords where id not in (select top 30 id from T_FilterWords)
–取把前條排除在外的前條,也就是-40條
→ 解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
→ 解3:用ROW_NUMBER實現(xiàn)
/———————————————–+———————————————–\
下面的SQL題是?碱}中的常考題,必須重視!!!!!!!!
2,橫表、縱表轉換(?!!!)
1)縱表結構 TableA
Name Course Grade
張三 語文 75
張三 數(shù)學 80
張三 英語 90
李四 語文 95
李四 數(shù)學 55
橫表結構 TableB
Name 語文 數(shù)學 英語
張三 75 80 90
李四 95 55 0
先理解:
select Name,
(case Course when ‘語文‘ then Grade else 0 end) as 語文,
(case Course when ‘數(shù)學‘ then Grade else 0 end) as 數(shù)學,
(case Course when ‘英語‘ then Grade else 0 end) as 英語
from TableA
然后理解標準答案:
select Name,
sum(case Course when ‘語文‘ then Grade else 0 end) as 語文,
sum(case Course when ‘數(shù)學‘ then Grade else 0 end) as 數(shù)學,
sum(case Course when ‘英語‘ then Grade else 0 end) as 英語
from TableA
group by Name
2)、橫表轉縱表的”SQL”示例
橫表結構: TEST_H2Z
ID 姓名 語文 數(shù)學 英語
1 張三 80 90 70
2 李四 90 85 95
3 王五 88 75 90
轉換后的表結構:
ID 姓名 科目 成績
1 張三 語文 80
2 張三 數(shù)學 90
3 張三 英語 70
4 李四 語文 90
5 李四 數(shù)學 80
6 李四 英語 99
7 王五 語文 85
8 王五 數(shù)學 96
9 王五 英語 88
橫表轉縱表SQL示例:
SELECT 姓名,’語文’ AS 科目,語文 AS 成績 FROM TEST_H2Z UNION ALL
SELECT 姓名,’數(shù)學’ AS 科目,數(shù)學 AS 成績 FROM TEST_H2Z UNION ALL
SELECT 姓名,’英語’ AS 科目,英語 AS 成績 FROM TEST_H2Z
ORDER BY 姓名,科目 DESC;
3,刪除姓名、年齡重復的記錄(只保留Id最大的一條)(?!!!)
Id name age salary
1 yzk 80 1000
2 yzk 80 2000
3 tom 20 20000
4 tom 20 20000
5 im 20 20000
//取得不重復的數(shù)據
select * from Persons
where Id in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)
→ 根據姓名、年齡分組,取出每組的Id最大值,然后將Id最大值之外的排除。
刪除重復的數(shù)據:
delete from Persons
where Id not in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)
4,下面是一個由*號組成的4行倒三角形圖案。
→ 要求:1、輸入倒三角形的行數(shù),行數(shù)的取值3-21之間,對于非法的行數(shù),要求拋出提示“非法行數(shù)!”;2、在屏幕上打印這個指定了行數(shù)的倒三角形。
*******
*****
***
*
5,一個文本文件含有如下內容:
4580616022644994|3000|趙濤
4580616022645017|6000|張屹
4580616022645090|3200|鄭欣夏
→ 上述文件每行為一個轉賬記錄,第一列表示帳號,第二列表示金額,第三列表示開戶人姓名。
創(chuàng)建一張數(shù)據庫表(MS SQLServer數(shù)據庫,表名和字段名自擬),請將上述文件逐條插入此表中。
6、一個文本文件含有如下內容,分別表示姓名和成績:
張三 90
李四 96
王五 78
趙六 82
→ 提供用戶一個控制臺界面,允許用戶輸入要查詢的姓名,輸入姓名并且按回車以后,打印出此人的成績,如果不輸入姓名直接按回車則顯示所有人的姓名以及成績。(注意:不能使用數(shù)據庫)
7,表A字段Id為numberic(18,0),哪個SQL語句是錯誤的:
select * from A where id=”;
select * from A where id=’13′;
select * from A where id=null;
select * from A where id=’ 13′;
8,在SQLServer中求當前時間與2012-01-01 0:0:0相差的秒數(shù)?
9,做一個表格,三行三列,第一列,前兩行合一;第二行,后兩列合一。
10,
表一:student_info
學號 姓名 性別 出生年月 家庭住址 備注
0001 張三 男 1981-8-9 北京 NULL
表二:curriculum
課程編號 課程名稱 學分
0001 計算機基礎 2
0002 C語言 2
表三:grade
學號 課程編號 分數(shù)
0001 0001 80
0001 0002 90
題目:
→ 條件查詢:
在GRADE表中查找80-90份的學生學號和分數(shù)
select 學號,分數(shù) from grade where 分數(shù) between 80 and 90
在GRADE 表中查找課程編號為003學生的平均分
select avg(分數(shù)) from grade where 課程編號=’003′
在GRADE 表中查詢學習各門課程的人數(shù)
Select課程編號,count(學號) as 人數(shù)from grade group by 課程編號
查詢所有姓張的學生的學號和姓名
select 姓名,學號 from student_info where 姓名 like ‘張%’
→ 嵌套查詢:
1,查詢和學號’0001’的這位同學性別相同的所有同學的姓名和出生年月
select 姓名,出生年月 from student_info where 性別 in(select 性別 from student_info where sno=’0001′)
2,查詢所有選修課程編號為0002 和0003的學生的學號、姓名和性別
select 學號,姓名,性別 from student_info where 學號 in(select 學號 from grade where 課程編號=’0002′ and 學號 in(select 學號 from grade where 課程編號=’0001′))
3,查詢出學號為0001的學生的分數(shù)比0002號學生最低分高的課程編號的課程編號和分數(shù)
select 課程編號, 分數(shù) from grade where 學號=’0001′ and 分數(shù)>(select min(分數(shù)) from grade where 學號=’0002′)
→ 多表查詢:
1,查詢分數(shù)在80-90分的學生的學號、姓名、分數(shù)
select student_info.學號,student_info.姓名,grade.分數(shù) from student_info,grade where grade.分數(shù) between 80 and 90
2,查詢學習了’C語言’課程的學生學號、姓名和分數(shù)
select student_info.學號,student_info.姓名,grade.成績from student_info,grade,curriculum where student_info.學號=grade.學號and grade.課程號=curriculum.課程號and curriculum.課程名=’C語言’
3,查詢所有學生的總成績,要求列出學號、姓名、總成績,沒有選課的學生總成績?yōu)榭铡?/p>
select grade.學號,student_info.姓名,sum(grade.成績) as 總成績from student_info,grade where grade.學號=student_info.學號group by grade.學號,student_info.姓名
11,題目、活期存款中,“儲戶”通過“存取款單”和“儲蓄所”發(fā)生聯(lián)系。假定儲戶包括:賬號,姓名,電話,地址,存款額;“儲蓄所”包括:儲蓄所編號,名稱,電話,地址(假定一個儲戶可以在不同得儲蓄所存取款)
1、寫出設計以上表格的語句(4分)
2、創(chuàng)建一個觸發(fā)器TR1完成下面內容:
→ 當向“存取款單”表中插入數(shù)據時,如果存取標志=1則應該更改儲戶表讓存款額加上存取金額,如果存取標志=0則應該更改儲戶表讓存款額減去存取金額,如果余額不足顯示余額不足錯誤。
CREATE TABLE CREATE TRIGGER tr1 on qukuan after insert
AS
BEGIN
declare @sid nvarchar(50)
declare @type int
declare @qian int
declare @yuer int
select @sid=sid,@type=[type],@m=m from inserted
select @yuer=yuer from cunkuan
if(@type=1)
begin
update cunkuan set yuer=yuer+@qian
end
else
begin
if(@yuer<@qian)
begin
print ‘余額不足’
end
else
begin
update cunkuan set yuer=yuer-@qian
end
end
END
GO
12,本題用到下面三個關系表:
CARD 借書卡: (CNO 卡號,NAME 姓名,CLASS 班級)
BOOKS 圖書: (BNO 書號,BNAME 書名,AUTHOR 作者,PRICE 單價,QUANTITY 庫存冊數(shù) )
BORROW 借書記錄: (CNO 借書卡號,BNO 書號,RDATE 還書日期
→ 備注:限定每人每種書只能借一本;庫存冊數(shù)隨借書、還書而改變。
→ 要求實現(xiàn)如下處理:
1),寫出自定義函數(shù),要求輸入借書卡號能得到該卡號所借書金額的總和
CREATE FUNCTION getSUM
(
@CNO int
)
RETURNS int
AS
BEGIN
declare @sum int
select @sum=sum(price) from BOOKS where bno in (select bno from BORROW where cno=@CNO)
return @sum
END
GO
2),找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數(shù)。
select CNO,count(BNO) as 借書數(shù)量from BORROW group by CNO having count(BNO)>3
3),查詢借閱了”水滸”一書的讀者,輸出姓名及班級。
select name,class from card where cno in( select cno from borrow where bno in(
select bno from BOOKS where bname=’水滸’))
4),查詢過期未還圖書,輸出借閱者(卡號)、書號及還書日期。
select CNO,BNO,RDATE from borrow where getdate()>RDATE
5),查詢書名包括”網絡”關鍵詞的圖書,輸出書號、書名、作者。
select bno,bname,author from books where bname like ‘網絡%’
6),查詢現(xiàn)有圖書中價格最高的圖書,輸出書名及作者。
select bname,author from books where price in(select max(price) from books )
7),查詢當前借了”計算方法”但沒有借”計算方法習題集”的讀者,輸出其借書卡號,并按卡號降序排序輸出。
select cno from borrow where bno in (select bno from books where bname=’計算方法’) and cno not in ( select cno from borrow where bno in(select bno from books where bname=’計算方法習題集’)) order by cno desc
或
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME=N’計算方法’
AND NOT EXISTS(
SELECT * FROM BORROW aa,BOOKS bb
WHERE aa.BNO=bb.BNO
AND bb.BNAME=N’計算方法習題集’
AND aa.CNO=a.CNO)
ORDER BY a.CNO DESC
8),將”C01″班同學所借圖書的還期都延長一周。
update borrow set rdate=dateadd(day,7,rdate) from BORROW where cno in(select cno from card where class=’一班’)
9),從BOOKS表中刪除當前無人借閱的圖書記錄。
DELETE A FROM BOOKS a WHERE NOT EXISTS( SELECT * FROM BORROW WHERE BNO=a.BNO)
10),如果經常按書名查詢圖書信息,請建立合適的索引。(這個不確定對不 90%應該是對的 自己看了下書寫的)
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)
11),在BORROW表上建立一個觸發(fā)器,完成如下功能:如果讀者借閱的書名是”數(shù)據庫技術及應用”,就將該讀者的借閱記錄保存在BORROW_SAVE表中(注ORROW_SAVE表結構同BORROW表)。
CREATE TRIGGER TR_SAVE ON BORROW FOR INSERT,UPDATE AS IF @@ROWCOUNT>0 INSERT BORROW_SAVE SELECT i.* FROM INSERTED i,BOOKS b
WHERE i.BNO=b.BNO AND b.BNAME=N’數(shù)據庫技術及應用’
12),建立一個視圖,顯示”力01″班學生的借書信息(只要求顯示姓名和書名)。
CREATE VIEW V_VIEW AS select name,bname from books,card,borrow where borrow.cno=card.cno and borrow.bno=books.bno and class=’一班’
13).查詢當前同時借有”計算方法”和”組合數(shù)學”兩本書的讀者,輸出其借書卡號,并按卡號升序排序輸出。
select a.cno from borrow a,borrow b where a.cno=b.cno and a.bno in(select bno from books where bname=’計算方法’) and b.bno in(select bno from books where bname=’組合數(shù)學’) order by a.cno desc
或
SELECT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME IN(‘計算方法’,’組合數(shù)學’) GROUP BY a.CNO HAVING COUNT(*)=2 ORDER BY a.CNO DESC
14),用事務實現(xiàn)如下功能:一個借書卡號借走某書號的書,則該書的庫存量減少1,當某書的庫存量不夠1本的時候,該卡號不能借該書
alter PROCEDURE pro_jieshu
@cno int,
@bno int,
@date datetime
AS
BEGIN
begin tran
declare @quantity int
select @quantity=quantity from books where bno=@bno
insert into borrow values(@cno,@bno,@date)
update books set quantity=@quantity-1 where bno=@bno
if(@quantity>0)
begin
commit tran
end
else
begin
print ‘已無庫存’
rollback
end
END
GO
15),用游標實現(xiàn)將書號為‘A001’的書本的價格提高10元
declare @bno int
declare @bname nvarchar(50)
declare @author nvarchar(50)
declare @price int
declare @quantity int
declare mycursor cursor for select * from books
open mycursor
fetch next from mycursor into @bno,@bname,@author,@price,@quantity
while(@@fetch_status=0)
begin
if(@bno=2)
begin
update books set price=@price+10 where current of mycursor
end
fetch next from mycursor into @bno,@bname,@author,@price,@quantity
end
close mycursor
deallocate mycursor
【最新數(shù)據庫面試題】相關文章:
數(shù)據庫常見面試題07-28
麥當勞最新面試題目02-22
2014最新中興面試題08-10
最新關于精選php面試題及答案07-18
最新文秘面試題目及答案07-20
最新結構化面試題目09-26
最新2015北京幼升小面試題08-03
最新騰訊微信產品經理面試題07-27
2016結構化面試題庫(最新)02-17