下面通過實例來對Select的通常用法加以介紹。 例1:選擇所有的列,語法為select * from table_list 如:select * from publishers 例2:選擇指定的列,語法為 select column_name[,column_name]… from table_name 如:select pub_id,pub_name from publishers 例3:重命名查詢結果中的列,語法為 select column_heading= column_name from table_name 如:select Publisher=pub_name,pub_id from publishers 例4:select列表中的計算值,可以對select列表中的數值數據進行計算,下面列出了算術運算符。
符號運算 +加 -減 /除 *乘 %取模 如select title_id,total_sales,total_sales*2 from titles 例5:使用distinct消除重復的查詢結果 可選的關鍵詞消除select語句的結果中的重復行。若不指定distinct,缺省值為all,將檢索出包含重復行的所有行數據。 如:select distinct au_id from titleauthor 例6:選擇行——where語句 select語句中的確切指定要檢索哪些行的準則,其一般格式為: select select_list from table_list where search_conditions where子句中的搜索條件(或稱限制)包括: ·比較運算符(=,<,>,!=等= 如:where advance*2>total_sales*price ·范圍(between和not between) 如:where total_sales between 5000 and 10000 ·列表(in和not in) 如:where state in(“CA”,”IN”,”MD”) ·匹配字符(like和not like) 如:where phone like “0535%” ·未知值(is null和is not null) 如:where advance is null ·以上各項的組合(and, or) 如:where advance<5000 or total_sales between 500 and 1000 例7:用集合函數小結查詢結果 集合函數用特定列的數據來計算小結值。 集合函數結 果 Sum([all|distinct]expression)數值列中(不重復)值的總和 Avg([all|distinct]expression)數值列中(不重復)值的平均 count([all|distinct]expression)列中(不重復)非空值的數目 Count(*)選定的行數 Max(expression)Expression的最大值 Min(expression)Expression的最小值 如:select avg(advance),sum(total_sales) from titles where type=”as” select count(*) from titles select avg(distinct price) from titles select max(price) from books 例8:分組組織查詢結果——group by 子句 group by 子句用在select語句中將一張表分成若干組。 如:select type, advance from titles group by type 例9:選擇分組數據——having子句 having為group by 子句設置條件,與where為select語句設置條件一樣。Having搜索條件與where相同,但having可包括集合函數,而where不能包括。 下列語句使用帶集合函數having子句的例子。它把title表中的行按類型分組,但去掉了那只包含一本書的分組。 Select type from titles group by type having count(*)>1 下面是一個不帶集合函數的having子句的例子。它把title表中的行按類型分組,但去掉了那些不以字母“p”開頭的類型。 Select type from titles group by type having type like “p%” 例10:查詢結果排序——order by子句 Order by子句允許按一列或多列對查詢結果排序。每個排序可以是升序的(asc)或降序的(desc)。若不特別指明,則按升序進行。下列查詢返回按pub_id排序的結果: Select pub_id,type,title_id from titles order by pub_id 例11:連接——從多張表中檢索數據 連接兩張或兩張以上的表是這樣一個過程:比較指定字段中的數據,根據比較結果用符合條件的行組成一張新表。 舉例: select publishers.pub_id,publishers.pub_name,authors.* from publishers,authors where publishers.city=authors.city 例12:分組計算子句 Compute是Sybase對SQL標準中Group子句的擴充,可以將其看作帶聚集計算的Group子句。例如: Select type,price,advance From titles Order by type Compute sum(price),sum(advance) by type 2.Insert語句 用Insert命令向數據庫中添加行有兩種方法:使用關鍵詞values或使用select語句。 Insert語句的基本語法為: Insert[into]表名[(字段列表)] {values(值列表)|select_statement} 舉例:insert into publishers values(‘1622’,’Jardin,Inc.’,’Camden’,’NJ’) Insert into publishers(pub_id,pub_name) values(‘1756’,’The Health Center’) Insert authors select * from newauthors Insert authors(au_id,address,au_lname,au_fname) Select * from newauthors 3.Delect語句 Delect可以對一行或多行進行操作。 Delect語句的基本語法為: Delect 表名 [from 表名列表] [where條件表達式] 舉例:Delect publishers where pub_name=”Jardin,Inc.” Delect titles From authors, titles Where titles.title_id=authors.title_id 4.Update語句 可以使用Update命令來改動表中的單個行、一組行或所有行。 Update語句的基本語法為: Update表名 Set column_name1={expression1|null|(select_statement)} [,column_name2={expression2|null|(select_statement)}] [……] [from 表名列表] [where 條件表達式] 舉例: update authors set_au_lname=”Health”,aufname=”Goodbody” where au_lname=”Bloth” update titles set total_sales=total_sales + qty from titles,sales where titles.title_id=sales.title_id 六、Sybase預定義函數 1.聚集函數 sum([all|distinct]表達式) avg([all|distinct]表達式) count([all|distinct]表達式) count(*) max(表達式) min(表達式) 2.字符串函數 upper(字符表達式) lower(字符表達式) char(整型表達式) char_length(字符表達式) ltrim(字符表達式) rtrim(字符表達式) …… 3.數學函數 abs(精確小數型表達式) floor(精確小數型表達式)求小于或等于給定表達式值的最大整數(取底) rand([整數型] round(精確小數型表達式,整數) sign(精確小數型表達式) power(精確小數型表達式,整數冪) …… 4.日期函數 getdate() datepart(日期部分,日期) datediff(日期部分,日期1,日期2) dateadd(日期部分,數值表達式,日期) 5.類型轉換函數 convert(數據類型,表達式[,格式]) 6.系統函數 db_name([數據庫ID]) host_name() isnull(表達式1,表達式2) …… 七、數據控制語言 用來控制數據的安全性,如權限控制語句GRANT和REVOKE等。
第七講 數據庫編程基礎
一、批處理 SQL Server可以處理作為一批而提交的多個SQL語句,既可以是交互式的,也可以是一個文件。批處理SQL語句由批結束標志終止,該標志指示SQL Server從前面開始執行該批處理語句,對于獨立的SQL實用程序isql而言,其批結束標志為單獨占一行的“go”。 舉例:選擇表title及表authors的行數 select count(*) from titles select count(*) from authors go 二、流程控制語言 1.變量聲明與賦值 全局變量由系統預定義,以符號@@打頭。 局部變量聲明使用Declare語句,這個變量必須以符號@開頭,后跟一個標識符。 Declare @變量名 數據類型[,@變量名 數據類型,……] 變量賦值使用Select語句,未賦值的變量其值為Null。 舉例: Declare @msg char(50) Select @msg=’How are you?’ Select @msg=emp_name from employee Where emp_id=12345678 2.SQL語句塊 Begin Statement Block/*多個順序執行的SQL 語句*/ End 3.條件語句 If 條件表達式 語句(塊) Else 語句(塊) 舉例: if(select max(id) from sysobjects)<50 print ‘數據庫里沒有用戶創建的對象‘ else select name,type,id from sysobjects where id>50 4.循環語句 While 條件表達式 語句(塊) ●兩個特殊的循環控制語句: Continue 執行下一次循環 Break 退出當前循環 舉例: While(select avg(price) from titles)>$20 Begin Update titles set price=price/2 If(select avg(price) from titles)<$40 Break Else Continue End 5.其它控制語句 ◇Return語句——無條件結束當前過程,并可返回給調用者的一個狀態值:Return[整數表達式] ◇Print語句 ◇RaiseError語句 ◇Waitfor語句 三、存儲過程 存儲過程是存儲在服務器端的一類數據庫對象,它實質上是一段用SQL語言編寫的程序,它在服務器端預先經過編譯,并確定出執行計劃,因此與同樣功能的批處理語句相比,它的執行速度較快。 基本語法: Create Procedure[owner.]過程名 [@參數名 數據類型[=默認值][Output]] [,@參數名 數據類型[=默認值][Output]] [……] AS Begin SQL語句(塊) End 存儲過程是數據庫對象,和表、索引是一個級別的;是SQL語句和控制流語言的集合,存儲過程在首次運行時被編譯,并駐留在過程高速緩存的內存中,所以存儲過程的招待非常快。存儲過程可以帶參數,可以調用其他過程,返回狀態值,返回參數值,并且可以在遠程SQL Server執行。可以在遠程SQL Server執行對數據庫設計有特別重要的意義。SQL Server提供的存儲過程稱為系統過程。 存儲過程大大增強了SQL的能力、效率和靈活性,經過編譯的存儲過程極大地改善SQL語句和批處理的性能。 存儲過程有很多優點: ●存儲過程在第一次執行時編譯,并存儲在過程高速緩存的內存中。編譯時系統對其進行優化,以選擇最佳的路徑來訪問數據集中的數據,這種優化考慮了數據集的實際數據結構。因此存儲過程大大提高了系統的性能。 ●存儲過程可以跨服務器運行。這一點是通過觸發器來實現的,當然,首先存儲過程要能登錄到該遠程服務器。 ●應用程序也能執行存儲過程,從而實現服務器和客戶之間的協同作業。 ●存儲過程減少了網絡的交通。這是因為存儲過程的文本存儲在數據庫里,調用存儲過程時通過網絡的只是存儲過程的過程名。 ●利用存儲過程可以提供一個附加的安全層。 如(該例子取自pubs2數據庫): Create proc titleid_proc(@title_id varchar(80)) As Begin Select @title_id=lower(@title_id)+”%” Select title,title_id,price Form titles Where lower(title_id) like @title_id Return @@rowcount End 注意例子中的黑體部分,這實際上是一條賦值語句。該存儲過程有返回值。 存儲過程可以變得非常復雜。我們認為,創建存儲過程還是要遵循“最簡單就是最好”的原則。建議在創建存儲過程時采用縮進風格,否則創建的存儲過程三天之后連自己都看不懂。 需要對存儲過程作些說明: ●Create procedure 語句不能和其他語句在同一個批命令里。 ●Create procedure 語句不能包括下列語句: use Create View Create default Create rule Create trigger Create procedure 不能使用use語句好理解,存儲過程是針對數據庫的,不能在一個數據庫里訪問另外的數據庫。如果在存儲過程里訪問另外的數據庫,則數據庫表的參照完整性難于得到保障。 從另外幾條語句看,在存儲過程里一般不能創建新的數據庫對象。但可以創建表和索引,以及和表相關聯的鍵,表是臨時表,在存儲過程結束后不能看見創建的臨時表;否則的話每運行一次存儲過程就創建一個表,結果可想而知。 存儲過程里不能創建一個對象,刪除它;然后又在同一存儲過程里用相同的名字創建新的對象。實際上,SQL Server在存儲過程運行時而不是在編譯時創建對象的。 ●如果存儲過程調用另外的存儲過程,則第二個存儲過程可以調用在第一個存儲過程里創建的對象。 ●存儲過程包含的最多參數為255個,對存儲過程里的局部和全局變量沒有限制。 最后討論一下系統存儲過程。系統存儲過程以sp_開頭,當然用戶創建的存儲過程也可以以sp_開頭;?/span> |
|