1. 程式人生 > >走向面試之資料庫基礎:一、你必知必會的SQL語句練習-Part 2

走向面試之資料庫基礎:一、你必知必會的SQL語句練習-Part 2

本文是在Cat Qi的參考原帖的基礎之上經本人一題一題練習後編輯而成,非原創,僅潤色而已。另外,本文所列題目的解法並非只有一種,本文只是給出比較普通的一種而已,也希望各位園友能夠自由發揮。

一、書到用時方恨少:"圖書-讀者-借閱"類題目

1.1 本題目的表結構

  本題用到下面三個關係表:

  CARDS 借書卡。 CNO 卡號,NAME 姓名,CLASS 班級

  BOOKS 圖書。 BNO 書號,BNAME 書名,AUTHOR 作者,PRICE 單價,QUANTITY 庫存冊數

  BORROW 借書記錄。 CNO 借書卡號,BNO 書號,RDATE 還書日期

  備註:限定每人每種書只能借一本;庫存冊數隨借書、還書而改變。

1.2 基本建表語句

 1 create table CARDS
 2 (
 3     CNO int identity(1,1),
 4     NAME nvarchar(50) not null,
 5     CLASS nvarchar(100) not null,
 6     constraint pk_cards primary key (CNO)
 7 )
 8 
 9 create table BOOKS
10 (
11     BNO int identity(1,1),
12     BNAME nvarchar(255) not null
, 13 AUTHOR nvarchar(50) not null, 14 PRICE decimal(8,1) not null, 15 QUANTITY int default 0, 16 constraint pk_books primary key (BNO) 17 ) 18 19 create table BORROW 20 ( 21 CNO int not null, 22 BNO int not null, 23 RDATE datetime default GETDATE() not null, 24 constraint
pk_borrow primary key (CNO,BNO), 25 constraint fk_borrow_cards foreign key (CNO) references CARDS(CNO), 26 constraint fk_borrow_books foreign key (BNO) references BOOKS(BNO) 27 )
View Code

1.3 插入測試資料

 1 insert into CARDS(NAME,CLASS) values('張三','計科一班')
 2 insert into CARDS(NAME,CLASS) values('李四','計科一班')
 3 insert into CARDS(NAME,CLASS) values('王五','計科二班')
 4 insert into CARDS(NAME,CLASS) values('六四','計科二班')
 5 insert into CARDS(NAME,CLASS) values('七七','軟工一班')
 6 insert into CARDS(NAME,CLASS) values('粑粑','軟工二班')
 7 
 8 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('水滸','施耐庵',188,3)
 9 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('計算機網路','謝希仁',49,3)
10 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('計算方法','嚴蔚敏',58,3)
11 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('計算方法習題集','殷人昆',188,3)
12 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('資料庫技術及應用','王珊',38,3)
13 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('組合數學','周偉',28,3)
14 insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('Redis初探','周旭龍',25,3)
15 
16 insert into BORROW(CNO,BNO) values(1,1)
17 insert into BORROW(CNO,BNO) values(2,1)
18 insert into BORROW(CNO,BNO) values(3,1)
19 
20 insert into BORROW(CNO,BNO) values(4,3)
21 insert into BORROW(CNO,BNO) values(4,6)
22 insert into BORROW(CNO,BNO) values(5,6)
23 insert into BORROW(CNO,BNO) values(7,7)
View Code

1.4 開始實戰吧小宇宙

  (1)寫出建立BORROW表的SQL語句,要求定義主碼完整性約束和引用完整性約束

1 create table BORROW
2 (
3     CNO int not null,
4     BNO int not null,
5     RDATE datetime default GETDATE() not null,
6     constraint pk_borrow primary key (CNO,BNO),
7     constraint fk_borrow_cards foreign key (CNO) references CARDS(CNO),
8     constraint fk_borrow_books foreign key (BNO) references BOOKS(BNO)
9 )

  (2)找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數

1 select b.CNO,COUNT(b.CNO) as 'BorrowCount' 
2 from BORROW b
3 group by b.CNO
4 having COUNT(b.CNO)>=5

  這裡測試資料裡邊沒有借過5本的,但只要改為2,即可得到一條結果:

  (3)查詢借閱了"水滸"一書的讀者,輸出姓名及班級

1 select c.NAME,c.CLASS 
2 from CARDS c,BORROW r,BOOKS b
3 where c.CNO=r.CNO and r.BNO=b.BNO and b.BNAME='水滸'

  (4)查詢目前為止未還圖書,輸出借閱者(卡號)、書號及還書日期

1 select CNO,BNO,RDATE 
2 from BORROW 
3 where RDATE<GETDATE()

  (5)查詢書名包括"網路"關鍵詞的圖書,輸出書號、書名、作者

1 select b.BNO,b.BNAME,b.AUTHOR 
2 from BOOKS b
3 where b.BNAME like '%網路%'

  (6)查詢現有圖書中價格最高的圖書,輸出書名及作者

1 select BNAME,AUTHOR 
2 from BOOKS
3 where PRICE=( SELECT MAX(PRICE) from BOOKS )

  (7)查詢當前借了"計算方法"但沒有借"計算方法習題集"的讀者,輸出其借書卡號,並按卡號降序排序輸出

1 select r.CNO 
2 from BORROW r,BOOKS b
3 where r.BNO=b.BNO and b.BNAME='計算方法' and not exists
4 (
5     select * from BORROW r1,BOOKS b1 
6     where r1.BNO=b1.BNO and r.CNO=r1.CNO and b1.BNAME='計算方法習題集'
7 )
8 order by r.CNO desc

  (8)將"計科一班"班同學所借圖書的還期都延長一週

1 --解法一
2 update BORROW set RDATE=DATEADD(Day,7,RDATE) 
3 where CNO in ( select CNO from CARDS where CLASS='計科一班' )
4 --解法二
5 update b set b.RDATE=DATEADD(Day,7,RDATE)  
6 from BORROW b,CARDS c
7 where b.CNO=c.CNO and c.CLASS='計科一班'

  (9)從BOOKS表中刪除當前無人借閱的圖書記錄

1 delete from BOOKS 
2 where BNO not in 
3 (
4     select distinct BNO from BORROW
5 )

  這裡四本圖書被刪除,只剩下1,3,6這三本圖書了。

  (10)如果經常按書名查詢圖書資訊,請建立合適的索引

1 create index index_books_bname on BOOKS(BNAME)

PS:關於索引,你必須瞭解的東東

①索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中,索引允許使用者不必翻閱完整個書就能迅速地找到所需要的資訊。在資料庫中,索引也允許資料庫程式迅速地找到表中的資料,而不必掃描整個資料庫

②索引的優點:大大加快資料的檢索速度,這也是建立索引的最主要的原因;

③索引的缺點:索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大;當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度;

  (11)在BORROW表上建立一個觸發器,完成如下功能:

    -- 如果讀者借閱的書名是"資料庫技術及應用"
    -- 就將該讀者的借閱記錄儲存在BORROW_SAVE表中(注ORROW_SAVE表結構同BORROW表)

1 create trigger Tr_CopyToSave
2 on BORROW
3 for insert,update
4 as
5 if @@ROWCOUNT>=1
6 insert into BORROW_SAVE select i.BNO,i.CNO,i.RDATE
7 from inserted i,BOOKS b
8 where i.BNO=b.BNO and b.BNAME='資料庫技術及應用'

PS:關於觸發器,你必須瞭解的東東

①觸發器是一種特殊型別的儲存過程,對特定事件作出響應。觸發器對錶進行插入、更新、刪除的時候會自動執行的特殊儲存過程,一般用在較check約束更加複雜的約束上面。

②觸發器有兩個特殊的表:插入表instered表)和刪除表deleted表)。這兩張是邏輯表也是虛表。系統在記憶體中建立這兩張表,不會儲存在資料庫中。而且兩張表的都是隻讀的,只能讀取資料而不能修改資料。這兩張表的結果總是與被改觸發器應用的表的結構相同。當觸發器完成工作後,這兩張表就會被刪除。inserted表的資料是插入或是修改後的資料,而deleted表的資料是更新前的或是刪除的資料。

  (12)建立一個檢視,顯示"計科一班"班學生的借書資訊(只要求顯示姓名和書名)

1 create view V_BorrowInfo_CS0801
2 as
3 select c.NAME,b.BNAME 
4 from CARDS c,BOOKS b,BORROW r
5 where c.CNO=r.CNO and b.BNO=r.BNO and c.CLASS='計科一班'

PS:關於(View)檢視,你必須瞭解的東東

(1)檢視是從一個或幾個基本表中根據使用者需要而做成的一個虛表:①檢視是虛表,它在儲存時只儲存檢視的定義,而沒有儲存對應的資料;②檢視只在剛剛開啟的一瞬間,通過定義從基表中搜集資料,並展現給使用者;

(2)檢視的優點:①能分割資料,簡化使用者觀點。②為資料提供一定的邏輯獨立性(如果為某一個基表定義一個檢視,即使以後基本表的內容的發生改變了也不會影響“檢視定義”所得到的資料);③提供自動的安全保護功能( 檢視能像基本表一樣授予或撤消訪問許可權)

  (13)查詢當前同時借有"計算方法"和"組合數學"兩本書的讀者,輸出其借書卡號,並按卡號升序排序輸出

1 select b.CNO 
2 from BORROW b
3 where b.BNO in (select BNO from BOOKS where BNAME in ('計算方法','組合數學'))
4 group by b.CNO
5 having COUNT(b.BNO)=2
6 order by b.CNO

  (14)假定在建BOOKS表時沒有定義主碼,寫出為BOOKS表追加定義主碼的語句

alter table BOOKS add primary key (BNO)

  (15)①將CARDS表中的NAME最大列寬增加到100個字元(原為50個字元)

alter table CARDS alter column NAME nvarchar(100)

      ②為CARDS表增加1列DEPTNAME(系名),可變長,最大50個字元

alter table CARDS add DEPTNAME nvarchar(50)

二、練習總結

本篇是從Cat Qi的原文《SQL面試題(學生表-教師表-課程表-選課表)》中摘抄的,Part 1的連結點此訪問。總體來說,Part 2本篇的題目難度沒有Part 1的高,比較適合總結鍛鍊。最後,感謝Cat Qi總結的文章,讓我可以從中實踐並得到一點提高。後面,我會繼續複習一下有關資料庫的基礎知識和練習一下資料庫的其他方面的筆試面試題,到時如果有機會,還會總結成部落格釋出到我的園子。

參考原帖

  (1)Cat Qi,《SQL面試題(學生表-教師表-課程表-選課表)》:http://www.cnblogs.com/qixuejia/p/3637735.html

  (2)CSDN,《找些不錯的SQL面試題》討論帖,http://bbs.csdn.net/topics/280002741

  (3)逆心,《SQL Server 觸發器》,http://www.cnblogs.com/kissdodog/p/3173421.html

  (4)JohnSoft工作室,《資料庫檢視定義及其相關操作》,http://www.cnblogs.com/GISDEV/archive/2008/02/13/1067817.html

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

走向面試資料庫基礎SQL語句練習-Part 2

本文是在Cat Qi的參考原帖的基礎之上經本人一題一題練習後編輯而成,非原創,僅潤色而已。另外,本文所列題目的解法並非只有一種,本文只是給出比較普通的一種而已,也希望各位園友能夠自由發揮。 一、書到用時方恨少:"圖書-讀者-借閱"類題目 1.1 本題目的表結構   本題用到下面三個關係表:   CAR

JAVA基礎類和物件

1、複習  Java基礎語法規範         Java兩種大的資料型別:基本資料型別、引用資料型別         基本資料型別:八種回顧                       引用資料型別:陣列、字串、類、Scanner、Connection  變數的命名規則:

00201 資料庫基礎函式觸發器TRIGGER和儲存過程PROCEDURE

/本博文語法基於SQL SERVER 2008 自建函式FUNCTION 使用者自己寫的一些SQL程式碼的組合,從而實現特定的功能 建立函式的語法: CREATE FUNCTION function_name (arg1 type1, a

SQL Server基礎(二)資料庫物件檢視同義詞可程式設計性外部資源Service Broker儲存安全性 分別表示什麼意思

一、簡介        其幾天弄了個數據表,知道了資料表大概是怎麼回事。今天打算學習學習資料庫的儲存過程,於是發現, 儲存過程只是資料庫物件的一部分。我這個人比較喜歡從全域性認識一個事物,索性我就把資料物件全部羅列出來。 二、資料庫物件

SQL Server資料庫基礎),資料庫時間建立約束

管理器: 系統資料庫有四個: master:系統資訊,要經常備份 model:模板資料庫 tempdb:臨時資料庫 msdb:代理服務資料庫 資料庫的轉移: 直接找到資料庫的位置是不能剪下複製的,要先通過分離,斷開資料庫與SQL Server的連線

近日有需要寫點C#程式,有用到Dataset資料集和SQLite資料庫,由於我從來就不擅長記各種程式語言的語法,所以在查閱堆資料後,留下以下內容備忘 SQLite操作,直接貼程式碼,很簡單

近日有需要寫點C#程式,有用到Dataset資料集和SQLite資料庫,由於我從來就不擅長記各種程式語言的語法,所以在查閱一堆資料後,留下以下內容備忘:   一、SQLite操作,直接貼程式碼,很簡單:       //建立一個數據庫檔案     string  d

我的Unity遊戲開發筆記特效基礎粒子效果面板

如何在Unity中實現粒子效果? 首先,右鍵點選 Hierarchy欄,選擇effects->Particle System,這樣你就新建了一個粒子系統,如圖所示: 下面來介紹右側監視器(Inspector)內的內容: 首先是Transform,分別為Positio

資料庫基礎知識資料庫的種類與SQL

1:關係型資料庫 RDBMS(關係型指關係模型,即二維表格模型) 常用 Oracle,Mysql,SQL Server 特點 1:關係型資料庫是由多張能互相聯接的二維行列表格組成的資料庫 2:提供對SQL的支援,可以實現複雜的查詢 3:支援事務處理,能保持資料一

IDL(ENVI/IDL) 簡(jian)明(lou)教程IDL基礎

    IDL是一門簡單易用的(包括但不限於)科學計算和視覺化語言,包含大量的函式,尤其是同ENVI結合集成了該軟體的大量功能,因此在遙感影象批量處理上應用廣泛。關於IDL(結合ENVI)的中文簡明教程並不多見,但英文版卻有不少,本文以幾個英文資源為基礎介紹。如果有一些程式

odoo12應用雙因子驗證(Two-factor authentication, 2FA)(HOTP,TOTP)附原始碼

前言       雙因子認證:雙因子認證(2FA)是指結合密碼以及實物(信用卡、SMS手機、令牌或指紋等生物標誌)兩種條件對使用者進行認證的方法。--百度百科       跟我一樣"老"的網癮少年想必一定見過買點卡後上面送的密保(類似但不完全一樣

JavaScript設計模式面向對象編程

this 依賴 人在 turn obj log javascrip 體會 創建 JavaScript面向對象編程 眾所周知,JS作為一門腳本語言,由於其設計者在設計JS的時候,也僅僅用了很少的時間就完成了JS這門語言的創建,JS雖然擁有著腳本語言的優勢,但是JS也存在著

JavaScript設計模式面向對象編程(第二節)

得到 調用 帶來 方式 get 特權 style 方法封裝 面向對象 一、封裝 面向對象編程思想其中的一個特點就是封裝,通俗的講法就是把需要的功能方向在一個對象裏。遺憾的是,對於JS這種解釋性的弱類型語言沒有經典強類型語言中那樣通過class等關鍵字實現類的封裝方法,j

JavaScript設計模式面向對象編程(第三節)

設置 style 擁有 ray 進行 如果 eat gree 而在 一、繼承 js並沒有繼承這一個現有的機制,所以我們所說的繼承是通過JS本身的機制去實現的。 1、類式繼承 1 // 類式繼承 2 3 // 父類 4 function SuperClas

構建法第十十二章

交互 業界 用戶體驗 可用性 找到 方法 認同 我認 設計 用戶體驗有幾個層次:1 最基礎的是在交互環節,就是usablity,可用性,或者說易用性,大家說得最多的;要把可用性做好,不是太難,業界有成熟的方法,不需要太多天賦,兩個字:“用心”即可。 2 更高層次的乃情

前端自動化測試UI Recorder(介紹)

而且 行為 文件上傳 語言 系統 nod clas 調用 開發 UI Recorder是一款零成本的整體自動化測試解決方案,一次自測等於多次測試,測一個瀏覽器等於測多個瀏覽器! 支持所有用戶行為: 鍵盤事件, 鼠標事件, alert, 文件上傳, 拖放, svg, sha

Shell基礎介紹歷史命令命令不全和別名通配符輸入輸入重定向管道發和作業控制

基礎 一個 直接 1.5 寫到 否則 shel attr tle Shell的介紹 zsh、ksh(yum list |grep zsh 進行查看,然後可以相應的進行安裝) 命令歷史1. /root/.b

機器學習數學基礎)-微積分,概率論和矩陣

系列 學習 python 機器學習 自然語言處理 圖片 clas 數學基礎 記錄 學習python快一年了,因為之前學習python全棧時,沒有記錄學習筆記想回顧發現沒有好的記錄,目前主攻python自然語言處理方面,把每天的學習記錄記錄下來,以供以後查看,和交流分享。~~

Web編程基礎CSSJavaScriptjQuery (何婕著) 完整pdf掃描版

3.2 jquery 知識點 網頁特效 3.1 OS 文本 scrip clas 《Web編程基礎:CSS、JavaScript、jQuery》緊密圍繞網頁設計師在進行Web前臺開發中實際需要掌握的技術,全面介紹了使用DIV+CSS、JavaScript、jQuery進行W

PHP應用的CI/CD流程實踐與學習PHP運行環境的準備

代碼結構 php7.1 運行環境 php應用 nginx 數據卷 選擇 class tar 前言:一直以來想學習與實踐一下敏捷開發,之前項目雖說口口聲聲我們項目是敏捷開發,其實很扯。 敏捷開發如果有持續集成、持續部署的支持,那樣開發、測試、運維將節省不少精力。 此系列博

3星|《實戰復盤第四季·商業巨頭們的變革道》GETCL力拓集團英美資源集團等企業總裁的變更經驗

tar 表現 哈佛商業評論 運動 選擇 方法 -c 團隊 文章 實戰復盤第四季·商業巨頭們的變革之道(《哈佛商業評論》增刊) 本期是《哈佛商業評論》“實戰復盤”欄目的10篇文章,講的是GE、TCL、力拓集團、英美資源集團等企業如何