概要
在本次實驗中,將測試您的 SQL/XML 和 Xquery 相關知識並體驗 DB2 Command Editor 和 IBM Data Studio 以及 SQL Assist Wizard。
前提條件
首先,確保您的機器上已經安裝了 DB2 Express-C V9.5 免費數據庫服務器;
您已經閱讀了 “DB2Express-C 快速入門”(中文版) 中的相關內容。
您已經學習了本系列實驗的前幾篇文章的相關內容。
SQL/XML 和 Xquery
目標
您已經看到了 SQL/XML 和 Xquery 語法的幾個示例,並了解了 DB2 Command Editor 和 IBM Data Studio (原 Developer Workbench)。在本次實驗中,將測試您的 SQL/XML 和 Xquery 知識並體驗這些工具。我們將使用 DB2 Command Editor 和 SQL Assist Wizard。
步驟
1.確保創建“mydb”數據庫並裝載它。
2.使用 “命令編輯器” 或 Data Studio:
a)以兩種方式獲取 ITEMS 表中的所有注釋 XML 文檔,但是只使用 Xquery。
清單 1. 測試命令1
Xquery db2-fn:XMLcolumn('ITEMS.COMMENTS')
Xquery db2-fn:sqlquery("select comments from items")
b)為什麼在執行以下 SQL 語句時不會返回完全相同的輸出:
SELECT comments FROM items
因為當一個值不存在時,SQL 會返回 NULL,而 Xquery 不返回任何東西。
c)獲取 ResponseRequested 為“No”的 XML 文檔的記錄的 ID 和 BRANDNAME。
清單 2. 測試命令2
select id, brandname from items where
XMLEXISTS('$c/Comments/Comment[ResponseRequested="No"]'
passing ITEMS.COMMENTS as "c")
SQL
目標
您已經看到了 SQL 語法的幾個示例,並了解了 DB2 “命令行編輯器” 和 SQL Assist Wizard(SQL 助手)。在本次實驗中,將測試您的 SQL 知識並體驗這些工具。
步驟
3.使用 SQL Assist Wizard 構建一個滿足以下要求的查詢:
列出 1970 年 1 月 1 日以後雇傭的職員的職員編號、名字和姓氏。結果按照職員編號排序。
a)打開 “命令行編輯器” 並確保連接到 SAMPLE 數據庫(在下拉列表中選擇 SAMPLE)。如果列表中沒有出現這個數據庫,那麼單擊下拉列表旁邊的 “添加” 按鈕,添加一個到 SAMPLE 的連接。
圖 1. 啟動命令行編輯器
b)在 “命令行編輯器” 中,啟動 “SQL 助手”。
圖 2. 啟動 “SQL 助手”
c)在向導的 Outline 區域(左上角)中選擇 FROM 部分,然後展開與登錄用戶同名的模式,查看與這個模式相關聯的各個表。選擇 employee 表並使用 > 按鈕將它移動到“選擇的源表”區域中。
圖 3. 選擇 employee 表
d)在 Outline 區域中選擇 SELECT 部分(在 FROM 部分下面),展開 employee 表查看它的列。選擇 empno、firstnme 和 lastname 列並使用 > 按鈕將它們移動到“結果列”區域中。
圖 4. 選擇列
e)在 Outline 區域的 WHERE 部分中,在“列”下拉列表中選擇 hiredate 列。在 “運算符” 下拉列表中,選擇 > 操作符。在 “值”下拉列表中,選擇 “示列值”,然後在出現的列表中選擇任何值並單擊“確定”按鈕。插入這個“偽”值是為了查明 DB2 所需的日期格式。將插入的值改為‘1977-05-05’並使用 > 按鈕將它移動到 “搜索條件” 區域中。DB2 使用強類型轉換。應該將值顯式轉換為目標類型,而不是讓 DB2 在運行時進行隱式轉換,這是一個好習慣。DB2 只能隱式轉換某些數據值,因此顯式轉換是一個好的做法。為了顯式轉換上面的值,將它包圍在 DATE() 函數中,比如 DATE(‘1977-05-05’)。
圖 5. 選擇 WHERE 條件
f)在 Outline 區域的 ORDER BY 部分中,展開 employee 表查看它的列,然後選擇 empno 列並使用 > 按鈕將它移動到 Sort Columns 區域中。還可以選擇按照職員編號的升序還是降序排序。
圖 6. 選擇排序方式
g)現在,完整的 SQL 查詢文本應該會顯示在向導的底部區域中。單擊“運行”按鈕執行這個查詢。這時應該會出現一個小的查詢結果窗口。單擊結果窗口上的“確定”按鈕將其關閉。
h)單擊向導底部的“確定”按鈕,返回到“命令行編輯器”。現在,使用向導構建的查詢應該會出現在“命令行編輯器”的輸入區域中。
i)單擊“命令行編輯器”中的“執行”按鈕運行這個查詢。這時應該會出現一個結果窗口,可以在其中對返回的結果集進行添加/刪除/修改。
圖 7. 查詢結果
圖片看不清楚?請點擊這裡查看原圖(大圖)。
您創建的 SQL 查詢是:
清單 3. 最終創建的語句
SELECT EMPLOYEE.EMPNO, EMPLOYEE.FIRSTNME, EMPLOYEE.LASTNAME
FROM ADIS00317.EMPLOYEE AS EMPLOYEE
WHERE EMPLOYEE.HIREDATE > '1977-05-05'
ORDER BY EMPLOYEE.EMPNO ASC
4.使用 SQL Assist Wizard 或您自己的 SQL 知識編寫一個滿足以下要求的查詢:
列出不是經理的所有職員的名字和姓氏。
首先按照職員姓氏排序,
SELECT empno, firstnme, lastname FROM <schema>.employee
WHERE hiredate > DATE('1970-01-01') ORDER BY empno;
然後按照名字排序。 SELECT firstnme,lastname FROM <schema>.employee
WHERE job NOT LIKE 'MANAGER' ORDER BY lastname, firstnme;
5.使用 SQL Assist Wizard 或您自己的 SQL 知識編寫一個 SQL 語句,給 D11 部門的所有職員加薪 15%。
UPDATE <schema>.employee SET salary = (salary * 1.15) WHERE workdept = 'D11';
6.使用 SQL Assist Wizard 或您自己的 SQL 知識編寫一個 SQL 語句,將項目 AD3112 的所有權轉移給 DanIEl S. Smith。
(注意:SQL Assist Wizard 無法在數據修改語句中嵌套子選擇語句。首先使用向導構造子 SELECT,然後使用向導構造所需的 UPDATE 語句。最後,將這兩個語句合並在一起,從而獲得所需的結果。)
UPDATE <schema>.project SET respemp =
(SELECT empno FROM <schema>.employee
WHERE firstnme = 'DANIEL' AND midinit = ’S’ AND lastname = 'SMITH')
WHERE projno = 'AD3112';