Những người phát triển ứng dụng và những người quản trị cơ sở dữ liệu có thể sử dụng hướng dẫn này để nâng cao các kỹ năng truy vấn cơ sở dữ liệu của mình.. Các thành viên tham gia sáng
Trang 1Hướng dẫn SQL & XQuery cho IBM DB2, Phần 6: Ngôn ngữ định nghĩa dữ liệu và ngôn
ngữ kiểm soát dữ liệu
Tổng quan về các thành phần DML, DDL, và DCL của SQL
Pat Moffatt, Giám đốc Chương trình quản lý thông tin, Sáng kiến học đường, IBM Bruce Creighton, Chuyên viên lập kế hoạch các phần kỹ năng, IBM
Jessica Cao, Chuyên viên phát triển các công cụ đào tạo, IBM
Tóm tắt: Hướng dẫn này, Phần 6 của loạt bài hướng dẫn SQL & XQuery cho
IBM DB2 , phát triển theo ngôn ngữ xử lý dữ liệu (DML) và giới thiệu ngôn ngữ định nghĩa dữ liệu (DDL) và ngôn ngữ kiểm soát dữ liệu (DCL) Nó cũng bàn luận đến các lệnh SQL khác lệnh SELECT
Trước khi bạn bắt đầu
Về loạt bài này
Loạt bài hướng dẫn này dạy các chủ đề SQL từ cơ bản đến nâng cao và các chủ đề XQuery cơ bản Nó cũng chỉ ra cách diễn đạt các câu hỏi nghiệp vụ thường gặp bằng các truy vấn cơ sở dữ liệu sử dụng các câu truy vấn SQL hay các câu truy vấn XQuery Những người phát triển ứng dụng và những người quản trị cơ sở dữ liệu có thể sử dụng hướng dẫn này để nâng cao các kỹ năng truy vấn cơ sở dữ liệu của mình Các thành viên tham gia sáng kiến học đường IBM có thể sử dụng loạt hướng dẫn này như một phần trong chương trình giảng dạy cơ sở dữ liệu của họ Loạt bài hướng dẫn chỉ ra cách diễn đạt các câu hỏi kinh doanh thường gặp như các truy vấn cơ sở dữ liệu khi sử dụng SQL hay các XQuery
Tất cả các ví dụ trong bài này là dựa trên Aroma, một cơ sở dữ liệu mẫu chứa các
dữ liệu doanh thu về các sản phẩm cà phê và chè đã bán trong các cửa hàng trên khắp nước Mỹ Mỗi ví dụ gồm có ba phần:
Một câu hỏi kinh doanh dưới dạng ngôn ngữ thường ngày
Một hoặc nhiều ví dụ truy vấn, được biểu diễn bằng SQL hay XQuery
Trang 2 Một bảng các kết quả trả về từ cơ sở dữ liệu
Hướng dẫn này được thiết kế để cho phép các học viên học tập ngôn ngữ SQL và XQuery Cũng như học bất cứ cái gì khác, việc bổ sung thêm các bài tập thực hành
là rất quan trọng Dữ liệu và các định nghĩa bảng sẽ tạo điều kiện thuận lợi cho các bài tập thực hành này
Đối với các sinh viên sử dụng tài liệu này như một phần của khoá học, hãy nhận từ thầy hướng dẫn của mình các chỉ dẫn để kết nối tới cơ sở dữ liệu Aroma và tìm hiểu mọi sự khác biệt giữa hướng dẫn và cài đặt tại máy cục bộ của mình
Cảm ơn bạn lựa chọn IBM® DB2® để nghiên cứu về các máy chủ dữ liệu lai, phục vụ dữ liệu với cả hai cấu trúc: cấu trúc quan hệ thuần khiết lẫn cấu trúc
Trang 3Kết nối tới một cơ sở dữ liệu
Bạn cần kết nối tới một cơ sở dữ liệu trước khi có thể sử dụng các câu lệnh SQL
để truy vấn hay xử lý dữ liệu Lệnh CONNECT kết hợp một kết nối cơ sở dữ liệu với một tên người sử dụng
Đối với loạt bài này, tên cơ sở dữ liệu là aromadb (Nếu bạn là sinh viên khi sử dụng phần này như một phần của khoá học, hãy thông qua thầy hướng dẫn để tìm
ra tên cơ sở dữ liệu bạn cần nối tới.)
Để kết nối tới cơ sở dữ liệu aromadb, gõ lệnh sau đây vào trong bộ xử lý dòng lệnh DB2:
CONNECT TO aromadb USER userid USING
password
Đối với sinh viên khi sử dụng phần này như một phần của khoá học, thay thế
"userid" và "password" bằng số ID và mật khẩu của người sử dụng mà bạn đã nhận được từ thầy hướng dẫn Nếu máy không hỏi userid và password thì chỉ cần
gõ vào lệnh sau đây:
CONNECT TO aromadb
Thông điệp sau báo cho bạn biết rằng đã tạo kết nối thành công:
Database Connection Information
Database server = DB2/NT 9.0.0
SQL authorization ID = USERID
Local database alias = AROMADB
Trang 4Khi đã kết nối được, bạn có thể bắt đầu sử dụng cơ sở dữ liệu
Các thành phần SQL
SQL gồm có ba thành phần: ngôn ngữ xử lý dữ liệu (DML), ngôn ngữ định nghĩa
dữ liệu (DDL) và ngôn ngữ kiểm soát dữ liệu (DCL) DML gồm các lệnh
SELECT, UPDATE, INSERT, và DELETE; DDL gồm các lệnh CREATE, ALTER, và DROP ; ngôn ngữ kiểm soát gồm có các lệnh GRANT và REVOKE
DDL
ALTER Thường dùng để thêm, điều chỉnh
Trang 5DCL
REVOKE
Thường dùng để hủy bỏ quyền của những người sử dụng cơ sở dữ liệu
Lệnh CREATE TABLE
Câu hỏi
Trang 6Bộ phận tiếp thị đã bắt đầu giới thiệu một chương trình thành viên mới để làm tăng doanh thu Các khách hàng có thể mua một "Gold Card" (Thẻ Vàng) và được hưởng chiết khấu, các quà tặng miễn phí và thông tin qua email về các hoạt động khuyến mại khác nhau
Mỗi cửa hàng được cung cấp các thẻ ghi số trước
Tạo ra một bảng mới trong cơ sở dữ liệu Aroma được gọi là Gold để lưu giữ
thông tin về các khách hàng Gold Card Nó cần phải có các cột để chứa các giá trị như một số nhận dạng (ID) thẻ duy nhất, khóa cửa hàng, họ, tên, email, và trạng thái
Ví dụ truy vấn
CREATE TABLE aroma.gold
(card_id SMALLINT NOT NULL PRIMARY
KEY,
storekey INTEGER NOT NULL,
fname VARCHAR(20) NOT NULL,
lname VARCHAR(20) NOT NULL,
email VARCHAR(30),
status VARCHAR(10) NOT NULL,
FOREIGN KEY (storekey) REFERENCES
aroma.store (storekey));
Kết quả
Bạn có thể thực hiện một lệnh SELECT để xem kết quả của lệnh CREATE
TABLE
Trang 7SELECT * FROM aroma.gold;
Card_id Storekey Fname Lname Email Status
Cú pháp của lệnh CREATE TABLE
CREATE TABLE table_name
Truy vấn này sử dụng một lệnh CREATE TABLE để xây dựng một bảng có tên là
Gold trong cơ sở dữ liệu Aroma Lệnh CREATE phải bắt đầu với từ CREATE Từ
thứ hai nói cho DB2 biết sẽ tạo ra kiểu đối tượng nào (ở đây là bảng - table), còn
từ thứ ba đặt tên đối tượng (Gold)
Trang 8Phần nằm trong dấu ngoặc đơn là vùng mô tả cột để định nghĩa cột Mọi cột phải được gán ba phần: tên cột, kiểu dữ liệu, và đặc tính NULL
Mệnh đề PRIMARY KEY là tùy chọn Nó bảo đảm chắc chắn rằng các giá trị
trong cột card_id là duy nhất hai thẻ không thể có cùng số ID
Mệnh đề FOREIGN KEY cũng là tùy chọn Nó liên kết cột storekey của bảng
Gold với cột storekey của bảng Store Điều này bảo đảm chắc chắn rằng khóa cửa
hàng (store key) tồn tại và hợp lệ và hai cột chứa các giá trị có cùng kiểu dữ liệu
Để biết chi tiết hơn về lệnh CREATE TABLE , hãy tìm nó trong Trung tâm thông tin DB2 (xem Tài nguyên) Trung tâm được giới thiệu trong Phần 1 của loạt bài này
Tên cột
Các bảng và các cột phải theo các quy ước đặt tên của DB2:
Ký tự đầu tiên của tên bảng phải là một ký tự chữ cái hay một trong các ký hiệu quốc gia Chúng bao gồm các chữ cái A - Z, ký hiệu Đôla ($), ký hiệu (@), và ký hiệu số (#)
Các ký tự tiếp theo có thể chứa một tổ hợp các ký tự chữ cái, các chữ số
0-9, và dấu gạch chân (_) Trong hầu hết các trường hợp, dấu gạch chân được
sử dụng như một dấu phân tách trực quan
Chiều dài tên của bảng/ cột thay đổi tùy theo nền hệ thống Xin vui lòng
xem SQL Reference Guide (Hướng dẫn Tham khảo SQL) về các đặc thù
riêng (xem Resources)
Kiểu dữ liệu
Một cột phải lưu trữ các giá trị của một kiểu dữ liệu cụ thể
Numbers Tất cả các số có một dấu và một độ chính xác Độ chính
Trang 9(Các số) xác là số các bit hay các chữ số, trừ dấu Các số gồm có
SMALLINT, INTEGER, BIGINT, REAL, DOUBLE và DECIMALS
Character
string (Chuỗi
ký tự)
Một chuỗi ký tự) Một chuỗi ký tự là một chuỗi các byte
Chiều dài của chuỗi là số lượng các byte trong chuỗi Nếu
chiều dài bằng không, giá trị này được gọi là chuỗi rỗng
Các chuỗi ký tự gồm có chuỗi ký tự có chiều dài cố định
và chuỗi ký tự có chiều dài thay đổi (VARCHAR, LONG VARCHAR, và CLOB)
Graphic
string (Chuỗi
đồ họa)
Một chuỗi đồ họa Một chuỗi đồ họa là một chuỗi của dữ
liệu ký tự hai byte Chuỗi đồ họa gồm có chuỗi đồ họa có chiều dài cố định và chuỗi đồ họa có chiều dài thay đổi
(Chuỗi nhị
phân)
Một chuỗi nhị phân Một chuỗi nhị phân là một chuỗi các
byte Nó thường được dùng để chứa dữ liệu không truyền thống, như các hình ảnh Đối tượng lớn nhị phân (BLOB)
là một chuỗi nhị phân Xem các đối tượng lớn (LOBs) để biết thêm thông tin
14 ký số biểu diễn ngày tháng và thời giờ hợp lệ dưới dạng
yyyyxxddhhmmss) Các giá trị kiểu ngày giờ có thể được sử
dụng trong một số phép toán số học và phép toán chuỗi nhất định và tương thích với một số chuỗi ký tự nhất định; tuy nhiên, chúng không phải là chuỗi ký tự mà cũng không
là các số Các giá trị kiểu ngày giờ gồm có Date,Time, và Timestamp
Null value
(Giá trị null)
Giá trị null là một giá trị đặc biệt, khác với tất cả các giá trị khác null Nó có nghĩa là không có mặt bất kỳ một giá trị nào khác tại cột đó trên dòng đang xét Giá trị null tồn tại với tất cả các kiểu dữ liệu
Trang 10XML
DB2 9 là máy chủ cơ sở dữ liệu lai đầu tiên trên thế giới cho phép quản lý dữ liệu theo mô hình quan hệ và mô hình pureXML DB2 9 đã đưa ra cơ chế tối ưu để lưu tữ dữ liệu XML cùng với cơ chế quan hệ vốn có của nó
Để biết các chi tiết về các kiểu dữ liệu, xem lại Phần1 của loạt bài này
Đặc tính NULL
Tất cả Card_id, storekey, fname, và lname được định nghĩa như giá trị không null
(NOT NULL) do chúng là các thông tin quan trọng mà mỗi hàng phải có Đối với
bảng này, một hàng không có card_id là vô nghĩa đối với ngôn ngữ định nghĩa dữ
liệu và ngôn ngữ kiểm soát dữ liệu
Nếu một đặc tính null bị bỏ qua, nó sẽ bằng NULL theo mặc định Email được cho
phép là null do không phải tất cả khách hàng đều có e-mails Họ vẫn có thể được hưởng các chiết khấu và các quà tặng miễn phí
Sau khi tất cả các cột đều được định nghĩa, các khóa chính và khoá ngoài được định nghĩa Bạn không cần chỉ rõ khóa chính mà khóa ngoài tham chiếu đến bởi vì DB2 biết về khóa chính từ thông tin danh mục
Trước khi chuyển sang phần tiếp theo, bạn cần vào Trung tâm thông tin DB2 (xemTài nguyên) và đọc toàn bộ tài liệu trực tuyến về lệnh CREATE TABLE Điều này sẽ giúp bạn trở nên quen thuộc với định dạng của tài liệu trợ giúp và xem lại những thứ bạn vừa mới học được
Lệnh INSERT
Câu hỏi
Trang 11Một khách hàng vừa mới mua Thẻ Vàng (Gold Card) đầu tiên từ cửa hàng có khóa cửa hàng (storekey) là 1 Tên của cô ấy là Ada Alexander, và e-mail của cô ấy là coffee_lover@hotmail.com
Với mục đích của bài tập này, giả thiết rằng cửa hàng này được gán các thẻ đánh
số từ 1 tới 100
Nhập bản ghi của cô ấy vào trong bảng Gold với trạng thái được đặt là Active
(hoạt động)
Ví dụ truy vấn
INSERT INTO aroma.gold
VALUES(1, 1, 'Ada', 'Alexander',
'coffee_lover@hotmail.com',
'Active');
Kết quả
SELECT * FROM aroma.gold;
Card_id StorekeyFname Lname Email Status
1 1 Ada Alexander coffee_lover@hotmail.comActive
Cú pháp của lệnh INSERT
Trang 12INSERT INTO table_name
VALUES(value1, value2, value3, );
Về truy vấn
Ví dụ truy vấn này minh họa một lệnh INSERT để thêm một hàng mới vào bảng
Gold Chú ý rằng chuỗi các giá trị trong lệnh INSERT được xếp cùng tuần tự
giống như tuần tự các cột trong bảng Cũng lưu ý rằng có một giá trị cho từng cột trong bảng
Nếu giá trị là kiểu ký tự, nó phải được đặt trong các dấu nháy đơn
Để biết thêm thông tin về lệnh INSERT tìm kiếm trong Trung tâm thông tin DB2 (xem Tài nguyên)
Bạn cũng có thể chèn nhiều hàng vào trong một bảng, chỉ sử dụng một lệnh
INSERT
Câu hỏi
Có nhiều khách hàng mua các Thẻ Vàng từ cửa hàng có storekey 1 Tên của họ là Ben Bowman - mmmcoffee@yahoo.com, Cynthia Chen -
iheartcoffee@gmail.com, David Doyle - coffee_maniac@msn.com, Emily Enright
- cupAday@hotmail.com and Frank Freeman - coffee_addict@gmail.com Hãy
nhập các bản ghi của họ vào trong bảng Gold bằng chỉ một lệnh
Ví dụ truy vấn
INSERT INTO aroma.gold
VALUES(2, 1, 'Ben', 'Bowman', 'mmmcoffee@yahoo.com',
'Active'),
(3, 1, 'Cynthia', 'Chen', 'iheartcoffee@gmail.com', 'Active'),
Trang 13(4, 1, 'David', 'Doyle', 'coffee_maniac@msn.com', 'Active'),
(5, 1, 'Emily', 'Enright', 'cupAday@hotmail.com', 'Active'),
(6, 1, 'Frank', 'Freeman', 'coffee_addict@gmail.com', 'Active');
Kết quả
SELECT * FROM aroma.gold;
Card_id Storekey Fname Lname Email Status
1 1 Ada Alexander coffee_lover@hotmail.com Active
2 1 Ben Bowman mmmcoffee@yahoo.com Active
3 1 Cynthia Chen iheartcoffee@gmail.com Active
4 1 David Doyle coffee_maniac@msn.com Active
5 1 Emily Enright cupAday@hotmail.com Active
6 1 Frank Freeman coffee_addict@gmail.com Active
Trang 14
Lệnh UPDATE
Câu hỏi
Emily Enright mới kết hôn với Frank Freeman và thay đổi tên họ của cô ấy thành
'Freeman' Hãy cập nhật bảng Gold để phản ánh sự thay đổi này
SELECT * FROM aroma.gold;
Card_id Storekey Fname Lname Email Status
1 1 Ada Alexander coffee_lover@hotmail.comActive
2 1 Ben Bowman mmmcoffee@yahoo.com Active
3 1 Cynthia Chen iheartcoffee@gmail.com Active
Trang 154 1 David Doyle coffee_maniac@msn.com Active
5 1 Emily Freeman cupAday@hotmail.com Active
6 1 Frank Freeman coffee_addict@gmail.com Active
Mệnh đề SET chỉ rõ các cột được cập nhật và các giá trị mới của chúng
Mệnh đề WHERE là quan trọng Nếu nó bị bỏ sót, tất cả các hàng trong bảng sẽ
được gán giá trị mới new_value tại vị trí cột column_name
Về truy vấn
Trong ví dụ này, một mệnh đề WHERE được dùng để định hướng DB2 tới các hàng bạn muốn cập nhật Đây là chỗ mà mã nhận biết duy nhất trở nên rất quan
trọng Bạn muốn chỉ UPDATE cho riêng một Emily Enright Mặc dù bảng Gold
hiện tại rất nhỏ bé và chỉ chứa một Emily Enright, nhưng nó có thể phát triển
Trang 16mạnh và chứa nhiều bản ghi có các tên và họ giống nhau Vì vậy luôn luôn sử dụng các mã nhận biết duy nhất là một thói quen an toàn
Để biết thêm thông tin về lệnh UPDATE tìm kiếm nó trong Trung tâm thông tin DB2 (xem Tài nguyên)
Lệnh DELETE
Câu hỏi
Frank Freeman đã huỷ bỏ tư cách thành viên của mình Hãy xóa bản ghi của anh
ấy khỏi cơ sở dữ liệu
Ví dụ truy vấn
DELETE FROM aroma.gold
WHERE card_id = 6;
Kết quả
SELECT * FROM aroma.gold;
Card_id Storekey Fname Lname Email Status
1 1 Ada Alexander coffee_lover@hotmail.comActive
Trang 172 1 Ben Bowman mmmcoffee@yahoo.com Active
3 1 Cynthia Chen iheartcoffee@gmail.com Active
4 1 David Doyle coffee_maniac@msn.com Active
5 1 Emily Freeman cupAday@hotmail.com Active
Cú pháp của lệnh DELETE
DELETE FROM table_name
[WHERE search_condition];
search_condition Điều kiện này sẽ được đánh giá là đúng hay sai
Mệnh đề WHERE là quan trọng Nếu nó bị bỏ qua, tất cả các hàng trong bảng sẽ
bị xóa
Về truy vấn
Ở đây lệnh DELETE loại bỏ Frank Freeman ra khỏi bảng Gold Xin nhắc lại, việc
nêu ra một điều kiện chỉ rõ mã nhận diện duy nhất là rất quan trọng Nếu điều kiện chỉ rõ là "WHERE lname = 'Freeman'" thì cả hai bản ghi của Frank and Emily Freeman sẽ bị xóa
Trang 18Để biết thêm thông tin về lệnh DELETE, tìm kiếm nó trong Trung tâm thông tin DB2 ( xem Tài nguyên)
ALTER TABLE aroma.gold
ADD referrals SMALLINT;
Kết quả
SELECT * FROM aroma.gold;
Card_id Storekey Fname Lname Email Status Referrals
Trang 191 1 Ada Alexander coffee_lover@hotmail.comActive
2 1 Ben Bowman mmmcoffee@yahoo.com Active
3 1 Cynthia Chen iheartcoffee@gmail.com Active
4 1 David Doyle coffee_maniac@msn.com Active
5 1 Emily Freeman cupAday@hotmail.com Active
Cú pháp của lệnh ALTER TABLE
ALTER TABLE table_name
ADD column_name column_definition;
Cột card_id ban đầu được tạo ra có kiểu là SMALLINT, hỗ trợ các số nguyên lên
đến năm chữ số Ta đã nhận thấy rằng khi bảng Gold lớn lên, cột này có thể đạt tới
các số id lớn hơn Hãy thay đổi cột card_id để chứa các giá trị kiểu INTEGER