2013年9月19日 星期四

select

從資料庫中檢索資料的過程或命令稱為查詢。 主要是使用 select 命令來定義查詢,select 命令建立一個暫時虛擬表。
定義顯示表頭
程式1:select 語法
select *
from table_expression
最簡單表頭定義的是 *,表頭定義中 * 意指表頭為代表 from 資料表表示式所有欄。表頭定義也可選擇可用欄子集或者在檢索它們之前對欄值進行計算;
程式2:選出員工檔全部欄
select * 
from employees
假設一個資料表稱為employees,這條命令將從 employees 中檢索所有紀錄和欄。
from 定義查詢所要引用並作處理的的資料表,資料表引用可以是基本資料表,連接及子查詢的複雜構造。
from employees 是最簡單的資料表表示式,它只讀取了一個資料表 employees。
欄名引用
程式1:select 語法
select c1, c2, ...
from table_expression
另一種用逗號分隔的欄名陣列來定義表頭,每個欄名為 from 子句定義資料表中實際欄名或別名。。
是本局辦理研習時,要產出所有員工的簽到表可以[emp_namelist.sql]表示,此 sql 表示員工表取出所有員工名稱組成新的表。
表名引用
程式1:select 語法
select t1.c1, t2.c2, ...
from table_expression
若超過一個資料表有相同欄名,那麼還必須指定表名或表別名。
程式2:員工部門名單
select e.name, d.name dep
from employees e join departments d on e.dep_id = d.id
值表示式
值表示式會為結果表每一筆紀錄進行一次計算,計算之前用該欄的數值代換任何值表示式裡引用的欄名。
下式表示各人出生年份。
程式1:各人出生年份
select name, substr(birthday, 0, 4) as year 
from humans
比如若 employees 表頭有 name 和 salary 的欄,分別代表員工名稱及月薪,則下式表每位員工月薪為幾美金:
程式2:每位員工月薪為幾美金
select name, salary / 34 
from employees;
值表示式的並不一定要有引用來自 from 子句中表表示式裡面的表的欄名, 可以有任意常數。
下式產出同員工筆數的體溫正常及不正常標籤,可拿來作門禁用。
程式3:體溫標籤
select 'normal', 'fever'
from employees
可以省略值表示式而用 select 命令當做一個計算器:
程式4:select_no_from.sql
select 3 * 4;
表頭定義裡的表示式也可為函數,比如,可以呼叫函數 random():
程式5:select_random.sql
select random();
別名
程式1:語法
name [as] alias
其中 name 為欄名,alias 為欄的別名,as 可加可不加。
下式將職稱姓名欄別名為 name_title。
程式2:職稱姓名表
select name || title as name_title
from employees
查詢表頭欄名和在 from 子句裡的欄名是不同。
預設欄名
若表頭未定義欄別名,則系統會賦予預設值。對欄值引用, 預設是欄名。對於函數調用,預設是函數名。對於複雜表示式,系統應生成一個通用名。
對[select_no_from.sql]會產出下表,欄名為表示式文字表示。
表1:select_no_from
3 * 4
12
distinct
若兩筆紀錄裡至少有一欄值不同,則此兩筆紀錄為相異,否則為相同。
若於 select 後加入 distinct 修飾,則合併相同紀錄。
列出本局人員具有的職稱。
程式1:本局人員職稱列表
select distinct title
from employees
相對 distinct 是 all,因它是預設值,所以通常不寫。
兩個空值認為是相同的。

沒有留言:

張貼留言