SQL數據庫教程_第1頁
SQL數據庫教程_第2頁
已閱讀5頁,還剩7頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、掌握 SQL 四條最基本的數據操作語句:Insert, Select,Update 和 Delete。練掌握 SQL 是數據庫用戶的寶貴財富。在本文中,我們將引導你掌握四條最基本的數據操作語句 SQL的核心功能 來依次介紹比較操作符、選擇斷言以及三值邏輯。當你完成這些學習后,顯然你已經開始算是精通SQL 了。在我們開始之前,先使用 CREATE TABLE 語句來創建一個表(如圖 1 所示)。DDL 語句對數據庫對象如表、列和視進行定義。它們并不對表中的行進行處理,這是因為 DDL 語句并不處理數據 庫中實際的數據。這些工作由另一類 SQL 語句 數據操作語言( DML ) 語句進行處理。SQ

2、L 中有四種基本的 DML 操 作: INSERT , SELECT ,UPDATE 和 DELETE 。由于這是大多數 SQL 用戶經常用到的, 我們有必要在此對它們進行一一說明。在圖 1 中我們給 出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在后面的例子中將要用到它。連接查詢通 過連接運算符可以實現多個表查詢。連接是關系數據庫模型的主要特點,也是它區別于其它類型數據庫管理系統的一個標志。在 關系數據庫管理系統中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息

3、。連接操作給用戶帶來很大的靈活性, 他們可以在任何時候增加新的數據類型。為不同實體創建新的表, 爾后通過 連接進行查詢。連接可以在 SELECT語句的 FROM 子句或 WHERE 子句中建立,似是而非在FROM 子句中指出連接時有助于將連接操作與WHERE 子句中的搜索條件區分開來。所以,在 Transact-SQL 中推薦使用這種方法。SQL-92 標準所定義的 FROM 子句的連接語法格式為:FROM join_table join_type join_tableON (join_condition)其中 join_table 指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表

4、操作, 對同一個表操作的連接又稱做自連接。join_type指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNERJOIN)使用比較運算符進行表間某 (些) 列數據的比較操作, 并列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。外 連接分為左外連接(LEFT OUTER JOIN或 LEFT JOIN) 、右外連接 (RIGHT OUTER JOIN或 RIGHT JOIN)和 全外連接 (FULL OUTER JOIN或 FULL JOIN) 三種。 與內連接不同的是, 外連接不只列出與連接條件相匹配的行,而是列出

5、左表 (左外連接時 ) 、右表 (右外連接時 )或兩個表 (全外連接時 ) 中所有符合搜索條件的數據行。交叉連接 (CROSS JOIN) 沒有 WHERE子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。連接操作中的ON (join_condition)子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。無論哪種連接都不能對text、ntext 和 image 數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:SELECT p1.pub_id,p2.pub_id,p1.pr_in

6、foFROM pub_info AS p1 INNER JOIN pub_info AS p2ON DA TALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一) 內連接內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:1、 等值連接:在連接條件中使用等于號(=) 運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。2、 不等連接: 在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括 >、>=、& lt;= 、<、!> 、!&

7、lt; 和<> 。3、自然連接:在連接條件中使用等于(=) 運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。例,下面使用等值連接列出authors 和 publishers 表中位于同一城市的作者和出版社:SELECT *FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city又如使用自 然連接,在選擇列表中刪除authors 和 publishers 表中重復列 (city 和 state): SELECT a.*,p.pub_id,p.pub_name,p.coun

8、tryFROM authors AS a INNER JOIN publishers AS pON a.city=p.city(二)外連接內連 接時,返回查詢結果集合中的僅是符合查詢條件( WHERE搜索條件或 HA VING條件 )和連接條件的行。而采用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表 (左外連接時 )、右表 (右外連接時 )或兩個邊接表 (全外連接 )中的所有數據行。如下面使用左外連接將論壇內容和作者信息連接起來:SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ON a.username=b.

9、username下 面使用全外連接將city 表中的所有作者以及user 表中的所有作者, 以及他們所在的城市:SELECT a.*,b.*FROM city as a FULL OUTER JOIN user as b ON a.username=b.username(三) 交叉連接交叉連接不帶WHERE子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例, titles 表中有 6 類圖書,而publishers 表中有 8 家出版社,則下列交叉連接檢索到的記錄數將等于 6*8=48 行。SE

10、LECT type,pub_nameFROM titles CROSS JOIN publishers ORDER BY typeUNION運算符可以將兩個或兩個以上上 SELECT 語句的查詢結果集合合并成一個結果集合顯示,即執行聯合查詢。 UNION 的語法格式為:select_statementUNION ALL selectstatementUNION ALL selectstatement n其 中 selectstatement 為待聯合的 SELECT 查詢語句。ALL 選項表示將所有行合并到結果集合中。不指定該項時,被聯合查詢結果集合中的重復行將只保留一行。聯合查詢時, 查詢結

11、果的列標題為第一個查詢語句的列標題。因此, 要定義列標題必須在第一個查詢語句中定義。 要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。在使用 UNION運算符時, 應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,并且每個查詢選擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對于數值類型,系統將低精度的數據類型轉換為高精度的數據類型。在包括多個查詢的UNION語句中, 其執行順序是自左至右, 使用括號可以改變這一執行順序。例如:查詢 1 UNION ( 查詢 2 UNION查詢 3)INSERT 語句用戶可以用 INSERT 語

12、句將一行記錄插入到指定的一個表中。例如,要將雇員 John Smith的記錄插入到本例的表中,可以使用如下語句:INSERT INTO EMPLOYEES VALUES ('Smith','John','1980-06-10','Los Angles',16,45000);通過這樣的INSERT 語句,系統將試著將這些值填入到相應的列中。這些列按照我們創建表時定義的順序排列。在本例中,第一個值“Smith將”填到第 一個列 LAST_NAME中; 第二個值 “John將”填到第二列 FIRST_NAME中 以此類推。我們說過系統會

13、 “試著 ”將值填 入,除了執行規則之外它還要進行類型檢查。如果類型不符(如將一個字符串填入到類型為數字的列中),系統將拒絕這一次操作并返回一個錯誤信息。如果 SQL 拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為 SQL 提供對事務的支持。一次事務將數據庫從一種一致性轉移到另一種一致性。如果事務的某一部分失敗, 則整個事務都會失敗,系統將會被恢復 (或稱之為回退) 到此事務之前的狀態。回到原來的INSERT 的例子,請注意所有的整形十進制數都不需要用單引號引起來,而字符串和日期類型的值都要用單引號來區別。為了增加可讀性而在數字間插入逗號將會引起錯誤。記住,在SQL 中逗號是元

14、素的分隔符。同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。對于日期類型,我們必須使用SQL 標準日期格式( yyyy-mm-dd ),但是在系統中可以進行定義,以接受其他的格式。當然,2000 年臨近,請你最好還是使用四位來表示年份。既然你已經理解了INSERT 語句是怎樣工作的了,讓我們轉到EMPLOYEES表中的其他部分:INSERT INTO EMPLOYEES VALUES ('Bunyan','Paul','1970-07-04','Boston',12,70000);INSERT INTO EMPLOY

15、EES VALUES('John','Adams','1992-01-21', 'Boston',20,100000);INSERT INTO EMPLOYEES VALUES('Smith','Pocahontas','1976-04-06', 'Los Angles',12,100000);INSERT INTO EMPLOYEES VALUES ('Smith','Bessie','1940-05-02','

16、;Boston',5,200000);INSERT INTO EMPLOYEES VALUES ('Jones','Davy','1970-10-10', 'Boston',8,45000);INSERT INTO EMPLOYEES VALUES('Jones','Indiana','1992-02-01', 'Chicago',NULL,NULL);在最后一項中, 我們不知道 Jones 先生的工薪級別和年薪,所以我們輸入NULL (不要引號)。NULL是

17、 SQL 中的一種特殊情況,我們以后將進行詳細的討論。現在我們只需認為NULL表示一種未知的值。有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進行賦值。除了對要省略的列輸入NULL外,還可以采用另外一種INSERT 語句,如 下:INSERT INTO EMPLOYEES( FIRST_NAME, LAST_NAME,HIRE_DATE, BRANCH_OFFICE)VALUE('Indiana','Jones','1992-02-01','Indianapolis');這樣,我們先在表名之后列出一系列列名。未列

18、出的列中將自動填入缺省值,如果沒有設置缺省值則填入NULL 。請注意我們改變了列的順序, 而值的順序要對應新的列的順序。如果該語句中省略了FIRST_NAME和 LAST_NAME項(這兩項規定不能為空) ,SQL 操作將失敗。讓我們來看一看上述INSERT 語句的語法圖:INSERT INTO table (column ,column) VALUES(columnvalue ,columnvalue);和前一篇文章中一樣,我們用方括號來表示可選項,大括號表示可以重復任意次數的項(不能在實際的SQL 語句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號。SELECT語句S

19、ELECT 語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數據是數據庫管理中最重要的功能,所以SELECT 語句 在 SQL 中是工作量最大的部分。實際上,僅僅是訪問數據庫來分析數據并生成報表的人可以對其他SQL 語句一竅不通。SELECT 語句 的結果通常是生成另外一個表。在執行過程中系統根據用戶的標準從數據庫中選出匹配的行和列,并將結果放到臨時的表中。在直接SQL (direct SQL )中,它將結果顯示在終端的顯示屏上,或者將結果送到打印機或文件中。也可以結合其他SQL 語句來將結果放到一個已知名稱的表中。SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到

20、的關系代數運算 “選擇 ”(或稱 “限制 ”),但實際上它也可以完成其他兩種關系運算“投影 ”和“連接 ”,SELECT 語句還可以完成聚合計算并對數據進行排序。SELECT 語句最簡單的語法如下:SELECT columns FROM tables;當我們以這種形式執行一條SELECT 語句時, 系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表。這就是實現關系投影運算的一個形式。讓我們看一下使用圖1 中 EMPLOYEES表的一 些例子(這個表是我們以后所有SELECT 語句實例都要使用的。 而我們在圖 2 和圖 3 中給出了查詢的實際結果。我們將在其他的例子中使用這些結果

21、)。假設你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL 查詢:SELECT BRANCH_OFFICE FROM EMPLOYEES;以上 SELECT 語句的執行將產生如圖2 中表 2 所示的結果。由于我們在 SELECT 語句中只指定了一個列,所以我們的結果表中也只有一個列。注意結果表中具有重復的行,這是因為有多個雇員在同一部門工作(記住SQL 從所選的所有行中將值返 回)。要消除結果中的重復行,只要在SELECT 語句中加上 DISTINCT子句:SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES;這次查詢的結果如表3 所示?,F 在已經消

22、除了重復的行,但結果并不是按照順序排列的。如果你希望以字母表順序將結果列出又該怎么做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果:SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEESORDER BY BRANCH_OFFICE ASC;這一查詢的結果如表4 所 示。請注意在ORDERBY之后是如何放置列名BRANCH_OFFICE的,這就是我們想要對其進行排序的列。為什么即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們并不顯示出來。列名 BRANCH_OFFICE 之后的關鍵字 ASC 表示

23、按照升序排列。如果你希望以降序排列,那么可以用關鍵字DESC。同樣我們應該指出ORDERBY 子句只將臨時表中的結果進行排序;并不影響原來的表。假設我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號中的內容, 我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:SELECT BRANCH_OFFICE,FIRST_NAME,LAST_NAME,SALARY,HIRE_DA TE FROM EMPLOYEESORDER BY SALARY DESC, HIRE_DATE DESC;這里我們進行了多列的選擇和排序。排序的優先級由語句中的列

24、名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現了重復的行時,這些行將被按照第二列進行排序,如果在第二列中又出現了重復的行時,這些行又將被按照第三列進行排序 如此類推。這次查詢的結果如表5 所示。將一個很長的表中的所有列名寫出來是一件相當麻煩的事,所以 SQL 允許在選擇表中所有的列時使用 * 號:SELECT * FROM EMPLOYEES;這次查詢返回整個EMPLOYEES表,如表 1 所示。下面我們對開始時給出的SELECT 語句的語法進行一下更新 (豎直線表示一個可選項, 允許在其中選擇一項。 ):SELECT DISTINCT(column , columns

25、)| * FROM table , tableORDER BY column ASC | DESC , column ASC | DESC ;定義選擇標準在我們目前所介紹的SELECT 語句中, 我們對結果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT 語句進行限制使得它只返回希望得到的行:SELECT columns FROM tables WHERE predicates;WHERE子句對條件進行了設置,只有滿足條件的行才被包括到結果表中。這些條件 由斷言( predicate)進行指定(斷言指出了關于某件事情的一種可能的事實)。如果該斷言對于某個給定的行成立,該

26、 行將被包括到結果表中,否則該行被忽略。在 SQL 語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones 的職員,則可以使用以下SELECT 語句:SELECT * FROM EMPLOYEES WHERE LAST_NAME = 'Jones'LAST_NAME = 'Jones' 部分就是斷言。 在執行該語句時, SQL 將每一行的 LAST_NAME 列與 “Jones進”行比較。如果某一職員的姓為“Jones,”即斷 言成立,該職員的信息將被包括到結果表中(見表6)。使用最多的六種比較我們上例中的斷言包括一種基于“等值 ” 的比較( LAST_NAME = 'Jones' ),但是 SQL 斷言還可以包含其他幾種類型的比較。其中最常用的為:等 于 =不等于 <>小 于 <大 于 >小于或等于 <=大于或等于>=下面給出了不是基于等值比較的一個例子:SELECT * FROM EMPLOYEES WHERE SALARY > 50000;這一查詢將返回年薪高于$50,000.00 的職員(參見表 7)。邏輯連接符有時我們需要定義一條不止一種斷言的SELECT 語句

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論