SELECT語句是使用頻率最高、語法相對複雜的DBCC命令。下面先從最簡單也是最常用的單表查詢開始。
(1) 用SELECT 子句來指定查詢所需的列,多個列之間用逗號分開
select p_id,p_name,cost from products
(2) 可以使用符號“*”來選取表的全部列
select * from products
(3) 在查詢結果中添加列
select p_id,p_name,quantity,cost,quantity*cost as sum_cost from products
(1) 使用WHERE 子句
用戶在查詢數據庫時,往往並不需要了解全部信息,而只需要其中一部分滿足某些條件的信息。在這種情況下就需要在SELECT 語句中加入條件,以選擇數據行,這時就要用到WHERE 子句。WHERE 子句中的條件是由表達式以及邏輯聯結詞AND、 OR、NOT 等組成。
例:查詢工資介於2000 元和3000 元之間的員工姓名。
select e_name
from employee
where e_wage between 2000 and 3000
from employee
where e_wage between 2000 and 3000
(2) 使用DISTINCT關鍵字
用戶在對數據庫進行查詢時,往往會出現重複結果,這時就需要使用DISTINCT 關鍵字消除重複部分。
例:列出工資大於7000 的員工所屬的部門編號
use pangu
select distinct dept_id
from employee
where e_wage > 7000
select distinct dept_id
from employee
where e_wage > 7000
(3) 使用IN 關鍵字
在使用WHERE 子句進行查詢時,若條件表達式中出現若干條件相同的情況,就會使表達式顯得冗長,不便於用戶使用,這時可用IN 關鍵字來簡化。
例:查詢在編號爲‘1001’和‘1002’的部門中工作的員工姓名
use pangu
select e_name
from employee
where dept_id in ('1001','1002')
select e_name
from employee
where dept_id in ('1001','1002')
(4) 使用通配符
在WHERE 子句中可以使用謂詞LIKE來進行字符串的匹配檢查,其中將大量使用通配符。
例:查找姓王且名字爲兩個字的員工姓名及其部門編號
select e_name,dept_id
from employee
where e_name like '王__'
from employee
where e_name like '王__'
/*注意有兩個_,因一個漢字佔兩個字符*/
如果用戶要查找的數據中本身就包含了通配符,如“SQL_Mail”,就需要使用轉義字符來區分通配符與實際存在的字符。其格式如下;
LIKE ‘字符匹配串’ ESCAPE ‘轉義字符’
例:查找以"SQL_M"開頭,"il"結尾的對象
select *
from objects
where object_name like 'SQL#_M_il' escape '#'
from objects
where object_name like 'SQL#_M_il' escape '#'
(1) 使用ORDER 子句
當用戶要對查詢結果進行排序時就需要在SELECT 語句中加入ORDER BY 子句。在ORDER BY 子句中可以使用一個或多個排序要求,其優先級次序爲從左到右。
例: 查詢工作級別爲‘2’ 的員工姓名,查詢結果按工資排序
select e_name
from employee
where job_level='2'
order by e_wage
from employee
where job_level='2'
order by e_wage
(2) 選取前幾行數據
在SELECT 語句中使用TOP n 或TOP n PERCENT, 來選取查詢結果的前n 行或前百分之n 的數據。此語句經常和ORDER 子句一起使用。
例: 查詢工資最高的三名員工的姓名和工資
select top 3 e_name, e_wage
from employee
order by e_wage desc
from employee
order by e_wage desc
(1) 使用GROUP 子句
當用戶要對查詢結果進行分組時,就需要在SELECT 語句中加入GROUP BY 子句。
例: 查詢工作級別爲'2'的員工姓名,查詢結果按部門分組
select e_name,dept_id
from employee
where job_level='2'
group by dept_id,e_name
from employee
where job_level='2'
group by dept_id,e_name
(2) 使用WITH { CUBE | ROLLUP }選項
使用這兩個選項可以格外返回按組統計的數據行。與CUBE 不同的是,ROLLUP 選項只返回最高層的分組列(即,第一個分組列)的統計數據。二者的差別請看下面的例子。
例 :查詢公司編號、公司所訂購的產品編號和應支付的金額,查詢結果按公司編號和產品編號分組。
/*使用cube選項*/
select firm_id,p_id,sum(o_price*o_quantity) as sum_value
from orders
group by firm_id,p_id with cube
from orders
group by firm_id,p_id with cube
運行結果如下:
/*使用rollup選項*/
select firm_id,p_id,sum(o_price*o_quantity) as sum_value
from orders
group by firm_id,p_id with rollup
from orders
group by firm_id,p_id with rollup
運行結果如下:
(3) 使用HAVING 子句
HAVING 子句用來選擇特殊的組,它將組的一些屬性與常數值進行比較,如果一個組滿足HAVING 子句中的邏輯表達式,它就可以包含在查詢結果中。
例:查詢有多個員工工資不低於6000的部門編號
select dept_id,count(*)
from employee
where e_wage>=6000
group by dept_id
having count(*)>1
from employee
where e_wage>=6000
group by dept_id
having count(*)>1
注意:
在SELECT語句中WHERE、GROUP BY、HAVING子句和統計函數的執行次序如下:WHERE子句從數據源中去掉不符合其搜索條件的數據行;GROUP BY 子句蒐集數據行到各個組中;統計函數爲各個組計算統計值;HAVING子句去掉不符合組搜索條件的各組數據行。
待續……
參考資料: