第三章——關系數(shù)據(jù)庫標準語言SQL

說在前面

本章習題和答案放在最后,答案是我自己寫的盼忌,如果與我不一樣歡迎留言交流积糯。

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ī)則為:

全稱轉存在的規(guī)則

SELECT Student.Sname

FROM Student

WHERE NOT EXISTS

(SELECT *

FROM SC

WHERE SC.Sno=Student.Sno AND SC.Cno='1'

);


使用蘊含

蘊含轉存在的規(guī)則:

蘊含轉存在規(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é)調。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迂尝,隨后出現(xiàn)的幾起案子脱茉,更是在濱河造成了極大的恐慌,老刑警劉巖垄开,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琴许,死亡現(xiàn)場離奇詭異,居然都是意外死亡溉躲,警方通過查閱死者的電腦和手機榜田,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锻梳,“玉大人箭券,你說我怎么就攤上這事〕簦” “怎么了邦鲫?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長神汹。 經常有香客問我,道長古今,這世上最難降的妖魔是什么屁魏? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮捉腥,結果婚禮上氓拼,老公的妹妹穿的比我還像新娘。我一直安慰自己抵碟,他們只是感情好桃漾,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拟逮,像睡著了一般撬统。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敦迄,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天恋追,我揣著相機與錄音,去河邊找鬼罚屋。 笑死苦囱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的脾猛。 我是一名探鬼主播撕彤,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猛拴!你這毒婦竟也來了羹铅?” 一聲冷哼從身側響起瞧柔,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睦裳,沒想到半個月后造锅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡廉邑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年哥蔚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛蒙。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡糙箍,死狀恐怖,靈堂內的尸體忽然破棺而出牵祟,到底是詐尸還是另有隱情深夯,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布诺苹,位于F島的核電站咕晋,受9級特大地震影響,放射性物質發(fā)生泄漏收奔。R本人自食惡果不足惜掌呜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坪哄。 院中可真熱鬧质蕉,春花似錦、人聲如沸翩肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽念祭。三九已至兑宇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棒卷,已是汗流浹背顾孽。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留比规,地道東北人若厚。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蜒什,于是被迫代替她去往敵國和親测秸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,225評論 0 7
  • 50個常用的sql語句 Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cna...
    最美的太陽WW閱讀 3,158評論 0 23
  • 模式 定義模式實際上定義了一個命名空間,在這個空間中 可以進一步 定義該模式包含的數(shù)據(jù)對象霎冯,例如基本表铃拇,視圖,索引...
    iOS_愛OS閱讀 887評論 0 1
  • 十月,深圳下雨 十月缠俺,江西下雨 十月显晶,武漢下雨 十月,襄陽下雨 整個十月壹士,我所到過的地方都被氤氳籠罩磷雇,在這種缺氧的...
    雙漁侳閱讀 212評論 0 1
  • 首先盒使,小歪再告訴你如何訓練之前崩掘,先要講講為什么要進行胸部訓練。 1忠怖、女生鍛煉胸肌能豐胸嗎呢堰? 女性對于胸部的訓練,鍛...
    運動閨蜜萬小歪閱讀 2,843評論 1 21