GBase 8s SQL 指南:教程———3编写SELECT语句
3編寫SELECT語句
SELECT語句是最重要且最復雜的SQL語句。可使用它和SQL語句INSERT、 UPDATE和DELETE操縱數據。可以使用SELECT語句從數據庫檢索數據。將它用作 INSERT語句的一部分來生成新行或將它作為UPDATE語句的一部分來更新信息。
SELECT語句是查詢數據庫中信息的主要方法。它是檢索程序、報告、表單或電子表格中 的數據的關鍵。可以將SELECT語句與查詢工具DB-Access配合使用或在應用程序中嵌入 SELECT 語句。
本章介紹了使用SELECT語句查詢和檢索關系數據庫數據的基本方法。本章討論如何調整 語句以從一個或多個表中選擇信息行和列,如何在SELECT語句中包含表達式和函數以 及如何創建數據庫表之間的各種連接條件。SELECT語句的語法和使用方法在GBase 8s SQL指南:語法中有詳細描述。
本出版物中的大部分示例來自stores_demo數據庫中的各表,該數據庫隨GBase 8s SQL API 或數據庫實用程序的軟件提供。為了簡便起見,示例只顯示了每個SELECT語句檢索的數 據的一部分。有關演示數據庫的結構和內容的信息,請參閱《GBase 8s SQL參考指南》。 為了著重強調,雖然SQL不區分大小寫,但是在示例中用大寫字母顯示關鍵字。
3.1介紹SELECT語句
SELECT語句允許您查看關系數據庫中的數據的子句構成。這些子句允許您從一個或多個 表或視圖中選擇列和行、指定一個或多個條件、對數據進行排序和總結以及將選擇的數據 放置在臨時表中。
本章介紹了如何使用五個SELECT語句子句。如果包含全部五個子句,那么它們必須按照 下列順序岀現在SELECT語句中:
Projection 子句
FROM子句
WHERE 子句
ORDER BY 子句
INTO TEMP 子句
只有Projection子句和FROM子句是必需的。這兩個子句構成每個數據庫查詢的基礎, 原因是它們指定要檢索的列值,以及包含這些列的表。使用以下列表中的一個或多個其它 子句:
?添加WHERE子句以選擇特定行或創建連接條件。
添加ORDER BY主鍵以更改生成數據的順序。
添加INTO TEMP子句以將結果保存為表以供進一步查詢。
還有兩個SELECT語句子句GROUP BY和HAVING,使您可以執行更復雜的數據檢索。 編寫高級SELECT語句中對它們進行了描述。另一個子句INTO指定要從應用程序中的 SELECT語句中接收數據的程序或主變量。關于使用SELECT語句的完整語法和規則在 GBase 8s SQL指南:語法中有所描述。
SELECT語句的輸出
雖然在所有GBase 8s產品中語法相同,但是結果輸出的格式和顯示取決于應用程序。本章 和編寫高級SELECT語句中的示例如同您在DB-Access中使用“交互式查詢語言”選項 時那樣顯示SELECT語句及輸出。
大對象數據類型的輸出
當發出包含大對象的SELECT語句時,DB-Access按如下所示顯示結果:
對于TEXT列或CLOB列,顯示列的內容。
對于BYTE列,顯示詞<BYTE value〉而不是實際值。
對于BLOB列,顯示詞<SBlob data>而不是實際值。
用戶定義的數據類型的輸出
DB-Access使用特殊約定來顯示包含復雜或不透明數據類型的列的輸出。
非缺省代碼集的輸出
可以發出查詢NCHAR列而不是CHAR列,或者NVARCHAR列而不是VARCHAR列 的SELECT語句。
一些基本概念
SELECT語句不同于INSERT、UPDATE和DELETE語句,它不修改數據庫中的數據。 一次只能有一個用戶修改數據,而多個用戶可同時查詢或選擇數據。有關修改數據的語句 的更多信息,請參閱修改數據。INSERT、UPDATE和DELETE語句的語法描述位于
《GBase 8s SQL指南:語法》中。
在關系數據庫中,列是包含岀現在表中的每一行中的特定信息類型的數據元素。行是在數 據庫表中的所有列上有關單個實體的信息的一組相關項。
可以從數據庫表、系統目錄表(包含有關數據庫的信息的特殊表)、或視圖(創建來包含 一組定制數據的虛擬表)中選擇列和行。有關系統目錄表的信息在GBase 8s SQL參考指 南中有所描述。
特權
在查詢數據之前,確保您對數據庫具有Connect特權和表的Select特權。通常這些特權授 予所有用戶。在GBase 8s SQL指南:語法的GRANT和REVOKE語句中描述了數據庫 訪問權。
關系操作
關系操作涉及處理一個或多個表或者關系以產生另一個表,三種關系操作為選擇、投影和 連接。本章包括選擇、投影和連接操作的一些示例。
選擇和投影
在關系術語中,選擇被定義為取得滿足特定條件的單個表的行的水平子集。此類SELECT 語句返回表中的某些行和所有列。選擇是通過SELECT語句的WHERE子句實現的,如 下圖所示:
圖:查詢
SELECT * FROM customer WHERE state = ‘NJ’;
該結果包含的列數與customer表相同,但只是后者的行的子集。在此示例中,DB-Access顯 示單獨行上來自每列的數據。
圖:查詢結果
customejnum 119
fname
Bob
lname
Shorter
company
The Triathletes Club
address1
2405 Kings Highway
address2
city
Cherry Hill
state
NJ
zipcode
08002
phone
609-663-6079
customejnum 122
fname
Cathy
lname
O’Brian
company
The Sporting Life
address1
543d Nassau
address2
city
Princeton
state
NJ
zipcode
08540
phone
609-342-0054
在關系術語中,投影被定義為從保留唯一行的單個表的列中獲取垂直子集。此類S ELECT語 句返回表中的某些行和某些列。
投影是通過SELECT語句的Projection子句中的投影列表實現的。如下圖所示。
圖:查詢
SELECT city, state, zipcode FROM customer;
此結果包含的列數與customer表相同,但只是投影表中列的子集。因為只從每行中選擇一 小部分的數據,所以DB-Access能夠在一行上顯示行的所有數據。
圖:查詢結果
city state zipcode
Sunnyvale
CA
94086
San Francisco
CA
94117
Palo Alto
CA
94303
Redwood City
CA
94026
Los Altos
CA
94022
Mountain View
CA
94063
Palo Alto
CA
94304
Redwood City
CA
94063
Sunnyvale
CA
94086
Redwood City
CA
94062
Sunnyvale
CA
94085
Oakland
CA
94609
Cherry Hill
NJ
08002
Phoenix
AZ
85016
Wilmington
DE
19898
Princeton
NJ
08540
Jacksonville
FL
32256
Bartlesville
OK
74006
最常見的SELECT語句都同時使用選擇和投影。此類查詢返回表的某些行和某些列。如下 圖所示。
圖查詢
SELECT UNIQUE city, state, zipcode
FROM customer
WHERE state = ‘NJ’;
圖6包含customer表的列的子集和行的子集。
圖:查詢結果
city state zipcode
Cherry Hill NJ 08002
Princeton NJ 08540
連接
當兩個或多個表被同一列或多個列連接時發生連接,它創建新的結果表。下圖顯示了一個 查詢,該查詢使用items和stock表的子集來說明連接的概念。
圖:兩個表之間的連接
SELECT UNOJE ltem_num. orO9r_num.
stock.stock_nMTi. desciip^iion
FROM items, slock
WHERE fiems.stock num = skx^k.stoclc num
正在上傳…重新上傳取消
正在上傳…重新上傳取消
下列查詢將customer和state表連接起來。
圖:查詢
SELECT UNIQUE city, state, zipcode, sname
FROM customer, state
WHERE customer.state = state.code; 該結果包含customer和state表的指定行和列。
圖:查詢結果
city state zipcode sname
Bartlesville
OK
74006
Oklahoma
Blue Island
NY
60406
New York
Brighton
MA
02135
Massachusetts
Cherry Hill
NJ
08002
New Jersey
Denver
CO
80219
Colorado
Jacksonville
FL
32256
Florida
Los Altos
CA
94022
California
Menlo Park
CA
94025
California
Mountain View
CA
94040
California
Mountain View
CA
94063
California
Oakland
CA
94609
California
Palo Alto
CA
94303
California
Palo Alto
CA
94304
California
Phoenix
AZ
85008
Arizona
Phoenix
AZ
85016
Arizona
Princeton
NJ
08540
New Jersey
Redwood City
CA
94026
California
Redwood City
CA
94062
California
Redwood City
CA
94063
California
San Francisco
CA
94117
California
Sunnyvale
CA
94085
California
Sunnyvale
CA
94086
California
Wilmington
DE
19898
Delaware
3.2單個表的SELECT語句
可用多種方法查詢數據庫中的單個表。可用調整SELECT語句以執行以下操作:
,檢索所有或指定的列
?檢索所有或指定的行
,對檢索到的數據執行計算或其它功能
,用各種方法對數據進行排序
最基本的SELECT語句只包含兩個必需的子句,即Projection子句和FROM。
3.2.1使用星號(*)
下列查詢在投影列表中指定manufact表中所有的列。顯式投影列表是想要從表投影的列名 或表達式的列表。
圖:查詢
SELECT manu_code, manu_name, lead_time FROM manufact;
以下查詢使用通配符星號()作為選擇列表中的簡寫來表示表中所有名稱相同的列。當想 要所有列按其定義的順序排列時,可使用星號(),隱式選擇列表使用星號。
圖:查詢
SELECT * FROM manufact;
因為manufact表只含有三列,圖1和圖2是等價的,并且顯示相同的結果。即,manufact表 中每個列和行的列表。下圖顯示了結果。
圖:查詢結果
manu_code manu_name lead_time
SMT
Smith
3
ANZ
Anza
5
NRG
Norge
7
HSK
Husky
5
HRO
Hero
4
SHM
Shimara
30
KAR
Karsten
21
NKL
Nikolus
8
PRC
ProCycle
9
隊列進行重新排序
下列查詢顯示了如何通過更改列在投影列表中的順序。
圖:查詢
SELECT manu_name, manu_code, lead_time FROM manufact; 該查詢結果包含與前一查詢結果相同的列,但因為用不同的順序指定了列,所以顯示也不 同。
圖:查詢結果
manu_name manu_code lead_time
Smith
SMT
3
Anza
ANZ
5
Norge
NRG
7
Husky
HSK
5
Hero
HRO
4
Shimara
SHM
30
Karsten
KAR
21
Nikolus
NKL
8
ProCycle
PRC
9
3.2.2使用ORDER BY子句存儲行
不以任何特定順序排列查詢的結果。例如:圖4和圖2以隨機順序顯示。
可以將ORDER BY子句添加到您的SELECT語句里指導系統以特定順序對數據進行排 序。ORDER BY子句是任何遠程或本地表或視圖中的列名的列表。投影列表中允許的所有 表達式在ORDER BY列表中也允許。如果在ORDER BY列表中使用的列具有選擇觸發 器,那么將不會激活該觸發器。
以下查詢返回manufact表中manu_code、manu_name和lead_time列的每一行。并根 據lead_time進行排序。
圖:查詢
SELECT manu_code, manu_name, lead_time
FROM manufact
ORDER BY lead_time;
對于GBase 8s,不需要在投影列表中包括您想要在ORDER BY子句中使用的列。即,可 以根據不在投影列表中檢索的列對數據進行排序。以下查詢返回manufact表
中 manu_code、manu_name列的每一行,并根據lead_time進行排序。lead_time列位于 ORDER BY子句中(盡管未包含在投影列表中)。
圖:查詢
SELECT manu_code, manu_name
FROM manufact
ORDER BY lead_time;
升序
缺省情況下,檢索到的數據按升序順序排序。在ASCII字符集中,升序是從大寫字母A到 小寫字母z,對于字符數據類型,那么是從最小值到最大值。DATE和DATETIME數據 按照從最早到最新排序,INTERVAL數據按從時間范圍最短到最長排序。
降序
降序與升序相反,對于字符類型為從小寫z到大寫A,對于數字類型為從最大值到最小值。 DATE和DATETIME數據按照從最新到最早排序,INTERVAL數據按從時間范圍最長到 最短排序。以下查詢顯示了降序的示例。
圖:查詢
SELECT * FROM manufact ORDER BY lead_time DESC;
列名后跟關鍵字DESC導致以降序對檢索數據進行排序,如下圖所示:
圖:查詢結果
manu_code manu_name lead_time
SHM
Shimara
30
KAR
Karsten
21
PRC
ProCycle
9
NKL
Nikolus
8
NRG
Norge
7
HSK
Husky
5
ANZ
Anza
5
HRO
Hero
4
SMT
Smith
3
您可以在ORDER BY子句中指定任何內置數據類型的列(TEXT、BYTE、BLOB或 CLOB除外),數據庫服務器根據該列中的值對數據進行排序。
對多個列進行排序
還可以使用ORDER BY排序兩個或多個列,這會創建嵌套排序。缺省值仍然是升序。在 ORDER BY子句中最先列出的列優先。
下列查詢和圖2及相應的查詢結果顯示了嵌套排序。要修改顯示所選數據的順序。更改在 ORDER BY子句中命名的兩個列的順序。
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code, unit_price;
查詢結果中,manu_code列數據按字母順序顯示,并且在同一 manu_code (例如:ANZ、 HRO)中,unit_price以升序列出。
圖:查詢結果
stock_num manu_code description unit_price
5 ANZ
tennis racquet
$19.80
9 ANZ
volleyball net
$20.00
6 ANZ
tennis ball
$48.00
313 ANZ
swim cap
$60.00
201 ANZ
golf shoes
$75.00
310 ANZ
kick board
$84.00
111 SHM
10-spd, assmbld
$499.99
112 SHM
12-spd, assmbld
$549.00
113 SHM
18-spd, assmbld
$685.90
5 SMT
tennis racquet
$25.00
6 SMT
tennis ball
$36.00
1 SMT
baseball gloves
$450.00
下列查詢顯示了 ORDER BY子句中列的相反順序。
圖查詢
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY unit_price, manu_code;
在此查詢結果中,數據按unit_price的升序顯示,其中兩個或多個行具有相同的unit_price (例如:$20.00、$48.00、$312.00), manu_code 以字母順序顯示。
圖: 查詢結果
stock_num manu_code description unit_price
302 HRO
ice pack
$4.50
302 KAR
ice pack
$5.00
5 ANZ
tennis racquet
$19.80
9 ANZ
volleyball net
$20.00
103 PRC
frnt derailleur
$20.00
108 SHM
crankset
$45.00
6 ANZ
tennis ball
$48.00
305 HRO
first-aid kit
$48.00
303 PRC
socks
$48.00
311 SHM
water gloves
$48.00
113 SHM
18-spd, assmblc
1 $685.90
1 HSK
baseball gloves
$800.00
8 ANZ
volleyball
$840.00
4 HSK
football
$960.00
ORDER BY子句中的列的順序十分重要,DESC關鍵字的位置也很重要。盡管下列查詢中 的各語句在ORDER BY子句中包含相同的語句,但是每個語句產生的結果并不相同(沒 有顯示)。
圖查詢
SELECT * FROM stock ORDER BY manu_code, unit_price DESC;
SELECT * FROM stock ORDER BY unit_price, manu_code DESC;
SELECT * FROM stock ORDER BY manu_code DESC, unit_price;
SELECT * FROM stock ORDER BY unit_price DESC, manu_code;
3.2.3選擇特定列
之前的章節顯示了如何選擇和排序表中所有的數據。然而,您經常希望看到的是一個或多 個特定列的數據。并且,公式是使用Projection和FROM子句指定列和表,并可以使用 ORDER BY子句按照升序或降序對數據進行排序。
如果想要操作orders表中的所有客戶號,那么使用以下查詢中的語句。
圖:查詢
SELECT customer_num FROM orders;
該結果顯示了語句如何只選擇orders表中customer_num列中的所有數據,并列出所有訂單 上的客戶號,包括重復的客戶號。
圖:查詢結果
customer_num
104
101
104
122
123
124
126
127
輸岀包括若干重復,原因是某些客戶下了多個訂單。有時您想要在投影中看到重復的行。 而有時您卻只想看到特異值,而不是每個值都出的頻率。
要抑制重復行,可在選擇列表的開頭包括關鍵字DISTINCT或其同義詞UNIQUE,每個 查詢級別一次,如以下查詢所示。
圖:查詢
SELECT DISTINCT customer_num FROM orders;
SELECT UNIQUE customer_num FROM orders;
要生成更可讀的表,圖3將顯示限制為僅顯示一次orders表中的每個客戶號。如下所示。
圖:查詢結果
customer_num
101
104
106
110
111
112
115
116
117
119
120
121
122
123
124
126
127
假設您正在處理客戶電話,并且想要找到購買訂單號DM354331。要列出orders表中的所 有購買訂單號,使用諸如以下查詢所示的語句。
圖查詢
SELECT po_num FROM orders;
該結果顯示了如何檢索到orders表中po_num列的數據。 圖:查詢結果
po_num
B77836
9270
B77890
8006
2865
Q13557
278693
然而,該列表順序無用。可以添加ORDER BY子句來以升序對列數據進行排序,使得查 找特定po_num更容易,如下所示。
圖查詢
SELECT po_num FROM orders ORDER BY po_num;
圖: 查詢結果
po_num
278693
278701
2865
429Q
4745
8006
8052
9270
B77836
B77890
要從表中選擇多個列,請在Projection子句的投影列表中列出它們。以下查詢顯示了選擇 列的順序就是檢索列的順序,從左到右。
圖查詢
SELECT ship_date, order_date, customer_num,
order_num, po_num
FROM orders
ORDER BY order_date, ship_date;
如對多個列進行排序所示,可以使用ORDER BY子句來以升序或降序對數據進行排序和 執行嵌套排序。此結果顯示了升序。
圖:查詢結果
ship_date ordejdate customejnum
order_num po_num
06/01/1998 05/20/1998
104
1001 B77836
05/26/1998 05/21/1998
101
1002 9270
05/23/1998 05/22/1998
104
1003 B77890
05/30/1998 05/22/1998
106
1004 8006
06/09/1998 05/24/1998
116
1005 2865
05/30/1998 112
1006 Q13557
06/05/1998 05/31/1998
117
1007 278693
07/06/1998 06/07/1998
110
1008 LZ230
06/21/1998 06/14/1998
111
1009 4745
06/29/1998 06/17/1998
115
1010 429Q
06/29/1998 06/18/1998
117
1012 278701
07/03/1998 06/18/1998
104
1011 B77897
07/10/1998 06/22/1998
104
1013 B77930
07/03/1998 06/25/1998
106
1014 8052
07/16/1998 06/27/1998
110
1015 MA003
07/12/1998 06/29/1998
119
1016 PC6782
07/13/1998 07/09/1998
120
1017 DM354331
07/13/1998 07/10/1998
121
1018 S22942
07/16/1998 07/11/1998
122
1019 Z55709
07/16/1998 07/11/1998
123
1020 W2286
07/25/1998 07/23/1998
124
1021 C3288
07/30/1998 07/24/1998
126
1022 W9925
07/30/1998 07/24/1998
127
1023 KF2961
當對表中的若干列使用SELECT和ORDER BY時,您會發現使用整數來在ORDER BY 子句中表示列的位置非常有用。當整數是ORDER BY列表中的元素時。數據庫服務器將 它看作是投影列表中的位置。例如,在ORDER BY列表中使用3 (ORDER BY 3)表示 投影列表中的第三項。以下查詢中的語句檢索和顯示相同數據,如下圖12所示。
圖:查詢
SELECT customer_num, order_num, po_num, order_date
FROM orders
ORDER BY 4, 1;
SELECT customer_num, order_num, po_num, order_date
FROM orders
ORDER BY order_date, customer_num;
圖:查詢結果
customer_num
order_num po_num
order_date
104
1001 B77836
05/20/1998
101
1002 9270
05/21/1998
104
1003 B77890
05/22/1998
106
1004 8006
05/22/1998
116
1005 2865
05/24/1998
112
1006 Q13557
05/30/1998
117
1007 278693
05/31/1998
110
1008 LZ230
06/07/1998
111
1009 4745
06/14/1998
115
1010 429Q
06/17/1998
104
1011 B77897
06/18/1998
117
1012 278701
06/18/1998
104
1013 B77930
06/22/1998
106
1014 8052
06/25/1998
110
1015 MA003
06/27/1998
119
1016 PC6782
06/29/1998
120
1017 DM354331
07/09/1998
121
1018 S22942
07/10/1998
122
1019 Z55709
07/11/1998
123
1020 W2286
07/11/1998
124
1021 C3288
07/23/1998
126
1022 W9925
07/24/1998
127
1023 KF2961
07/24/1998
當將整數指定給列名時,可以在ORDER BY子句中包括DESC關鍵字。如下所示。
圖查詢
SELECT customer_num, order_num, po_num, order_date
FROM orders
ORDER BY 4 DESC, 1;
在此示例中,數據先按order_date以降序排序再按customer_num以升序排序。
選擇子串
要選擇字符列的部分值,請在投影列表中包含一個子串。假設市場營銷部門計劃向客戶寄 郵件并想要客戶的基于郵政編碼的地理分布。可編寫與以下圖中顯示的查詢相似的查詢。
圖查詢
SELECT zipcode[1,3], customer_num
FROM customer
ORDER BY zipcode;
該查詢使用子串來選擇zipcode列的前三個字符(它們標識州)和全部customer_num,并 按郵政編碼以升序列出它們,如以下結果所示。
圖:查詢結果
zipcode customer_num
021
125
080
119
085
122
198
121
322
123
943
103
943
107
946
118
ORDER BY和非英文數據
缺省情況下,對于數據庫數據,GBase 8s數據庫服務器使用美國英語語言環境,稱為語言 環境。美國英語語言環境指定數據以代碼集順序存儲。此缺省語言環境使用ISO 8859-1代 碼集。
如果您的數據庫包含非英語數據,那么應在NCHAR (或NVARCHAR)列中存儲非英語 數據,以獲取按語言排序的結果。ORDER BY子句應以適合于語言的順序返回數據。
3.2.4使用 WHERE子句
SELECT語句返回的行集是其活動集。單個SELECT語句返回單個行。如果只想看見特 定行,可將WHERE子句添加至SELECT語句。例如:使用WHERE子句來將數據庫服 務器返回的行限制為特定客戶所下的訂單或特定客戶服務代表輸入的電話。
可以使用WHERE子句來設置比較條件或連接條件。本節只演示第一種用法。連接條件在 后面的節和下一章中描述。
3.2.5創建比較條件
SELECT語句的WHERE子句指定了您想要看到的行。比較條件使用特定關鍵字和運算符 來定義搜索條件。
例如,可使用BETWEEN、IN、LIKE或 MATCHES中的一個來測試相等性。或者使 用關鍵字IS NULL來測試空值。可將關鍵字NOT與這些關鍵字中的任何一個組合來指 定相反條件。
下表列出可在WHERE子句中用來代替關鍵字測試相等性的關系運算符。
運算符
操作
等于
!=或 <>
不等于
大于
=
大于并或等于
<
小于
<=
小于或等于
對于CHAR表達式,大于在ASCII整理順序中意味著之后,其中小寫字母在大寫字母之 后,而大寫字母和小寫字母都在數字之后。請參閱《GBase 8s SQL指南:語法》中的ASCII 字符集圖表。對于DATE和DATETIME表達式,大于意味著時間上更遲,對于 INTERVAL表達式,它意味著更長的持續時間。
不能使用TEXT或BYTE列創建比較條件(使用IS NULL或IS NOT NULL關鍵字來 測試NULL值時除外)。
不能指定BLOB或CLOB列從而在GBase 8s上創建比較條件(用IS NULL或IS NOT NULL關鍵字來測試NULL值時除外)。
可以在WHERE子句中使用上述關鍵字或運算符來創建執行下列操作的比較條件查詢:
包括值
?排除值
查找值范圍
?查找值的子集
標識NULL值
要使用以下條件執行變量文本搜索,在WHERE子句中使用上述關鍵字或運算符來創建比 較條件查詢:
?精確文本比較
?單字符通配符
?受限單字符通配符
可變長通配符
下標
下一節包含說明這些查詢類型的示例。
包括行
在WHERE子句中使用等號(=)關系運算符包括行,如以下查詢所示。
圖:查詢
SELECT customer_num, call_code, call_dtime, res_dtime
FROM cust_calls
WHERE user_id = ‘maryj’;
該查詢返回以下行集。
圖:查詢結果
customer_num call_code call_dtime res_dtime
106 D 1998-06-12 08:20 1998-06-12 08:25
121 O 1998-07-10 14:05 1998-07-10 14:06
127 I 1998-07-31 14:30
排除行
在WHERE子句中使用關系運算符!=或 <> 排除行。
以下查詢假設您從符合ANSI的數據庫中選擇;該語句指定所有者或customer表的創建者 的登錄名。當表的創建者就是當前用戶時,或者當數據庫不符合ANSI時,不需要此限定 符。然而,在任一情況下都可以包括該限定符。有關所有者命名的詳細討論,請參閱《GBase 8s SQL指南:語法》。
圖:查詢
SELECT customer_num, company, city, state
FROM odin.customer
WHERE state != ‘CA’;
SELECT customer_num, company, city, state
FROM odin.customer
WHERE state <> ‘CA’;
此查詢中的兩個語句都通過指定在用戶odin擁有的customer表中state列中的值不應等 于CA來排除值,如下所示。
圖:查詢結果
customer_num
company
city
state
119
The Triathletes Club Cherry Hill
NJ
120
Century Pro Shop
Phoenix
AZ
121
City Sports
Wilmington
DE
122
The Sporting Life
Princeton
NJ
123
Bay Sports
Jacksonville
FL
124
Putnum’s Putters
Bartlesville
OK
125
Total Fitness Sports Brighton
MA
Neelie’s Discount Sp Denver CO
Big Blue Bike Shop Blue Island NY
Phoenix College Phoenix AZ
指定一定范圍的行
下列查詢顯示在WHERE子句中指定一定范圍內行的兩種方法。
圖查詢
SELECT catalog_num, stock_num, manu_code, cat_advert
FROM catalog
WHERE catalog_num BETWEEN 10005 AND 10008;
SELECT catalog_num, stock_num, manu_code, cat_advert
FROM catalog
WHERE catalog_num >= 10005 AND catalog_num <= 10008;
查詢中的每個子句都指定catalog_num的范圍,從10005至10008 (包括10005和 10008),第一個語句使用關鍵字,第二個語句使用關系運算符檢索行。如下所示。
圖:查詢結果
catalog_num 10005
stock_num
3
manu_code
HSK
cat_advert
High-Technology Design Expands the Sweet Spot
catalog_num
10006
stock_num
3
manu_code
SHM
cat_advert
Durable Aluminum for High School and Collegiate Athletes
catalog_num
10007
stock_num
4
manu_code
HSK
cat_advert
Quality Pigskin with Joe Namath Signature
catalog_num
10008
stock_num
4
manu_code
HRO
cat_advert Highest Quality Football for High School and Collegiate Competitions
盡管catalog表標記具有BYTE數據類型的列,但該列不包括在此SELECT語句中,原因 是輸出將按列名只顯示詞<BYTE value>。可以編寫SQL API應用程序來顯示TEXT和 BYTE 值。
排除一定范圍的行
以下查詢使用關鍵字NOT BETWEEN排除zipcode列中字符范圍在94000到94999的 行,如下所示。
圖:查詢
SELECT fname, lname, city, state
FROM customer
WHERE zipcode NOT BETWEEN ‘94000’ AND ‘94999’
ORDER BY state;
圖:查詢結果
fname
lname
city
state
Frank
Lessor
Phoenix
AZ
Fred
Jewell
Phoenix
AZ
Eileen
Neelie
Denver
CO
Jason
Wallack
Wilmington
DE
Marvin
Hanlon
Jacksonville
FL
James
Henry
Brighton
MA
Bob
Shorter
Cherry Hill
NJ
Cathy
O’Brian
Princeton
NJ
Kim
Satifer
Blue Island
NY
Chris
Putnum
Bartlesville
OK
使用WHERE子句査找值的子集
就像排除行,以下查詢假定使用符合ANSI的數據庫。所有者限定符在引號中,以保護文 字字符串的區分大小寫。
圖:查詢
SELECT lname, city, state, phone
FROM ‘Aleta’.customer
WHERE state = ‘AZ’ OR state = ‘NJ’
ORDER BY Iname;
SELECT lname, city, state, phone
FROM ‘Aleta’.customer
WHERE state IN (‘AZ’, ‘NJ’) ORDER BY lname;
查詢中的每個語句在Aleta. customer表的state列中檢索包括AZ或NJ子集的行。
圖:查詢結果
lname
city
state phone
Jewell
Phoenix
AZ
602-265-8754
Lessor
Phoenix
AZ
602-533-1817
O’Brian
Princeton
NJ
609-342-0054
Shorter
Cherry Hill
NJ
609-663-6079
不能使用IN關鍵字來測試TEXT或BYTE列。
另外,當使用GBase 8s時,不能使用IN關鍵字來測試BLOB或CLOB列。
在查詢(對符合ANSI的數據庫進行查詢的示例)中,表所有者名稱兩邊沒有引號。鑒于 圖1中兩個語句搜索Aleta.customer表,以下查詢搜索表ALETA.customer,這是一個不同 的表,原因在于符合ANSI的數據庫查看所有者名稱的方式。
圖查詢
SELECT lname, city, state, phone
FROM Aleta.customer
WHERE state NOT IN (‘AZ’, ‘NJ’)
ORDER BY state;
上一個查詢添加了關鍵字NOT IN,以便子集更改為排除state列中的子集AZ和NJ,下圖 以state列的順序顯示結果。
圖: 查詢結果
lname
city
state phone
Pauli
Sunnyvale
CA
408-789-8075
Sadler
San Francisco
CA
415-822-1289
Currie
Palo Alto
CA
415-328-4543
Higgins
Redwood City
CA
415-368-1100
Vector
Los Altos
CA
415-776-3249
Watson
Mountain View
CA
415-389-8789
Ream
Palo Alto
CA
415-356-9876
Quinn
Redwood City
CA
415-544-8729
Miller
Sunnyvale
CA
408-723-8789
Jaeger
Redwood City
CA
415-743-3611
Keyes
Sunnyvale
CA
408-277-7245
Lawson
Los Altos
CA
415-887-7235
Beatty
Menlo Park
CA
415-356-9982
Albertson
Redwood City
CA
415-886-6677
Grant
Menlo Park
CA
415-356-1123
Parmelee
Mountain View
CA
415-534-8822
Sipes
Redwood City
CA
415-245-4578
Baxter
Oakland
CA
415-655-0011
Neelie
Denver
CO
303-936-7731
Wallack
Wilmington
DE
302-366-7511
Hanlon
Jacksonville
FL
904-823-4239
Henry
Brighton
MA
617-232-4159
Satifer
Blue Island NY
312-944-5691
Putnum
Bartlesville
OK
918-355-2074
標識NULL值
使用IS NULL或IS NOT NULL選項檢查NULL值。NULL值表示沒有數據或未知值。
NULL值不等同于零或空白。
以下查詢返回具有空paid_date的所有行,如下所示。
圖:查詢
SELECT order_num, customer_num, po_num, ship_date
FROM orders
WHERE paid_date IS NULL
ORDER BY customer_num;
圖:查詢結果
ordejnum customejnum po_num ship_date
1004
106
8006
05/30/1998
1006
112
Q13557
1007
117
278693
06/05/1998
1012
117
278701 06/29/1998
1016
119
PC6782 07/12/1998
1017
120
DM354331 07/13/1998
構成復合條件
要連接兩個或多個比較條件或Boolean表達式,使用邏輯運算符AND、OR和NOT。
Boolean表達式的值求出為true或false,如果涉及到NULL值,那么為unknown。
在以下查詢中,運算符AND組合WHERE子句中的兩個比較表達式。
圖:查詢
SELECT order_num, customer_num, po_num, ship_date
FROM orders
WHERE paid_date IS NULL
AND ship_date IS NOT NULL
ORDER BY customer_num;
該查詢返回具有NULL paid_date或NOT NULL ship_date的所有值。
圖:查詢結果
order_num customer_num po_num ship_date
1004
106 8006
05/30/1998
1007
117 278693
06/05/1998
1012
117 278701
06/29/1998
1017
120 DM354331
07/13/1998
使用精確文本比較
以下示例包含一個WHERE子句,它通過使用關鍵字LIKE或MATCHES或者等號(=) 關系運算符來搜索精確文本比較。與較早的示例不同,這些示例說明如何查詢不在當前數 據庫中的表。僅當包含該表的數據庫與當前數據庫的ANSI兼容狀態相同時,才能訪問不 在當前數據庫中的表。如果當前數據庫是符合ANSI的數據庫,那么要訪問的表必須也駐 留在符合ANSI的數據庫中。如果當前數據庫不是符合ANSI的數據庫,那么要訪問的 表必須也駐留在不符合ANSI的數據庫中。
雖然本章前面使用的數據庫是演示數據庫,但是下列示例中的FROM子句指定了由所有 者bubba創建的manatee表,該表駐留在名為syzygy的符合ANSI的數據庫中。有關如何 訪問不在不在當前數據庫中的表的更多信息,請參閱《GBase 8s SQL指南:語法》。
下列查詢中的每個語句檢索description列中具有單詞helmet的所有行,如下所示。
圖查詢
SELECT stock_no, mfg_code, description, unit_price
FROM syzygy:bubba.manatee
WHERE description = ‘helmet’
ORDER BY mfg_code;
SELECT stock_no, mfg_code, description, unit_price
FROM syzygy:bubba.manatee
WHERE description LIKE ‘helmet’
ORDER BY mfg_code;
SELECT stock_no, mfg_code, description, unit_price
FROM syzygy:bubba.manatee
WHERE description MATCHES ‘helmet’ ORDER BY mfg_code;
該結果可能如下圖所示。
圖:查詢結果
stock_no mfg_code description unit_price
991 ABC helmet
991 BKE helmet
991 HSK helmet
991 PRC helmet
991 SPR helmet
$222.00
$269.00
$311.00
$234.00
$245.00
使用變量文本搜索
可對基于字段的子串搜索的變量文本查詢使用關鍵字LIKE和MATCHESo包含關鍵字 NOT以指示相反的條件。
關鍵字LIKE是SQL的ISO/ANSI標準,而 MATCHES是GBase 8s擴展。
變量文本搜索字符串可將列出的通配符與下表中的LIKE或MATCHES包括在一起。 下表顯示了您可以與關鍵字LIKE和MATCHES 一起使用的通配符。說明了這些符號及 其含義。
關鍵字符號 含義
關鍵字
符號
含義
LIKE
%
求值為零或多個字符
LIKE
求值為單個字符
LIKE
\
對下一字符的特殊有效位數進行轉義
MATCHES
求值為零個或多個字符
MATCHES
?
求值為單個字符(空值除外)
MATCHES
::
求值為單個字符或一定范圍內的值
MATCHES
\
對下一字符的特殊有效位數進行轉義
不能使用LIKE或 MATCHES運算符測試BLOB、CLOB、TEXT或BYTE列。
使用單字符通配符
下列查詢中的語句說明如何在WHERE子句中使用單字符通配符。而且,它們還演示了如 何查詢非當前數據庫中的表。stock表位于數據庫sloth中。除了在當前演示數據庫外部之外, sloth還在稱為meerkat的獨立數據庫服務器上。
有關更多信息,請參閱在外部數據庫中訪問和修改數據和《GBase 8s SQL指南:語法》。
圖查詢
SELECT stock_num, manu_code, description, unit_price
FROM sloth@meerkat:stock
WHERE manu_code LIKE ‘R’
AND unit_price >= 100
ORDER BY description, unit_price;
SELECT stock_num, manu_code, description, unit_price
FROM sloth@meerkat:stock
WHERE manu_code MATCHES ‘?R?’
AND unit_price >= 100 ORDER BY description, unit_price;
查詢中的每個語句只檢索manu_code的中間字母是R的那些行。如下所示。比較’R’(對 于LIKE)或’?R?’(對于MATCHES)從左到右指定下列項:
?任何單個字符
? 字母R
?任何單個字符
圖:查詢結果
stock_num manu_code description unit_price
205 HRO
3 golf balls
$312.00
2 HRO
baseball
$126.00
1 HRO
baseball gloves
$250.00
7 HRO
basketball
$600.00
102 PRC
bicycle brakes
$480.00
114 PRC
bicycle gloves
$120.00
4 HRO
football
$480.00
110 PRC
helmet
$236.00
110 HRO
helmet
$260.00
307 PRC
infant jogger
$250.00
306 PRC
tandem adapter
$160.00
308 PRC
twin jogger
$280.00
304 HRO
watch
$280.00
指定一定范圍內的詞首字符的WHERE子句
下列查詢只選擇manu_code以A到H開頭的那些列,并返回結果顯示的行。測試’[A-H]’ 指定從A到H之間(包括A和H)的任何一個字母。對于LIKE關鍵字,不存在等價的 通配符。
圖:查詢
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE manu_code MATCHES ‘[A-H]*’
ORDER BY description, manu_code;
圖:查詢結果
stock_num manu_code description unit_price
205 ANZ
3 golf balls
$312.00
205 HRO
3 golf balls
$312.00
2 HRO
baseball
$126.00
3 HSK
baseball bat
$240.00
1 HRO
baseball gloves
$250.00
1 HSK
baseball gloves
$800.00
7 HRO
basketball
$600.00
313 ANZ
swim cap
$60.00
6 ANZ
tennis ball
$48.00
5 ANZ
tennis racquet
$19.80
8 ANZ
volleyball
$840.00
9 ANZ
volleyball net
$20.00
304 ANZ
watch
$170.00
具有可變長通配符的WHERE子句
下列查詢中的語句在字符串的末尾使用通配符來檢索description以字符bicycle開頭的所 有行。
圖查詢
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE description LIKE ‘bicycle%’
ORDER BY description, manu_code;
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE description MATCHES ‘bicycle*’
ORDER BY description, manu_code;
任一語句都返回以下行。
圖:查詢結果
stock_num manu_code description unit_price
102 PRC
bicycle brakes
$480.00
102 SHM
bicycle brakes
$220.00
114 PRC
bicycle gloves
$120.00
107 PRC
bicycle saddle
$70.00
106 PRC
bicycle stem
$23.00
101 PRC
bicycle tires
$88.00
101 SHM
bicycle tires
$68.00
105 PRC
bicycle wheels
$53.00
105 SHM
bicycle wheels
$80.00
SBASe*
比較’bicycle%'或’bicycle*'指定字符bicycle后跟零個字符或任何字符序列。它與bicycle stem匹配,而stem與通配符匹配。如果具有該描述的行存在,那么它只與字符bicycle匹 配。
以下查詢通過添加排除PRC的manu_code的另一個比較條件來縮小搜索范圍。
圖:查詢
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE description LIKE ‘bicycle%’
AND manu_code NOT LIKE ‘PRC’
ORDER BY description, manu_code;
該語句只檢索到下列行。
圖:查詢結果
stock_num manu_code description unit_price
102 SHM bicycle brakes $220.00
101 SHM bicycle tires $68.00
105 SHM bicycle wheels $80.00
當從大型表中進行選擇并在比較字符串中使用詞首通配符時(如’%cycle’),查詢通常需 要較長時間來執行。由于不能使用索引,所以搜索每一行。
MATCHES子句和非缺省語言環境
缺省情況下,對數據庫數據,GBase 8s數據庫服務器使用美國英語語言環境,稱為語言環 境。缺省的語言環境使用ISO 8859-1代碼集。該美國英語語言環境指定MATCHES將使 用代碼集順序。
如果數據庫使用非缺省語言環境,那么指定范圍的MATCHES子句將該語言環境的整理順 序用于字符數據類型(包括CHAR、NCHAR、VARCHAR、NVARCHAR和 LVARCHAR)。MATCHES范圍的此功能是一般規則(只有NCHAR和NVARCHAR列 可使用特定于語言環境的整理)的例外情況。然而,如果語言環境不能指定任何特殊整理 順序,那么MATCHES使用代碼集順序。
在GBase 8s中,可以使用SET COLLATION語句為會話指定不同于DB_LOCALE設置的 數據庫語言環境。有關SET COLLATION的描述,請參閱《GBase 8s SQL指南:語法》。 保護特殊字符
下列查詢使用ESCAPE與LIKE或MATCHES配合使用,以便您可以保護特殊字符,使 它們不會被誤認為是通配符。
圖查詢
SELECT * FROM cust_calls
WHERE res_descr LIKE ‘%!%%’ ESCAPE
ESCAPE關鍵字指定包含下一個字符的轉義字符(在本示例中為!)以便將它解釋為數據 而不是通配符。在該示例中,轉義字符導致將中間的百分號(%)當作數據。通過使用 ESCAPE關鍵字,您可以使用LIKE通配符百分號(%)在res_descr列中搜索百分號(%) 的岀現次數。查詢檢索下列顯示的行。
圖:查詢結果
customejnum 116
call_dtime 1997-12-21 11:24
user_id mannyn
call_code I
call_descr Second complaint from this customer!
Received two cases righthanded outfielder
glove (1 HRO) instead of one case lefties.
res_dtime 1997-12-27 08:19
res_descr Memo to shipping (Ava Brown) to send case
of lefthanded gloves, pick up wrong case;
memo to billing requesting 5% discount to placate customer due to second offense and lateness of resolution because of holiday.
在WHERE子句中使用下標
您可以在SELECT語句的WHERE子句中使用下標,以指定選擇某列中一定范圍內額字 符或數字,如下所示。
SELECT catalog_num, stock_num, manu_code, cat_advert,
cat_descr
FROM catalog
WHERE cat_advert[1,4] = ‘High’;
下標[1,4]導致該查詢檢索cat_advert列的前四個字母為High的所有行。如下所示。
圖: 查詢結果
catalog_num 10004
stock_num 2
manu_code HRO
SBASe*
cat_advert Highest Quality Ball Available, from Hand-Sti tching to the Robinson Signature
cat_descr
Jackie Robinson signature ball. Highest professional quality, used by National League.
catalog_num 10005
stock_num 3
manu_code HSK
cat_advert High-Technology Design Expands the Sweet Spot cat_descr
Pro-style wood. Available in sizes: 31,32, 33, 34, 35.
catalog_num 10045
stock_num 204
manu_code KAR
cat_advert High-Quality Beginning Set of Irons. Appropriate for High School Competitions
cat_descr
Ideally balanced for optimum control. Nylon covered shaft.
catalog_num 10068
stock_num 310
manu_code ANZ
cat_advert High-Quality Kickboard
cat_descr
White. Standard size.
3.2.6使用FIRST子句選擇特定行
可以在SELECT語句的Projection子句中包含FIRST max規范(其中max具有整數值) 來構建查詢,使其僅返回匹配SELECT語句條件的最初max行。在(且僅在)此上下文中, 也可以使用關鍵字LIMIT作為FIRST的同義詞。執行具有FIRST子句的SELECT語句 時返回的行可能會不同,這取決于該語句是否還包含ORDER BY子句。
在Projection子句中,后面跟無符號整數的關鍵字SKIP可用在FIRST或LIMIT關鍵字 前面。SKIP offset子句指示數據庫服務器在返回FIRST子句指定的行數之前,從查詢結果 集中排除最初offset行滿足條件的行。在SPL例程中,SKIP、FIRST或LIMIT的參數
可以是字面值整數或局部SPL變量。如果Projection子句包含SKIP offset但不包含
FIRST或LIMIT規范,那么查詢返回除最初offset行以外所有滿足條件的行。
Projection子句在下列上下文中不能包含SKIP、FIRST或LIMIT關鍵字:
?當SELECT語句是視圖定義的一部分
? 在子查詢中,除了外部查詢的FROM子句
?在跨服務器分發的查詢中,其中參與的數據庫服務器不支持SKIP、FIRST或
LIMIT關鍵字。
有關使用FIRST子句的限制的信息,請參閱《GBase 8s SQL指南:語法》中SELECT語 句的Projection子句的描述。
不具有ORDER BY子句的FIRST子句
如果具有FIRST子句的SELECT語句中沒有ORDER BY子句,那么可能返回符合
SELECT語句條件的任何行。換言之,數據庫服務器確定返回哪些限定行,并且查詢結果 可能會不同,這取決于優化器選擇的查詢計劃。
以下查詢使用FIRST子句來返回state表中的前五行。
圖:查詢
SELECT FIRST 5 * FROM state;
圖:查詢結果
code sname
AK Alaska
HI Hawaii
CA California
OR Oregon
WA Washington
當只想知道表包含的所有列的名稱和數據的類型,或者測試可能會返回許多行的查詢時, 可以使用FIRST子句。以下查詢顯示了如何使用FIRST子句來返回表的第一行的列值。
圖:查詢
SELECT FIRST 1 * FROM orders;
圖:查詢結果
order_num 1001
order_date 05/20/1998
customer_num 104
ship_instruct express
backlog
n
po_num
B77836
ship_date
06/01/1998
ship_weight
20.40
ship_charge
$10.00
paid_date
07/22/1998
具有ORDER BY子句的FIRST子句
可以在具有FIRST子句的SELECT語句中包括ORDER BY子句,以返回包含指定列的 最高值或最低值的行。以下查詢顯示了包含ORDER BY子句以(按字母順序)返回包含 在state表中的前五個州的查詢。該查詢,(除ORDER BY子句以外,它與圖1相同)返 回不同于圖1的一組行。
圖:查詢
SELECT FIRST 5 * FROM state ORDER BY sname;
圖:查詢結果
code sname
AL Alabama
AK Alaska
AZ Arizona
AR Arkansas
CA California
以下查詢顯示如何在具有ORDER BY子句的查詢中使用FIRST子句來查找stock表中 列出的10中最貴的商品。
圖:查詢
SELECT FIRST 10 description, unit_price
FROM stock ORDER BY unit_price DESC;
圖:查詢結果
description unit_price
football
$960.00
volleyball
$840.00
baseball gloves
$800.00
18-spd, assmbld
$685.90
irons/wedge
$670.00
basketball $600.00
12-spd, assmbld $549.00
10-spd, assmbld $499.99
football $480.00
bicycle brakes $480.00
應用程序可以將Projection子句的SKIP和FIRST關鍵字與ORDER BY子句相結合使 用,以執行連續查詢,對某些固定大小(例如,最大行數可在一屏顯示,無需滾動)的子 集中所有滿足條件的行進行增量檢索。通過在每次查詢后使用FIRST子句的max參數增 大SKIP子句的offset參數值可實現上述操作。通過對滿足條件的行施加唯一的命令, ORDER BY子句確保每次查詢返回滿足條件行的不同子集。
以下查詢顯示了包含SKIP、FIRST和ORDER BY規范以(按字母順序)返回state表的 10個州中的第六個州,而不是前五個州的查詢。該查詢類似于圖1,但SKIP 5規范指示 數據庫服務器返回不同于圖1的行集。
圖:查詢
SELECT SKIP 5 FIRST 5 * FROM state ORDER BY sname;
圖:查詢結果
code sname
CO Colorado
CT Connecticut
DE Delaware
FL Florida
GA Georgia
如果使用SKIP、FIRST和ORDER BY關鍵字,必須指定對應于應用程序設計目標的參 數,如果SKIP的offset參數大于滿足條件的行數,那么任何FIRST或LIMIT規范都無 效,并且查詢不會返回任何結果。
3.2.7表達式和派生的值
不限制您按名稱選擇列。可以在SELECT語句的Projection子句中列出表達式來執行對列 數據的計算,并顯示派生自一列或多列的內容的信息。
表達式由列名、常量、帶引號字符串、關鍵字或用運算符連接的這些項的任何組合組成。 當在程序中嵌入SELECT語句時,它還可以包括主變量(程序數據)。
算術表達式
算術運算符至少包含下表中列出的算術運算符之一并產生一個數字
運算符
操作
加
減
乘
/
除
不能在算術表達式中使用TEXT或BYTE列。
在GBase 8s,不能在算術表達式中指定BLOB或CLOB。
算術表達式使您能夠查看建議的計算的結果而不必實際改變數據庫中的數據。可以添加 INTO TEMP子句來將已改變的數據保存在臨時表中以供將來參考、計算或即時報告。
當unit_price為$400或更多時,以下查詢對unit_price列計算7%的銷售稅(但不在數據 庫中更新它)。
圖:查詢
SELECT stock_num, description, unit_price, unit_price * 1.07
FROM stock
WHERE unit_price >= 400;
此結果在expression列中顯示。
圖:查詢結果
stock_num description unit_price (expression)
1 baseball gloves
$800.00
$856.00
1 baseball gloves
$450.00
$481.50
4 football
$960.00
$1027.20
4 football
$480.00
$513.60
7 basketball
$600.00
$642.00
8 volleyball
$840.00
$898.80
102 bicycle brakes
$480.00
$513.60
111 10-spd, assmbld
$499.99
$534.99
112 12-spd, assmbld
$549.00
$587.43
113 18-spd, assmbld
$685.90
$733.91
203 irons/wedge $670.00 $716.90
當訂貨數量小于5時,下列查詢對訂單計算$6.50的附加費用。
圖查詢
SELECT item_num, ordejnum, quantity,
total_price, total_price + 6.50
FROM items
WHERE quantity < 5;
結果顯示在expression列中。
圖:查詢結果
item_num order_num quantity total_price (expression)
1
1001
1
$250.00
$256.50
1
1002
1
$960.00
$966.50
2
1002
1
$240.00
$246.50
1
1003
1
$20.00
$26.50
2
1003
1
$840.00
$846.50
1
1004
1
$250.00
$256.50
2
1004
1
$126.00
$132.50
3
1004
1
$240.00
$246.50
4
1004
1
$800.00
$806.50
1
1023
2
$40.00
$46.50
2
1023
2
$116.00
$122.50
3
1023
1
$80.00
$86.50
4
1023
1
$228.00
$234.50
5
1023
1
$170.00
$176.50
6
1023
1
$190.00
$196.50
下列查詢計算并在expression列中顯示按接收到客戶電話(call_dtime)與處理電話 (res_dtime)之間的時間間隔(以天、小時和分鐘計)。
圖查詢
SELECT customejnum, call_code, call_dtime,
res_dtime - call_dtime
FROM cust_calls
ORDER BY customer_num;
圖: 查詢結果
customer_num call_code call_dtime (expression)
106 D
1998-06-12 08:20
0 00:05
110 L
1998-07-07 10:24
0 00:06
116 I
1997-11-28 13:34
0 03:13
116 I
1997-12-21 11:24
5 20:55
119 B
1998-07-01 15:00
0 17:21
121 O
1998-07-10 14:05
0 00:01
127 1
1998-07-31 14:30
使用顯示標簽
可以將顯示標簽指定給計算或派生的數據列,以替換缺省列頭expression。在圖1、圖?3和圖1中,派生數據顯示在expression列中。下列查詢還顯示派生值,但顯示派生值的列 具有描述性頭taxed。
圖查詢
SELECT stock_num, description, unit_price,
unit_price * 1.07 taxed
FROM stock
WHERE unit_price >= 400;
結果顯示將標記taxed指定給用于顯示操作unit_price * 1.07的結果的投影列表中的表達 式。
圖:查詢結果
stock_num description unit_price taxed
1 baseball gloves
$800.00
$856.00
1 baseball gloves
$450.00
$481.50
4 football
$960.00
$1027.20
4 football
$480.00
$513.60
7 basketball
$600.00
$642.00
8 volleyball
$840.00
$898.80
102 bicycle brakes
$480.00
$513.60
111 10-spd, assmbld
$499.99
$534.99
112 12-spd, assmbld
$549.00
$587.43
113 18-spd, assmbld
$685.90
$733.91
203 irons/wedge
$670.00
$716.90
在下列查詢中,為顯示操作total_price + 6.50的結果的列定義標簽surchargeo
圖查詢
SELECT item_num, order_num, quantity,
total_price, total_price + 6.50 surcharge
FROM items
WHERE quantity < 5;
在輸出中對surcharge列添加標簽。
圖:查詢結果
item_num order_num quantity total_price surcharge
1
1001
1
$250.00
$256.50
1
1002
1
$960.00
$966.50
2
1002
1
$240.00
$246.50
1
1003
1
$20.00
$26.50
2
1003
1
$840.00
$846.50
1
1023
2
$40.00
$46.50
2
1023
2
$116.00
$122.50
3
1023
1
$80.00
$86.50
4
1023
1
$228.00
$234.50
5
1023
1
$170.00
$176.50
6
1023
1
$190.00
$196.50
下列查詢將標簽span指定給顯示從DATETIME列res_dtime減去DATETIME 列call_dtime的結果的列。
圖查詢
SELECT customejnum, call_code, call_dtime,
res_dtime - call_dtime span
FROM cust_calls ORDER BY customer_num;
在輸出中標記了 span列。
圖: 查詢結果
customejnum call_code call_dtime
span
106 D
1998-06-12 08:20
0 00:05
110 L
1998-07-07 10:24
0 00:06
116 I
1997-11-28 13:34
0 03:13
116 I
1997-12-21 11:24
5 20:55
119 B
1998-07-01 15:00
0 17:21
121 O
1998-07-10 14:05
0 00:01
127 I
1998-07-31 14:30
CASE表達式
CASE表達式條件表達式,類似于編程語言中的CASE語句。當要更改表示數據的方式時, 可以使用CASE表達式。CASE表達式允許語句返回若干可能結果之一,這取決于若干條 件測試中哪一個求值為TRUE。
在CASE表達式中不允許TEXT或BYTE值。
考慮用數字表示婚姻狀態的列,1、2、3和4是相應表示單身、已婚、離異和喪偶的值。 在某些情況下,考慮到數據庫的效率,您可能更想存儲短的值(1 ,2,3和4),但人
力資源部的職員可能更具有描述性的值(單身、已婚、離異和喪偶)。CASE表達式簡化 了這種不同值集之間的轉換。
下列示例顯示具有多個 WHEN子句的CASE表達式,它返回stock表的manu_code列更 具有描述性的值。如果沒有任何WHEN條件為true,那么NULL是缺省的結果。(可以 省略ELSE NULL子句。)
SELECT
CASE
WHEN manu_code = “HRO” THEN “Hero”
WHEN manu_code = “SHM” THEN “Shimara”
WHEN manu_code = “PRC” THEN “ProCycle”
WHEN manu_code = “ANZ” THEN “Anza”
ELSE NULL
END
FROM stock;
在CASE表達式中必須至少包含一個 WHEN子句;后續的WHEN子句和ELSE子句 是可選的。如果沒有WHEN條件求值為true,那么結果值為NULL。可以使用IS NULL 表達式來處理為NULL值的結果。有關處理值(NULL)的信息,請參閱《GBase 8s SQL指 南:語法》。
下列查詢顯示了簡單的CASE表達式,它返回一個字符串值來標記0rders表中尚未交付給 客戶的任何訂單。
圖:查詢
SELECT order_num, order_date,
CASE
WHEN ship_date IS NULL
THEN “order not shipped”
END
FROM orders;
圖:查詢結果
ordejnum ordejdate (expression)
05/20/1998
05/21/1998
05/22/1998
05/22/1998
05/24/1998
05/30/1998 order not shipped
05/31/1998
07/11/1998
07/11/1998
07/23/1998
07/24/1998
07/24/1998
有關如何使用CASE表達式來更新列的信息,請參閱更新列的CASE表達式。
對派生列進行排序
當想要在表達式中使用ORDER BY時,可以使用指定給表達式的顯示標注或整數。如圖1?和圖3所示。
圖查詢
SELECT customejnum, call_code, call_dtime,
res_dtime - call_dtime span
FROM cust_calls ORDER BY span;
下列查詢從cust_calls表中檢索圖5所檢索的相同數據。在此查詢中,ORDER BY子句導 致以span列中派生值的升序顯示數據,如下所示。
圖: 查詢結果
customejnum call_code call_dtime span
127 I
1998-07-31 14:30
121 O
1998-07-10 14:05
0 00:01
106 D
1998-06-12 08:20
0 00:05
110 L
1998-07-07 10:24
0 00:06
116 I
1997-11-28 13:34
0 03:13
119 B
1998-07-01 15:00
0 17:21
116 I
1997-12-21 11:24
5 20:55
下列查詢使用整數表示運算res_dtime - call_dtime的結果,并檢索出現在上一結果中的相同 行。
圖查詢
SELECT customer_num, call_code, call_dtime,
res_dtime - call_dtime span
FROM cust_calls ORDER BY 4;
3.2.8在SELECT語句中使用Rowid值
數據庫服務器將唯一的rowid指定給未分片的表中的行。實際上,rowid是每個表中的隱藏 列。rowid的順序值沒有任何特殊意義,可能根據chunk中的物理數據的位置的不同而變 化。可以使用rowid來找到與表中的某行相關聯的內部記錄號。分片表中的行不自動包含 rowid 列。
建議您在應用程序中使用主鍵而不是rowid作為訪問的方法。因為主鍵是用SQL的 ANSI規范定義的,所以使用它們來訪問數據提高了應用程序的可移植性。另外,當數據 庫服務器使用主鍵時,它訪問分片表中的數據所需的時間比使用rowid時訪問相同數據所 需的時間要要少。
有關rowid的更多信息,請參閱《GBase 8s管理員指南》。
下列查詢在Projection子句中使用rowid和星號(*)來檢索manufact表中的每一行及其 相應的rowid o
圖查詢
SELECT rowid, * FROM manufact;
圖:查詢結果
rowid manu_code manu_name
lead_time
257 SMT
Smith
3
258 ANZ
Anza
5
259 NRG
Norge
7
260 HSK
Husky
5
261 HRO
Hero
4
262 SHM
Shimara
30
263 KAR
Karsten
21
264 NKL
Nikolus
8
265 PRC
ProCycle
9
不要在permanent表中存儲rowid或嘗試將它用作外鍵。如果刪除了一個表然后從外部數 據重新裝入它,那么所有rowid都將不同。
3.3多表SELECT語句
要從兩個或多個表中選擇數據,在FROM子句中指定表名。添加WHERE子句一章每個 表中的至少一個相關列間創建連接條件。WHERE子句創建臨時組合表。在其中,滿足連 接添加的每一對行都被鏈接以組成單個行。
簡單連接根據每個表中某列的關系組合來自兩個或多個表的信息。組合連接根據每個表中 兩個或多個列之間的關系連接兩個或多個表。
要創建連接,必須在每個表中至少一列之間指定稱為連接條件的關系。因為要對列進行比 較,所以它們必須具有兼容的數據類型。當連接大型表時,對連接條件中的列進行索引會 提高性能。
數據類型在GBase 8s SQL參考指南中描述。索引在GBase 8s管理員指南中詳細所討論。
3.3.1創建笛卡爾積
當執行未顯式聲明表之間的連接條件的多表查詢時,就創建了笛卡爾積。笛卡爾積由表的 行的每種可能的組合構成。此結果通常很大且不實用。
以下查詢從兩個表中進行選擇并生成笛卡爾積。
圖:查詢
SELECT * FROM customer, state;
state表只有52行,customer表只有28行,然而查詢的影響是將一個表的行數乘以另一 個表的行數并檢索不實用的1,456行,如下所示。
圖:查詢結果
customejnum 101
fname
Ludwig
lname
Pauli
company
All Sports Supplies
address1
213 Erstwild Court
address2
city
Sunnyvale
state
CA
zipcode
94086
phone
408-789-8075
code
AK
sname
Alaska
customer_num 101 fname Ludwig
Iname Pauli
company All Sports Supplies
address1 213 Erstwild Court
address2
city Sunnyvale
state CA
zipcode 94086
phone 408-789-8075
code HI
sname Hawaii
customer_num 101
fname
Ludwig
lname
Pauli
company
All Sports Supplies
address1
213 Erstwild Court
address2
city
Sunnyvale
state
CA
zipcode
94086
phone
408-789-8075
code
CA
sname
California
另外,顯示在連續行中的某些數據是矛盾的。例如:雖然customer表中的city和state指示 在California的地址,但是state表的code和sname可能是另一個州的。
3.3.2創建連接
在概念上,任何連接的第一階段是創建笛卡爾積,要改進或限制此笛卡爾積并除去數據行 的無意義組合,在SELECT語句的WHERE子句中包括有效的連接條件。
本節說明了跨連接、等值連接、自然連接和多表連接。其他復雜構成(如自連接和外鏈接) 在編寫高級SELECT語句中討論。
跨連接
跨連接組合所有選擇的表中的所有行并創建笛卡爾積。跨連接的結果可能會非常大并且難 于管理。
下列查詢使用ANSI連接語法創建跨連接。
圖:查詢
SELECT * FROM customer CROSS JOIN state;
該查詢的結果與圖1的結果完全相同。另外,可能通過指定WHERE子句來過濾跨連接。
有關笛卡爾積的更多信息,請參閱創建笛卡爾積。有關ANSI語法的更多信息,請參閱ANSI 連接語法。
等值連接
等值連接是基于相等或匹配列值的連接。在WHERE子句中,使用作為比較運算符的等號 (=)來表示這一相等關系。如下所示。
圖:查詢
SELECT * FROM manufact, stock
WHERE manufact.manu_code = stock.manu_code;
該查詢在manu_code列上連接manufact和stock表。它只檢索兩個列的值相等的那些行。 以下結果顯示了一些這樣的行。
圖:查詢結果
manu_code SMT
manu_name Smith
lead_time 3
stock_num 1
manu_code SMT
description baseball gloves
unit_price $450.00
unit
case
unit_descr
10 gloves/case
manu_code
SMT
manu_name
Smith
lead_time
3
stock_num
5
manu_code
SMT
description
tennis racquet
unit_price
$25.00
unit
each
unit descr
each
manu_code
SMT
manu_name
Smith
lead_time
3
stock_num
6
manu_code
SMT
description
tennis ball
unit_price
$36.00
unit
case
unit_descr
24 cans/case
manu_code
ANZ
manu_name
Anza
lead_time
5
stock_num
5
manu_code
ANZ
description
tennis racquet
unit_price
$19.80
unit
each
unit_descr
each
在等值連接中,該結果同時包括manufact和stock表中的manu_code列,原因是選擇列表 請求每個列。
還可以使用附加約束創建等值連接,此時比較條件基于連接列中值的不相等性。這些連接 在WHERE子句中指定的比較條件中除等號(=)之外還使用其他關系運算符。
要連接包含相同名稱的列的表,用列的表名和句點(.)限定每個列名,如下列查詢所示。
圖查詢
SELECT order_num, orde^date, ship_date, cust_calls.*
FROM orders, cust_calls
WHERE call_dtime >= ship_date
AND cust_calls.customer_num = orders.customer_num
ORDER BY orders.customejnum;
該查詢連接customer_num列,然后只選擇cust_calls表中call_dtime大于或等于orders表中 的ship_date那些行。該結果顯示它返回的組合行。
圖:查詢結果
order_num 1004
order_date 05/22/1998
ship_date 05/30/1998
customer_num 106
call_dtime 1998-06-12 08:20
user_id maryj
call_code D
call_descr Order received okay, but two of the cans of
ANZ tennis balls within the case were empty
res_dtime 1998-06-12 08:25
res_descr Authorized credit for two cans to customer,
issued apology. Called ANZ buyer to report
the qa problem.
order_num
1008
order_date
06/07/1998
ship_date
07/06/1998
customer_num
110
call_dtime
1998-07-07 10:24
user_id
richc
call_code
L
call_descr
Order placed one month ago (6/7) not received.
res_dtime
1998-07-07 10:30
res_descr
Checked with shipping (Ed Smith). Order out
yesterday-was waiting for goods from ANZ. Next time will call with delay if necessary.
order_num order_date ship_date
1023
07/24/1998
07/30/1998
customer_num 127
call_dtime user_id
1998-07-31 14:30
maryj
call_code call_descr
I
Received Hero watches (item # 304) instead
of ANZ watches
res_dtime res_descr
Sent memo to shipping to send ANZ item 304
to customer and pickup HRO watches. Should be done tomorrow, 8/1
自然連接
自然連接是等值連接的一種,構建它來使連接列不會多余地顯示數據,如以下查詢所示。
圖查詢
SELECT manu_name, lead_time, stock.*
FROM manufact, stock
WHERE manufact.manu_code = stock.manu_code;
類似等值連接的示例,該查詢在manu_code列上連接manufact和stock表。因為更接近地 定義了投影列表,所以只對檢索到的每一行列出一次manu_code,如下所示。
圖:查詢結果
manu_name Smith
lead_time
3
stock_num
1
manu_code
SMT
description
baseball gloves
unit_price
$450.00
unit
case
unit_descr
10 gloves/case
manu_name
Smith
lead_time
3
stock_num
5
manu_code
SMT
description
tennis racquet
unit_price
$25.00
unit
each
unit_descr
each
manu_name
Smith
lead_time
3
stock_num
6
manu_code
SMT
description
tennis ball
unit_price
$36.00
unit
case
unit_descr
24 cans/case
manu_name Anza
lead_time 5
stock_num 5 manu_code ANZ
description tennis racquet
unit_price $19.80 unit each
unit_descr each
所有的連接都是相關聯的。即,WHERE子句中的連接術語不影響連接的意義。
下列查詢中的兩個語句都創建相同的自然連接。
圖查詢
SELECT catalog.*, description, unit_price, unit, unit_descr
FROM catalog, stock
WHERE catalog.stock_num = stock.stock_num
AND catalog.manu_code = stock.manu_code
AND catalog_num = 10017;
SELECT catalog.*, description, unit_price, unit, unit_descr
FROM catalog, stock
WHERE catalog_num = 10017
AND catalog.manu_code = stock.manu_code
AND catalog.stock_num = stock.stock_num;
每個語句檢索到下列行。
圖:查詢結果
catalog_num 10017
stock_num 101
manu_code PRC
cat_descr
Reinforced, hand-finished tubular. Polyurethane belted.
Effective against punctures. Mixed tread for super wear and road grip.
cat_picture
cat_advert Ultimate in Puncture Protection, Tires
Designed for In-City Riding description bicycle tires unit_price $88.00 unit box
unit_descr 4/box
圖 3 包括 TEXT 列 cat_descr、BYTE 列 cat_picture 和 VARCHAR 列 cat_advert。
多表連接
多表連接在一個或多個相關聯列上連接兩個以上的表。它可以是等值連接或自然連接。
下列查詢在catalog、stock和manufact表上創建等值連接。
圖查詢
SELECT * FROM catalog, stock, manufact
WHERE catalog.stock_num = stock.stock_num
AND stock.manu_code = manufact.manu_code
AND catalog_num = 10025;
該查詢檢索到下列行。
圖: 查詢結果
catalog_num 10025
stock_num 106
manu_code PRC
cat_descr
Hard anodized alloy with pearl finish; 6mm hex bolt hard ware.
Available in lengths of 90-140mm in 10mm increments.
cat_picture
cat_advert
ProCycle Stem with Pearl Finish
stock_num
106
manu_code
PRC
description
bicycle stem
unit_price
$23.00
unit
each
unit_descr
each
manu_code
PRC
manu_name
ProCycle
lead_time
9
manu_code重復三次,每個表一次,stock_num重復兩次。
為避免多表查詢的大量重復(如圖1),在投影列表中包括特定的列以更確切地定義 SELECT語句,如下所示。
圖查詢
SELECT catalog.*, description, unit_price, unit,
unit_descr, manu_name, lead_time
FROM catalog, stock, manufact
WHERE catalog.stock_num = stock.stock_num
AND stock.manu_code = manufact.manu_code
AND catalog_num = 10025;
該查詢使用通配符來從具有大多數列的表中選擇所有列,然后從其他兩個表中指定列。下 表顯示了此查詢生成的自然連接。它與前一示例顯示相同的信息,但不重復。
圖:查詢結果
catalog_num 10025
stock_num 106
manu_code PRC
cat_descr
Hard anodized alloy with pearl finish. 6mm hex bolt
hardware. Available in lengths of 90-140mm in 10mm increments.
cat_picture
cat_advert
ProCycle Stem with Pearl Finish
description
bicycle stem
unit_price
$23.00
unit
each
unit_descr
each
manu_name
ProCycle
lead_time
9
3.3.3某些查詢快捷方式
可以使用別名,INTO TEMP子句和顯示標注來加快連接和多表查詢,并生成輸出以用于 其它用途。
別名
可以在SELECT語句的FROM子句中將別名指定給表,以使多表查詢更節省時間,可讀 性更高。每當要使用表名時,就可以使用別名,例如:在其他子句中作為列名的前綴。
圖查詢
SELECT s.stock_num, s.manu_code, s.description,
s.unit_price, c.catalog_num,
c.cat_advert, m.lead_time
FROM stock s, catalog c, manufact m
WHERE s.stock_num = c.stock_num
AND s.manu_code = c.manu_code
AND s.manu_code = m.manu_code
AND s.manu_code IN (‘HRO’, ‘HSK’)
AND s.stock_num BETWEEN 100 AND 301
ORDER BY catalog_num;
SELECT語句的相關特性允許您在定義別名之前使用別名。在此查詢中,stock表的別名 是s, catalog表的別名是c, manufact表的別名是m,它們分別在FROM子句中指定。并 在整個SELECT和 WHERE子句中用作列前綴。
將圖1的長度與下列查詢比較,后者不使用別名。
圖查詢
SELECT stock.stock_num, stock.manu_code, stock.description, stock.unit_price, catalog.catalog_num,
catalog.cat_advert, manufact.lead_time FROM stock, catalog, manufact
WHERE stock.stock_num = catalog.stock_num
AND stock.manu_code = catalog.manu_code
AND stock.manu_code = manufact.manu_code
AND stock.manu_code IN (‘HRO’, ‘HSK’)
AND stock.stock_num BETWEEN 100 AND 301
ORDER BY catalog_num;
圖1和圖2是等價的且都檢索到以下查詢顯示的數據。
圖:查詢結果
stock_num 110
manu_code HRO
description helmet unit_price $260.00 catalog_num 10033
cat_advert Lightweight Plastic with Vents Assures Cool
Comfort Without Sacrificing Protection
lead_time 4
stock_num 110
manu_code HSK
description helmet unit_price $308.00 catalog_num 10034
cat_advert Teardrop Design Used by Yellow Jerseys; You
Can Time the Difference
lead_time 5
不能將 ORDER BY 子句用于 TEXT 列 cat_descr 或 BYTE 列 cat_picture。
可以使用別名來縮短對不在當前數據庫中的表的查詢時間。
下列查詢連接駐留在不同數據庫和系統(均不是當前數據庫或系統)中的2個表中的列。
圖查詢
SELECT order_num, Iname, fname, phone
FROM masterdb@central:customer c, sales@western:orders o
WHERE c.customer_num = o.customer_num
AND order_num <= 1010;
通過分別將c和o指定給長database@system:table名
稱 masterdb@central:customer 和 sales@western:orders,您可以使用別名來縮短 WHERE 子 句中的表達式并檢索數據,如下所示。
圖:查詢結果
ordejnum lname
fname
phone
1001 Higgins
Anthony
415-368-1100
1002 Pauli
Ludwig
408-789-8075
1003 Higgins
Anthony
415-368-1100
1004 Watson
George
415-389-8789
1005 Parmelee
Jean
415-534-8822
1006 Lawson
Margaret
415-887-7235
1007 Sipes
Arnold
415-245-4578
1008 Jaeger
Roy
415-743-3611
1009 Keyes
Frances
408-277-7245
1010 Grant
Alfred
415-356-1123
有關如何訪問不在當前數據庫中的表的更多信息,請參閱訪問其他數據庫服務器和《GBase 8s SQL指南:語法》。
還可以使用同義詞作為不在當前數據庫中的表以及當前表和視圖的長名稱的簡寫引用。
INTO TEMP 子句
通過將INTO TEMP子句添加到您的SELECT語句,可以在獨立的表中臨時保存多表查 詢的結果,您可以查詢或處理該表,而無需修改數據庫。當結束SQL會話或者程序或報 告終止時,就會刪除臨時表。
下列查詢創建名為stockman的臨時表,并將在其中保存查詢的結果。由于臨時表中的所有 列都必須具有名稱,所以別名adj_price是必需的。
圖:查詢
SELECT DISTINCT stock_num, manu_name, description,
unit_price, unit_price * 1.05 adj_price
FROM stock, manufact
WHERE manufact.manu_code = stock.manu_code
INTO TEMP stockman;
SELECT * from stockman;
圖:查詢結果
stock_num manu_name description unit_price adj_price
1 Hero
baseball gloves
$250.00
$262.5000
1 Husky
baseball gloves
$800.00
$840.0000
1 Smith
baseball gloves
$450.00
$472.5000
2 Hero
baseball
$126.00
$132.3000
3 Husky
baseball bat
$240.00
$252.0000
4 Hero
football
$480.00
$504.0000
4 Husky
football
$960.00 $1008.0000
306 Shimara
tandem adapter
$190.00
$199.5000
307 ProCycle
infant jogger
$250.00
$262.5000
308 ProCycle
twin jogger
$280.00
$294.0000
309 Hero
ear drops
$40.00
$42.0000
309 Shimara
ear drops
$40.00
$42.0000
310 Anza
kick board
$84.00
$88.2000
310 Shimara
kick board
$80.00
$84.0000
311 Shimara
water gloves
$48.00
$50.4000
312 Hero
racer goggles
$72.00
$75.6000
312 Shimara
racer goggles
$96.00
$100.8000
313 Anza
swim cap
$60.00
$63.0000
313 Shimara
swim cap
$72.00
$75.6000
可以查詢此表并將該表與其它表連接,這可以避免多次排序,并使您能夠更快地在數據庫 中移動。有關臨時表的更多信息,請參閱《GBase 8s SQL指南:語法》和《GBase 8s管理 員指南》。
3.4總結
本章介紹了用于查詢關系數據庫的基本SELECT語句類型的語法示例和結果。單個表的SELECT語句一節顯示了如何執行以下操作:
使用Projection和FROM子句從表中選擇列和行
使用Projection、FROM和 WHERE子句從表中選擇行
在Projection子句中使用DISTINCT或UNIQUE關鍵字來消除查詢結果中重復的行
使用ORDER BY子句和DESC關鍵字來排序檢索的數據
? ????選擇包含非英語字符的數據值并對其排序
在 WHERE子句中使用BETWEEN、IN、MATCHES和LIKE關鍵字以及各
種關系運算符來創建比較條件
???????創建包括值、排除值、查找一定范圍內的值(使用關鍵字、關系運算符和下標)查找值的子集的比較條件
???????使用精確文本比較、變長通配符和受限及非受限通配符來執行變量文本搜索
使用邏輯運算符AND、OR和NOT來在WHERE子句中連接搜索條件或Boolean表達式
???????使用ESCAPE關鍵字來保護查詢中的特殊字符
在 WHERE子句中使用IS NULL和IS NOT NULL關鍵字來搜素NULL值
使用FIRST子句指定查詢只返回符合SELECT語句的條件的指定書目的行
???????在Projection子句中使用算術運算符對數字字段執行計算并顯示派生數據
???????將顯示標簽指定個計算列作為用于報告的格式化工具
本章還介紹了簡單連接條件,使您能夠從兩個或多個表中選擇和顯示數據。多表SELECT語句一節描述了如何執行下列操作:
?創建笛卡爾積
創建CROSS JOIN,它創建笛卡爾積
?在查詢中將WHERE子句與有效連接條件包括在一起以抑制笛卡爾積
?定義和創建自然連接和等值連接
?在一列或多列上連接兩個或多個表
?在多表查詢中使用別名作為快捷方式
?使用INTO TEMP子句將選擇的數據檢索到獨立的臨時表中,以便在數據庫外部執行計算
總結
以上是生活随笔為你收集整理的GBase 8s SQL 指南:教程———3编写SELECT语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: logstash filter 过滤器详
- 下一篇: 数据结构(一)求矩阵中的鞍点