<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 5,  comments - 7,  trackbacks - 0
    掌握SQL四條最基本的數(shù)據(jù)操作語句:Insert,Select,Update和Delete。

       練掌握SQL是數(shù)據(jù)庫用戶的寶貴財 富。在本文中,我們將引導你掌握四條最基本的數(shù)據(jù)操作語句—SQL的核心功能—來依次介紹比較操作符、選擇斷言以及三值邏輯。當你完成這些學習后,顯然你已經(jīng)開始算是精通SQL了。

      在我們開始之前,先使用CREATE TABLE語句來創(chuàng)建一個表(如圖1所示)。DDL語句對數(shù)據(jù)庫對象如表、列和視進行定義。它們并不對表中的行進行處理,這是因為DDL語句并不處理數(shù)據(jù)庫中實際的數(shù)據(jù)。這些工作由另一類SQL語句—數(shù)據(jù)操作語言(DML)語句進行處理。

      SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于這是大多數(shù)SQL用戶經(jīng)常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在后面的例子中將要用到它。

      INSERT語句

      用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員John Smith的記錄插入到本例的表中,可以使用如下語句:

      INSERT INTO EMPLOYEES VALUES

       ('Smith','John','1980-06-10',

       'Los Angles',16,45000);

      通過這樣的INSERT語句,系統(tǒng)將試著將這些值填入到相應的列中。這些列按照我們創(chuàng)建表時定義的順序排列。在本例中,第一個值“Smith”將填到第一個列LAST_NAME中;第二個值“John”將填到第二列FIRST_NAME中……以此類推。

      我們說過系統(tǒng)會“試著”將值填入,除了執(zhí)行規(guī)則之外它還要進行類型檢查。如果類型不符(如將一個字符串填入到類型為數(shù)字的列中),系統(tǒng)將拒絕這一次操作并返回一個錯誤信息。

      如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務的支持。一次事務將數(shù)據(jù)庫從一種一致性轉移到另一種一致性。如果事務的某一部分失敗,則整個事務都會失敗,系統(tǒng)將會被恢復(或稱之為回退)到此事務之前的狀態(tài)。

       回到原來的INSERT的例子,請注意所有的整形十進制數(shù)都不需要用單引號引起來,而字符串和日期類型的值都要用單引號來區(qū)別。為了增加可讀性而在數(shù)字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。

      同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。

      對于日期類型,我們必須使用SQL標準日期格式(yyyy-mm-dd),但是在系統(tǒng)中可以進行定義,以接受其他的格式。當然,2000年臨近,請你最好還是使用四位來表示年份。

      既然你已經(jīng)理解了INSERT語句是怎樣工作的了,讓我們轉到EMPLOYEES表中的其他部分:

      INSERT INTO EMPLOYEES VALUES

       ('Bunyan','Paul','1970-07-04',

       'Boston',12,70000);

      INSERT INTO EMPLOYEES 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',

       '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是SQL中的一種特殊情況,我們以后將進行詳細的討論?,F(xiàn)在我們只需認為NULL表示一種未知的值。

      有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進行賦值。除了對要省略的列輸入NULL外,還可以采用另外一種INSERT語句,如下:

      INSERT INTO EMPLOYEES(

       FIRST_NAME, LAST_NAME,

       HIRE_DATE, BRANCH_OFFICE)

      VALUE(

       'Indiana','Jones',

       '1992-02-01','Indianapolis');

      這樣,我們先在表名之后列出一系列列名。未列出的列中將自動填入缺省值,如果沒有設置缺省值則填入NULL。請注意我們改變了列的順序,而值的順序要對應新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規(guī)定不能為空),SQL操作將失敗。

      讓我們來看一看上述INSERT語句的語法圖:

      INSERT INTO table

       [(column { ,column})]

      VALUES

       (columnvalue [{,columnvalue}]);

      和前一篇文章中一樣,我們用方括號來表示可選項,大括號表示可以重復任意次數(shù)的項(不能在實際的SQL語句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號。

      SELECT語句

      SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數(shù)據(jù)是數(shù)據(jù)庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問數(shù)據(jù)庫來分析數(shù)據(jù)并生成報表的人可以對其他SQL語句一竅不通。

      SELECT語句的結果通常是生成另外一個表。在執(zhí)行過程中系統(tǒng)根據(jù)用戶的標準從數(shù)據(jù)庫中選出匹配的行和列,并將結果放到臨時的表中。在直接SQL(direct SQL)中,它將結果顯示在終端的顯示屏上,或者將結果送到打印機或文件中。也可以結合其他SQL語句來將結果放到一個已知名稱的表中。

      SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到的關系代數(shù)運算“選擇”(或稱“限制”),但實際上它也可以完成其他兩種關系運算—“投影”和“連接”,SELECT語句還可以完成聚合計算并對數(shù)據(jù)進行排序。

      SELECT語句最簡單的語法如下:

      SELECT columns FROM tables;

      當我們以這種形式執(zhí)行一條SELECT語句時,系統(tǒng)返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表。這就是實現(xiàn)關系投影運算的一個形式。

      讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以后所有SELECT語句實例都要使用的。而我們在圖2和圖3中給出了查詢的實際結果。我們將在其他的例子中使用這些結果)。

      假設你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:

      SELECT BRANCH_OFFICE FROM EMPLOYEES;

      以上SELECT語句的執(zhí)行將產(chǎn)生如圖2中表2所示的結果。

      由于我們在SELECT語句中只指定了一個列,所以我們的結果表中也只有一個列。注意結果表中具有重復的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結果中的重復行,只要在SELECT語句中加上DISTINCT子句:

      SELECT DISTINCT BRANCH_OFFICE

      FROM EMPLOYEES;

      這次查詢的結果如表3所示。

      現(xiàn)在已經(jīng)消除了重復的行,但結果并不是按照順序排列的。如果你希望以字母表順序將結果列出又該怎么做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果:

      SELECT DISTINCT BRANCH_OFFICE

      FROM EMPLOYEES

      ORDER BY BRANCH_OFFICE ASC;

      這一查詢的結果如表4所示。請注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,這就是我們想要對其進行排序的列。為什么即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們并不顯示出來。列名BRANCH_ OFFICE之后的關鍵字ASC表示按照升序排列。如果你希望以降序排列,那么可以用關鍵字DESC。

      同樣我們應該指出ORDER BY子句只將臨時表中的結果進行排序;并不影響原來的表。

      假設我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號中的內(nèi)容,我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:

      SELECT BRANCH_OFFICE,FIRST_NAME,

       LAST_NAME,SALARY,HIRE_DATE

      FROM EMPLOYEES

      ORDER BY SALARY DESC,

       HIRE_DATE DESC;

      這里我們進行了多列的選擇和排序。排序的優(yōu)先級由語句中的列名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現(xiàn)了重復的行時,這些行將被按照第二列進行排序,如果在第二列中又出現(xiàn)了重復的行時,這些行又將被按照第三列進行排序……如此類推。這次查詢的結果如表5所示。

      將一個很長的表中的所有列名寫出來是一件相當麻煩的事,所以SQL允許在選擇表中所有的列時使用*號:

      SELECT * FROM EMPLOYEES;

      這次查詢返回整個EMPLOYEES表,如表1所示。

       下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項,允許在其中選擇一項。):

      SELECT [DISTINCT]

       (column [{, columns}])| *

      FROM table [ {, table}]

      [ORDER BY column [ASC] | DESC

       [ {, column [ASC] | DESC }]];

      定義選擇標準

      在我們目前所介紹的SELECT語句中,我們對結果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT語句進行限制使得它只返回希望得到的行:

      SELECT columns FROM tables [WHERE predicates];

      WHERE子句對條件進行了設置,只有滿足條件的行才被包括到結果表中。這些條件由斷言(predicate)進行指定(斷言指出了關于某件事情的一種可能的事實)。如果該斷言對于某個給定的行成立,該行將被包括到結果表中,否則該行被忽略。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:

      SELECT * FROM EMPLOYEES

      WHERE LAST_NAME = 'Jones';

      LAST_NAME = 'Jones'部分就是斷言。在執(zhí)行該語句時,SQL將每一行的LAST_NAME列與“Jones”進行比較。如果某一職員的姓為“Jones”,即斷言成立,該職員的信息將被包括到結果表中(見表6)。

      使用最多的六種比較

      我們上例中的斷言包括一種基于“等值”的比較(LAST_NAME = 'Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:

      等于 =

      不等于 <>

      小于 <

      大于 >

      小于或等于 <=

      大于或等于 >=

      下面給出了不是基于等值比較的一個例子:

      SELECT * FROM EMPLOYEES

      WHERE SALARY > 50000;

      這一查詢將返回年薪高于$50,000.00的職員(參見表7)。

      邏輯連接符

      有時我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看Davy Jones的信息的話,表6中的結果將是不正確的。為了進一步定義一個WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員Davy Jones的記錄,用戶可以輸入如下語句:

      SELECT * FROM EMPLOYEES

      WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';

      在本例中,我們通過邏輯連接符AND將兩個斷言連接起來。只有兩個斷言都滿足時整個表達式才會滿足。如果用戶需要定義一個SELECT語句來使得當其中任何一項成立就滿足條件時,可以使用OR連接符:

      SELECT * FROM EMPLOYEES

      WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';

      有時定義一個斷言的最好方法是通過相反的描述來說明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時,你可以進行如下的查詢:

      SELECT * FROM EMPLOYEES

      WHERE NOT(BRANCH_OFFICE = 'Boston');

      關鍵字NOT后面跟著用圓括號括起來的比較表達式。其結果是對結果取否定。如果某一職員所在部門的辦事處在Boston,括號內(nèi)的表達式返回true,但是NOT操作符將該值取反,所以該行將不被選中。

      斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進行求值,可以用括號將它們括起來:

      SELECT * FROM EMPLOYEES

      WHERE (LAST_NAME = 'Jones'

      AND FIRST_NAME = 'Indiana')

      OR (LAST_NAME = 'Smith'

      AND FIRST_NAME = 'Bessie');

      SQL沿用數(shù)學上標準的表達式求值的約定—圓括號內(nèi)的表達式將最先進行求值,其他表達式將從左到右進行求值。

      以上對邏輯連接符進行了說明,在對下面的內(nèi)容進行說明之前,我們再一次對SELECT語句的語法進行更新:

      SELECT [DISTINCT]

       (column [{, column } ] )| *

      FROM table [ { , table} ]

      [ORDER BY column [ASC] | [DESC

      [{ , column [ASC] | [DESC } ] ]

      WHERE predicate [ { logical-connector predicate } ];

      NULL和三值邏輯

      在SQL中NULL是一個復雜的話題,關于NULL的詳細描述更適合于在SQL的高級教程而不是現(xiàn)在的入門教程中進行介紹。但由于NULL需要進行特殊處理,并且你也很可能會遇到它,所以我們還是簡略地進行一下說明。

      首先,在斷言中進行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:

      SELECT * FROM EMPLOYEES

      WHERE SALARY IS NULL;

      相反,如果用戶需要所有已知年薪數(shù)據(jù)的職員的信息,你可以使用以下語句:

      SELECT * FROM EMPLOYEES

      WHERE SALARY IS NOT NULL;

      請注意我們在列名之后使用了關鍵字IS NULL或IS NOT NULL,而不是標準的比較形式:COLUMN = NULL、COLUMN <> NULL或是邏輯操作符NOT(NULL)。

      這種形式相當簡單。但當你不明確地測試NULL(而它們確實存在)時,事情會變得很混亂。

      例如,回過頭來看我們圖1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等級或年薪值都是未知的。這兩個列都包含NULL??梢韵胂筮\行如下的查詢:

      SELECT * FROM EMPLOYEES

      WHERE GRADE <= SALARY;

      此時,Indiana Jones應該出現(xiàn)在結果表中。因為NULL都是相等的,所以可以想象它們是能夠通過GRADE小于等于SALARY的檢查的。這其實是一個毫無疑義的查詢,但是并沒有關系。SQL允許進行這樣的比較,只要兩個列都是數(shù)字類型的。然而,Indiana Jones并沒有出現(xiàn)在查詢的結果中,為什么?

      正如我們早先提到過的,NULL表示未知的值(而不是象某些人所想象的那樣表示一個為NULL的值)。對于SQL來說意味著這個值是未知的,而只要這個值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許除了在true 和false之外還有第三種類型的真值,稱之為“非確定”(unknown)值。

      如果比較的兩邊都是NULL,整個斷言就被認為是非確定的。將一個非確定斷言取反或使用AND或OR與其他斷言進行合并之后,其結果仍是非確定的。由于結果表中只包括斷言值為“真”的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符IS NULL和IS NOT NULL。

      UPDATE語句

      UPDATE語句允許用戶在已知的表中對現(xiàn)有的行進行修改。

      例如,我們剛剛發(fā)現(xiàn)Indiana Jones的等級為16,工資為$40,000.00,我們可以通過下面的SQL語句對數(shù)據(jù)庫進行更新(并清除那些煩人的NULL)。

      UPDATE EMPLOYEES

      SET GRADE = 16, SALARY = 40000

      WHERE FIRST_NAME = 'Indiana'

       AND LAST_NAME = 'Jones';

      上面的例子說明了一個單行更新,但是UPDATE語句可以對多行進行操作。滿足WHERE條件的所有行都將被更新。如果,你想讓Boston辦事處中的所有職員搬到New York,你可以使用如下語句:

      UPDATE EMPLOYEES

      SET BRANCH_OFFICE = 'New York'

      WHERE BRANCH_OFFICE = 'Boston';

      如果忽略WHERE子句,表中所有行中的部門值都將被更新為'New York'。

      UPDATE語句的語法流圖如下面所示:

      UPDATE table

      SET column = value [{, column = value}]

      [ WHERE predicate [ { logical-connector predicate}]];

      DELETE語句

      DELETE語句用來刪除已知表中的行。如同UPDATE語句中一樣,所有滿足WHERE子句中條件的行都將被刪除。由于SQL中沒有UNDO語句或是“你確認刪除嗎?”之類的警告,在執(zhí)行這條語句時千萬要小心。如果決定取消Los Angeles辦事處并解雇辦事處的所有職員,這一卑鄙的工作可以由以下這條語句來實現(xiàn):

      DELETE FROM EMPLOYEES

      WHERE BRANCH_OFFICE = 'Los Angeles';

      如同UPDATE語句中一樣,省略WHERE子句將使得操作施加到表中所有的行。

      DELETE語句的語法流圖如下面所示:

      DELETE FROM table

      [WHERE predicate [ { logical-connector predicate} ] ];

      現(xiàn)在我們完成了數(shù)據(jù)操作語言(DML)的主要語句的介紹。我們并沒有對SQL能完成的所有功能進行說明。SQL還提供了許多的功能,如求平均值、求和以及其他對表中數(shù)據(jù)的計算,此外SQL還能完成從多個表中進行查詢(多表查詢,或稱之為連接)的工作。這種語言還允許你使用GRANT和REVOKE命令控制使用者的數(shù)據(jù)訪問權限。
    posted on 2008-12-09 10:02 Vincent-chen 閱讀(218) 評論(0)  編輯  收藏 所屬分類: SQL

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲免费闲人蜜桃| 久久综合九九亚洲一区| 亚洲综合av一区二区三区| 最近中文字幕mv免费高清视频8 | 大陆一级毛片免费视频观看| 亚洲国产精品久久丫| 国产情侣激情在线视频免费看| 中文字幕亚洲第一在线| 免费精品国产日韩热久久| 国产亚洲精品成人AA片| 好吊妞在线新免费视频| 香蕉视频免费在线播放| 国产亚洲人成A在线V网站| 你懂的在线免费观看| 亚洲天堂视频在线观看| 两性刺激生活片免费视频| 亚洲真人无码永久在线观看| 免费看又爽又黄禁片视频1000| 国产亚洲情侣久久精品| 亚洲无码在线播放| 99视频在线免费| 国产日本亚洲一区二区三区| 日本高清免费aaaaa大片视频| eeuss在线兵区免费观看| 亚洲国产精品成人精品无码区| 中国人xxxxx69免费视频| 精品国产成人亚洲午夜福利| 免费在线观看视频a| 国产自国产自愉自愉免费24区 | 十八禁的黄污污免费网站| 久久香蕉国产线看观看亚洲片| 亚洲免费中文字幕| 国产亚洲美女精品久久| 亚洲av无码一区二区乱子伦as| 18禁无遮挡无码网站免费| 一级毛片试看60分钟免费播放| 亚洲精品人成在线观看| 免费大香伊蕉在人线国产| 久久99精品国产免费观看| 亚洲av无码一区二区三区天堂 | 亚洲精品第一综合99久久|