⑴ sql語言中,各種數據類型代表的含義是什麼
(1)數值型
數值是諸如32 或153.4 這樣的值。MySQL 支持科學表示法,科學表示法由整數或浮點數後跟「e」或「E」、一個符號(「+」或「-」)和一個整數指數來表示。1.24E+12 和23.47e-1 都是合法的科學表示法表示的數。而1.24E12 不是合法的,因為指數前的符號未給出。
浮點數由整數部分、一個小數點和小數部分組成。整數部分和小數部分可以分別為空,但不能同時為空。
數值前可放一個負號「-」以表示負值。
(2)字元(串)型
字元型(也叫字元串型,簡稱串)是諸如「Hello, world!」或「一個饅頭引起的血案」這樣的值,或者是電話號碼87398413這樣的值。既可用單引號也可用雙引號將串值括起來。
初學者往往分不清數值87398143和字元串87398143的區別。都是數字啊,怎麼一個要用數值型,一個要用字元型呢?關鍵就在於:數值型的87398143是要參與計算的,比如它是金融中的一個貨款總額;而字元型的87398143是不參與計算的,只是表示電話號碼,這樣的還有街道號碼、門牌號碼等等,它們都不參與計算。
(3)日期和時間型
日期和時間是一些諸如「2006-07-12」或「12:30:43」這樣的值。MySQL還支持日期/時間的組合,如「2006-07-12 12:30:43」。
(4)NULL值
NULL表示未知值。比如填寫表格中通訊地址不清楚留空不填寫,這就是NULL值。
我們用Create Table語句創建一個表,這個表中包含列的定義。例如我們在前面創建了一個joke表,這個表中有content和writer兩個列:
定義一個列的語法如下:
其中列名由col_name 給出。列名可最多包含64個字元,字元包括字母、數字、下劃線及美元符號。列名可以名字中合法的任何符號(包括數字)開頭。但列名不能完全由數字組成,因為那樣可能使其與數據分不開。MySQL保留諸如SELECT、DELETE和CREATE這樣的詞,這些詞不能用做列名,但是函數名(如POS 和MIN)是可以使用的。
列類型col_type表示列可存儲的特定值。列類型說明符還能表示存放在列中的值的最大長度。對於某些類型,可用一個數值明確地說明其長度。而另外一些值,其長度由類型名蘊含。例如,CHAR(10) 明確指定了10個字元的長度,而TINYBLOB值隱含最大長度為255個字元。有的類型說明符允許指定最大的顯示寬度(即顯示值時使用多少個字元)。浮點類型允許指定小數位數,所以能控制浮點數的精度值為多少。
可以在列類型之後指定可選的類型說明屬性,以及指定更多的常見屬性。屬性起修飾類型的作用,並更改其處理列值的方式,屬性有以下類型:
(1)專用屬性用於指定列。例如,UNSIGNED 屬性只針對整型,而BINARY屬性只用於CHAR 和VARCHAR。
(2)通用屬性除少數列之外可用於任意列。可以指定NULL 或NOT NULL 以表示某個列是否能夠存放NULL。還可以用DEFAULT,def_value 來表示在創建一個新行但未明確給出該列的值時,該列可賦予值def_value。def_value 必須為一個常量;它不能是表達式,也不能引用其他列。不能對BLOB 或TEXT 列指定預設值。
如果想給出多個列的專用屬性,可按任意順序指定它們,只要它們跟在列類型之後、通用屬性之前即可。類似地,如果需要給出多個通用屬性,也可按任意順序給出它們,只要將它們放在列類型和可能給出的列專用屬性之後即可。
2. MySQL的列(欄位)類型
資料庫中的每個表都是由一個或多個列(欄位)構成的。在用CREATE TABLE語句創建一個表時,要為每列(欄位)指定一個類型。列(欄位)的類型比數據類型更為細化,它精確地描述了給定表列(欄位)可能包含的值的種類,如是否帶小數、是否文字很多。
MySQL有整數和浮點數值的列類型,如表1所示。整數列類型可以有符號也可無符號。有一種特殊的屬性允許整數列值自動生成,這對需要唯一序列或標識號的應用系統來說是非常有用的。
類型 說明
TINYINT 非常小的整數
SMALLINT 較小整數
MEDIUMINT 中等大小整數
INT 標准整數
BIGINT 較大整數
FLOAT 單精度浮點數
DOUBLE 雙精度浮點數
DECIMAL 一個串的浮點數
表1:數值列類型
每種數值類型的名稱和取值范圍如表2所示。
類型說明 取值范圍
TINYINT[(M)] 有符號值:-128 到127
無符號值:0到255(0 到28 - 1)
SMALLINT[(M)] 有符號值:-32768 到32767(- 215 到215 - 1)
無符號值:0到65535(0 到21 6 - 1)
MEDIUMINT[(M)] 有符號值:-8388608 到8388607(- 22 3 到22 3 - 1 )
無符號值:0到16777215(0 到22 4 - 1)
INT[(M)] 有符號值:-2147683648 到2147683647(- 231 到231- 1)
無符號值:0到4294967295(0 到232-1)
BIGINT[(M)] 有符號值:-9223372036854775808 到 9223373036854775807(- 263到263-1)
無符號值:0到18446744073709551615(0到264 – 1)
FLOAT[(M, D)] 最小非零值:±1.175494351E - 38
DOUBLE[(M,D)] 最小非零值:±2.2250738585072014E - 308
DECIMAL (M, D) 可變;其值的范圍依賴於M 和D
表2:數值列類型的取值范圍
類型說明 存儲需求
TINYINT[(M)] 1位元組
SMALLINT[(M)] 2位元組
MEDIUMINT[(M)] 3位元組
INT[(M)] 4位元組
BIGINT[(M)] 8位元組
FLOAT[(M, D)] 4位元組
DOUBLE[(M, D)] 8位元組
DECIMAL (M, D) M位元組(MySQL < 3.23),M+2位元組(MySQL > 3.23 )
表3:數值列類型的存儲需求
MySQL提供了五種整型: TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。INT為INTEGER的縮寫。這些類型在可表示的取值范圍上是不同的。整數列可定義為UNSIGNED從而禁用負值;這使列的取值范圍為0以上。各種類型的存儲量需求也是不同的。取值范圍較大的類型所需的存儲量較大。
MySQL 提供三種浮點類型: FLOAT、DOUBLE和DECIMAL。與整型不同,浮點類型不能是UNSIGNED的,其取值范圍也與整型不同,這種不同不僅在於這些類型有最大值,而且還有最小非零值。最小值提供了相應類型精度的一種度量,這對於記錄科學數據來說是非常重要的(當然,也有負的最大和最小值)。
在選擇了某種數值類型時,應該考慮所要表示的值的范圍,只需選擇能覆蓋要取值的范圍的最小類型即可。選擇較大類型會對空間造成浪費,使表不必要地增大,處理起來沒有選擇較小類型那樣有效。對於整型值,如果數據取值范圍較小,如人員年齡或兄弟姐妹數,則TINYINT最合適。MEDIUMINT能夠表示數百萬的值並且可用於更多類型的值,但存儲代價較大。BIGINT在全部整型中取值范圍最大,而且需要的存儲空間是表示範圍次大的整型INT類型的兩倍,因此只在確實需要時才用。對於浮點值,DOUBLE佔用FLOAT的兩倍空間。除非特別需要高精度或范圍極大的值,一般應使用只用一半存儲代價的FLOAT型來表示數據。
在定義整型列時,可以指定可選的顯示尺寸M。如果這樣,M應該是一個1 到255的整數。它表示用來顯示列中值的字元數。例如,MEDIUMINT(4)指定了一個具有4個字元顯示寬度的MEDIUMINT列。如果定義了一個沒有明確寬度的整數列,將會自動分配給它一個預設的寬度。預設值為每種類型的「最長」值的長度。如果某個特定值的可列印表示需要不止M個字元,則顯示完全的值;不會將值截斷以適合M個字元。
對每種浮點類型,可指定一個最大的顯示尺寸M 和小數位數D。M 的值應該取1 到255。D的值可為0 到3 0,但是不應大於M - 2(如果熟悉ODBC 術語,就會知道M 和D 對應於ODBC 概念的「精度」和「小數點位數」)。M和D對FLOAT和DOUBLE 都是可選的,但對於DECIMAL是必須的。在選項M 和D時,如果省略了它們,則使用預設值。
2.2字元串列類型
MySQL提供了幾種存放字元數據的串類型,其類型如下:
類型名 說明
CHAR 定長字元串
VARCHAR 可變長字元串
TINYBLOB 非常小的BLOB(二進制大對象)
BLOB 小BLOB
MEDIUMBLOB 中等的BLOB
LONGBLOB 大BLOB
TINYTEXT 非常小的文本串
TEXT 小文本串
MEDIUMTEXT 中等文本串
LONGTEXT 大文本串
ENUM 枚舉;列可賦予某個枚舉成員
SET 集合;列可賦予多個集合成員
表4:字元串列類型
下表給出了MySQL 定義串值列的類型,以及每種類型的最大尺寸和存儲需求。對於可變長的列類型,各行的值所佔的存儲量是不同的,這取決於實際存放在列中的值的長度。這個長度在表中用L 表示。
類型說明
最大尺寸
存儲需求
CHAR( M)
M 位元組
M 位元組
VARCHAR(M)
M 位元組
L + 1位元組
TINYBLOB, TINYTEXT
28- 1位元組
L + 1位元組
BLOB, TEXT
216 - 1 位元組
L + 2位元組
MEDIUMBLOB, MEDIUMTEXT
224- 1位元組
L + 3位元組
LONGBLOB, LONGTEXT
232- 1位元組
L + 4位元組
ENUM(「value1」, 「value2」, ...)
65535 個成員
1 或2位元組
SET (「value1」, 「value2」, ...)
64個成員
1、2、3、4 或8位元組
表5:串列類型最大尺寸及存儲需求
L 以外所需的額外位元組為存放該值的長度所需的位元組數。MySQL 通過存儲值的內容及其長度來處理可變長度的值。這些額外的位元組是無符號整數。請注意,可變長類型的最大長度、此類型所需的額外位元組數以及佔用相同位元組數的無符號整數之間的對應關系。例如,MEDIUMBLOB 值可能最多224 - 1位元組長並需要3 個位元組記錄其結果。3 個位元組的整數類型MEDIUMINT 的最大無符號值為224 - 1。這並非偶然。
2.3日期時間列類型
MySQL 提供了幾種時間值的列類型,它們分別是: DATE、DATETIME、TIME、TIMESTAMP和YEAR。下表給出了MySQL 為定義存儲日期和時間值所提供的這些類型,並給出了每種類型的合法取值范圍。
類型名 說明
DATE 「YYYY-MM-DD」格式表示的日期值
TIME 「hh:mm:ss」格式表示的時間值
DATETIME 「YYYY-MM-DD hh:mm:ss」格式
TIMESTAMP 「YYYYMMDDhhmmss」格式表示的時間戳值
YEAR 「YYYY」格式的年份值
表6:日期時間列類型
下面舉個例子:
這個例子創建一個student表,這個表中有name欄位,字元類型列,不允許NULL(空值)。有Chinese、Maths和English三個整數類型列。還有個Birthday日期類型列。
CREATE TABLE student
(
Name varchar(20) NOT NULL,
Chinese TINYINT(3),
Maths TINYINT(3),
English TINYINT(3),
Birthday DATE
)
⑵ sql定義語句
定義各種資料庫的「對象」
模式定義
表定義
視圖定義
索引定義
SQL的數據定義語句
⑶ SQL的定義功能是什麼
SQL全稱是「結構化查詢語言(Structured
Query
Language)」,最早的是IBM的聖約瑟研究實驗室為其關系資料庫管理系統SYSTEM
R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言,得到了廣泛的應用。如今無論是像Oracle
,Sybase,Informix,SQL
server這些大型的資料庫管理系統,還是像Visual
Foxporo,PowerBuilder這些微機上常用的資料庫開發系統,都支持SQL語言作為查詢語言。
⑷ 在sql語句中定義資料庫的語句是
在sql語句中定義資料庫的語句是資料庫、表、視圖、索引、存儲過程,例如CREATE、DROP、ALTER等等。SQL語言(即結構化查詢語言)主要用於存取數據、查詢數據、更新數據和管理關系資料庫系統,SQL語言由IBM開發。DDL語句,資料庫定義語句:資料庫、表、視圖、索引、存儲過程,例如CREATE、DROP、ALTER等等。
⑸ SQL 查詢語句如何定義變數
as在SQL中是別名的用法,它可以為表名取別名,也可以為列名取別名,
其作用主要是為了增加可讀性。
⑹ sql 語句 中的表示什麼意思
在sql中?是表示佔位符
是在程序里需要進行設置的參數
例子:
pre = conn.prepareStatement("select * from usermsg where username=?");//佔位符
pre.setString(1, username);//設置參數
使用PreparedStatement和Connection 訪問資料庫
⑺ SQL語句是什麼意思
以下摘自網路 SQL基本語句 來自:SQL編程技巧
掌握SQL四條最基本的數據操作語句:Insert,Select,Update和Delete。
練掌握SQL是資料庫用戶的寶貴財 富。在本文中,我們將引導你掌握四條最基本的數據操作語句—SQL的核心功能—來依次介紹比較操作符、選擇斷言以及三值邏輯。當你完成這些學習後,顯然你已經開始算是精通SQL了。
在我們開始之前,先使用CREATE TABLE語句來創建一個表(如圖1所示)。DDL語句對資料庫對象如表、列和視進行定義。它們並不對表中的行進行處理,這是因為DDL語句並不處理資料庫中實際的數據。這些工作由另一類SQL語句—數據操作語言(DML)語句進行處理。
SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由於這是大多數SQL用戶經常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在後面的例子中將要用到它。
INSERT語句
用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員John Smith的記錄插入到本例的表中,可以使用如下語句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通過這樣的INSERT語句,系統將試著將這些值填入到相應的列中。這些列按照我們創建表時定義的順序排列。在本例中,第一個值「Smith」將填到第一個列LAST_NAME中;第二個值「John」將填到第二列FIRST_NAME中……以此類推。
我們說過系統會「試著」將值填入,除了執行規則之外它還要進行類型檢查。如果類型不符(如將一個字元串填入到類型為數字的列中),系統將拒絕這一次操作並返回一個錯誤信息。
如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務的支持。一次事務將資料庫從一種一致性轉移到另一種一致性。如果事務的某一部分失敗,則整個事務都會失敗,系統將會被恢復(或稱之為回退)到此事務之前的狀態。
回到原來的INSERT的例子,請注意所有的整形十進制數都不需要用單引號引起來,而字元串和日期類型的值都要用單引號來區別。為了增加可讀性而在數字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。
同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。
對於日期類型,我們必須使用SQL標准日期格式(yyyy-mm-dd),但是在系統中可以進行定義,以接受其他的格式。當然,2000年臨近,請你最好還是使用四位來表示年份。
既然你已經理解了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中的一種特殊情況,我們以後將進行詳細的討論。現在我們只需認為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項(這兩項規定不能為空),SQL操作將失敗。
讓我們來看一看上述INSERT語句的語法圖:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
和前一篇文章中一樣,我們用方括弧來表示可選項,大括弧表示可以重復任意次數的項(不能在實際的SQL語句中使用這些特殊字元)。VALUE子句和可選的列名列表中必須使用圓括弧。
SELECT語句
SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數據是資料庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問資料庫來分析數據並生成報表的人可以對其他SQL語句一竅不通。
SELECT語句的結果通常是生成另外一個表。在執行過程中系統根據用戶的標准從資料庫中選出匹配的行和列,並將結果放到臨時的表中。在直接SQL(direct SQL)中,它將結果顯示在終端的顯示屏上,或者將結果送到列印機或文件中。也可以結合其他SQL語句來將結果放到一個已知名稱的表中。
SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到的關系代數運算「選擇」(或稱「限制」),但實際上它也可以完成其他兩種關系運算—「投影」和「連接」,SELECT語句還可以完成聚合計算並對數據進行排序。
SELECT語句最簡單的語法如下:
SELECT columns FROM tables;
當我們以這種形式執行一條SELECT語句時,系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表。這就是實現關系投影運算的一個形式。
讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以後所有SELECT語句實例都要使用的。而我們在圖2和圖3中給出了查詢的實際結果。我們將在其他的例子中使用這些結果)。
假設你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT語句的執行將產生如圖2中表2所示的結果。
由於我們在SELECT語句中只指定了一個列,所以我們的結果表中也只有一個列。注意結果表中具有重復的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結果中的重復行,只要在SELECT語句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
這次查詢的結果如表3所示。
現在已經消除了重復的行,但結果並不是按照順序排列的。如果你希望以字母表順序將結果列出又該怎麼做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
這一查詢的結果如表4所示。請注意在ORDER BY之後是如何放置列名BRANCH _OFFICE的,這就是我們想要對其進行排序的列。為什麼即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們並不顯示出來。列名BRANCH_ OFFICE之後的關鍵字ASC表示按照升序排列。如果你希望以降序排列,那麼可以用關鍵字DESC。
同樣我們應該指出ORDER BY子句只將臨時表中的結果進行排序;並不影響原來的表。
假設我們希望得到按部門排序並從工資最高的雇員到工資最低的雇員排列的列表。除了工資括弧中的內容,我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
這里我們進行了多列的選擇和排序。排序的優先順序由語句中的列名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現了重復的行時,這些行將被按照第二列進行排序,如果在第二列中又出現了重復的行時,這些行又將被按照第三列進行排序……如此類推。這次查詢的結果如表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'部分就是斷言。在執行該語句時,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,括弧內的表達式返回true,但是NOT操作符將該值取反,所以該行將不被選中。
斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進行求值,可以用括弧將它們括起來:
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用數學上標準的表達式求值的約定—圓括弧內的表達式將最先進行求值,其他表達式將從左到右進行求值。
以上對邏輯連接符進行了說明,在對下面的內容進行說明之前,我們再一次對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的高級教程而不是現在的入門教程中進行介紹。但由於NULL需要進行特殊處理,並且你也很可能會遇到它,所以我們還是簡略地進行一下說明。
首先,在斷言中進行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
相反,如果用戶需要所有已知年薪數據的職員的信息,你可以使用以下語句:
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應該出現在結果表中。因為NULL都是相等的,所以可以想像它們是能夠通過GRADE小於等於SALARY的檢查的。這其實是一個毫無疑義的查詢,但是並沒有關系。SQL允許進行這樣的比較,只要兩個列都是數字類型的。然而,Indiana Jones並沒有出現在查詢的結果中,為什麼?
正如我們早先提到過的,NULL表示未知的值(而不是象某些人所想像的那樣表示一個為NULL的值)。對於SQL來說意味著這個值是未知的,而只要這個值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許除了在true 和false之外還有第三種類型的真值,稱之為「非確定」(unknown)值。
如果比較的兩邊都是NULL,整個斷言就被認為是非確定的。將一個非確定斷言取反或使用AND或OR與其他斷言進行合並之後,其結果仍是非確定的。由於結果表中只包括斷言值為「真」的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符IS NULL和IS NOT NULL。
UPDATE語句
UPDATE語句允許用戶在已知的表中對現有的行進行修改。
例如,我們剛剛發現Indiana Jones的等級為16,工資為$40,000.00,我們可以通過下面的SQL語句對資料庫進行更新(並清除那些煩人的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語句或是「你確認刪除嗎?」之類的警告,在執行這條語句時千萬要小心。如果決定取消Los Angeles辦事處並解僱辦事處的所有職員,這一卑鄙的工作可以由以下這條語句來實現:
DELETE FROM EMPLOYEES
WHERE BRANCH_OFFICE = 'Los Angeles';
如同UPDATE語句中一樣,省略WHERE子句將使得操作施加到表中所有的行。
DELETE語句的語法流圖如下面所示:
DELETE FROM table
[WHERE predicate [ { logical-connector predicate} ] ];
現在我們完成了數據操作語言(DML)的主要語句的介紹。我們並沒有對SQL能完成的所有功能進行說明。SQL還提供了許多的功能,如求平均值、求和以及其他對表中數據的計算,此外SQL還能完成從多個表中進行查詢(多表查詢,或稱之為連接)的工作。這種語言還允許你使用GRANT和REVOKE命令控制使用者的數據訪問許可權。
⑻ SQL語句定義一個函數
--a為學生表,b為成績表,c為課程表
create function test(@id varchar(10))
returns table
return
select a.id,a.name,c.kcname,c.kcnumber,b.scores from a
left join b on b.id=a.id
left join c on c.id=a.id
where a.id=@id
這樣應該對的,希望可以幫到你。
⑼ 在SQL語句的定義我想問下,這句中的這句是什麼意思啊
意思就是說把id欄位設置為主鍵,主鍵名稱為pk_id
後面的on primary表示說這個表創建在primary這個文件組上。
另外需要指出的是,主鍵默認為聚集索引,你這樣執行命令後,就會自動在id欄位上創建一個聚集索引
以後插入到表裡的數據就按照id的升序排列存儲