I.GIỚI THIỆU SQL
Về mặt lý thuyết, ngôn ngữ CSDL phải cho phép chúng ta tạo ra các cấu trúc CSDL và bảng; nó phải cho phép chúng ta thực hiện các công việc quản lý dữ liệu cơ bản (bổ sung, xoá, và sửa dữ liệu); đồng thời nó phải cho phép chúng ta thực hiện các câu vấn tin phức tạp được thiết kế để biến đổi dữ liệu thoo thành thông tin hữu dụng. Hơn nữa, nó phải thực hiện các chức năng cơ bản như vậy với một nỗ lực tối thiểu của người dùng, đồng thời cấu trúc lệnh và cú pháp của nó phải dễ học. Cuối cùng, nó phải dễ chuyển đổi; nghĩa là, nó phải tuân theo một chuẩn nào đó để chúng ta không phải học lại quá nhiều khi chúng ta chuyển từ một RDBMS này sang RDBMS khác.
SQL đáp ứng tốt các yêu cầu ngôn ngữ CSDL lý tưởng này. Trước hết, năng lực của SQL đáp ứng được cả ba loại:
Định nghĩa dữ liệu tạo ra cấu trúc CSDL và cấu trúc bảng của nó.
Quản lý dữ liệu dùng một tập các lệnh nhập, sửa, xoá và cập nhật dữ liệu trong bảng CSDL.
Vấn tin dữ liệu dùng một tập các lệnh khảo sát nội dung CSDL và cho phép người dùng chuyển dữ liệu thô thành thông tin hữu ích.
Thứ hai, SQL tương đối dễ học: nó thực các chức năng CSDL cần thiết bởi một tập khoảng ba mươi lệnh cơ bản. Hơn nữa, SQL là ngôn ngữ phi thủ tục: Bạn chỉ phải cần yêu cầu cái phải làm, bạn không phải bận tâm về cách nó làm như thế nào.
Cuối cùng, Viện Tiêu chuẩn Quốc gia Mỹ ANSI (American National Standards Institute) quy định chặt chẽ một chuẩn SQL. Không hẩn là chuẩn ANSI đã chặt chẽ đến mức tất cả các sản phẩm SQL thương mại không thể tuân theo nó. Trên thực tế, một số nhà cung cấp đã tiếp nhận ngay chuẩn ANSI SQL 2, được cài đặt năm 1993. Do đó, hiếm khi chuyển một ứng dụng từ một RDBMS này sang một RDBMS khác mà không phải tạo ra một vài thay đổi. Tuy nhiên, các phiên bản SQL khác nhau dùng chung cùng một tập lệnh và cấu trúc cơ bản, từ đó cho phép chúng ta kết luận rằng có một chuẩn khả dùng.
Chúng ta sẽ dùng chuẩn này như một nền tảng cho trình bày của chúng ta. Tuy nhiên chúng ta cũng sẽ trình bày một số cải tiến SQL, đặc biệt là khi các cải tiến đó cùng được sử dụng rộng rãi giữa nhiều nhà cung cấp RDBMS.
Đừng vội thất vọng vì sự tồn tại của một số phiên bản SQL đặc thù. Do sự khác biệt giữa các phiên bản SQL đặc thù không lớn lắm, bạn chỉ phải thay đổi một chút để điều chỉnh các yêu cầu phần mềm của bạn. Cho dù bạn sử dụng XDB, ORACLE, dBASE IV, DB2, R:BASE trên DOS, OS/2 DataBase Manager của IBM, hoặc bất cứ một phần mềm RDBMS được thiết lập đúng đắn nào khác, kinh nghiệm của chúng tôi là chỉ cần vài giờ với một quyến sổ tay phần mềm là đủ để bạn tăng tốc độ SQL nếu bạn biết các nội dung được trình bày trong chương này. Tóm lại, kiến thức bạn nhận được trong chương này là khả dùng.
Có một số lý do chính đáng để nghiên cứu những vấn đề cơ bản của SQL:
Nỗ lực chuẩn hoá ANSI đã đưa đến một chuẩn vấn tin thực tế cho CSDL quan hệ. Trên thực tế, nhiều chuyên gia CSDL quan hệ đã thiên về khẳng định rằng “Không có SQL không phải là quan hệ”.
SQL đã trở thành cơ sở cho những nỗ lực hợp nhất DBMS hiện nay và trong tương lai gần, cho phép chúng ta liên kết các CSDL quan hệ, mạng và phân cấp.
SQL đã trở thành chất xúc tác trong quá trình phát triển CSDL phân tán và các kiến trúc CSDL khách/chủ. Chúng ta sẽ khảo sát quá trình phát triển này trong chương 10.
II.CÁC LỆNH ĐỊNH NGHĨA DỮ LIỆU
Các lệnh định nghĩa dữ liệu được dùng để tạo cấu trúc CSDL và các bảng trong CSDL. Trước hết là một tin không vui: Tạo cấu trúc CSDL chính là một đặc điểm giúp phân biệt rõ các RDBMS với nhau. Tin vui là tương đối dễ dàng tạo ra các cấu trúc CSDL rất phức tạp với bất kì RDBMS nào bạn dùng.
1.Tạo cấu trúc CSDL
Nếu RDBMS của bạn sử dụng cài đặt SQL chuẩn ANSI, tạo cấu trúc CSDL lôgic (lược đồ) được hoàn thành bởi dòng lệnh
CREATE SCHEMA AUTHORIZATION
Do đó nếu người tạo là JONES, dùng lệnh
CREATE SCHEMA AUTHORIZATION JONES
Đa số các RDBMS, bao gồm DB2, XDB, và dBASE IV, sử dụng phiên bản
CREATE DATABASE
hơi khác so với phiên bản CREATE SCHEMA được thừa nhận trong SQL chuẩn ANSI nguyên gốc.
Bạn không phải bận tâm khi thấy rằng, trừ quá trình tạo CSDL, phần lớn các thủ tục và lệnh SQL có xu hướng khác một chút so với trong SQL chuẩn. Tuy nhiên, đôi khi bạn có thể gặp một số sai khác cú pháp nhỏ, và chúng tôi sẽ chỉ cho bạn khuôn dạng của chúng bằng cách sử dụng các hộp chú giải như dưới đây:
2.Tạo cấu trúc bảng
Sau khi đã tạo ra cấu trúc CSDL, chúng ta có thể tạo cấu trúc bảng cho các bảng thuộc CSDL. Để trình bày cách thực hiện chúng ta tạo cấu trúc cho hai bảng với tên INVENTRY và VENDOR tương ứng.
(1)Bảng 3.1 Nội dung của bảng INVENTRY |
P_CODE
|
P_DESCRIPT
|
STOCK_DATE
|
ON_HAND
|
MIN_QUANT
|
PRICE
|
V_CODE
|
13-Q2/P2
ZW-23116
2QQ23DRT
54778-2T
23114-AA
89-WRE-Q
2232/QWE
1546-QQ2
WWE/D324
2232/QTY
|
7.25in, power saw blade
2.5in, wood screw, 100
PVC pipe, 3.5in, 8ft
Rat-tail file, 1/8in fine
Sledge hammer, 12lb
Houselite chain saw, 16in
B&D jigsaw, 8in, blade
Hardware cloth,1/4in,50ft
Claw hammer
B&D jigsaw, 12in, blade
|
08/12/91
06/25/91
07/02/91
12/03/90
02/15/91
08/11/91
11/26/90
08/14/91
08/12/91
11/26/90
|
32
237
188
43
8
11
6
15
23
8
|
15
100
75
20
5
5
3
5
10
3
|
14.99
8.45
5.87
4.99
14.40
256.99
99.87
39.95
5.95
109.92
|
21344
21231
21344
21344
21231
24288
24288
23119
21225
24288
|
Bảng INVENTRY, chỉ ra trên bảng 3.1, sẽ được cấu trúc để chứa bảy thuộc tính, với tên tương ứng là P_CODE, P_DESCRIPT, STOCK_DATE, ON_HAND, MIN_QUANT, PRICE, và V_CODE. Lưu ý các đặc điểm thuộc tính của bảng INVENTRY. Chẳng hạn, P_CODE là một xâu hỗn hợp các kí tự chữ và số, đồng thời chiếm tối đa tám vị trí. Vì P_CODE chứa các kí tự nên nó phải thuộc kiểu trường kí tự. Tương tự, thuộc tính P_DESCRIPT là trường kí tự có thể gồm tới hai nhăm kí tự. Mặt khác, thuộc tính STOCK_DATE chứa dữ liệu ngày, trong khi các thuộc tính ON_HAND, MIN_QUANT và PRICE chứa dữ liệu số. Cuối cùng, chúng ta phải xem xét V_CODE:
Nếu chúng ta định cho phép máy tính tạo ra các mã nhà cung cấp mới bằng cách cộng 1 vào mã nhà cung cấp đã ghi lớn nhất, chúng ta phải xem V_CODE là thuộc tính số. (Bạn không thể thực hiện các thủ tục toán trên dữ liệu kí tự!)
Nếu chúng ta không dự định thực hiện các thủ tục toán trên V_CODE, chúng ta có thể gán cho nó thuộc kiểu kí tự ngay cả khi chúng gồm toàn các kí tự số. Bạn sẽ thấy rằng dữ liệu kí tự cho phép vấn tin nhanh hơn. Do đó, nếu không cần thực hiện các thủ tục toán (cộng, trừ, nhân, chia...) trên thuộc tính, nên lưu nó theo kiểu kí tự.
Chúng ta sẽ sử dụng lựa chọn (1) để trình bày các thủ tục SQL trong chương này.
Phần lớn các cài đặt SQL hiện nay cho phép phân loại các đặc điểm thuộc tính như bảng 3.2; một số còn gồm các kiểu dữ liệu bổ sung như kiểu tiền, kiểu kí tự với độ dài thay đổi, kiểu kí tự với độ dài cố định và một số kiểu khác.
Bảng 3.2 Phân loại thuộc tính
Kiểu
|
Mô tả
|
smallint
|
Giá trị nguyên nhỏ. Giá trị smallint không chứa dấu chấm thập phân và chứa sáu (hoặc ít hơn) chữ số. Số smallint âm dành một vị trí cho dấu. Do đó, giá trị smallint thay đổi từ –99999 đến 999999.
|
integer
|
Giá trị nguyên. Giá trị integer chứa tới mười một chữ số. Như vậy giá trị integer thay đổi từ –9999999999 đến 99999999999.
|
decimal
|
Giá trị thập phân. Giá trị decimal có thể chứa các vị trí thập phân. Thuộc tính thuộc kiểu decimal cần mô tả tổng số chữ số (gồm cả dấu chấm thập phân) và số dành cho các vị trí thập phân. Chẳng hạn, mô tả decimal(6, 2) đưa ra khoảng giá trị có thể có –99.99 tới 999.99
|
numeric
|
Số thập phân có thể chứa tới hai mưới chữ số, gồm dấu chấm thập phân và các vị trí thập phân. Như vậy, các giá trị như 34256450967.85453567 là phù hợp.
|
float
|
Số thập phân dấu chấm động có thể chứa tới mười chín chữ số.
|
date
|
Dạng ngày Julian cho phép dùng các phép toán số học ngày.
|
char
|
Kiểu (xâu) kí tự cho phép dùng dữ liệu xâu trong khoảng từ 1 đến 254 kí tự.
|
logical
|
Có thể nhận các mục dữ liệu true (T) hoặc false (F)
|
SQL chuẩn không hỗ trợ kiểu dữ liệu lôgic (logical) và ngày (date). Tuy nhiên, nhiều RDBMS hỗ trợ dữ liệu lôgic, và tất cả RDBMS hiện nay đều hỗ trợ kiểu ngày dựa vào biến đổi toán học, tự động chuyển dạng ngày chuẩn như 11/24/92 thành dạng ngày Julian để cho phép chúng ta thực hiện tính toán số học Julian. Đúng như tên của nó, số học ngày là quá trình cho phép chúng ta cộng hoặc trừ ngày. Chẳng hạn, phép trừ
12/01/92 – 08/12/90
hoàn toàn hợp lệ trong môi trường ngày Julian và đưa ra số ngày giữa 12/01/92 và 08/12/90. Tương tự, ngày sáu mươi kể từ ngày 06/15/92 có thể được tính toán bằng cách
06/15/92 + 60
hoặc ngày 90 kể từ ngày hiện hành trong hệ thống máy tính
SYSDATE + 90
Số học ngày hoàn toàn tiện lợi trong môi trường kinh doanh, đặc biệt khi chúng ta muốn tính lãi trên tất cả các hoá đơn còn nợ cũ trong khoảng thời gian nhiều hơn ba mươi ngày kể từ ngày ghi trong hoá đơn, hoặc khi chúng ta muốn tính số ngày trung bình một sản phẩm nằm trong kho.
áp dụng các kiểu trong bảng 3.2 cho nội dung bảng INVENTRY trong bảng 3.1, chúng ta có thể định kiểu các thuộc tính như trong bảng 3.3. Dùng kiểu thuộc tính trong bảng 3.3, bây giờ chúng ta có thể tạo ra cấu trúc bảng. Để có một định nghĩa bảng dễ đọc, chúng ta đặt mỗi thuộc tính trên một hàng riêng biệt:
CREATE TABLE INVENTRY ( P_CODE CHAR(8) NOT NULL,
P_DESCRIPT CHAR(25) NOT NULL,
STOCK_DATE DATE,
ON_HAND SMALLINT NOT NULL,
MIN_QUANT SMALLINT,
PRICE DECIMAL(7,2),
V_CODE SMALLINT);
Bảng 3.3 Các đặc điểm thuộc tính bảng INVENTRY
Cột (thuộc tính)
|
Đặc điểm
|
Yêu cầu đặc biệt
|
Chú thích
|
P_CODE
|
char(8)
|
Not null
|
Tối đa 8 kí tự
|
P_DESCRIPT
|
char(25)
|
Not null
|
Tối đa 25 kí tự
|
STOCK_DATE
|
date
|
|
Ngày Julian
|
ON_HAND
|
smallint
|
Not null
|
Giá trị nguyên nằm trong khoảng 0 – 1000
|
MIN_QUANT
|
smallint
|
|
Giá trị nguyên nằm trong khoảng 0 – 1000
|
PRICE
|
decimal(7,2)
|
|
Đơn vị USD, giá trị trong khoảng 0.00 - 9999.99
|
V_CODE
|
smallint
|
|
Mã nhà cung cấp, giá trị nằm trong khoảng 1-1000
|
Nhớ rằng chúng ta đã dùng mô tả NOT NULL để khẳng định rằng khóa chính của bảng không thể nhận “giá trị” null, theo đó đảm bảo tính toàn vẹn thực thể. Nếu mô tả NOT NULL không được dùng, về sau bảng sẽ chấp nhận mục dữ liệu null, và bạn sẽ phải chấp nhận thiếu tính toàn vẹn thực thể hoặc phải viết chương trình để duy trì toàn vẹn thực thể.
Khi khảo sát lệnh bảng được dùng để tạo cấu trúc bảng INVENTRY, bạn lưu ý các đặc điểm sau đây:
Các mô tả thuộc tính được đặt trong cặp dấu ngoặc tròn.
Các mô tả thuộc tính tách nhau bởi dấu phảy.
Dãy lệnh chấm dứt với dấu chấm phảy trong ví dụ này. (Nhưng nhớ rằng, RDBMS của bạn có thể yêu cầu bạn bỏ đi dấu chấm phảy.)
Bảng 3.4 Nội dung của bảng VENDOR
V_CODE
|
V_COMPANY
|
C_LNAME
|
C_FNAME
|
C_I
|
V_PHONE
|
21231
24288
21344
23119
21225
|
J.I. Supplies, Inc
Harding Super Wholesale
Q&D Building Supplies
Charlie’s Wholesale
Rather’s Building, Inc.
|
Fielding
Smith
Cavazos
Smithson
Smith
|
Anne
Stanley
Maria
Ronald
Sally
|
K.
G.
D.
W.
K.
|
666-233-1281
800-213-9999
800-333-9011
212-667-0090
800-234-1200
|
V_ADDRESS
|
V_CITY
|
V_STATE
|
V_ZIP
|
1233 Industrial Blvd. W
855 Temco Plaza
1452 West End. Suite 23B
125-C contract Circle
1117 Industrial Plaza
|
Indianapolis
Rockford
Dallas
Murfreesboro
Champaign
|
IN
IL
TX
TN
IL
|
21456
27122
31126
37129
22134
|
Bảng thứ hai của CSDL, VENDOR, chứa dữ liệu như trong bảng 3.4. Cấu trúc bảng VENDOR được tạo ra bởi lệnh sau:
CREATE TABLE VENDOR ( V_CODE SMALLINT NOT NULL,
V_COMPANY CHAR(25),
C_LNAME CHAR(12),
C_FNAME CHAR(10),
C_I CHAR(2),
V_PHONE CHAR(12),
V_ADDRESS CHAR(30),
V_CITY CHAR(20),
V_STATE CHAR(2),
V_ZIP CHAR(5));
Chia sẻ với bạn bè của bạn: |