【正文】
: :select * from students where native in (39。湖南39。, 39。四川39。) ...and:select * from students where age between 20 and 30 c.“=”:select * from students where name = 39。李山39。 :select * from students where name like 39。李%39。 (注意查詢條件中有“%”,則說明是部分匹配,而且還有先后信息在里面,即查找以“李”開頭的匹配項(xiàng)。所以若查詢有“李”的所有對(duì)象,應(yīng)該命令:39。%李%39。若是第二個(gè)字為李,則應(yīng)為39。_李%39?;?9。_李39?;?9。_李_39。) e.[]匹配檢查符:select * from courses where o like 39。[AC]%39。 (表示或的關(guān)系,與in(...)類似,而且[]可以表示范圍,如:select * from courses where o like 39。[AC]%39。) :直接按照字符串處理的方式進(jìn)行處理,例如:select * from students where birth = 39。19801139。 and birth = 39。1980123139。 ()求和,如:select count(*) from students (求學(xué)生總?cè)藬?shù)) (列)求平均,如:select avg(mark) from grades where o=’B2’ (列)和min(列),求最大與最小 常用于統(tǒng)計(jì)時(shí),如分組查總數(shù):select gender,count(sno) from studentsgroup by gender(查看男女學(xué)生各有多少) 注意:從哪種角度分組就從哪列g(shù)roup by 對(duì)于多重分組,只需將分組規(guī)則羅列。比如查詢各屆各專業(yè)的男女同學(xué)人數(shù) ,那么分組規(guī)則有:屆別(grade)、專業(yè)(mno)和性別(gender),所以有g(shù)roup by grade, mno, gender select grade, mno, gender, count(*)from studentsgroup by grade, mno, gender 通常group還和having聯(lián)用,比如查詢1門課以上不及格的學(xué)生,則按學(xué)號(hào)(sno)分類有: select sno,count(*) from grades where mark60group by snohaving count(*)1 合并查詢結(jié)果,如: SELECT * FROM studentsWHERE name like ‘張%’UNION [ALL]SELECT * FROM studentsWHERE name like ‘李%’ select , from grades g JOIN students s ON =JOIN courses c ON =(注意可以引用別名)select ,max(coursename),count(sno) from courses LEFT JOIN grades ON = group by 左連接特點(diǎn):顯示全部左邊表中的所有項(xiàng)目,即使其中有些項(xiàng)中的數(shù)據(jù)未填寫完全。 左外連接返回那些存在于左表而右表中卻沒有的行,再加上內(nèi)連接的行。 與左連接類似 select sno,name,major from students FULL JOIN majors ON = 兩邊表中的內(nèi)容全部顯示 select , from courses c1,courses c2 where = 采用別名解決問題。 select lastname+firstname from lastname CROSS JOIN firstanme 相當(dāng)于做笛卡兒積 ,如查詢李山的同鄉(xiāng): select * from studentswhere native in (select native from students where name=’ 李山’) ,比如,下面兩句是等價(jià)的: select * from studentswhere sno in (select sno from grades where o=’B2’) select * from students where exists (select * from grades where = AND o=’B2’) ,有兩種方法:asc升序和desc降序 ,可以按照查詢條件中的某項(xiàng)排列,而且這項(xiàng)可用數(shù)字表示,如: select sno,count(*) ,avg(mark) from grades group by snohaving avg(mark)85order by 3 ,應(yīng)該用[]括住。 ,如select sno,courseno from grades where mark IS NULL ,any相當(dāng)于邏輯運(yùn)算“||”而all則相當(dāng)于邏輯運(yùn)算“amp。amp。” ?。? 如,沒有選修‘B2’課程的學(xué)生 : select students.*from students, gradeswhere =AND ’B2’ 上面的查詢方式是錯(cuò)誤的,正確方式見下方: select * from studentswhere not exists (select * from grades where = AND o=39。B239。) ?。? 如,選修了全部課程的學(xué)生: select *from studentswhere not exists ( select *from courseswhere NOT EXISTS (select *from gradeswhere sno=AND o=)) 最外一重:從學(xué)生表中選,排除那些有課沒選的。用not exist。由于討論對(duì)象是課程,所以第二重查詢從course表中找,排除那些選了課的即可SQL 2000中的觸發(fā)器使用 觸發(fā)器是數(shù)據(jù)庫(kù)應(yīng)用中的重用工具,它的應(yīng)用很廣泛,這幾天寫一個(gè)化學(xué)數(shù)據(jù)統(tǒng)計(jì)方面的軟件,需要根據(jù)采樣,自動(dòng)計(jì)算方差,在這里,我使用了觸發(fā)器。下面我摘錄了SQL Server官方教程中的一段關(guān)于觸發(fā)器的文字,確實(shí)有用的一點(diǎn)文字描述。 ______________________________________________________________________________________________________________ 可以定義一個(gè)無(wú)論何時(shí)用INSERT語(yǔ)句向表中插入數(shù)據(jù)時(shí)都會(huì)執(zhí)行的觸發(fā)器。 當(dāng)觸發(fā)INSERT觸發(fā)器時(shí),新的數(shù)據(jù)行就會(huì)被插入到觸發(fā)器表和inserted表中。inserted表是一個(gè)邏輯表,它包含了已經(jīng)插入的數(shù)據(jù)行的一個(gè)副本。inserted表包含了INSERT語(yǔ)句中已記錄的插入動(dòng)作。inserted表還允許引用由初始化INSERT語(yǔ)句而產(chǎn)生的日志數(shù)據(jù)。觸發(fā)器通過檢查inserted表來確定是否執(zhí)行觸發(fā)器動(dòng)作或如何執(zhí)行它。inserted表中的行總是觸發(fā)器表中一行或多行的副本。 日志記錄了所有修改數(shù)據(jù)的動(dòng)作(INSERT、UPDATE和DELETE語(yǔ)句),但在事務(wù)日志中的信息是不可讀的。然而,inserted表允許你引用由INSERT語(yǔ)句引起的日志變化,這樣就可以將插入數(shù)據(jù)與發(fā)生的變化進(jìn)行比較,來驗(yàn)證它們或采取進(jìn)一步的動(dòng)作。也可以直接引用插入的數(shù)據(jù),而不必將它們存儲(chǔ)到變量中。 示例 在本例中,將創(chuàng)建一個(gè)觸發(fā)器。無(wú)論何時(shí)訂購(gòu)產(chǎn)品(無(wú)論何時(shí)向Order Details表中插入一條記錄),這個(gè)觸發(fā)器都將更新Products表中的一列(UnitsInStock)。用原來的值減去訂購(gòu)的數(shù)量值即為新值。 USE Northwind CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS UPDATE P SET UnitsInStock = – FROM Products AS P INNER JOIN Inserted AS I ON = DELETE觸發(fā)器的工作過程當(dāng)觸發(fā)DELETE觸發(fā)器后,從受影響的表中刪除的行將被放置到一個(gè)特殊的deleted表中。deleted表是一個(gè)邏輯表,它保留已被刪除數(shù)據(jù)行的一個(gè)副本。deleted表還允許引用由初始化DELETE語(yǔ)句產(chǎn)生的日志數(shù)據(jù)。 使用DELETE觸發(fā)器時(shí),需要考慮以下的事項(xiàng)和原則: l 當(dāng)某行被添加到deleted表中時(shí),它就不再存在于數(shù)據(jù)庫(kù)表中;因此,deleted表和數(shù)據(jù)庫(kù)表沒有相同的行。 l 創(chuàng)建deleted表時(shí),空間是從內(nèi)存中分配的。deleted表總是被存儲(chǔ)在高速緩存中。 l 為DELETE動(dòng)作定義的觸發(fā)器并不執(zhí)行TRUNCATE TABLE語(yǔ)句,原因在于日志不記錄TRUNCATE TABLE語(yǔ)句。 示例 在本例中,將創(chuàng)建一個(gè)觸發(fā)器,無(wú)論何時(shí)刪除一個(gè)產(chǎn)品類別(即從Categories表中刪除一條記錄),該觸發(fā)器都會(huì)更新Products表中的Discontinued列。所有受影響的產(chǎn)品都標(biāo)記為1,標(biāo)示不再使用這些產(chǎn)品了。 USE Northwind CREATE TRIGGER Category_Delete ON Categories FOR DELETE AS UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON = UPDATE觸發(fā)器的工作過程可將UPDATE語(yǔ)句看成兩步操作:即捕獲數(shù)據(jù)前像(before image)的DELETE語(yǔ)句,和捕獲數(shù)據(jù)后像(after image)的INSERT語(yǔ)句。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語(yǔ)句時(shí),原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。 觸發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動(dòng)作。 可以使用IF UPDATE語(yǔ)句定義一個(gè)監(jiān)視指定列的數(shù)據(jù)更新的觸發(fā)器。這樣,就可以讓觸發(fā)器容易的隔離出特定列的活動(dòng)。當(dāng)它檢測(cè)到指定列已經(jīng)更新時(shí),觸發(fā)器就會(huì)進(jìn)一步執(zhí)行適當(dāng)?shù)膭?dòng)作,例如發(fā)出錯(cuò)誤信息指出該列不能更新,或者根據(jù)新的更新的列值執(zhí)行一系列的動(dòng)作語(yǔ)句。 語(yǔ)法 IF UPDATE (column_name) 例1 本例阻止用戶修改Employees表中的EmployeeID列。 USE Northwind GO CREATE TRIGGER Employee_Update ON Employees FOR UPDATE AS IF UPDATE (EmployeeID) BEGIN RAISERROR (39。Transaction cannot be processed.\ ***** Employee ID number cannot be modified.39。, 10, 1) ROLLBACK TRANSACTION END INSTEAD OF觸發(fā)器的工作過程可以在表或視圖上指定INSTEAD OF觸發(fā)器。執(zhí)行這種觸發(fā)器就能夠替代原始的觸發(fā)動(dòng)作。INSTEAD OF觸發(fā)器擴(kuò)展了視圖更新的類型。對(duì)于每一種觸發(fā)動(dòng)作(INSERT、UPDATE或 DELETE),每一個(gè)表或視圖只能有一個(gè)INSTEAD OF觸發(fā)器。 INSTEAD OF觸發(fā)器被用于更新那些沒有辦法通過正常方式更新的視圖。例如,通常不能在一個(gè)基于連接的視圖上進(jìn)行DELETE操作。然而,可以編寫一個(gè)INSTEAD OF DELETE觸發(fā)器來實(shí)現(xiàn)刪除。上述觸發(fā)器可以訪問那些如果視圖是一個(gè)真正的表時(shí)已經(jīng)被刪除的數(shù)據(jù)行。將被刪除的行存儲(chǔ)在一個(gè)名為deleted的工作表中,就像AFTER觸發(fā)器一樣。相似地,在UPDATE INSTEAD OF觸發(fā)器或者INSERT INSTEAD OF觸發(fā)器中,你可以訪問inserted表中的新行。 不能在帶有WITH CHECK OPTION定義的視圖中創(chuàng)建INSTEAD OF觸發(fā)器。二、SQL數(shù)據(jù)庫(kù)數(shù)據(jù)體系結(jié)構(gòu) SQL數(shù)據(jù)庫(kù)的數(shù)據(jù)體系結(jié)構(gòu)基本上是三級(jí)結(jié)構(gòu),但使用術(shù)語(yǔ)與傳統(tǒng)關(guān)系模型術(shù)語(yǔ)不同。在SQL中,關(guān)系模式(模式)稱為“基本表”(base table);存儲(chǔ)模式(內(nèi)模式)稱為“存儲(chǔ)文件”(stored file);子模式(外模式)稱為“視圖”(view);元組稱為“行”(row);屬性稱為“列”(column)。名稱對(duì)稱如^00100009a^: 1 三、SQL語(yǔ)言的組成 在正式學(xué)習(xí)SQL語(yǔ)言之前,首先讓我們對(duì)SQL語(yǔ)言有一個(gè)基本認(rèn)識(shí),介紹一下SQL語(yǔ)言的組成: (Table)的集合,它由一個(gè)或多個(gè)SQL模式定義。 ,一行是列的序列(集合),每列與行對(duì)應(yīng)一個(gè)數(shù)據(jù)項(xiàng)。 基本表是實(shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)的表,而視圖是由若干基本表或其他視圖構(gòu)成的表的定義。 ,一個(gè)存儲(chǔ)文件也可存放一個(gè)或多個(gè)基本表。每個(gè)存儲(chǔ)文件與外部存儲(chǔ)上一個(gè)物理文件對(duì)應(yīng)。 在用戶角度來看,視圖和基本表是一樣的,沒有區(qū)別,都是關(guān)系