語言簡介
套用
結構化查詢語言SQL(STRUCTURED QUERY LANGUAGE)是最重要的關係資料庫操作語言,並且它的影響已經超出資料庫領域,得到其他領域的重視和採用,如人工智慧領域的數據檢索,第四代軟體開發工具中嵌入SQL的語言等。
支持標準
SQL 是1986年10 月由美國國家標準局(ANSI)通過的資料庫語言美國標準,接著,國際標準化組織(ISO)頒布了SQL正式國際標準。1989年4月,ISO提出了具有完整性特徵的SQL89標準,1992年11月又公布了SQL92標準,在此標準中,把資料庫分為三個級別:基本集、標準集和完全集。
其他版本
各種不同的資料庫對SQL語言的支持與標準存在著細微的不同,這是因為,有的產品的開發先於標準的公布,另外,各產品開發商為了達到特殊的性能或新的特性,需要對標準進行擴展。已有100多種遍布在從微機到大型機上的資料庫產品SQL,其中包括DB2、SQL/DS、ORACLE、INGRES、SYBASE、SQLSERVER、DBASEⅣ、PARADOX、MICROSOFTACCESS等。
SQL語言基本上獨立於資料庫本身、使用的機器、網路、作業系統,基於SQL的DBMS產品可以運行在從個人機、工作站到基於區域網路、小型機和大型機的各種計算機系統上,具有良好的可移植性。可以看出標準化的工作是很有意義的。早在1987年就有些有識之士預測SQL的標準化是“一場革命”,是“關係資料庫管理系統的轉折點”。資料庫和各種產品都使用SQL作為共同的數據存取語言和標準的接口,使不同資料庫系統之間的互操作有了共同的基礎,進而實現異構機、各種操作環境的共享與移植。
1974年,在IBM公司聖約瑟研究實驗室研製的大型關係資料庫管理系統SYSTEM R 中,使用SEQUEL語言(由BOYCE 和CHAMBERLIN 提出),後來在SEQUEL 的基礎上發展了SQL 語言。 SQL語言是一種互動式查詢語言,允許用戶直接查詢存儲數據,但它不是完整的程式語言,如它沒有DO或FOR 類似的循環語句,但它可以嵌入到另一種語言中,也可以借用VB、C、JAVA等語言,通過調用級接口(CALL LEVEL INTERFACE)直接傳送到資料庫管理系統。SQL基本上是域關係演算,但可以實現關係代數操作。
語句結構
結構化查詢語言包含 6 個部分:
一:數據查詢語言(DQL:Data Query Language):
其語句,也稱為“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程式給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其他類型的SQL語句一起使用。
二:數據操作語言(DML:Data Manipulation Language):
其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱為動作查詢語言。
三:事務處理語言(TPL):
它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:數據控制語言(DCL):
它的語句通過GRANT或REVOKE獲得許可,確定單個用戶和用戶組對資料庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對表單個列的訪問。
五:數據定義語言(DDL):
其語句包括動詞CREATE和DROP。在資料庫中創建新表或刪除表(CREAT TABLE 或 DROP TABLE);為表加入索引等。DDL包括許多與人資料庫目錄中獲得數據有關的保留字。它也是動作查詢的一部分。
六:指針控制語言(CCL):
它的語句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作。
發展歷史
在1970年代初,由IBM公司San Jose,California研究實驗室的埃德加·科德發表將數據組成表格的套用原則(Codd's Relational Algebra)。1974年,同一實驗室的D.D.Chamberlin和R.F. Boyce對Codd's Relational Algebra在研製關係資料庫管理系統System R中,研製出一套規範語言-SEQUEL(Structured English QUEry Language),並在1976年11月的IBM Journal of R&D上公布新版本的SQL(叫SEQUEL/2)。1980年改名為SQL。
1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2和SQL/DS資料庫系統中也實現了SQL。
1986年10月,美國ANSI採用SQL作為關係資料庫管理系統的標準語言(ANSI X3. 135-1986),後為國際標準化組織(ISO)採納為國際標準。
1989年,美國ANSI採納在ANSI X3.135-1989報告中定義的關係資料庫管理系統的SQL標準語言,稱為ANSI SQL 89,該標準替代ANSI X3.135-1986版本。該標準為下列組織所採納:
國際標準化組織(ISO),為ISO 9075-1989報告“Database Language SQL With Integrity Enhancement”
美國聯邦政府,發布在The Federal Information Processing Standard Publication(FIPS PUB)127
目前(21世紀初期)主要的關係資料庫管理系統支持某些形式的SQL,大部分資料庫打算遵守ANSI SQL89標準。
數據類型
簡要描述一下結構化查詢語言中的五種數據類型: 字元型,文本型,數值型,邏輯型和日期型。
字元型
VARCHARVS CHAR
VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字元串長度小於255的字元。
假如你向一個長度為四十個字元的VARCHAR型欄位中輸入數據Bill Gates。當你以後從這個欄位中取出此數據時,你取出的數據其長度為十個字元——字元串Bill Gates的長度。假如你把字元串輸入一個長度為四十個字元的CHAR型欄位中,那么當你取出數據時,所取出的數據長度將是四十個字元。字元串的後面會被附加多餘的空格。
當你建立自己的站點時,你會發現使用VARCHAR型欄位要比CHAR型欄位方便的多。使用VARCHAR型欄位時,你不需要為剪掉你數據中多餘的空格而操心。
VARCHAR型欄位的另一個突出的好處是它可以比CHAR型欄位占用更少的記憶體和硬碟空間。當你的資料庫很大時,這種記憶體和磁碟空間的節省會變得非常重要。
文本型
TEXT
使用文本型數據,你可以存放超過二十億個字元的字元串。當你需要存儲大串的字元時,應該使用文本型數據。
注意文本型數據沒有長度,而上一節中所講的字元型數據是有長度的。一個文本型欄位中的數據通常要么為空,要么很大。
當你從HTML FORM的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲於文本型欄位中。但是,無論何時,只要你能避免使用文本型欄位,你就應該不使用它。文本型欄位既大且慢,濫用文本型欄位會使伺服器速度變慢。文本型欄位還會吃掉大量的磁碟空間。
一旦你向文本型欄位中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。
數值型
整數 INT 、小數NUMERIC、錢數MONEY
INT VS SMALLINT VS TINYINT
通常,為了節省空間,應該儘可能的使用最小的整型數據。一個TINYINT型數據只占用一個位元組;一個INT型數據占用四個位元組。這看起來似乎差別不大,但是在比較大的表中,位元組數的增長是很快的。另一方面,一旦你已經創建了一個欄位,要修改它是很困難的。因此,為安全起見,你應該預測一下,一個欄位所需要存儲的數值最大有可能是多大,然後選擇適當的數據類型。
NUMERIC
為了能對欄位所存放的數據有更多的控制,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型欄位可以存儲從-10^38到10^38範圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型欄位中存儲小數3.14。
MONEY VS SMALLMONEY
你可以使用 INT型或NUMERIC型數據來存儲錢數。但是,專門有另外兩種數據類型用於此目的。如果你希望你的網點能掙很多錢,你可以使用MONEY型數據。如果你的野心不大,你可以使用SMALLMONEY型數據。MONEY型數據可以存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數。如果你需要存儲比這還大的金額,你可以使用NUMERIC型數據。
SMALLMONEY型數據只能存儲從-214,748.3648到214,748.3647 的錢數。同樣,如果可以的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間。
邏輯型
BIT
如果你使用複選框(CHECKBOX)從網頁中蒐集信息,你可以把此信息存儲在BIT型欄位中。BIT型欄位只能取兩個值:0或1。
當心,在你創建好一個表之後,你不能向表中添加 BIT型欄位。如果你打算在一個表中包含BIT型欄位,你必須在創建表時完成。
日期型
DATETIME VS SMALLDATETIME
一個 DATETIME型的欄位可以存儲的日期範圍是從1753年1月1日第一毫秒到9999年12月31日最後一毫秒。
如果你不需要覆蓋這么大範圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,只不過它能表示的日期和時間範圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的欄位能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。
DATETIME型欄位在你輸入日期和時間之前並不包含實際的數據,認識這一點是重要的。
語言特點
1.一體化:SQL集數據定義DDL、數據操縱DML和數據控制DCL於一體,可以完成資料庫中的全部工作。
2.使用方式靈活:它具有兩種使用方式,即可以直接以命令方式互動使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主語言中使用。
3.非過程化:只提操作要求,不必描述操作步驟,也不需要導航。使用時只需要告訴計算機“做什麼”,而不需要告訴它“怎么做”。
4.語言簡潔,語法簡單,好學好用:在ANSI標準中,只包含了94個英文單詞,核心功能只用6個動詞,語法接近英語口語。
軟道語錄
結構化查詢語言
SQL(Structured Query Language,結構化查詢語言)是一種用於資料庫操作的語言。
使用簡要
簡單的Transact-結構化查詢語言查詢只包括選擇列表、FROM子句和WHERE子句。它們分別說明所查詢列、查詢的表或視圖、以及搜尋條件等。
選擇列表
選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變數(包括局部變數和全局變數)等構成。
1、選擇所有列
例如,下面語句顯示testtable表中所有列的數據:
SELECT * FROM testtable
2、選擇部分列並指定它們的顯示次序
查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。
3、更改列標題
在選擇列表中,可重新指定列標題。定義格式為:
列標題=列名 列名 列標題
如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句使用漢字顯示列標題: SELECT 暱稱=nickname,電子郵件=email FROM testtable。
4、刪除重複行
SELECT語句中使用ALL或DISTINCT選項來顯示錶中符合條件的所有行或刪除其中重複的數據行,默認為ALL。使用DISTINCT選項時,對於所有重複的數據行在SELECT返回的結果集合中只保留一行。
5、限制返回的行數
使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一百分數,指定返回的行數等於總行數的百分之幾。TOP命令僅針對SQL Server系列資料庫,並不支持Oracle資料庫。
FROM子句
FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖,它們之間用逗號分隔。
在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:
在FROM子句中可用以下兩種格式為表或視圖指定別名:
表名 as 別名
表名 別名
WHERE子句
WHERE子句設定查詢條件,過濾掉不需要的數據行。
WHERE子句可包括各種條件運算符:
比較運算符(大小比較):>;、>=、=、<;、<=、<>;、!>;、!<
範圍運算符(表達式值是否在指定的範圍):BETWEEN…AND…
NOT BETWEEN…AND…
列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……)
NOT IN (項1,項2……)
模式匹配符(判斷值是否與指定的字元通配格式相符):LIKE、NOT LIKE
空值判斷符(判斷表達式是否為空):IS NULL、IS NOT NULL
邏輯運算符(用於多條件的邏輯連線):NOT、AND、OR
1、範圍運算符例:age BETWEEN 10 AND 30相當於age>=10 AND age<=30
2、列表運算符例:country IN ('Germany','China')
3、模式匹配符例:常用於模糊查找,它判斷列值是否與指定的字元串格式相匹配。可用於char、varchar、text、ntext、datetime和smalldatetime等類型查詢。
可使用以下通配字元:
百分號%:可匹配任意類型和長度的字元,如果是中文,請使用兩個百分號即%%。
下劃線_:匹配單個任意字元,它常用來限制表達式的字元長度。
方括弧[]:指定一個字元、字元串或範圍,要求所匹配對象為它們中的任一個。[^]:其取值也[] 相同,但它要求所匹配對象為指定字元以外的任一個字元。
查詢結果排序
使用ORDER BY子句對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式為:
ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,為默認值,DESC為降序。ORDER BY不能按ntext、text和image數據類型進行排序。
相關函式
SQL Aggregate 函式
SQL Aggregate 函式計算從列中取得的值,返回一個單一的值。
有用的 Aggregate 函式:
•AVG() - 返回平均值
•COUNT() - 返回行數
•FIRST() - 返回第一個記錄的值
•LAST() - 返回最後一個記錄的值
•MAX() - 返回最大值
•MIN() - 返回最小值
•SUM() - 返回總和
SQL Scalar 函式
SQL Scalar 函式基於輸入值,返回一個單一的值。
有用的 Scalar 函式:
•UCASE() - 將某個欄位轉換為大寫
•LCASE() - 將某個欄位轉換為小寫
•MID() - 從某個文本欄位提取字元
•LEN() - 返回某個文本欄位的長度
•ROUND() - 對某個數值欄位進行指定小數位數的四捨五入
•NOW() - 返回當前的系統日期和時間
•FORMAT() - 格式化某個欄位的顯示方式