1. txt導入ACCESS的sql語句
思路:
1 讀取txt 按行
2 分隔chr(10)
3 拼接sql ,insert into 表 values 分隔欄位1 分隔欄位2 分隔欄位3.。。。
4 執行Conn.Execute sql
2. 如何用SQL語句把表中的數據轉化成txt
新建一個文本文攔銷件 CX.TXT,內容如下
use yourdatabasename
go
select field1,field2,,,,, from tablename
go
---以下接著寫查詢語句,
----------------------------------
第二個文件 :查詢.BAT 批處理文件
OSQL -S Servername -U logid -P password -i cx.txt -o 查詢結果.TXT
----------------------------
把OSQL.EXE 和這二個文件放在同一文件夾里,雙簡轎游擊 查詢.BAT 就會生成 查詢結果.TXT 這個文件了帆輪,裡面就是文本格式的。
3. sql語法查詢數據都有什麼語法
http://www.eeyes.net/et/etnew/jiaocheng/sql.txt
或:
SQL介紹
使用SELECT 語句從表中取數據
創建新表
欄位屬性
向表中添加數據
刪除和修改表
為了建立交互站點,你需要使用資料庫來存儲來自訪問者的信息。例如,你要建立一個職業介紹服務的站點,你就需要存儲諸如個人簡歷,所感興趣的工作等等這樣的信息。創建動態網葉也需要使用資料庫,如果你想顯示符合來訪者要求的最好的工作,你就需要從資料庫中取出這份工作的信息。你將會發現,在許多情況下需要使用資料庫。
在這一章里,你將學會怎樣使用"結構化查詢語言"(SQL〕來操作資料庫。SQL語言是資料庫的標准語言。在Active Sever Pages 中,無論何時你要訪問一個資料庫,你就要使用SQL語言。因此,掌握好SQL對ASP編程是非常重要的。
注意:
你可以把"SQL"讀作"sequel",也可以按單個字母的讀音讀作S-Q-L。 兩種發音都是正確的,每種發音各有大量的支持者。在本書里,認為"SQL"讀作"sequel"。
通過這一章的學習,你將理解怎樣用SQL實現資料庫查詢,你將學會怎樣使用這種查詢從數據表中取出信息,最後,你將學會怎樣設計和建立自己的資料庫。
注意:
通過下面幾章對SQL的介紹,你將對SQL有足夠的了解,從而可以有效地使用Active Sever Pages。但是,SQL是一種復雜的語言,本書不可能包括它的全部細節。要全面掌握SQL語言,你需要學習在Microsoft SQL Sever 中使用SQL。你可以到附近的書店去買一本Microsoft SQL Sever 6.5。
SQL介紹:
本書假設你是在SQL操作Microsoft SQL Sever 的資料庫。你也可以用SQL操作許多其它類型的資料庫。SQL是操作資料庫的標准語言。(事實上,關於SQL語言有一個專門的ANSI標准〕
注意:
不要在你的站點上試圖用Microsoft Access代替Microsoft SQL Sever。SQL Sever可以同時服務於許多用戶,如果你希望你的站點有較高的訪問率,MS Access是不能勝任的。
在學習SQL的細節之前,你需要理解它的兩大特點。一個特點容易掌握,另一個掌握起來有點困難。
第一個特點是所有SQL資料庫中的數據都存儲在表中。一個表由行和列組成。例如,下面這個簡單的表包括name 和e-mail address:
Name Email Address
................................................................
Bill Gates [email protected]
president Clinton [email protected]
Stephen Walther [email protected]
這個表有兩列(列也稱為欄位,域〕:Name和Email Address。有三行,每一行包含一組數據。一行中的數據組合在一起稱為一條記錄。
無論何時你向表中添加新數據,你就添加了一條新記錄。一個數據表可以有幾十個記錄,也可以有幾千甚至幾十億個記錄。雖然你也許永遠不需要存儲十億個Email地址,但知道你能這樣做總是好的,也許有一天你會有這樣的需要。
你的資料庫很有可能包含幾十個表,所有存儲在你資料庫中的信息都被存儲在這些表中。當你考慮怎樣把信息存儲在資料庫中時,你應該考慮怎樣把它們存儲在表中。
SQL的第二個特點有些難於掌握。這種語言被設計為不允許你按照某種特定的順序來取出記錄,因為這樣做會降低SQL Sever取記錄的效率。使用SQL,你只能按查詢條件來讀取記錄。
當考慮如何從表中取出記錄時,自然會想到按記錄的位置讀取它們。例如,也許你會嘗試通過一個循環,逐個記錄地掃描,來選出特定的記錄。在使用SQL時,你必須訓練自己,不要有這種思路。
假如你想選出所有的名字是"Bill Gates"的記錄,如果使用傳統的編程語言,你也許會構造一個循環,逐個查看錶中的記錄,看名字域是否是"Bill Gates"。
這種選擇記錄的方法是可行的,但是效率不高。使用SQL,你只要說,"選擇所有名字域等於Bill Gates的記錄",SQL就會為你選出所有符合條件的記錄。SQL會確定實現查詢的最佳方法。
建設你想取出表中的前十個記錄。使用傳統的編程語言,你可以做一個循環,取出前十個記錄後結束循環。但使用標準的SQL查詢,這是不可能實現的。從SQL的角度來說,在一個表中不存在前十個記錄這種概念。
開始時,當你知道你不能用SQL實現某些你感覺應該能實現的功能,你會受到挫折。你也許會以頭撞牆甚至想寫惡毒的信件給SQL的設計者們。但後來你會認識到,SQL的這個特點不僅不是個限制,反而是其長處。因為SQL不根據位置來讀取記錄,它讀取記錄可以很快。
綜上所述,SQL有兩個特點:所有數據存儲在表中,從SQL的角度來說,表中的記錄沒有順序。在下一節,你將學會怎樣用SQL從表中選擇特殊的記錄。
使用SQL從表中取記錄。
SQL的主要功能之一是實現資料庫查詢。如果你熟悉Internet 引擎,那麼你已經熟悉查詢了。你使用查詢來取得滿足特定條件的信息。例如,如果你想找到有ASP信息的全部站點,你可以連接到 Yahoo!並執行一個對Active Sever Pages的搜索。在你輸入這個查詢後,你會收到一個列表,表中包括所有其描述中包含搜索表達式的站點。
多數Internet 引擎允許邏輯查詢。在邏輯查詢中,你可以包括特殊的運算符如AND、OR和NOT,你使用這些運算符來選擇特定的記錄。例如,你可以用AND來限制查詢結果。如果你執行一個對Active Sever Pages AND SQL的搜索。你將得到其描述中同時包含Active Sever Pages 和SQL的記錄。當你需要限制查詢結果時,你可以使用AND。
如果你需要擴展查詢的結果,你可以使用邏輯操作符OR。例如,如果你執行一個搜索,搜索所有的其描述中包含Active Sever Pages OR SQL的站點,你收到的列表中將包括所有其描述中同時包含兩個表達式或其中任何一個表達式的站點。
如果你想從搜索結果中排除特定的站點,你可以使用NOT。例如,查詢"Active Sever Pages "AND NOT "SQL"將返回一個列表,列表中的站點包含Active Sever Pages,但不包含SQL。當必須排除特定的記錄時,你可以使用NOT。
用SQL執行的查詢與用Internet搜索引擎執行的搜索非常相似。 當你執行一個SQL查詢時,通過使用包括邏輯運算符的查詢條件,你可以得到一個記錄列表。此時查詢結果是來自一個或多個表。
SQL查詢的句法非常簡單。假設有一個名為email_table 的表,包含名字和地址兩個欄位,要得到Bill Gates 的e_mail地址,你可以使用下面的查詢:
SELECT email from email_table WHERE name="Bill Gates"
當這個查詢執行時,就從名為email_table的表中讀取Bill Gates的e_mail 地址。這個簡單的語句包括三部分:
■ SELECT語句的第一部分指名要選取的列。在此例中,只有email列被選取。當執行 時,只顯示email列的值 [email protected]。
■ SELECTT語句的第二部份指明要從哪個(些)表中查詢數據。在此例中,要查詢的表名為email_table 。
■ 最後,SELECT語句的WHERE子句指明要選擇滿足什麼條件的記錄。在此例中,查詢條件為只有name列的值為Bill Gates 的記錄才被選取。
Bill Gates很有可能擁有不止一個email地址。如果表中包含Bill Gates的多個email地址。用上述的SELECT語句可以讀取他所有的email地址。SELECT語句從表中取出所有name欄位值為Bill Gates 的記錄的email 欄位的值。
前面說過,查詢可以在查詢條件中包含邏輯運算符。假如你想讀取Bill Gates 或Clinton總統的所有email地址,你可以使用下面的查詢語句:
SELECT email FROM email_table WHERE name="Bill Gates" OR
name="president Clinton"
此例中的查詢條件比前一個復雜了一點。這個語句從表email_table中選出所有name列為Bill Gates或president Clinton的記錄。如果表中含有Bill Gates或president Clinton的多個地址,所有的地址都被讀取。
SELECT語句的結構看起來很直觀。如果你請一個朋友從一個表中為你選擇一組記錄,你也許以非常相似的方式提出你的要求。在SQL SELECT語句中,你"SELECT特定的列FROM一個表WHERE某些列滿足一個特定的條件"。
下一節將介紹怎樣執行SQL查詢來選取記錄。這將幫助你熟悉用SELECT語句從表中取數據的各種不同方法。
使用ISQL執行SELECT查詢
當你安裝SQL Sever時,你同時安裝了一個叫作ISQL/w的應用程序。ISQL/w允許你執行交互的SQL查詢。在把查詢包括到你的ASP網頁中之前,用ISQL/w對其進行測試是非常有用的。
注意:
在這本書的第一部份,你學習了怎樣安裝和配置Microsoft SQL Sever 。如果沒有安裝SQL Sever或者SQL Sever不能運行,請參閱第三章"安裝和使用SQL Sever"。
選擇任務上SQL Sever程序組中的ISQL_w以啟動該程序。程序啟動時,首先會出現一個對話框,要求輸入伺服器信息和登錄信息(見圖10.1)。在Sever框中,輸入你的SQL伺服器的名字。如果伺服器正運行在本地計算機上,伺服器名字就是你計算機的名字。在登錄信息框中,輸入一個登錄帳號和密碼或選擇使用"可信連接",然後單擊Connect按鈕。
圖10。1
注意:
如果你將SQL Sever配置為使用完整安全或混合安全,那麼你可以使用可信連接。如果你使用標准安全,你則需要提供用戶帳號和密碼。要了解更多信息,參見第三章。
如果一切正常,在你單擊連接按鈕後會出現一個查詢窗口,如圖10.2所示。(如果有異常,請參考第三章)
圖10.2
在執行查詢之前,你需要選擇資料庫。安裝 SQL Sever時你已為自己創建了一個資料庫,SQL Sever還有許多系統資料庫,如master,model,msdb,和tempdb。
方便的是,SQL Sever帶有一個特殊的名為pubs的例子資料庫。庫 pubs中包含供一個虛擬的出版商使用的各個表。文檔中所有的例子程序都是針對這個庫來設計的。本書中的許多例子也使用這個資料庫。
在查詢窗口頂部的DB下拉框中選擇資料庫pubs,這樣你就選擇了資料庫。你所有的查詢都將針對這個庫中的各個表來執行。現在你可以執行你的第一個查詢了。這真讓人興奮!
你的第一個查詢將針對一個名為autrors的表,表中包含所有為某個虛擬出版商工作的作者的相關數據。單擊查詢窗口並輸入以下的語句:
SELECT phone FROM authors WHERE au_name="Ringer"
輸入完成後,單擊執行查詢按鈕(一個綠色三角形,看起來像VCR播放鍵)。單擊此按鈕後,任何出現在查詢窗口中的語句均會被執行。查詢窗口會自動變成結果顯示窗口,你可以看到查詢的結果(見圖10.3)。
你看到的查詢結果也許與圖10.3所示的不同。在SQL Sever的不同版本中,庫pubs中的數據會有所不同。對SQL Sever 6.5來說,將會找到兩條記錄。結果顯示窗口中應顯示如下內容:
phone
...................
801 826_0752
801 826_0752
(2 row(s) affected)
圖10.3
你所執行的SELECT語句從表authors中取出所有名字為Ringer的作者的電話號碼。你通過在WHERE子句中使用特殊的選擇條件來限制查詢的結果。你也可以忽略選擇條件,從表中取出所有作者的電話號碼。要做到這一點,單擊Query標簽,返回到查詢窗口,輸入以下的SELECT語句:
SELECT Phone FROM authors
這個查詢執行後,會取出表authors中的所有電話號碼(沒有特定的順序)。如果表authors中包含一百個電話號碼,會有一百個記錄被取出,如果表中有十億個電話號碼,這十億條記錄都會被取出(這也許需要一些時間)。
表authrs的欄位包括姓,名字,電話號碼,地址,城市,州和郵政編碼。通過在SELECT語句的第一部份指定它們,你可以從表中取出任何一個欄位。你可以在一個SELECT語句中一次取出多個欄位,比如:
SELECT au_fname ,au_lname, phone FROM authors
這個SELECT語句執行後,將取出這三個列的所有值。下面是這個查詢的結果的一個示例(為了節省紙張,只顯示查詢結果的一部分,其餘記錄用省略號代替):
au_fname au_lname phone
.....................................................................................
Johnson White 408 496_7223
Marjorie Green 415 986_7020
Cheryl Carson 415 548_7723
Michael O'Leary 408 286_2428
...
(23 row(s) affected)
在SELECT語句中,你需要列出多少個欄位,你就可以列出多少。不要忘了把欄位名用逗號隔開。你也可以用星號(*)從一個表中取出所有的欄位。這里有一個使用星號的例子:
SELECT * FROM authors
這個SELECT語句執行後,表中的所有欄位的值都被取出。你會發現你將在SQL查詢中頻繁使用星號。
技巧:
你可以使用星號來查看一個表的所有列的名字。要做到這一點,只需要在執行完SELECT語句後看一下查詢結果的列標題。
操作多個表
到現在為止,你只嘗試了用一句SQL查詢從一個表中取出數據。你也可以用一個SELECT語句同時從多個表中取出數據,只需在SELECT語句的FROM從句中列出要從中取出數據的表名稱即可:
SELECT au_lname ,title FROM authors, titles
這個SELECT語句執行時,同時從表authors和表titles中取出數據。從表authors中取出所有的作者名字,從表titles中取出所有的書名。在ISQL/w程序中執行這個查詢,看一下查詢結果。你會發現一些奇怪的出乎意料的情況:作者的名字並沒有和它們所著的書相匹配,而是出現了作者名字和書名的所有可能的組合,這也許不是你所希望見到的。
出了什麼差錯?問題在於你沒有指明這兩個表之間的關系。你沒有通過任何方式告訴SQL如何把表和表關聯在一起。由於不知道如何關聯兩個表,伺服器只能簡單地返回取自兩個表中的記錄的所有可能組合。
要從兩個表中選出有意義的記錄組合,你需要通過建立兩表中欄位的關系來關聯兩個表。要做到這一點的途徑之一是創建第三個表,專門用來描述另外兩個表的欄位之間的關系。
表authors有一個名為au_id的欄位,包含有每個作者的唯一標識。表titles有一個名為title_id的欄位,包含每個書名的唯一標識。如果你能在欄位au_id和欄位title_id 之間建立一個關系,你就可以關聯這兩個表。資料庫pubs中有一個名為titleauthor的表,正是用來完成這個工作。表中的每個記錄包括兩個欄位,用來把表titles和表authors關聯在一起。下面的SELECT語句使用了這三個表以得到正確的結果:
SELECT au_name,title FROM authors,titles,titleauthor
WHERE authors.au_id=titleauthor.au_id
AND titles.title_id=titleauthor.title_id
當這個SELECT語句執行時,每個作者都將與正確的書名相匹配。表titleauthor指明了表authors和表titles的關系,它通過包含分別來自兩個表的各一個欄位實現這一點。第三個表的唯一目的是在另外兩個表的欄位之間建立關系。它本身不包含任何附加數據。
注意在這個例子中欄位名是如何書寫的。為了區別表authors和表titles中相同的欄位名au_id,每個欄位名前面都加上了表名前綴和一個句號。名為author.au_id 的欄位屬於表authors,名為titleauthor.au_id的欄位屬於表titleauthor,兩者不會混淆。
通過使用第三個表,你可以在兩個表的欄位之間建立各種類型的關系。例如,一個作者也許寫了許多不同的書,或者一本書也許由許多不同的作者共同完成。當兩個表的欄位之間有這種"多對多"的關系時,你需要使用第三個表來指明這種關系。
但是,在許多情況下,兩個表之間的關系並不復雜。比如你需要指明表titles和表publishers之間的關系。因為一個書名不可能與多個出版商相匹配,你不需要通過第三個表來指明這兩個表之間的關系。要指明表titles和表publishers之間的關系,你只要讓這兩個表有一個公共的欄位就可以了。在資料庫pubs中,表titles和表publishers都有一個名為pub_id的欄位。如果你想得到書名及其出版商的一個列表,你可以使用如下的語句:
SELECT title,pub_name FROM titles,publishers
WHERE titles.pub_id=publishers.pub_id
當然,如果一本書是由兩個出版商聯合出版的,那麼你需要第三個表來代表這種關系。
通常,當你予先知道兩個表的欄位間存在"多對多"關系時,就使用第三個表來關聯這兩個表。反之,如果兩個表的欄位間只有"一對一"或"一對多"關系,你可以使用公共欄位來關聯它門。
操作欄位
通常,當你從一個表中取出欄位值時,該值與創建該表時所定義的欄位名聯系在一起。如果你從表authors中選擇所有的作者名字,所有的值將會與欄位名au_lname相聯系。但是在某些情況下,你需要對欄位名進行操作。在SELECT語句中,你可以在預設欄位名後面僅跟一個新名字來取代它。例如,可以用一個更直觀易讀的名字Author Last Name來代替欄位名au_lname:
SELECT au_lname "Author Last Name" FROM authors
當這個SELECT語句執行時,來自欄位au_lname的值會與"Author Last Name"相聯系。查詢結果可能是這樣:
Author Last Name
................................................................................
White
Green
Carson
O'Leary
Straight
...
(23 row(s) affected)
注意欄位標題不再是au_lname,而是被Author Last Name所取代。
你也可以通過執行運算,來操作從一個表返回的欄位值。例如,如果你想把表titles中的所有書的價格加倍,你可以使用下面的SELECT語句:
SELECT price*2 FROM titles
當這個查詢執行時,每本書的價格從表中取出時都會加倍。但是,通過這種途徑操作欄位不會改變存儲在表中的書價。對欄位的運算只會影響SELECT語句的輸出,而不會影響表中的數據。為了同時顯示書的原始價格和漲價後的新價格,你可以使用下面的查詢:
SELECT price "Original price", price*2 "New price" FROM titles
當數據從表titles中取出時,原始價格顯示在標題Original price下面,加倍後的價格顯示在標題New price下面。結果可能是這樣:
original price new price
.........................................................................
19.99 39.98
11.95 23.90
2.99 5.98
19.99 39.98
...
(18 row(s) affected)
你可以使用大多數標準的數學運算符來操作欄位值,如加(+),減(-),乘(*)和除(/)。你也可以一次對多個欄位進行運算,例如:
SELECT price*ytd_sales "total revenue" FROM titles
在這個例子中,通過把價格與銷售量相乘,計算出了每種書的總銷售額。這個SELECT語句的結果將是這樣的:
total revenue
.....................................................
81,859,05
46,318,20
55,978,78
81,859,05
40,619,68
...
(18 row(s) affected)
最後,你還可以使用連接運算符(它看起來像個加號)來連接兩個字元型欄位:
SELECT au_fname+" "+au_lname "author name" FROM authors
在這個例子中,你把欄位au_fname和欄位au_lname粘貼在一起,中間用一個逗號 隔開,並把查詢結果的標題指定為author name。這個語句的執行結果將是這樣的:
author names
..................................................................
Johnson White
Marjorie Green
Cheryl Carson
Michael O'Leary
Dean Straight
...
(23 row(s) affected)
可以看到,SQL為你提供了對查詢結果的許多控制。你應該在ASP編程過程中充分利用這些優點。使用SQL來操作查詢結果幾乎總是比使用有同樣作用的腳本效率更高。
排序查詢結果
本章的介紹中曾強調過,SQL表沒有內在的順序。例如,從一個表中取第二個記錄是沒有意義的。從SQL的角度看來,沒有一個記錄在任何其他記錄之前。
然而,你可以操縱一個SQL查詢結果的順序。在預設情況下,當記錄從表中取出時,記錄不以特定的順序出現。例如,當從表authors中取出欄位au_lname時,查詢結果顯示成這樣:
au_lname
...........................................
White
Green
Carson
O'Leary
Straight
...
(23 row(s) affected)
看一列沒有特定順序的名字是很不方便的。如果把這些名字按字母順序排列,讀起來就會容易得多。通過使用ORDER BY子句,你可以強制一個查詢結果按升序排列,就像這樣:
SELECT au_lname FROM authors ORDER BY au_lname
當這個SELECT語句執行時,作者名字的顯示將按字母順序排列。ORDER BY子句將作者名字按升序排列。
你也可以同時對多個列使用ORDER BY子句。例如,如果你想同時按升序顯示欄位au_lname和欄位au_fname,你需要對兩個欄位都進行排序:
SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname
這個查詢首先把結果按au_lname欄位進行排序,然後按欄位au_fname排序。記錄將按如下的順序取出:
au_lname au_fname
...............................................................................
Bennet Abraham
Ringer Albert
Ringer Anne
Smith Meander
...
(23 row(s) affected)
注意有兩個作者有相同的名字Ringer。名為Albert Ringer的作者出現名為Anne Ringer的作者之前,這是因為姓Albert按字母順序應排在姓Anne之前。
如果你想把查詢結果按相反的順序排列,你可以使用關鍵字DESC。關鍵字DESC把查詢結果按降序排列,如下例所示:
SELECT au_lname,au_fname FROM authors
WHERE au_lname="Ringer" ORDER BY au_lname ,au_fname DESC
這個查詢從表authors中取出所有名字為Ringer的作者記錄。ORDER BY子句根據作者的名字和姓,將查詢結果按降序排列。結果是這樣的:
au_lname au_fname
....................................................................................................
Ringer Anne
Ringer Albert
(2 row(s) affectec)
注意在這個表中,姓Anne出現在姓Albert之前。作者名字按降序顯示。
你也可以按數值型欄位對一個查詢結果進行排序。例如,如果你想按降序取出所有書的價格,你可以使用如下的SQL查詢:
SELECT price FROM titles ORDER BY price DESC
這個SELECT語句從表中取出所有書的價格,顯示結果時,價格低的書先顯示,價格高的書後顯示。
警告:
不是特別需要時,不要對查詢結果進行排序,因為伺服器完成這項工作要費些力氣。這意味著帶有ORDER BY 子句的SELECT語句執行起來比一般的SELECT語句花的時間長。
取出互不相同的記錄
一個表有可能在同一列中有重復的值。例如,資料庫pubs的表authors中有兩個作者的名字是Ringer。如果你從這個表中取出所有的名字,名字Ringer將會顯示兩次。
在特定情況下,你可能只有興趣從一個表中取出互不相同的值。如果一個欄位有重復的值,你也許希望每個值只被選取一次,你可以使用關鍵字DISTINCT來做到這一點:
SELCET DISTINCT au_lname FROM authors WHERE au_lname="Ringer"
當這個SELECT語句執行時,只返回一個記錄。通過在SELECT語句中包含關鍵字DISTINCT,你可以刪除所有重復的值。例如,假設有一個關於新聞組信息發布的表,你想取出所有曾在這個新聞組中發布信息的人的名字,那麼你可以使用關鍵字DISTINCT。每個用戶的名字只取一次——盡管有的用戶發布了不止一篇信息。
警告:
如同ORDER BY子句一樣,強制伺服器返回互不相同的值也會增加運行開銷。福氣不得不花費一些時間來完成這項工作。因此,不是必須的時候不要使用關鍵字DISTINCT。
創建新表
前面說過,資料庫中的所有數據存儲在表中。數據表包括行和列。列決定了表中數據的類型。行包含了實際的數據。
例如,資料庫pubs中的表authors有九個欄位。其中的一個欄位名為為au_lname,這個欄位被用來存儲作者的名字信息。每次向這個表中添加新作者時,作者名字就被添加到這個欄位,產生一條新記錄。
通過定義欄位,你可以創建一個新表。每個欄位有一個名字和一個特定的數據類型(數據類型在後面的"欄位類型"一節中講述),例如欄位au_lname存儲的是字元型數據。一個欄位也可以存儲其它類型的數據。
使用SQL Sever,創建一個新表的方法是很多的。你可以可執行一個SQL語句或使用SQL事務管理器(SQL Enterprise Manager)來創建一個新表。在下一節里,你將學會如何用SQL語句來創建一個新表。
用SQL創建新表
注意:
如果你還沒有建立自己的資料庫,現在就跳回到第三章創建這個庫。你絕不能向master,tempdb或任何其他任何系統資料庫中添加數據。
從SQL Sever程序組(在任務欄中)中啟動ISQL/w程序。出現查詢窗口後,從窗口頂部的下拉列表中選擇你在第三章所創建的資料庫。下一步,在查詢窗口中鍵入下面的SQL語句,單擊執行查詢按鈕,執行這個語句:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate
DATETIME)
如果一切正常,你會在結果窗口中看到如下的文字(如果出現異常,請參閱第三章):
This command dit not return data ,and it did not return any rows
祝賀你,你已經建立了你的第一個表!
你所創建的表名為guestbook,你可以使用這個表來存儲來字你站點訪問者的信息。你是用REEATE TABLE語句創建的這個表,這個語句有兩部分:第一部份指定表的名子;第二部份是括在括弧中的各欄位的名稱和屬性,相互之間用逗號隔開。
表guestbook有三個欄位:visitor,comments 和entrydate。visitor欄位存儲訪問者的名字,comments欄位存儲訪問者對你站點的意見,entrydate欄位存儲訪問者訪問你站點的日期和時間。
注
4. 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;
5. sql語句 導出txt
sqlserver麻煩點 打開查詢分析器
exec master..xp_cmdshell 'bcp "select * from 資料庫名..表名" queryout "c:\tt.txt" -c -t ,-usa'
不過書出來的格式 不是很好
6. T-SQL的基本語法
一:insert語句
into 關鍵字是可選的
values關鍵字前面的()是可選的,這里是要接收數據的列
values後面,有兩種方式提供值
1:顯式的給出值 2:從select語句中導出值
insert語句注意幾點
1:不要理標志列,系統會給你插入的
2:給出實際的值,如果沒有,那就null
3:給出默認的值,default關鍵字,告訴資料庫取默認值
insert into ... select
什麼時候會這么用,當成批的數據來自
1:資料庫中的另一個表
2:同一台伺服器完全不同的資料庫
3:另一個SQLSERVER的資料庫
4:來自同一個表中的數據
說實在的2和3我從來沒用過
好,看一個例子
declare @mytable table
(
id int,
sortid int
);
insert into @mytable (id,sortid) select id,classid from proct;
select * from @mytable;
注意我定義了一個表的對象
每一句之間是用分號隔開的
(id,sortid) 是可以忽略的
二:update語句
看例子
update e set e.flag = 'm' from employee e join contact ce on e.id = ce.employeeid where ce.name = 'jo'
這里用到了join子句,當然是可以用的
如果修改不止一列 只要加一個逗號
set num = num * 1.2當然可以寫表達式
三:delete語句
delete from actors from actors a left join film f on a.filmid = f.filmid where f.filmid is null
outer連接將在沒有匹配的一端返回null,
這里也就是film表沒有匹配的行是null
注意 is null 的寫法
四: select語句
這里還是不說了,還是多說說子句吧
五:where子句
1:
= > < >= <= <> != !> !<
其中<> 與 !=都是不相等的意思
!>與!<不怎麼常見,但仔細想想也沒什麼用處
2:
and or not
如果一個where子句中同時出現這三個操作符
最先評估not 然後是and 然後是or
3:
between 例子 between 1 and 5 這個就不多說了
4:
like 例子:like "xland%"
%和_是通配符
%代表零個或多個任意字元
_表示單個任意字元
把字元包括在方括弧中
[a-c]表示a b c都可行
[ab]表示a或b
^與not表示下一個字元將被排除掉
5:
in 例子 in ( 1,2,3) 這個也不多說了
六:order by子句
order by由於比較常用 我這里就不多說了
1:order by username 是可以識別中文的(sql先把中文轉換成拼音再進行排序)
2:可以對 查詢到的表中的任何列 進行排序 無論該列是否包含在select列表中
3:基於多個列的order by
例如:order by addtime,id
先按時間排序,再在這個基礎上根據id排序,你也看到了,性能是有很大幅度的降低的
七:distinct關鍵字
select count(distinct column) from table
檢索某一列不重復的記錄數
八:group by 聚集函數 和 having子句
先看例子:
select orderid sum(orderMoney) from sales where orderid between 3 and 123 group by orderid
注意這里的orderid在表裡是有可能重復的
這個語句的作用是檢索出orderid從3到123的記錄,
然後在這個記錄集合上 以orderid分組
把orderid相同的數據分到一組 (這一組就是最終結果的一條記錄)
然後通過sum函數把各組的orderMoney數據相加,
結果是最終結果的第二個欄位
我發現用group by子句基本上都是和聚集函數一起用的
舉幾個聚集函數的例子
sum 求和
avg求平均數
min/max求最大和最小值
count(表達式|*)獲取一個查詢中的行數
只說說count吧:
count(coloum)如果這一列有null,那麼這些null的行將不會計算在內
count(*)將得到表裡的所有行的數目
聚集函數不一定非和group by一起使用不可
(另外avg基本上都是和group by一起使用的)
having子句是在組上放置條件的
看例子
select orderid sum(orderMoney) from sales where orderid between 3 and 123 group by orderid having sum(orderMoney)>5
group by得到了一個記錄的集合
然後通過having子句,再在這個集合上做篩選
7. 求sql語法
SQL語言快速入門(一)
SQL是英文Structured Query Language的縮寫,意思為結構化查詢語言。
SQL語言的主要功能就是同各種資料庫建立聯系,進行溝通。按照ANSI(美國國家標准協會)的規定,SQL被作為關系型資料庫管理系統的標准語言。SQL語句可以用來執行各種各樣的操作,例如更新資料庫中的數據,從資料庫中提取數據等。目前,絕大多數流行的關系型資料庫管理系統,如Oracle, Sybase, Microsoft SQL Server, Access等都採用了SQL語言標准。雖然很多資料庫都對SQL語句進行了再開發和擴展,但是包括Select, Insert, Update, Delete, Create, 及Drop在內的標準的SQL命令仍然可以被用來完成幾乎所有的資料庫操作。下面,我們就來詳細介紹一下SQL語言的基本知識。
資料庫表格
一個典型的關系型資料庫通常由一個或多個被稱作表格的對象組成。資料庫
中的所有數據或信息都被保存在這些資料庫表格中。資料庫中的每一個表格都具有
自己唯一的表格名稱,都是由行和列組成,其中每一列包括了該列名稱,數據類型
,以及列的其它屬性等信息,而行則具體包含某一列的記錄或數據。以下,是一個
名為天氣的資料庫表格的實例。
城市 最高氣溫 最低氣溫
北京 10 5
上海 15 8
天津 8 2
重慶 20 13
該表格中「城市」,「最高氣溫」和「最低氣溫」就是三個不同的列
,而表格中的每一行則包含了具體的表格數據。
數據查詢
在眾多的SQL命令中,select語句應該算是使用最頻繁的。Select語句主要被用來對資料庫進行查詢並返回符合用戶查詢標準的結果數據。Select語句的語法格式如下:
select column1 [, column2,etc] from tablename
[where condition];
([] 表示可選項)
Select語句中位於Select關鍵詞之後的列名用來決定那些列將作為查詢結果返回。用戶可以按照自己的需要選擇任意列,還可以使用通配符「*」來設定返回表格中的所有列。
Select語句中位於from關鍵詞之後的表格名稱用來決定將要進行查詢操作的目
標表格。
Select語句中的where可選從句用來規定哪些數據值或哪些行將被作為查詢結果返回或顯示。在where條件從句中可以使用以下一些運算符來設定查詢標准:
= 等於
> 大於
< 小於
>= 大於等於
<= 小於等於
<> 不等於
除了上面所提到的運算符外,LIKE運算符在where條件從句中也非常重要。
LIKE運算符的功能非常強大,通過使用LIKE運算符可以設定只選擇與用戶規定格式相同的記錄。此外,我們還可以使用通配符「%」用來代替任何字元串。舉例如下:
Select firstname, lastname, city
from employee
where firstname LIKE 『E%』;
(注意,字元串必須被包含在單括弧內)
上述SQL語句將會查詢所有名稱以E開頭的姓名。或者,通過如下語句:
Select * from employee
where firstname = 『May』;
查詢所有名稱為May的行。
SQL語言快速入門(二)
創建表格
SQL語言中的create table語句被用來建立新的資料庫表格。Create table
語句的使用格式如下:
create table tablename
(column1 data type,
column2 data type,
column3 data type);
如果用戶希望在建立新表格時規定列的限制條件,可以使用可選的條件
選項:
create table tablename
(column1 data type [constraint],
column2 data type [constraint],
column3 data type [constraint]);
舉例如下:
create table employee
(firstname varchar(15),
lastname varchar(20),
age number(3),
address varchar(30),
city varchar(20));
簡單來說,創建新表格時,在關鍵詞create table後面加入所要建立的表格
的名稱,然後在括弧內順次設定各列的名稱,數據類型,以及可選的限制條件
等。注意,所有的SQL語句在結尾處都要使用「;」符號。
使用SQL語句創建的資料庫表格和表格中列的名稱必須以字母開頭,後面
可以使用字母,數字或下劃線,名稱的長度不能超過30個字元。注意,用戶在
稱時不要使用SQL語言中的保留關鍵詞,如select, create, insert等,作為表格或
列的名稱。
數據類型用來設定某一個具體列中數據的類型。例如,在姓名列中只能采
用的數據類型,而不能使用number的數據類型。
SQL語言中較為常用的數據類型為:
char(size):固定長度字元串,其中括弧中的size用來設定字元串的最大
度。Char類型的最大長度為255位元組。
varchar(size):可變長度字元串,最大長度由size設定。
number(size):數字類型,其中數字的最大位數由size設定。
Date:日期類型。
number(size,d):數字類型,size決定該數字總的最大位數,而d則用於
設定該數字在小數點後的位數。
最後,在創建新表格時需要注意的一點就是表格中列的限制條件。所謂限
制條件就是當向特定列輸入數據時所必須遵守的規則。
例如,unique這一限制條件要求某一列中不能存在兩個值相同的記錄,所有
記錄的值都必須是唯一的。除unique之外,較為常用的列的限制條件
還包括not, null和primary key等。Not null用來規定表格中某一列的值
不能為空.Primary key則為表格中的所有記錄規定了唯一的標識符。
向表格中插入數據
SQL語言使用insert語句向資料庫表格中插入或添加新的數據行。Insert語
句的使用格式如下:
insert into tablename
(first_column,...last_column)
values (first_value,...last_value);
例如:
insert into employee
(firstname, lastname, age, address, city)
values (『Li』, 『Ming』, 45, 『No.77 Changan Road』, 『Beijing」);
簡單來說,當向資料庫表格中添加新記錄時,在關鍵詞insert into後面輸
入所要添加的表格名稱,然後在括弧中列出將要添加新值的列的名稱。最後
,在關鍵詞values的後面按照前面輸入的列的順序對應的輸入所有要添加的
記錄值。
更新記錄
SQL語言使用update語句更新或修改滿足規定條件的現有記錄。
Update語句的格式為:
update tablename
set columnname = newvalue [, nextcolumn = newvalue2...]
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
update employee
set age = age+1
where first_name= 『Mary』and last_name= 『Williams』;
使用update語句時,關鍵一點就是要設定好用於進行判斷的where條件
從句。
刪除記錄
SQL語言使用delete語句刪除資料庫表格中的行或記錄。Delete語句的
格式為:
delete from tablename
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
delete from employee
where lastname = May;
簡單來說,當需要刪除某一行或某個記錄時,在delete from關鍵詞之
後輸入表格名稱,然後在where從句中設定刪除記錄的判斷條件。注意,
如果用戶在使用delete語句時不設定where從句,則表格中的所有記錄將
全部被刪除。
刪除資料庫表格
在SQL語言中使用drop table命令刪除某個表格以及該表格中的所有記
錄。Drop table命令的使用格式為:
drop table tablename;
例如:
drop table employee;
如果用戶希望將某個資料庫表格完全刪除,只需要在drop table命令後
輸入希望刪除的表格名稱即可。Drop table命令的作用與刪除表格中的所有
記錄不同。刪除表格中的全部記錄之後,該表格仍然存在,而且表格中列
的信息不會改變。而使用drop table命令則會將整個資料庫表格的所有信息
全部刪除。
以上,我們對SQL語言主要的命令和語句進行了較為詳細的介紹。應該說SQL語句的語法結構和風格還是相當簡單和直觀的,只要用戶結合實踐多加練習,一定會在短期內迅速掌握。
SQL語言快速入門(三)
我們日常使用SQL語言的工作過程中,使用最多的還是從已經建立好的資料庫中查詢信息。下面,我們就來詳細介紹一下如何使用SQL語言實現各種資料庫查詢操作。
SELECT…FROM
為方便講解,我們在資料庫中創建名為Store_Information的如下數據表。
Store_Information
Store_Name Sales Date
Los Angeles 00 Jan-10-2000
San Diego 0 Jan-11-2000
Los Angeles 0 Jan-12-2000
Boston 0 Jan-12-2000
SQL語言中用於資料庫查詢的最簡單的命令就是SELECT…FROM,語法格
式為:
SELECT \"column_name\" FROM \"table_name\"
例如,如果我們希望查詢Store_Information數據表中所有的商店名稱時,可
以使用如下命令:
SELECT store_name FROM Store_Information
查詢結果顯示為:
Store_Name
Los Angeles
San Diego
Los Angeles
Boston
如果用戶希望一次查詢多個欄位,可以將所要查詢的欄位名稱依次加入
SELECT關鍵字之後,中間用「,」隔開即可。
DISTINCT
SELECT關鍵字支持用戶查詢數據表中指定欄位的所有數據,但是這樣有時
就會不可避免的出現重復信息。如果用戶希望只查詢那些具有不同記錄值的信
息的話,可以使用SQL語言的DISTINCT關鍵字。語法格式如下:
SELECT DISTINCT \"column_name\"
FROM \"table_name\"
例如,我們可以使用以下命令查詢Store_Information數據表具有不同記錄值
的所有記錄。
SELECT DISTINCT Store_Name FROM Store_Information
查詢結果如下:
Store_Name
Los Angeles
San Diego
Boston
WHERE
除了選擇具有不同記錄值的記錄之外,有時我們可能還會需要根據某些條
件對資料庫中的數據進行查詢。例如,我們可能需要查詢Store_Information數
據表中銷售額超過1000美圓的商店。為此,我們可以使用SQL語言的WHERE
關鍵字設定查詢條件。語法格式如下:
SELECT \"column_name\"
FROM \"table_name\"
WHERE \"condition\"
由此,我們可以使用如下命令查詢銷售額超過1000美圓的商店信息:
SELECT store_name FROM Store_Information WHERE Sales > 1000
查詢結果顯示為:
store_name
Los Angeles
運算函數
現在,我們已經了解到在使用SQL語言進行資料庫查詢操作時可以通過對
數值的判斷設定靈活的查詢條件。為了增強對運算的支持能力,SQL提供了眾
多實用的運算函數供廣大用戶使用。例如,我們可以直接在SQL命令中調用
SUM或AVG這兩個分別用於計算總數和平均數的函數。語法格式如下:
SELECT \"function type\"(\"column_name\")
FROM \"table_name\"
如果我們希望查詢Store_Information數據表中所有商店的總銷售額的話,可
以使用如下命令:
SELECT SUM(Sales) FROM Store_Information
查詢結果顯示為:
SUM(Sales)
50
COUNT
除了SUM和AVG函數之外,COUNT函數是SQL語言中另一個較為常用
的運算函數。COUNT函數可以用來計算數據表中指定欄位所包含的記錄數目。
語法格式為:
SELECT COUNT(\"column_name\")
FROM \"table_name\"
例如,如果我們希望查詢Store_Information數據表中的有關商店的記錄條數
時,可以使用如下命令:
SELECT COUNT(store_name)
FROM Store_Information
查詢結果顯示為:
Count(store_name)
4
COUNT函數可以和DISTINCT關鍵字一起使用從而可以查詢數據表中指定
欄位中所有具有不同記錄值的記錄數目.例如,如果我們希望查詢Store_Information
數據表中不同商店的數目時,可以使用如下命令:
SELECT COUNT(DISTINCT store_name)
FROM Store_Information
查詢結果顯示為:
Count(DISTINCT store_name)
3
GROUP BY
下面我們來進一步看一下SQL語言中的集合函數。上文中,我們曾使用
SUM函數計算所有商店的銷售總額,如果我們希望計算每一家商店各自的總銷
售額時該怎麼辦呢?要實現這一目的我們需要做兩件事:首先,我們需要查詢
商店名稱和銷售額兩個欄位;然後,我們使用SQL語言的GROUP BY命令將
銷售額按照不同的商店進行分組,從而計算出不同商店的銷售總額。GROUP
BY命令的語法格式為:
SELECT \"column_name1\", SUM(\"column_name2\")
FROM \"table_name\"
GROUP BY \"column_name1\"
我們可以使用如下命令實現上述查詢目的:
SELECT store_name, SUM(Sales)
FROM Store_Information
GROUP BY store_name
查詢結果顯示為:
store_name SUM(Sales)
Los Angeles 00
San Diego 0
Boston 0
小註:
GROUP BY關鍵字一般應用於同時查詢多個欄位並對欄位進行算術運
算的SQL命令中。
HAVING
用戶在使用SQL語言的過程中可能希望解決的另一個問題就是對由sum或
其它集合函數運算結果的輸出進行限制。例如,我們可能只希望看到Store_
Information數據表中銷售總額超過1500美圓的商店的信息,這時我們就需要使
用HAVING從句。語法格式為:
SELECT \"column_name1\", SUM(\"column_name2\")
FROM \"table_name\"
GROUP BY \"column_name1\"
HAVING (arithematic function condition)
(GROUP BY從句可選)
由此,我們可以使用如下命令實現上述查詢目的:
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
查詢結果顯示為:
store_name SUM(Sales)
Los Angeles 00
小註:
SQL語言中設定集合函數的查詢條件時使用HAVING從句而不是
WHERE從句。通常情況下,HAVING從句被放置在SQL命令的結尾處。
ALIAS
下面,我們重點介紹一下如何在SQL命令中設定別名。SQL語言中一般使
用兩種類型的別名,分別為欄位別名和數據表別名。簡單的說,使用欄位別名
可以幫助我們有效的組織查詢的輸出結果。例如,上文所列舉的多個實例中,
當我們計算商店銷售總額時,顯示結果中就會出現SUM(sales)。雖然SUM(sales)
並不會對我們理解查詢結果帶來不便,但是如果我們需要在查詢中使用多項復
雜運算時,顯示結果就不會這么直觀了。如果這時我們使用欄位別名就會極大
的提高查詢結果的可讀性。
對於數據表別名,我們可以通過將別名直接放置在FROM從句中數據表名
稱的後面設定。數據表別名在我們下面將要講述的連接多個數據表進行查詢的
操作中極為有用。
欄位和數據表別名的語法格式如下:
SELECT \"table_alias\".\"column_name1\" \"column_alias\"
FROM \"table_name\" \"table_alias\"
即別名都直接放置在各自對應名稱的後面,中間用空格分開。
以Store_Information數據表為例,我們可以在GROUP BY一節中所使用的
SQL命令中設置如下欄位和數據表別名:
SELECT A1.store_name \ "Store\", SUM(Sales) \"Total Sales\"
FROM Store_Information A1
GROUP BY A1.store_name
查詢結果顯示為:
Store Total Sales
Los Angeles 00
San Diego 0
Boston 0
連接多個數據表
最後,我們來看一下如果使用SQL語言連接多個數據表,實現對多個數據
表的查詢。為方便講解,我們在資料庫中分別創建了兩個名為Store_Information
和Region的數據表。
Store_Information
Store_Name Sales Date
Los Angeles 00 Jan-10-2000
San Diego 0 Jan-11-2000
Los Angeles 0 Jan-12-2000
Boston 0 Jan-12-2000
Region
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
下面,我們就來看一下通過數據表的連接實現按不同區域查詢銷售額。
我們注意到在名為Region的數據表中包含區域和商店兩個欄位信息,而在名為
Store_Information的數據表中則包含每一家商店的銷售信息。因此,為了得到按
區域劃分的銷售信息,我們需要將兩個不同數據表的信息結合在一起進行查詢.
通過對上述兩個數據表的分析,我們發現每個數據表中都包含一個名為
Store_Name的欄位,因此,我們可以使用如下命令實現查詢目的:
SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Region A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name
查詢結果顯示為:
REGION SALES
East 0
West 50
說明:
上述查詢命令的前兩行用於指定所要查詢的目標欄位,分別為Region數據
表中的Region_Name欄位和Store_Information數據表中Sales欄位的記錄值總
數。這里,我們設定兩個欄位的別名分別為REGION和SALES,兩個數據表的
別名分別為A1和A2。如果我們只使用欄位別名而不設定數據表別名的話,上
述SQL命令的第一行就變成如下形式:
SELECT Region.Region_Name REGION, SUM(Store_Information.Sales) SALES
由此我們可以看出有效的使用數據表別名,可以極大的簡化對多個數據表
進行操作的SQL命令。
上述查詢命令的第3行為WHERE從句,正是該從句設定了兩個數據表的
連接條件。因為我們希望確保Region數據表中的Store_Name欄位能夠與
Store_Information數據表中的同名欄位相對應,所以我們規定兩個欄位的記錄
值應當相等。在連接多個數據表時,一定要准確設定數據表的連接條件,如果
WHERE從句設定不正確,則可能導致查詢結果中出現眾多不相關的數據 .
8. sql常用語句語法
【查找數據】
語法:select
*
from
表名
where
id=1
-----------------------------
*代表所有,如果想查找其中幾個,可以直接寫列名,中間逗號分隔。where是條件
id=1是指id列值為1的所有信息
【更新數據】
語法:update
表名
set
name='聞銘'
where
id=1
------------------------------------
set後跟表名=值
如果不加where條件,則更新所有。
這里是指符合id=1的所有的都更新name為聞名
【刪除數據】
語法:delete
表名
where
id=1
-----------------------------------
刪除id列值為1的所有數據
【插入數據】
語法:insert
into
表名(列名,列名)values(列值,列值)
-------------------------------
注意主鍵列不可設置值
9. MySQL資料庫SQL語法參考
一、資料定義 ddl(data definition language)
資料定語言是指對資料的格式和形態下定義的搭纖局語言,他是每個資料庫要建立時候時首先要面對的,舉凡資料分哪些表格關系、表格內的有什麽欄位主鍵、表格和表格之間互相參考的關系等等,都是在開始的時候所必須規劃好的。
1、建表格:
create table table_name(column1 datatype [not null] [not null primary key],
column2 datatype [not null],
...);
說明:
datatype --是資料的格式,詳見表。
nut null --可不可以允許資料有空的(尚未有資料填入)。
primary key --是本表的主鍵。
2、更改表格
alter table table_name
add column column_name datatype
說豎扮明:增加一個欄位(沒有刪除某個欄位的語法。
alter table table_name
add primary key (column_name)
說明:更改表得的定義把某個欄位設為主鍵。
alter table table_name
drop primary key (column_name)
說明:把主鍵的定義刪除。
3、建立索引
create index index_name on table_name (column_name)
說明:對某個表格的欄位建立索引以增加查詢時的速度。
4、刪除
drop table_name
drop index_name
二、資料操作 dml (data manipulation language)
資料定義好之後接下來的就是資料的操作。資料的操作不外乎增加資料(insert)、查詢資料(query)、更改資料(update) 、刪除資料(delete)四種模式,以下分 別介紹他們的語法:
1、增加資料:
insert into table_name (column1,column2,...)
values ( value1,value2, ...)
說明:
1.若沒有指定column 系統則會按表格內的欄位順序填入資料。
2.欄位的資料形態和所填入的資料必須吻合。
3.table_name 也可以是景觀 view_name。
insert into table_name (column1,column2,...)
select columnx,columny,... from another_table
說明:也可以經過一個子查詢(subquery)把別的表格的資料填入。
2、查詢資料:
基本查詢
select column1,columns2,...
from table_name
說明:把table_name 的特定欄位資料全部列出來
select *
from table_name
where column1 = xxx
[and column2
yyy] [or column3
zzz]
說明:
1.'*'表示全部的欄位都列出來。
2.where 之後是接條件式,把符合條件的資料列出來。
select column1,column2
from table_name
order by column2 [desc]
說明:order by 是指定以某個欄位做排序,[desc]是指從大到小排列,若沒有指明,則是從小到大
排列
組合查詢
組合查詢是指所查詢得資料來源並不只有單一的表格,而是聯合一個以上的表格才能夠得到結果的。
select *
from table1,table2
where table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的資料。
2.當然兩個表格相互比較的欄位,其資料形態必須相同。
3.一個復雜的查詢其動用到的表格可能會很多個。
整合性的查詢:
select count (*)
from table_name
where column_name = xxx
說明:
查知讓詢符合條件的資料共有幾筆。
select sum(column1)
from table_name
說明:
1.計算出總和,所選的欄位必須是可數的數字形態。
2.除此以外還有 avg() 是計算平均、max()、min()計算最大最小值的整合性查詢。
select column1,avg(column2)
from table_name
group by column1
having avg(column2)
xxx
說明:
1.group by: 以column1 為一組計算 column2 的平均值必須和 avg、sum等整合性查詢的關鍵字一起使用。
2.having : 必須和 group by 一起使用作為整合性的限制。
復合性的查詢
select *
from table_name1
where exists (select *
from table_name2
where conditions )
說明:
1.where 的 conditions 可以是另外一個的 query。
2.exists 在此是指存在與否。
select *
from table_name1
where column1 in (select column1
from table_name2
where conditions )
說明:
1. in 後面接的是一個集合,表示column1 存在集合裡面。
2. select 出來的資料形態必須符合 column1。
其他查詢
select *
from table_name1
where column1 like 'x%'
說明:like 必須和後面的'x%' 相呼應表示以 x為開頭的字串。
select *
from table_name1
where column1 in ('xxx','yyy',..)
說明:in 後面接的是一個集合,表示column1 存在集合裡面。
select *
from table_name1
where column1 between xx and yy
說明:between 表示 column1 的值介於 xx 和 yy 之間。
3、更改資料:
update table_name
set column1='xxx'
where conditoins
說明:
1.更改某個欄位設定其值為'xxx'。
2.conditions 是所要符合的條件、若沒有 where 則整個 table 的那個欄位都會全部被更改。
4、刪除資料:
delete from table_name
where conditions
說明:刪除符合條件的資料。
說明:關於where條件後面如果包含有日期的比較,不同資料庫有不同的表達式。具體如下:
(1)如果是access資料庫,則為:where mydate#2000-01-01#
(2)如果是oracle資料庫,則為:where mydatecast(-01-01' as date) 或:where mydateto_date(-01-01','yyyy-mm-dd')
在delphi中寫成:
thedate=-01-01'
query1.sql.add('select * from abc where mydatecast('+''''+thedate+''''+' as date)');
如果比較日期時間型,則為:
where mydatetimeto_date(-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss');
10. SQL基本語句
掌握SQL四條最基本的數據*作語句 Insert Select Update和Delete 練掌握SQL是資料庫用戶的寶貴財 富 在本文中 我們將引導你掌握四條最基本的數據*作語句—SQL的核心功能—來依次介紹比較*作符 選擇斷言以及三值邏輯 當你完成這些學習後 顯然你已經開始算是精通SQL了 在我們開始之前 先使用CREATE TABLE語句來創建一個表 DDL語句對資料庫對象如表 列和視進行定義 它們並不對表中的行進行處理 這是因為DDL語句並不處理資料庫中實際的數據 這些工作由另一類SQL語句—數據*作語言(DML)語句進行處理 SQL中有四種基本的DML*作 INSERT SELECT UPDATE和DELETE 由於這是大多數SQL用戶經常用到的 我們有必要在此對它們進行一一說明 我們給出了一個名為EMPLOYEES的表 其中的每一行對應一個特定的雇員記錄 請熟悉這張表 我們在後面的例子中將要用到它 INSERT語句用戶可以用INSERT語句將一行記錄插入到指定的一個表中 例如 要將雇員John Smith的記錄插入到本例的表中 可以使用如下語句 INSERT INTO EMPLOYEES VALUES ( Smith John Los Angles );通過這樣的INSERT語句 系統將試著將這些值填入到相應的列中 這些列按照我們創建表時定義的順序排列 在本例中 第一個值 Smith 將填到第一個列LAST_NAME中 第二個值 John 將填到第二列FIRST_NAME中……以此類推 我們說過系統會 試著 將值填入 除了執行規則之外它還要進行類型檢查 如果類型不符(如將一個字元串填入到類型為數字的列中) 系統將拒絕這一次*作並返回一個錯誤信息 如果SQL拒絕了你所填入的一列值 語句中其他各列的值也不會填入 這是因為SQL提供對事務的支持 一次事務將資料庫從一種一致性轉移到另一種一致性 如果事務的某一部分失敗 則整個事務都會失敗 系統將會被恢復(或稱之為回退)到此事務之前的狀態 回到原來的INSERT的例子 請注意所有的整形十進制數都不需要用單引號引起來 而字元串和日期類型的值都要用單引號來區別 為了增加可讀性而在數字間插入逗號將會引起錯誤 記住 在SQL中逗號是元素的分隔符 同樣要注意輸入文字值時要使用單引號 雙引號用來封裝限界標識符 對於日期類型 我們必須使用SQL標准日期格式(yyyy mm dd) 但是在系統中可以進行定義 以接受其他的格式 當然 年臨近 請你最好還是使用四位來表示年份 既然你已經理解了INSERT語句是怎樣工作的了 讓我們轉到EMPLOYEES表中的其他部分 INSERT INTO EMPLOYEES VALUES ( Bunyan Paul Boston );INSERT INTO EMPLOYEES VALUES ( John Adams Boston );INSERT INTO EMPLOYEES VALUES ( Smith Pocahontas Los Angles );INSERT INTO EMPLOYEES VALUES ( Smith Bessie Boston );INSERT INTO EMPLOYEES VALUES ( Jones Davy Boston );INSERT INTO EMPLOYEES VALUES ( Jones Indiana Chicago NULL NULL);在最後一項中 我們不知道Jones先生的工薪級別和年薪 所以我們輸入NULL(不要引號) NULL是SQL中的一種特殊情況 我們以後將進行詳細的討論 現在我們只需認為NULL表示一種未知的值 有時 像我們剛才所討論的情況 我們可能希望對某一些而不是全部的列進行賦值 除了對要省略的列輸入NULL外 還可以採用另外一種INSERT語句 如下 INSERT INTO EMPLOYEES( FIRST_NAME LAST_NAME HIRE_DATE BRANCH_OFFICE)VALUE( Indiana Jones Indianapolis );這樣 我們先在表名之後列出一系列列名 未列出的列中將自動填入預設值 如果沒有設置預設值則填入NULL 請注意我們改變了列的順序 而值的順序要對應新的列的順序 如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規定不能為空) SQL*作將失敗 讓我們來看一看上述INSERT語句的語法圖 INSERT INTO table [(column { column})]VALUES (columnvalue [{ columnvalue}]);和前一篇文?幸謊頤怯梅嚼ê爬幢硎究裳∠睿罄ê瘧硎究梢災馗慈我獯問南睿ú荒茉謔導實腟QL語句中使用這些特殊字元) VALUE子句和可選的列名列表中必須使用圓括弧 SELECT語句SELECT語句可以從一個或多個表中選取特定的行和列 因為查詢和檢索數據是資料庫管理中最重要的功能 所以SELECT語句在SQL中是工作量最大的部分 實際上 僅僅是訪問資料庫來分析數據並生成報表的人可以對其他SQL語句一竅不通 SELECT語句的結果通常是生成另外一個表 在執行過程中系統根據用戶的標准從資料庫中選出匹配的行和列 並將結果放到臨時的表中 在直接SQL(direct SQL)中 它將結果顯示在終端的顯示屏上 或者將結果送到列印機或文件中 也可以結合其他SQL語句來將結果放到一個已知名稱的表中 SELECT語句功能強大 雖然表面上看來它只用來完成本文第一部分中提到的關系代數運算 選擇 (或稱 限制 ) 但實際上它也可以完成其他兩種關系運算— 投影 和 連接 SELECT語句還可以完成聚合計算並對數據進行排序 SELECT語句最簡單的語法如下 SELECT columns FROM tables;當我們以這種形式執行一條SELECT語句時 系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表 這就是實現關系投影運算的一個形式 讓我們看一下使用EMPLOYEES表的一些例子(這個表是我們以後所有SELECT語句實例都要使用的 而我們在圖 和圖 中給出了查詢的實際結果 我們將在其他的例子中使用這些結果) 假設你想查看雇員工作部門的列表 那下面就是你所需要編寫的SQL查詢 SELECT BRANCH_OFFICE FROM EMPLOYEES;由於我們在SELECT語句中只指定了一個列 所以我們的結果表中也只有一個列 注意結果表中具有重復的行 這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回) 要消除結果中的重復行 只要在SELECT語句中加上DISTINCT子句 SELECT DISTINCT BRANCH_OFFICEFROM EMPLOYEES;現在已經消除了重復的行 但結果並不是按照順序排列的 如果你希望以字母表順序將結果列出又該怎麼做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果 SELECT DISTINCT BRANCH_OFFICEFROM EMPLOYEESORDER BY BRANCH_OFFICE ASC;這一查詢的結果如表 所示 請注意在ORDER BY之後是如何放置列名BRANCH _OFFICE的 這就是我們想要對其進行排序的列 為什麼即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序 即使它們並不顯示出來 列名BRANCH_ OFFICE之後的關鍵字ASC表示按照升序排列 如果你希望以降序排列 那麼可以用關鍵字DESC 同樣我們應該指出ORDER BY子句只將臨時表中的結果進行排序 並不影響原來的表 假設我們希望得到按部門排序並從工資最高的雇員到工資最低的雇員排列的列表 除了工資括弧中的內容 我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表 以下是你將要用到的語句 SELECT BRANCH_OFFICE FIRST_NAME LAST_NAME SALARY HIRE_DATEFROM EMPLOYEESORDER BY SALARY DESC HIRE_DATE DESC;這里我們進行了多列的選擇和排序 排序的優先順序由語句中的列名順序所決定 SQL將先對列出的第一個列進行排序 如果在第一個列中出現了重復的行時 這些行將被按照第二列進行排序 如果在第二列中又出現了重復的行時 這些行又將被按照第三列進行排序……如此類推 這次查詢的結果如表 所示 將一個很長的表中的所有列名寫出來是一件相當麻煩的事 所以SQL允許在選擇表中所有的列時使用*號 SELECT * FROM EMPLOYEES;這次查詢返回整個EMPLOYEES表 如表 所示 下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項 允許在其中選擇一項 ) SELECT [DISTINCT] (column [{ columns}])| *FROM table [ { table}] <b lishixin/Article/program/Oracle/201311/18760