說在前面
本章習題和答案放在最后,答案是我自己寫的盼忌,如果與我不一樣歡迎留言交流积糯。
1,概論
無所謂谦纱,跳吧看成。
2,數(shù)據(jù)定義
2.1跨嘉,建表川慌、改表、刪表
建表
create table 表名
(屬性名1 類型(長度) 約束祠乃,
屬性名2 類型(長度) 約束梦重,
..........
PRIMARY KEY(指明哪個屬性當主鍵),
FOREIGN KEY(指明外鍵) REFERENCES 被參考表名(屬性名)亮瓷,
CHECK (寫入用戶定義約束條件)
)琴拧;
改表
ALTER包括的操作有三種:增加字段(增字段)、改變類型(改類型)寺庄、刪除約束(刪約束)艾蓝;
增字段:ALTER TABLE 表名 ADD 屬性名 類型(長度)約束力崇;
改類型:ALTER TABLE 表名 MODIFY 屬性名 類型斗塘;
刪約束:ALTER TABLE 表名 DROP 約束(屬性名)赢织;
刪表
DROP TABLE 表名;
2.2馍盟,建立與刪除索引
建立索引
CREATE UNIQUE/CLUSTER INDEX 索引名 ON 表名(屬性名 ASC/DESC于置,...);
這里UNIQUE/CLUSTER表示是唯一值索引還是聚簇索引贞岭,缺省值是UNIQUE八毯,對于CLUSTER只用記住每張表只能建立一個聚簇索引,并且聚簇只適用于不常更新的屬性瞄桨。
刪除索引
DROP INDEX 索引名话速;
3,查詢
3.1單表查詢(單查)
SELECT [ALL/DISTICNT] 屬性名芯侥,...(這里可以用*代表所有屬性泊交,同時可以對屬性名使用算術表達式或者集函數(shù))
FROM 表名
WHERE 查詢條件(這里門道很多)
ORDER BY 屬性名 ASC/DESC
GROUP BY 屬性名;
HAVING 條件柱查;
3.2連接查詢(連查)
等值與非等值連接
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
消除重復列后就是自然連接廓俭。
自身連接
SELECT FIRST.Cno,SECOND.Cpno
FROM Course First,Course SECOND
WHERE? FIRST.Cpno=SECOND.Cno;
外連接
一般情況下連接只會給出符合連接條件的結果,但是外連接會在不符合條件是用空行進行連接唉工,根據(jù)左外和右外空行填充在不同位置研乒。
SELECT XXX,XXX,XXX...
FROM Student,SC
WHERE Student.Sno=SC.Sno(*)
這就是右外。
3.3嵌套查詢(套查)
IN謂詞套查
略淋硝。
比較符套查
略雹熬。
ANY,ALL套查
略。
EXISTS套查
重中之重谣膳,EXISTS可以表達存在量詞竿报、全稱量詞和蘊含。那么應該如何轉化?
SELECT Student.Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Student.Sno=SC.Sno AND SC.Cno='1'
);
全稱量詞轉化存在量詞的轉化規(guī)則為:
SELECT Student.Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SC.Sno=Student.Sno AND SC.Cno='1'
);
蘊含轉存在的規(guī)則:
SELECT SC.Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *?
FROM Course
WHERE EXISTS
(SELECT *?
FROM SC SCY
WHERE SCY.Sno=95002 AND SCY.Cno=Course.Cno
) AND NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=Course.Cno
))
3.4集合查詢(集查)
SQL提供了UNION操作符來講兩個集合求并参歹。
4仰楚,數(shù)據(jù)更新
4.1,插入數(shù)據(jù)
插入單項:
INSERT
INTO 表名(屬性們)
VALUES(值們)犬庇;
插入子查詢結果:
INSERT
INTO 表名(屬性們)
子查詢僧界;
4.2,修改數(shù)據(jù)
直接改:
UPDATE 表名
SET 屬性=值
WHERE 查詢條件
帶子查詢的改:
UPDATE 表名
SET 屬性=值
WHERE 查詢條件中帶有子查詢
4.3臭挽,刪除數(shù)據(jù)
直接刪:
DELETE
FROM 表名
WHERE 查詢條件捂襟;
帶子查詢的刪:
DELETE
FROM 表名
WHERE 查詢條件中帶有子查詢;
5欢峰,視圖
5.1葬荷,視圖的意義
給不同的用戶涨共,不同的數(shù)據(jù)表現(xiàn)。
5.2宠漩,定義視圖
創(chuàng)建視圖
CREATE VIEW 視圖名(屬性們)
AS 子查詢
[WITH CHECK OPTION]举反;
最后的with check option表示對視圖進行增刪改時要滿足子查詢中的條件表達式,可選扒吁。
視圖名后是否需要指定屬性名火鼻?三種情況需要指定:1,子查詢的SELECT中有集函數(shù)雕崩;2魁索,子查詢的SELECT中存在同名屬性;3盼铁,你想取個更好的名字粗蔚。當這三種情況時,需要手動指定饶火。
刪除視圖
DROP VIEW 視圖名鹏控;
5.3,查詢視圖
類似于基本表的查詢趁窃。
5.4牧挣,更新視圖
類似于基本表的更新。
6醒陆,權限控制
6.1鹃骂,授權
GRANT 權限們(屬性們)
ON 對象類型稍刀,對象名們
TO 用戶們
[WITH GRANT OPTION]
對象類型如DATABASE馒吴,TABLE俭厚。
WITH GRANT OPTION意味著可以繼續(xù)授已有的權給別人,可選澡刹。
6.2呻征,收權
REVOKE 權限們(屬性們)
ON 對象類型,對象名
FROM 用戶們罢浇;
收權會鏈式的把所有間接下放的權限收回陆赋。
7,嵌入式SQL
SQL通信區(qū)嚷闭。
主變量攒岛,在嵌入式SQL中使用的主程序變量。
游標胞锰,逐一訪問結果集合的東西灾锯。
本章習題
解答:
1,sql語言主要特點包括以下5個:
綜合統(tǒng)一嗅榕。即將DDL(數(shù)據(jù)庫定義語言),DML(數(shù)據(jù)庫操作語言),DCL(數(shù)據(jù)庫控制語言)結合在一起顺饮,語法清晰簡潔吵聪。
高度非過程化。只需寫清楚做什么不用寫怎么做兼雄。
面向集合吟逝。就是不需要一條一條的操作。
既可以直接使用君旦,也可以嵌入式使用澎办。
簡單易學嘲碱。
2金砍,SQL的定義功能:關系型數(shù)據(jù)庫支持三級模式。外模式即視圖麦锯,模式即表恕稠,內模式包括索引。所以sql的定義功能包括定義與修改表扶欣,定義與修改視圖鹅巍,定義與修改索引。
3料祠,略骆捧,自己練習。
4髓绽,
(1)求供應工程J1的零件供應商號碼SNO敛苇。
SELECT SNO
FROM SPJ
WHERE JNO=‘J1’;
(2)求供應商J1零件P1的供應商號碼SNO。
SELECT SNO
FROM SPJ
WHERE JNO='J1' AND PNO='P1';
(3)求供應商J1零件為紅色的供應商號碼SNO顺呕。
SELECT SPJ.SNO
FROM SPJ,P
WHERE SPJ.JNO='J1' AND SPJ.PNO = P.PNO AND P.COLOR='紅';
(4)求沒有使用天津供應商的生產的紅色零件的工程號JNO枫攀。
這個題有點意思,用連接查詢或者嵌套查詢都是可以的株茶,我在這里用了嵌套查詢来涨,算是檢驗一下自己是不是真的理解了exist的用法,這里我將關系代數(shù)中的全稱量詞轉化成NOT EXIST來完成了表達式的構造启盛。我寫的這個如果你不熟悉全稱量詞和存在量詞的表達可能很難看懂蹦掐,這個題用連接表達會更容易理解一些。
SELECT SPJ.JNO
FROM SPJ
WHERE NOT EXIST
(
SELECT *
FROM S
WHERE S.SNO = SPJ.SNO AND SNO.CITY='天津';
) AND NOT EXIST
(
SELECT *
FROM P
WHERE P.PNO = SPJ.PNO AND P.COLOR = '紅';?
);
(5)求至少使用了供應商S1所提供的的全部零件的工程號JNO僵闯。
這個題應該是全場最佳卧抗,代碼很有點復雜,涉及到全稱量詞和蘊含轉化為SQL中的存在量詞棍厂,我先把后面的題做完再補上颗味。
5,
(1)
SELECT SNAME,CITY
FROM S牺弹;
(2)
SELECT PNAME,COLOR,WEIGHT
FROM P;
(3)
SELECT JNO
FROM SPJ
WHERE SNO='S1'浦马;
(4)
SELECT P.PNAME,SPJ.QTY
FROM SPJ,P
WHERE SPJ.JNO='J2' AND SPJ.PNO = P.PNO时呀;
(5)
SELECT? DISTINCT SPJ.PNO
FROM S,SPJ
WHERE S.CITY='上海' AND S.SNO=SPJ.SNO;
(6)
SELECT J.JNAME
FROM J,S,SPJ
WHERE SPJ.JNO = J.JNO AND SPJ.SNO = S.SNO AND S.CITY='上海';
(7)
SELECT J.JNAME
FROM J,S,SPJ
WHERE SPJ.JNO = J.JNO AND SPJ.SNO = S.SNO AND S.CITY != '天津';
(8)
UPDATE P
SET COLOR = '藍'
WHERE COLOR='紅';
(9)
UPDATE SPJ
SET SNO='S3'
WHERE JNO='J4' AND SNO='S5' AND PNO = 'P6';
(10)
DELETE?
FROM S
WHERE SNO='S3';
DELETE?
FROM SPJ
WHERE SNO='S3';
(11)
INSERT
INTO SPJ
VALUES('S2','J6','P4',200);
6,視圖是從一個或幾個基本表(或視圖)中導出的數(shù)據(jù)晶默,它與基本表不同谨娜,是一張?zhí)摫怼?shù)據(jù)庫中只存有視圖的定義磺陡,視圖的數(shù)據(jù)依然存放在基本表中趴梢。對視圖的更新操作會受到WITH CHECK OPTION的限制。加上WITH CHECK OPTION之后币他,更新視圖時要滿足子查詢中的WHERE后面的條件坞靶。
7,視圖的優(yōu)點:
1蝴悉,簡化操作
2彰阴,多角度看待同一數(shù)據(jù)
3,為重構數(shù)據(jù)庫邏輯獨立性
4拍冠,對機密數(shù)據(jù)提供保護
8尿这,并不是所有的視圖都可以更新,因為有些對視圖的更新不能轉化為有意義的唯一的基本表的更新庆杜。比如修改S_G視圖中的平均成績是不允許的射众,因為無法導致基本表的正確更新。
9晃财,一般來說叨橱,行列子集視圖都是允許更新的,除此之外還有某些視圖理論上是可以更新的(書上也沒具體說)拓劝。例子舉得就是那個S_G的例子雏逾。
10,sorry郑临,我不熟悉系統(tǒng)的視圖更新栖博。
11,
CREATE VIEW SANJIAN_PROVISION
AS
SELECT SNO,PNO,QTY
FROM SPJ,J
WHERE J.JNAME='三建' AND J.JNO = SPJ.JNO
WITH CHECK OPTION;
SELECT PNO,QTY
FROM SANJIAN_PROVISION;
SELECT *
FROM SANJIAN_PROVISION
WHERE SNO = 'S1';
12厢洞,
GRANT INSERT
ON TABLE S
TO 張勇
WITH GRANT OPTION;
GRANT SELECT,UPDATE(QTY)
ON TABLE SPJ
TO 李天明
13仇让,為了區(qū)分SQL語句與主程序語句,所有SQL語句前面都必須加上EXEC SQL躺翻。
14丧叽,SQL語句通過SQL通信區(qū)向主語言傳遞sql執(zhí)行狀況,主語言通過主變量向SQL傳遞數(shù)據(jù)公你。
15踊淳,通過游標進行協(xié)調。