SQL 是一種結(jié)構(gòu)化的查詢語言,是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言(關(guān)于SQL語言有一個專門的ANSI標(biāo)準(zhǔn))。下面主要介紹一下在實際操作中常用的一些命令和函數(shù)。
一.建一個新的數(shù)據(jù)庫
例:creat database mydata /*mydata是你想要建的庫的名字*/
二.在庫中建一個新表單
例:CREATE TABLE mydiary (weather VARCHAR(40),comments TEXT,thedate DATETIME)
你所創(chuàng)建的表名為mydiary,你可以使用這個表來存儲來字你的日記。你是用CREATE TABLE語句創(chuàng)建的這個表,這個語句有兩部分:第一部份指定表的名子;第二部份是括在括號中的各字段的名稱和屬性,相互之間用逗號隔開。
表mydiary有三個字段:weather,comments 和thedate。wearher字段存儲天氣,comments字段存儲內(nèi)容,thedate字段存儲日記記錄的日期。
注意每個字段名后面都跟有一個專門的表達(dá)式。例如,字段名comments后面跟有表達(dá)式TEXT。這個表達(dá)式指定了字段的數(shù)據(jù)類型。數(shù)據(jù)類型決定了一個字段可以存儲什么樣的數(shù)據(jù)。因為字段comments包含文本信息,其數(shù)據(jù)類型定義為文本型。
字段有許多不同的數(shù)據(jù)類型。
不同的字段類型用來存放不同類型的數(shù)據(jù)。創(chuàng)建和使用表時,更你應(yīng)該理解五種常用的字段類型:字符型,文本型,數(shù)值型,邏輯性和日期型。
1.字符型數(shù)據(jù)
請看下面這個例子:
CREATE TABLE mydairy (weather VARCHAR(40),comments TEXT,thedate DATETIME)
CREATE TABLE mydairy (weather CHAR(40),comments TEXT,thedate DATETIME)
用VARCHAR定義的字段可用來存放可變長度的字符串信息.但是VARCHAR類型可以存儲的字符串最長為255個字符。要存儲更長的字符串?dāng)?shù)據(jù),可以使用文本型數(shù)據(jù)。而表達(dá)式CHAR指定了這個字段應(yīng)該是固定長度的字符串。VARCHAR型和CHAR型數(shù)據(jù)的這個差別是細(xì)微的,但是非常重要。假如你向一個長度為四十個字符的VARCHAR型字段中輸入數(shù)據(jù)Bill Gates。當(dāng)你以后從這個字段中取出此數(shù)據(jù)時,你取出的數(shù)據(jù)其長度為十個字符--字符串Bill Gates的長度。
現(xiàn)在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那么當(dāng)你取出數(shù)據(jù)時,所取出的數(shù)據(jù)長度將是四十個字符。字符串的后面會被附加多余的空格。
2.文本型數(shù)據(jù)
例子:
CREATE TABLE mydairy (weather VARCHAR(40),comments TEXT,thedate DATETIME)
在這個例子中,字段comments被用來存一段信息。注意文本型數(shù)據(jù)沒有長度. 一旦你向文本型字段中輸入了任何數(shù)據(jù)(甚至是空值),就會有2K的空間被自動分配給該數(shù)據(jù)。除非刪除該記錄,否則你無法收回這部分存儲空間。
3.數(shù)值型數(shù)據(jù)
例子:
CREATE TABLE article (articlename VARCHAR(40),article_charnum INT)
為了節(jié)省內(nèi)存空間,你可以使用SMALLINT型數(shù)據(jù)。SMALLINT 型數(shù)據(jù)可以存儲從-32768到32768的整數(shù)。這種數(shù)據(jù)類型的使用方法與INT型完全相同。
最后,如果你實在需要節(jié)省空間,你可以使用TINYINT型數(shù)據(jù)。同樣,這種類型的使用方法也與INT型相同,不同的是這種類型的字段只能存儲從0到255的整數(shù)。TINYINT型字段不能用來存儲負(fù)數(shù)。
為了能對字段所存放的數(shù)據(jù)有更多的控制,你可以使用NUMERIC型數(shù)據(jù)來同時表示一個數(shù)的整數(shù)部分和小數(shù)部分。NUMERIC型數(shù)據(jù)使你能表示非常大的數(shù)--比INT型數(shù)據(jù)要大得多。一個NUMERIC型字段可以存儲從-1038到1038范圍內(nèi)的數(shù)。NUMERIC型數(shù)據(jù)還使你能表示有小數(shù)部分的數(shù)。例如,你可以在NUMERIC型字段中存儲小數(shù)0.01。
當(dāng)定義一個NUMERIC型字段時,你需要同時指定整數(shù)部分的大小和小數(shù)部分的大小。這里有一個使用這種數(shù)據(jù)類型的例子:
CREATE TABLE numeric_data (bignum NUMERIC(28,0),smallnum NUMERIC (6,3) )
當(dāng)這個語句執(zhí)行時,將創(chuàng)建一個名為numeric_data的包含兩個字段的表。字段bignum可以存儲直到28位的整數(shù)。字段smallnum可以存儲有6位整數(shù)部分和3位小數(shù)部分的小數(shù)。
一個NUMERIC型數(shù)據(jù)的整數(shù)部分最大只能有28位,小數(shù)部分的位數(shù)必須小于或等于整數(shù)部分的位數(shù),小數(shù)部分可以是零。
你可以使用INT型或NUMERIC型數(shù)據(jù)來存儲錢數(shù)。但是,專門有另外兩種數(shù)據(jù)類型用于此目的。MONEY型數(shù)據(jù)可以存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數(shù)。如果你需要存儲比這還大的金額,你可以使用NUMERIC型數(shù)據(jù)。SMALLMONEY型數(shù)據(jù)只能存儲從-214,748.3648到214,748.3647 的錢數(shù)。同樣,如果可以的話,你應(yīng)該用SMALLMONEY型來代替MONEY型數(shù)據(jù),以節(jié)省空間。下面的例子顯示了如何使用這兩種表示錢的數(shù)據(jù)類型:
CREATE TABLE books (bookname VARCHAR(40), a_book_price SMALLMONEY,total_price MONEY )
這個表可以用來存儲書的單價和出售總價。字段price 的數(shù)據(jù)類型是MONEY,字段a_book_price的數(shù)據(jù)類型是SMALLMONEY。
4.存儲邏輯值
BIT型字段不能取空值,只能取兩個值:0或1。這里有一個如何使用這種字段的例子:
CREATE TABLE right_falese (word VARCHAR(20),last_key BIT)
5.存儲日期和時間
如要存儲日期和時間,你需要使用DATETIME型數(shù)據(jù),如下例所示:
CREATE TABL studylog( coursename VARCHAR (50), begintime DATETIME ,endtime DATETIME)
一個DATETIME型的字段可以存儲的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最后一毫秒。
如果你不需要覆蓋這么大范圍的日期和時間,你可以使用SMALLDATETIME型數(shù)據(jù)。它與DATETIME型數(shù)據(jù)同樣使用,只不過它能表示的日期和時間范圍比DATETIME型數(shù)據(jù)小,而且不如DATETIME型數(shù)據(jù)精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。
DATETIME型字段在你輸入日期和時間之前并不包含實際的數(shù)據(jù),認(rèn)識這一點是重要的。
6.字段屬性(空值,缺省值和標(biāo)識值)。
(1).允許和禁止空值
大多數(shù)字段可以接受空值(NULL)。當(dāng)一個字段接受了空值后,如果你不改變它,它將一直保持空值??罩?NULL)和零是不同的,嚴(yán)格的說,空值表示沒有任何值。
為了允許一個字段接受空值,你要在字段定義的后面使用表達(dá)式NULL。例如,下面的表中兩個字段都允許接受空值:
CREATE TABLE course (coursename CHAR (50) NULL,hours INT NULL)
(2).缺省值
為了在創(chuàng)建一個表時指定缺省值,你可以使用表達(dá)式DEFAULT。請看下面這個在創(chuàng)建表時使用缺省值的例子:
CREATE TABLE message (name VARCHAR(10) NOT NULL,
address VARCHAR(40) NOT NULL,
tel int NULL,
relation VARCHAR(20) DEFAULT 'classmate')
在這個例子中,字段relation的缺省值被指定為classmate。注意單引號的使用,引號指明這是字符型數(shù)據(jù)。為了給非字符型的字段指定缺省值,不要把該值擴在引號中。
(3)標(biāo)識字段
每個表可以有一個也只能有一個標(biāo)識字段。一個標(biāo)識字段是唯一標(biāo)識表中每條記錄的特殊字段。例如,數(shù)據(jù)庫courses中的表course包含了一個唯一標(biāo)識每個工作標(biāo)識字段:
courseid coursename
…………………………………………………………….
1 english
2 chinese
3 math
4 physics
5 chemistry
字段courseid為每個工作提供了唯一的一個數(shù)字。如果你決定增加一個新工作,新增記錄的course字段會被自動賦給一個新的唯一值。
為了建立一個標(biāo)識字段,你只需在字段定義后面加上表達(dá)式IDENTITY即可。你只能把NUMERIC型或INT型字段設(shè)為標(biāo)識字段,這里有一個例子:
CREATE TABLE studentID (theID NUBERIC(15) IDENTITY,name VARCHAR(20))
建立一個標(biāo)示字段時,注意使用足夠大的數(shù)據(jù)類型。例如你使用TINYINT型數(shù)據(jù),那么你只能向表中添加255個記錄。如果你預(yù)計一個表可能會變得很大,你應(yīng)該使用NUMERIC型數(shù)據(jù)。
三.在表中查詢
1.輸入以下的SELECT語句:
SELECT studentname FROM students
這個查詢執(zhí)行后,會取出表students中的所有學(xué)生姓名(沒有特定的順序)。如果表students中包含幾百名學(xué)生,會有幾百個記錄被取出,如果表中有三萬名學(xué)生,這三萬條記錄都會被取出(這也許需要一些時間)。
2.你也可以在一個SELECT語句中一次取出多個字段,比如:
SELECT studentname ,studentid FROM students
在SELECT語句中,你需要列出多少個字段,你就可以列出多少。不要忘了把字段名用逗號隔開。你也可以用星號(*)從一個表中取出所有的字段。這里有一個使用星號的例子:
SELECT * FROM students
這個SELECT語句執(zhí)行后,表中的所有字段的值都被取出。你也可以用一個SELECT語句同時從多個表中取出數(shù)據(jù),只需在SELECT語句的FROM從句中列出要從中取出數(shù)據(jù)的表名稱即可:
SELECT studentname,specialityname FROM students, specialitys
這個SELECT語句執(zhí)行時,同時從表students和表specialitys中取出數(shù)據(jù)。從表students中取出所有的學(xué)生名字,從表specialitys中取出所有的專業(yè)名。但你考慮到?jīng)]有上例從兩個表中選出記錄組合有沒有意義?答案是否定的.要解決這個問題你需要通過建立兩表中字段的關(guān)系來關(guān)聯(lián)兩個表。要做到這一點的途徑之一是創(chuàng)建第三個表,專門用來描述另外兩個表的字段之間的關(guān)系。
表students有一個名為studentid的字段,包含有每個作者的唯一標(biāo)識。表specialitys有一個名為specialityid的字段,包含每個專業(yè)名的唯一標(biāo)識。如果你能在字段studentid和字段specialityid之間建立一個關(guān)系,你就可以關(guān)聯(lián)這兩個表。數(shù)據(jù)庫teaching中有一個名為studentspeciality的表,正是用來完成這個工作。表中的每個記錄包括兩個字段,用來把表students和表specialitys關(guān)聯(lián)在一起。下面的SELECT語句使用了這三個表以得到正確的結(jié)果:
SELECT studentname,speciality FROM students,specialitys,studentspeciality
WHERE students.specialityid=studentspeciality.specialityid
AND specialitys.specialityid=studentspeciality.specialityid
當(dāng)這個SELECT語句執(zhí)行時,每個學(xué)生都與專業(yè)相匹配。表studentspeciality指明了表students和表specialitys的關(guān)系,它通過包含分別來自兩個表的各一個字段實現(xiàn)這一點。第三個表的唯一目的是在另外兩個表的字段之間建立關(guān)系。它本身不包含任何附加數(shù)據(jù)。
注意:在這個例子中字段名是如何書寫的。為了區(qū)別表students和表specialitys中相同的字段名specialityid,每個字段名前面都加上了表名前綴和一個句號。
3.通常,當(dāng)你從一個表中取出字段值時,該值與創(chuàng)建該表時所定義的字段名聯(lián)系在一起。
下例:SELECT studentname "the name of student" FROM students
當(dāng)這個SELECT語句執(zhí)行時,來自字段studentname的值會與"the name of student"相聯(lián)系。查詢結(jié)果可能是這樣:
the name of student
……………………………………………………………………..
小新
小白
小生
......
(30 row(s) affected)
你也可以通過執(zhí)行運算,來操作從一個表返回的字段值。例如,如果你想把表books中的所有書的價格加倍,你可以使用下面的SELECT語句:
SELECT a _book_price*2 FROM books
你可以使用大多數(shù)標(biāo)準(zhǔn)的數(shù)學(xué)運算符來操作字段值,如加(+),減(-),乘(*)和除(/)。你也可以一次對多個字段進(jìn)行運算,例如:
SELECT a_book_price*sales_num"total money" FROM books
4.排序查詢結(jié)果
看一列沒有特定順序的名字是很不方便的。如果把這些名字按字母順序排列,讀起來就會容易得多。通過使用ORDER BY子句,你可以強制一個查詢結(jié)果按升序排列,就像這樣:
SELECT studentname FROM students ORDER BY studentname
當(dāng)這個SELECT語句執(zhí)行時,學(xué)生名字的顯示將按字母順序排列。ORDER BY子句將學(xué)生名字按升序排列。
而下例:SELECT studentname,speciality FROM students ORDER BY studentname ,speciality
這個查詢首先把結(jié)果按studentname字段進(jìn)行排序,然后按字段speciality排序。記錄將按如下的順序取出:
studentname speciality
…………………………………………………………………….
小白 幼教
小新 光電
小生 無線電
小軍 檔案
…
(23 row(s) affected)
你也可以按數(shù)值型字段對一個查詢結(jié)果進(jìn)行排序。例如,如果你想按降序取出所有書的價格,你可以使用如下的SQL查詢:
SELECT a_book_price FROM books ORDER BY a_book_price DESC
這個SELECT語句從表中取出所有書的價格,顯示結(jié)果時,價格低的書先顯示,價格高的書后顯示。
5.取出互不相同的記錄
在特定情況下,你可能只有興趣從一個表中取出互不相同的值。如果一個字段有重復(fù)的值,你也許希望每個值只被選取一次,你可以使用關(guān)鍵字DISTINCT來做到這一點:
SELCET DISTINCT studentname FROM students WHERE studentname='小白'
當(dāng)這個SELECT語句執(zhí)行時,只返回一個記錄。通過在SELECT語句中包含關(guān)鍵字DISTINCT,你可以刪除所有重復(fù)的值。
四.向表中添加數(shù)據(jù)
向表中添加一個新記錄,你要使用 INSERT 語句。這里有一個如何使用這種語句的例子:
INSERT students (studentname) VALUES ('one name')
這個語句把字符串'one name'插入表students的sudentname字段中。將要被插入數(shù)據(jù)的字段的名字在第一個括號中指定,實際的數(shù)據(jù)在第二個括號中給出。
INSERT 語句的完整句法如下:
INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |Values_list | elect_statement}
如果你在INSERT 語句中只指定兩個字段和數(shù)據(jù)會怎么樣呢?換句話說,你向一個表中插入一條新記錄,但有一個字段沒有提供數(shù)據(jù)。在這種情況下,有下面的四種可能:
1.如果該字段有一個缺省值,該值會被使用。
2.如果該字段可以接受空值,而且沒有缺省值,則會被插入空值。
3.如果該字段不能接受空值,而且沒有缺省值,就會出現(xiàn)錯誤。你會收到錯誤信息:The column in table mytable may not be null.
4. 最后,如果該字段是一個標(biāo)識字段,那么它會自動產(chǎn)生一個新值。當(dāng)你向一個有標(biāo)識字段的表中插入新記錄時,只要忽略該字段,標(biāo)識字段會給自己賦一個新值。
五.刪除記錄
要從表中刪除一個或多個記錄,需要使用DELETE語句。你可以給DELETE 語句提供WHERE 子句。WHERE子句用來選擇要刪除的記錄。例如,下面的這個DELETE語句只刪除字段studentname的值等于'小生'的記錄:
DELETE students WHERE studentname='小生'
DELETE 語句的完整句法如下:
DELETE [FROM] {table_name|view_name} [WHERE clause]
在SQL SELECT 語句中可以使用的任何條件都可以在DELECT 語句的WHERE子句 中使用。例如,下面的這個DELETE語句只刪除那些studentname字段的值為'小白'或speciality字段的值為'幼教'的記錄:
DELETE students WHERE studentname='小白' OR speciality='幼教'
六.更新記錄
要修改表中已經(jīng)存在的一條或多條記錄,應(yīng)使用SQL UPDATE語句。同DELETE語句一樣,UPDATE語句可以使用WHERE子句來選擇更新特定的記錄。請看這個例子:
UPDATE students SET speciality='教育' WHERE speciality='幼教'
這個UPDATE 語句更新所有speciality字段的值為'幼教'的記錄。對所有被選中的記錄,字段speciality的值被置為'教育'。
下面是UPDATE語句的完整句法:
UPDATE {table_name|view_name} SET [{table_name|view_name}]
{column_list|variable_list|variable_and_column_list}
[,{column_list2|variable_list2|variable_and_column_list2}…
[,{column_listN|variable_listN|variable_and_column_listN}]]
[WHERE clause]
注意:如果你不提供WHERE子句,表中的所有記錄都將被更新。
七.建立索引
索引有兩種類型:聚簇索引和非聚簇索引。在聚簇索引中,索引樹的葉級頁包含實際的數(shù)據(jù):記錄的索引順序與物理順序相同。在非聚簇索引中,葉級頁指向表中的記錄:記錄的物理順序與邏輯順序沒有必然的聯(lián)系。
如:CREATE INDEX studentname_index ON students (studentname)
這個語句建立了一個名為studentname_index的索引。你可以給一個索引起任何名字,但你應(yīng)該在索引名中包含所索引的字段名,這對你將來弄清楚建立該索引的意圖是有幫助的。
索引studentname_index對表students的studentname字段進(jìn)行。這是個非聚簇索引,也是個非唯一索引。(這是一個索引的缺省屬性)
如果你需要改變一個索引的類型,你必須刪除原來的索引并重建 一個。建立了一個索引后,你可以用下面的SQL語句刪除它:
DROP INDEX students.studentname_index
要建立一個聚簇索引,可以使用關(guān)鍵字CLUSTERED。記住一個表只能有一個聚簇索引。這里有一個如何對一個表建立聚簇索引的例子:
CREATE CLUSTERED INDEX studentname_clust_index ON students(studentname)
如果表中有重復(fù)的記錄,當(dāng)你試圖用這個語句建立索引時,會出現(xiàn)錯誤。但是有重復(fù)記錄的表也可以建立索引;你只要使用關(guān)鍵字ALLOW_DUP_ROW把這一點告訴SQL Sever即可:
CREATE CLUSTERED INDEX studentname_clust_index ON students(studentname)
WITH ALLOW_DUP_ROW
這個語句建立了一個允許重復(fù)記錄的聚簇索引。你應(yīng)該盡量避免在一個表中出現(xiàn)重復(fù)記錄,但是,如果已經(jīng)出現(xiàn)了,你可以使用這種方法。
要對一個表建立唯一索引,可以使用關(guān)鍵字UNIQUE。對聚簇索引和非聚簇索引都可以使用這個關(guān)鍵字。這里有一個例子:
CREATE UNIQUE COUSTERED INDEX studentname_clust_index ON students(studentname)
唯一索引是指該字段不能有重復(fù)的值,而不是只能建立這一個索引。
最后,要建立一個對多個字段的索引──復(fù)合索引──在索引建立語句中同時包含多個字段名。下面的例子對studentname和speciality兩個字段建立索引:
CREATE INDEX student_speciality_index ON students(studentname,speciality)
這個例子對兩個字段建立了單個索引。在一個復(fù)合索引中,你最多可以對16個字段進(jìn)行索引。
|
|