一肩碟、表的關(guān)系分析:
用戶和訂單:一個(gè)用戶可以有多個(gè)訂單强窖,但每個(gè)訂單只能屬于一個(gè)用戶,所以是一對(duì)多的關(guān)系削祈。
商品和分類:一個(gè)產(chǎn)品只能有一種分類翅溺,而一個(gè)分類可以有多種產(chǎn)品,所以是多對(duì)一的關(guān)系髓抑。
訂單和商品:一個(gè)訂單可以有多個(gè)商品咙崎,一個(gè)商品可以有多個(gè)訂單,所以是多對(duì)多的關(guān)系启昧。
二叙凡、主從表與主外鍵
當(dāng)兩張表的關(guān)系是一對(duì)多的時(shí)候,一代表主表密末,多代表從表握爷,在從表設(shè)置外鍵執(zhí)行主表的主鍵
注意插入數(shù)據(jù)時(shí)需要先設(shè)置 set names gbk
-
聲明外鍵約束:
alter table 從表 add [constraint] [外鍵名稱] foreign key (從表外鍵字段名) references 主表 (主表的主鍵)
注意:外鍵名稱用于刪除外鍵約束的,一般建議以“_fk”結(jié)尾 -
刪除外鍵約束:
alter table 從表 drop foreign key 外鍵名稱
注意事項(xiàng)
- 從表外鍵不能添加主表中不存在的記錄
- 主表不能刪除從表中已經(jīng)引用的記錄
三严里、建表規(guī)則總結(jié)
一對(duì)多的建表原則:在多的一方創(chuàng)建一個(gè)字段新啼,字段作為外鍵指向的一方的主鍵
多對(duì)多建表原則:兩張表之間多對(duì)多的關(guān)系需要通過(guò)創(chuàng)建第三張表,也稱為中間表刹碾,中間表中至少有有兩個(gè)字段分別作為外鍵指向各自一方的主鍵
四燥撞、多表查詢
-
內(nèi)連接(用的比較多)
- 普通(顯示)內(nèi)連接:前提條件需要有外鍵,提交的關(guān)鍵字是 inner join ... on
select * from A inner join B on 條件;
- 隱式內(nèi)連接(用的是最多的):可以省略inner join ... on 關(guān)鍵字
select * from A,B where 條件
- 普通(顯示)內(nèi)連接:前提條件需要有外鍵,提交的關(guān)鍵字是 inner join ... on
-
外連接
- 左連接(看左表,即sql語(yǔ)句中 left 關(guān)鍵字前的表):前提條件需要外鍵迷帜,使用關(guān)鍵字 left join ... on
select * from dept left outer join emp on dept.did = emp.dno
-
右連接(看右表與左連接相反)
- 左連接(看左表,即sql語(yǔ)句中 left 關(guān)鍵字前的表):前提條件需要外鍵迷帜,使用關(guān)鍵字 left join ... on
- 子查詢:一條select語(yǔ)句結(jié)果作為另一條select語(yǔ)法的一部分(查詢條件物舒、查詢結(jié)果、表等)
五戏锹、案例:
本題用到下面三個(gè)關(guān)系表:
CARD 借書卡冠胯。 CNO 卡號(hào),NAME 姓名锦针,CLASS 班級(jí)
BOOKS 圖書荠察。 BNO 書號(hào)置蜀,BNAME 書名,AUTHOR 作者,PRICE 單價(jià)悉盆,QUANTITY 庫(kù)存冊(cè)數(shù)
BORROW 借書記錄盯荤。 CNO 借書卡號(hào),BNO 書號(hào)焕盟,RDATE 還書日期
備注:限定每人每種書只能借一本秋秤;要求實(shí)現(xiàn)如下15個(gè)處理:
1.找出借書超過(guò)5本的讀者,輸出借書卡號(hào)及所借圖書冊(cè)數(shù)。(2分)
SELECT CNO,COUNT(*) FROM BORROW GROUP BY CNO HAVING COUNT(*)>5
2.查詢借閱了"水滸"一書的讀者京髓,輸出姓名及班級(jí)航缀。(3分)
SELECT * FROM CARD c WHERE EXISTS(SELECT * FROM BORROW a,BOOKS b WHERE a.BNO = b.BNO AND b.BNAME=N‘水滸’ AND a.CNO=c.CNO)
3.查詢過(guò)期未還圖書堰怨,輸出借閱者(卡號(hào))芥玉、書號(hào)及還書日期。(3分)
SELECET CNO AS "卡號(hào)"备图,BNO as "書號(hào)"灿巧,RDATE as "還書日期" FROM BORROW WHERE RDATE < NOW();
4.查詢書名包括"網(wǎng)絡(luò)"關(guān)鍵詞的圖書,輸出書號(hào)揽涮、書名抠藕、作者。(2分)
SELECET BNO,BNAME,AUTHOR FROM BOOKS WHERE BNAME LIKE "%網(wǎng)絡(luò)%"
5.查詢現(xiàn)有圖書中價(jià)格最高的圖書蒋困,輸出書名及作者盾似。(2分)
SELECET BNAME,AUTHOR FROM BOOKS WHERE PRICE = (SELECT MAX(PRICE) FROM BOOKS)
6.查詢當(dāng)前借了"計(jì)算方法"但沒(méi)有借"計(jì)算方法習(xí)題集"的讀者,輸出其借書卡號(hào)雪标,并按卡號(hào)降序排序輸出零院。(4分)
SELECET bo.CNO FORM BORROW bo,BOOKS WHERE bo.BNO = BOOKS.BNO and BOOKS.BNAME="計(jì)算方法" AND NOT EXISTS(SELECT * FORM BORROW r,BOOKS b WHERE r.BNO = b.BNO AND b.BNAME="計(jì)算方法題集") ORDER BY bo.CNO DESC;
7.將"C01"班同學(xué)所借圖書的還期都延長(zhǎng)一周村刨。(2分)
UPDATA bo SET RDATE=DATEADD(Day,7,bo.RDATE) FROM CARD c,BORROW bo WHERE c.CNO=b.CNO AND c.CLASS="c01";
8.從BOOKS表中刪除當(dāng)前無(wú)人借閱的圖書記錄告抄。(2分)
DELETE FROM BOOKS WHRER BNO NOT IN (SELECT DISTINCT BNO FROM BORROW)
9.在BORROW表上建立一個(gè)觸發(fā)器,完成如下功能:如果讀者借閱的書名是"數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用"嵌牺,就將該讀者的借閱記錄保存在BORROW_SAVE表中(注ORROW_SAVE表結(jié)構(gòu)同BORROW表)打洼。(4分)
10.建立一個(gè)視圖,顯示"力01"班學(xué)生的借書信息(只要求顯示姓名和書名)逆粹。(3分)
11.查詢當(dāng)前同時(shí)借有"計(jì)算方法"和"組合數(shù)學(xué)"兩本書的讀者募疮,輸出其借書卡號(hào),并按卡號(hào)升序排序輸出僻弹。(3分)
-
運(yùn)用到的知識(shí)點(diǎn)