Bởi vì đầu ra của mẫu đều được quy định trong hầu hết các trường hợp, bạn không cần phải truy cập vào kết quả để hiểu được các ví dụ.. Các hàm do người dùng định nghĩa User-defined được
Trang 1Chuẩn bị cho kỳ thi cơ bản về DB2 9, Phần 4: Làm việc với dữ liệu DB2
Roman B Melnyk, Nhân viên phát triển thông tin, IBM
Tóm tắt: Bài viết này giới thiệu về ngôn ngữ truy vấn cấu trúc - Structured Query
Language (SQL) và cung cấp cho bạn sự hiểu biết về cách DB2® 9 sử dụng SQL
để thao tác dữ liệu trong cơ sở dữ liệu quan hệ Bài viết này là bài thứ tư nằm trong số bảy bài viết mà bạn có thể sử dụng để có được chứng chỉ DB2 9 cơ bản (Bài thi số 730)
Trước khi bắt đầu
Về bài viết này
Bạn đã nghĩ tới việc có một chứng chỉ về các khái niệm cơ bản của DB2 (Bài thi
số 730)? Nếu bạn nghĩ như thế thì bạn đã đến đúng chỗ Loạt bảy bài hướng dẫn chuẩn bị thi chứng chỉ DB2 bao gồm những vấn đề cơ bản nhất những chủ đề
mà bạn cần phải hiểu rõ trước khi bạn đọc câu hỏi sát hạch đầu tiên Thậm chí, ngay cả khi bạn chưa có kế hoạch tìm kiếm chứng chỉ ngay bây giờ thì loạt bài viết này cũng là một nơi tuyệt vời để bạn bắt đầu học những vấn đề mới trong DB2 9
Về bài viết này
Bài viết này giải thích cách mà DB2 sử dụng SQL để thao tác dữ liệu trong cơ sở
dữ liệu quan hệ Các tài liệu được cung cấp chủ yếu ở đây bao gồm các mục tiêu trong phần 4 của bài thi, phần có tiêu đề là "Làm việc với dữ liệu DB2 sử dụng SQL và XQuery" Bạn có thể nhìn thấy các mục tiêu này tại: http://www-
03.ibm.com/certify/tests/obj730.shtml
Các chủ đề chứa đựng trong bài viết bao gồm:
Trang 2 Giới thiệu về SQL
Mô tả về Data Manipulation Language (Ngôn ngữ thao tác dữ liệu (DML))
và các ví dụ giải thích cách sử dụng DML để thu được thông tin riêng biệt
Ranh giới chuyển đổi
Thủ tục SQL và hàm do người dùng định nghĩa
Mục tiêu
Sau khi hoàn thành bài viết này, bạn có thể:
Hiểu cơ bản về SQL, cùng với các yếu tố trọng tâm trong ngôn ngữ SQL
Sử dụng DML để lựa chọn, chèn, cập nhật hoặc xóa dữ liệu
Sử dụng câu lệnh COMMIT và ROLLBACK để quản lý giao dịch, và biết được những cái gì cấu thành nên ranh giới chuyển đổi
Tạo và gọi thủ tục SQL hoặc hàm do người dùng định nghĩa từ trình điều khiển dòng lệnh
Các yêu cầu hệ thống
Trang 3Nếu bạn không thực sự chắc chắn để làm, bạn cần phải tải phiên bản thử nghiệm miễn phí của IBM DB2 9 để làm việc với bài viết này Cài đặt DB2 sẽ giúp bạn hiểu một số khái niệm được nói tới trong bài thi lấy chứng chỉ DB2 9 cơ bản Cài đặt DB2 không được đề cập đến trong bài viết này, nhưng tài liệu về tiến trình cài đặt có trong DB2 Information Center (Trung tâm thông tin của DB2)
Những quy ước được sử dụng trong bài viết
Quy ước những cụm từ màu sáng được sử dụng trong bài viết:
Monospaced được sử dụng cho câu lệnh SQL UPPERCASE (cụm từ viết hoa) là từ khóa của SQL, và lowercase (cụm từ viết thường) là giá trị do người dùng đặt ra trong đoạn mã ví dụ
Ngoại trừ trong đoạn mã, tên của đối tượng dữ liệu và tên của các cột trong bảng biểu được viết in hoa
Cụm từ in nghiêng được dùng khi giới thiệu một thuật ngữ (term) mới hoặc
để nhận biết một giá trị tham biến
Tất cả ví dụ trong bài viết đều dựa trên bộ cơ sở dữ liệu SAMPLE (Mẫu), đi kèm với DB2 Bởi vì đầu ra của mẫu đều được quy định trong hầu hết các trường hợp, bạn không cần phải truy cập vào kết quả để hiểu được các ví dụ
Ngôn ngữ truy vấn có cấu trúc (Structured Query Language) (SQL)
Các phần của câu SQL
Trang 4SQL là ngôn ngữ được sử dụng để định nghĩa và thao tác các đối tượng dữ liệu SQL Sử dụng SQL để định nghĩa một bảng dữ liệu, chèn dữ liệu vào bảng, thay đổi dữ liệu trong bảng và lấy dữ liệu từ bảng Giống như tất cả các ngôn ngữ khác, SQL có cú pháp định nghĩa và một tập hợp các phần tử ngôn ngữ
Hầu hết các câu lệnh SQL đều chứa đựng một hoặc nhiều phần tử ngôn ngữ sau:
Các ký tự đơn lẻ có thể là các chữ cái (A-Z, a-z, $, #, và @, hoặc một thành
phần trong tập ký tự mở rộng), các số (từ 0 đến 9), hoặc các ký tự đặc biệt (+, *, %, )
Một mã thông báo là chuỗi gồm một hoặc nhiều ký tự Chuỗi này không
được chứa ký tự trống trừ khi đó là một định dạng đã được định nghĩa (một hoặc nhiều ký tự nằm giữa hai dấu ngoặc kép) hoặc là một hằng xâu ký tự
Một định danh dạng SQL là một mã thông báo được dùng để tạo thành tên
Kiểu dữ liệu của một giá trị xác định trong DB2 sẽ giải thích giá trị đó thế
nào DB2 hỗ trợ khá nhiều công cụ xây dựng kiểu dữ liệu và thậm chí hỗ trợ cả các kiểu do người dùng định nghĩa (UDTs)
Một hằng số chỉ rõ một giá trị Chúng được phân ra thành nhiều loại như ký
tự, ảnh, hằng số chuỗi hệ thập lục phân, số nguyên, số thập phân hoặc hằng
số thực
Một đăng ký đặc biệt (special register) là một vùng lưu trữ được xác định
cho một thủ tục quản lý của cơ sở dữ liệu và được sử dụng để lưu trữ thông tin có thể tham chiếu bởi các câu lệnh SQL Các mẫu của đăng ký đặc biệt (special registers) là: CURRENT DATE, CURRENT
DBPARTITIONNUM, và CURRENT SCHEMA
Trang 5 Một đoạn chương trình (routine) có thể là một hàm, một phương thức hoặc
một thủ tục
o Một hàm thể hiện mối liên giữa một hoặc nhiều giá trị dữ liệu đầu
vào với một hoặc nhiều giá trị kết quả Hàm dữ liệu có thể là do người dùng định nghĩa hoặc có sẵn
Hàm của cột (hoặc cụm) hoạt động trên một tập hợp các giá trị trong
cột để trả về một giá trị Xem ví dụ:
SUM(sales) trả lại tổng các giá trị trong cột Sales
AVG(sales) trả về thương của phép chia tổng giá trị trong cột Sales cho số lượng các giá trị có mặt trong cột đó
MIN(sales) trả về giá trị nhỏ nhất trong cột Sales
MAX(sales) trả về giá trị lớn nhất trong cột Sales
COUNT(sales) trả lại số lượng giá trị khác 0 trên cột Sales
Hàm vô hướng (Scalar functions) hoạt động trên một giá trị để trả về
một giá trị khác Xem ví dụ:
ABS(-5) trả lại giá trị tuyệt đối của -5 kết quả là 5
HEX(69) trả lại biểu diễn dạng thập lục phân (hexadecimal)của số 69 - kết quả là 45000000
LENGTH('Pierre') trả lại số lượng ký tự (mỗi ký tự là một byte) có mặt trong chuỗi "Pierre" Kết quả là 6 Đối với chuỗi đồ họa (GRAPHIC), hàm LENGTH trả về số lượng ký
tự mà mỗi ký tự là 2 byte
Trang 6 YEAR('03/14/2002') trả về thành phần năm của ngày
UCASE('shaman') hoặc UPPER('shaman') trả lại một chuỗi trong đó tất cả các ký tự đều được chuyển thành ký tự in hoa -
- kết quả là, 'SHAMAN'
Các hàm do người dùng định nghĩa (User-defined) được ghi vào cơ
sở dữ liệu trong danh mục hệ thống (có thể truy cập thông qua các mục SYSCAT.ROUTINES) sử dụng câu lệnh CREATE
FUNCTION
o Một phương thức (method) cũng thể hiện mối quan hệ giữa tập các
giá trị dữ liệu đầu vào và tập các giá trị kết quả Tuy nhiên, phương thức cơ sở dữ liệu được xác định rất cụ thể và rõ ràng, giống như một phần định nghĩa của kiểu cấu trúc do người dùng định nghĩa Xem ví dụ, một phương thức gọi CITY (kiểu ADDRESS) được truyền giá trị đầu vào kiểu VARCHAR, và kết quả là một kiểu con của ADDRESS Phương thức do người dùng định nghĩa (User-defined) được ghi vào cơ sở dữ liệu trong danh mục hệ thống (có thể truy cập thông qua mục SYSCAT.ROUTINES) sử dụng câu lệnh
Trang 7CREATE METHOD Có rất nhiều thông tin về kiểu cấu trúc này,
tham khảo Giới thiệu về các kiểu dữ liệu có cấu trúc và kiểu bảng
(An introduction to structured data types and typed tables)
o Một thủ tục là một chương trình ứng dụng có thể bắt đầu bằng cách
tự thực hiện câu lệnh CALL Các đối số của các thủ tục là các giá trị
vô hướng có thể là các kiểu khác nhau và có thể được sử dụng để đưa vào các thủ tục, hay nhận các giá trị trả về từ thủ tục Thủ tục do người dùng định nghĩa (User-defined) được ghi vào cơ sở dữ liệu trong danh mục hệ thống (có thể truy cập thông qua danh mục
SYSCAT.ROUTINES) sử dụng câu lệnh CREATE PROCEDURE
Một biểu thức chỉ định một giá trị Có những biểu thức chuỗi ký tự, có
những biểu thức toán học, và những biểu thức rẽ nhánh (case), được dùng
để chỉ rõ các kết quả đặc biệt dựa vào sự đánh giá của một hoặc nhiều điều kiện
Một predicate (vị từ) chỉ ra điều kiện đúng, sai hoặc chưa biết về một hàng
hoặc một nhóm Có những loại sau:
o Các basic predicate (vị từ cơ bản) so sánh hai giá trị với nhau (ví dụ,
x > y)
o Vị từ BETWEEN so sánh giá trị với một phạm vi của các loại giá trị
o Vị từ EXISTS kiểm tra sự tồn tại chắc chắn của các hàng
o vị từ IN so sánh một hoặc nhiều giá trị với một dãy các giá trị
o Vị từ LIKE tìm kiếm các chuỗi có mẫu nhất định
o Vị từ NULL kiểm tra các giá trị null
Trang 8Ngôn ngữ xử lý dữ liệu - Data Manipulation Language (DML)
Sử dụng câu lệnh SELECT để tìm kiếm dữ liệu từ bảng cơ sở dữ liệu
Vị từ SELECT được dùng để tìm kiếm bảng biểu hoặc dữ liệu hiển thị Ở dạng đơn giản nhất, lệnh SELECT có thể được dùng để truy lục tất cả dữ liệu trong bảng Ví dụ, để tìm kiếm tất cả dữ liệu của bảng STAFF từ cơ sở dữ liệu
SAMPLE, sử dụng cú pháp sau:
SELECT * FROM staff
Dưới đây là một phần trong tập kết quả được trả bởi truy vấn này:
ID NAME DEPT JOB YEARS SALARY COMM
Trang 9SELECT * FROM staff FETCH FIRST 10 ROWS ONLY
Để giới hạn số lượng cột hiển thị từ bảng dữ liệu, liệt kê danh sách tên cột cách
nhau bởi dấu phẩy Xem ví dụ:
SELECT name, salary FROM staff
Sử dụng mệnh đề DISTINCT để loại bỏ các hàng trùng nhau trong tập kết quả Xem ví dụ:
SELECT DISTINCT dept, job FROM staff
Sử dụng vị từ AS để chỉ định một tên có nghĩa vào biểu thức hoặc một mục trong danh sách lựa chọn Xem ví dụ:
SELECT name, salary + comm AS pay FROM staff
Nếu thiếu mệnh đề AS, thì cột tìm thấy sẽ được đặt tên cột 2, điều này chỉ ra rằng đây là cột thứ hai trong tập kết quả
Trang 10
Sử dụng mệnh đề và vị từ WHERE để giới hạn số lượng của dữ liệu trả về bởi truy vấn
Sử dụng mệnh đề WHERE để lựa chọn các hàng cụ thể từ bảng, hoặc thêm một
hoặc nhiều tiêu chuẩn lựa chọn, hoặc một điều kiện tìm kiếm Một điều kiện tìm
kiếm (search condition) gồm có một hoặc nhiều vị từ Một vị từ chỉ rõ một hàng
nào đó sẽ có giá trị đúng hoặc sai (xem Những phần của của câu SQL) Khi xây dựng các biểu thức tìm kiếm, cần chắc chắn rằng:
Chỉ áp dụng những phép toán số học cho kiểu dữ liệu số
Chỉ so sánh giữa các kiểu dữ liệu tương thích
Các giá trị ký tự được đặt trong cặp dấu ngoặc đơn
Xác định các giá trị ký tự chính xác giống như trong cơ sở dữ liệu
Bây giờ, hãy xem một vài ví dụ sau
Tìm kiếm tên của những nhân viên có mức lương nhiều hơn $20,000:
"SELECT name, salary FROM staff
WHERE salary > 20000"
Câu lệnh được đặt trong cặp dấu ngoặc kép giữ cho hệ điều hành của bạn
Trang 11tránh khỏi sự hiểu nhầm các ký tự đặc biệt, ví dụ như * hoặc >; - thường được hiểu là các yêu cầu về địa chỉ đầu ra
Liệt kê danh sách tên, nghề nghiệp và lương của các nhân viên không phải
là người quản lý và có mức lương trên $20,000:
"SELECT name, job, salary FROM staff
WHERE job <> 'Mgr'
AND salary > 20000"
Tìm kiếm tên của những nhân viên bắt đầu bằng ký tự S:
SELECT name FROM staff
WHERE name LIKE 'S%'
Trong ví dụ này, kí hiệu % là một kí tự thay thế cho một chuỗi rỗng hoặc nhiều hơn một ký tự
Một truy vấn con (subquery) là một câu lệnh SELECT xuất hiện bên trong mệnh
đề WHERE của truy vấn chính và tập kết quả thu được của truy vấn con chính là kết quả của mệnh đề WHERE Ví dụ:
Trang 12"SELECT lastname FROM employee
WHERE lastname IN
(SELECT sales_person FROM sales
WHERE sales_date < '01/01/1996')"
Một tên liên kết (correlation name) được định nghĩa trong mệnh đề FROM của
truy vấn và có thể được dùng như là một tên ngắn cho bảng Tên liên kết cũng loại trừ các tham chiếu nhập nhằng giữa các cột từ các bảng khác nhau Ví dụ:
"SELECT e.salary FROM employee e
Trang 13"SELECT name, salary FROM staff
Sử dụng liên kết để tìm kiếm dữ liệu trên nhiều bảng
Một liên kết (join) là một truy vấn kết hợp dữ liệu từ hai bảng trở lên Việc làm
này rất cần thiết để lựa chọn từ hai hoặc nhiều bảng bởi vì dữ liệu được yêu cầu thường bị phân tán Một liên kết sẽ thêm các cột vào tập các kết quả Ví dụ, một liên kết đầy đủ của cột hai - cột ba ở các bảng là một bảng gồm sáu cột
Một liên kết đơn giản nhất là liên kết không đưa ra một điều kiện nào cả Ví dụ:
SELECT deptnumb, deptname, manager, id, name, dept, job
Trang 14FROM org, staff
Câu lệnh này trả về tổ hợp của tất cả các hàng trong bảng ORG và bảng STAFF
Ba cột đầu tiên thuộc bảng ORG, và bốn cột cuối cùng là của bảng STAFF Đó là
tập kết quả (cross product (thủ tục thông qua) của hai bảng) không phải là rất hữu ích Điều cần thiết là một điều kiện liên kết (join condition) để tinh chỉnh tập các
kết quả Ví dụ, đây là một yêu cầu tìm kiếm những nhân viên là người quản lý:
SELECT deptnumb, deptname, id AS manager_id, name AS manager
FROM org, staff
WHERE manager = id
ORDER BY deptnumb
Và đây là một phần kết quả được trả về bởi truy vấn này:
DEPTNUMB DEPTNAME MANAGER_ID MANAGER
Trang 1520 Mid Atlantic 10 Sanders
Câu lệnh mà bạn nhìn thấy trong phần cuối cùng của ví dụ là một liên kết nội
(inner join) Inner joins (liên kết nội) chỉ trả về những dòng có mặt ở cả hai bảng
thỏa mãn điều kiện liên kết Nếu tồn tại một dòng trong một bảng nhưng không được tồn tại trong bảng khác, nó không được thêm vào tập kết quả Để xác định một cách rõ ràng một liên kết nội, thêm vào truy vấn trước toán tử INNER JOIN trong mệnh đề FROM:
phù hợp cho các cột Manager và ID ở bảng bên trái (left table) (ORG) và bảng
bên phải (right table) (STAFF), theo thứ tự định sẵn (Khi thực hiện liên kết hai
bảng, bạn phải quy định bảng nào là bảng bên trái, bảng nào là bảng bên phải.)
Outer joins (liên kết ngoại) trả về các hàng được tạo bởi toán tử liên kết nội, cộng
thêm các hàng không được trả về bởi toán tử liên kết nội Có ba loại liên kết ngoại:
Trang 16 Một left outer join (liên kết ngoại bên trái) bao gồm các kết quả của liên kết nội cộng với các hàng của bảng bên left (trái), những hàng không được trả
về bởi liên kết nội Loại liên kết này sử dụng toán tử LEFT OUTER JOIN (hoặc LEFT JOIN) trong mệnh đề FROM
Một right outer join (liên kết ngoại bên phải) bao gồm các kết quả của liên kết nội cộng với các hàng của bảng bên phải, những hàng không được trả
về bởi liên kết nội Loại liên kết này sử dụng toán tử RIGHT OUTER JOIN (hoặc RIGHT JOIN) trong mệnh đề FROM
Một full outer join (liên kết ngoại đầy đủ) bao gồm các kết quả của liên kết nội cộng với các hàng của cả hai bảng bên trái và bên phải, những hàng
không được trả về bởi liên kết nội Loại liên kết này sử dụng toán tử FULL OUTER JOIN (hoặc FULL JOIN) trong mệnh đề FROM
Xây dựng các truy vấn phức tạp để trả lời những câu hỏi khó khăn hơn Dưới đây
là những truy vấn được thiết kế để tạo ra một danh sách các nhân viên có trách nhiệm đối với các dự án, xác định các nhân viên cũng là các nhà quản lý trong bộ phận danh sách mà họ quản lý:
SELECT empno, deptname, projname
Trang 17ON mgrno = empno
Đầu tiên liên kết ngoại sẽ đưa ra tên của các dự án mà nhân viên chịu trách nhiệm, liên kết ngoại này được đặt trong cặp dấu ngoặc đơn và được giải quyết đầu tiên Liên kết ngoại thứ hai sẽ đưa ra tên của một nhóm người nếu họ là những người quản lý
Sử dụng các toán tử để kết hợp hai hoặc nhiều truy vấn thành một truy vấn
Kết hợp hai hoặc nhiều truy vấn thành một truy vấn bằng cách sử dụng các toán tử
tập hợp UNION, EXCEPT, hoặc INTERSECT Các toán tử tập hợp xử lý các kết
quả của truy vấn, loại bỏ các kết quả trùng lặp và đưa ra kết quả cuối cùng
Toán tử tập hợp UNION tạo ra một bảng kết quả được kết hợp từ một hoặc nhiều bảng kết quả khác
Toán tử tập hợp EXCEPT tạo ra một bảng kết quả chứa đựng tất cả các hàng được trả về bởi truy vấn đầu tiên, nhưng không phải là truy vấn thứ hai hay bất kỳ một truy vấn tiếp theo nào
Toán tử tập hợp INTERSECT tạo ra một bảng kết quả chứa đựng các hàng được trả về bởi tất cả các truy vấn
Dưới đây là một ví dụ về truy vấn có sử dụng toán tử tập hợp UNION Có thể tạo
ra các truy vấn tương tự cho các toán tử EXCEPT hoặc toán tử INTERSECT bằng cách thay từ khóa UNION trong cấu trúc truy vấn sau
Trang 18"SELECT sales_person FROM sales
WHERE region = 'Ontario-South'
Trang 19bán trong ngày, và hàm MAX trong ví dụ này sẽ trả về số lượng lớn nhất của loại hàng hóa được ghi cho mỗi ngày
Một dạng khác của mệnh đề GROUP BY là mệnh đề GROUPING SETS
Grouping sets (tập hợp nhóm) có thể được dùng để phân tích dữ liệu ở các mức
khác nhau Ví dụ:
SELECT YEAR(sales_date) AS year, region, SUM(sales) AS tot_sales
FROM sales
GROUP BY GROUPING SETS (YEAR(sales_date), region, () )
Ở đây, hàm YEAR được dùng để lấy năm của giá trị kiểu ngày, và hàm SUM được dùng để trả lại tổng trong mỗi tập hợp các nhóm số liệu bán hàng Một
grouping sets list (danh sách tập hợp nhóm) chỉ rõ cách dữ liệu tạo thành nhóm,
hoặc kết hợp Một cặp dấu ngoặc rỗng được thêm vào danh sách tập hợp nhóm để
tạo thành một tổng số trong tập kết quả Câu lệnh trả về như sau:
YEAR REGION TOT_SALES
Trang 20Mệnh đề HAVING thường được dùng với mệnh đề GROUP BY để tìm kiếm kết quả cho một nhóm được chỉ ra trong một điều kiện cụ thể Mệnh đề HAVING có thể chứa một hoặc nhiều vị từ để so sánh đặc tính của nhóm này với đặc tính của nhóm khác, hoặc với một hằng số Ví dụ:
"SELECT sales_person, SUM(sales) AS total_sales FROM sales
GROUP BY sales_person
HAVING SUM(sales) > 25"
Trang 21Lệnh này trả về kết quả là một danh sách nhân viên bán hàng mà có tổng số hàng bán trên 25
Sử dụng lệnh INSERT để thêm hàng mới vào bảng biểu hoặc khung nhìn
Lệnh INSERT được sử dụng để thêm hàng mới vào bảng biểu hay khung nhìn Việc chèn hàng vào khung nhìn cũng giống như việc thêm hàng vào một bảng biểu
Sử dụng mệnh đề VALUES có chỉ rõ dữ liệu cột cho một hoặc nhiều hàng Xem ví dụ:
INSERT INTO staff VALUES
(1212,'Cerny',20,'Sales',3,90000.00,30000.00)
INSERT INTO staff VALUES
(1213,'Wolfrum',20,'Sales',2,90000.00,10000.00)
Tương đương với:
INSERT INTO staff (id, name, dept, job, years, salary, comm)
VALUES