53
CHƯƠNG 4.
NGÔN NGỮ TRUY VẤN SQL
Chương 4 trình bày thêm một ngôn ngữ thao c dữ liệu là ngôn ngữ SQL. SQL là ngôn ngữ
phi thủ tục với hai thành phần chính DDL (Data Definition Language) dùng để định nghĩa
cấu trúc của CSDL, DML (Data Manipulation Language) để truy xuất và cập nhật dữ liệu.
Nội dung chương bao gồm:
Giới thiệu về ngôn ngữ SQL.
Các lệnh dùng để định nghĩa cơ sở dữ liệu.
Các lệnh dùng để truy vấn cơ sở dữ liệu.
54
1. GII THIU V NGÔN NG SQL
1.1 Lịch sử phát triển
Từ một bài báo tham dự hội thảo khoa học A Relational Model of Data for Large Shared
Data Banks (tạm dịch "Mô hình quan hệ cho dữ liệu dùng trong ngân hàng dữ liệu chia
sẻ khối lượng lớn") của tiến Edgar F. Codd xuất bản tháng 6 năm 1970 trong tạp chí
Communications of the ACM của Hiệp hội ACM, một mô hình đã được chấp nhận rộng rãi
là mô hình tiêu chuẩn dùng cho hệ thống quản lý cơ sở dữ liệu quan hệ.
Giữa những m 1970, một nhóm các nhà phát triển tại trung tâm nghiên cứu của IBM tại
San Jose phát triển hệ thống sở dữ liệu "Hệ thống R" dựa trên hình của Codd.
Structured English Query Language, viết tắt "SEQUEL" (tạm dịch "Ngôn ngữ truy vấn
tiếng Anh có cấu trúc"), được thiết kế để quản và truy lục dữ liệu được lưu trữ trong Hệ
thống R. Sau này, tên viết tắt SEQUEL được rút gọn thành SQL để tránh việc tranh chấp
nhãn hiệu (từ SEQUEL đã được một công ty máy bay của UK Hawker-Siddeley đăng
ký). Mặc dù SQL bị ảnh hưởng bởi công trình của tiến Codd nhưng không do tiến
Codd thiết kế ra. Ngôn ngữ SEQUEL được thiết kế bởi Donald D. Chamberlin và Raymond
F. Boyce tại IBM và khái niệm của họ được phổ biến để tăng sự chú ý về SQL.
Phiên bản sở dữ liệu quan hệ phi thương mại, không hỗ trợ SQL đầu tiên được phát triển
năm 1974 (Ingres from U.C. Berkeley). Năm 1987, ANSI ISO công bố chuẩn đầu tiên
cho SQL. Năm 1989, ISO công bố thêm phần phụ lục định nghĩa một “Nét cải tiến cho toàn
vẹn”. Năm 1992, phiên bản chỉnh sửa đầu tiên của chuẩn này mặt, mang tên SQL2 hay
SQL-92. Năm 1999, SQL:1999 được phát hành với các chuẩn hỗ trcho quản dữ liệu
hướng đối tượng. Vào cuối năm 2003, SQL:2003 ra đời.
1.2 Khái niệm
SQL (Structured Query Language) là một ngôn ngữ phi thủ tục với hai thành phần chính là
DDL và DML.
DDL (Data Definition Language) dùng để định nghĩa cấu trúc của CSDL. ANSI
chia DDL gồm 2 phầnDDL gồm các lệnh để định nghĩa cấu trúc của CSDL như
CREATE TABLE, CREATE VIEW, ALTER TABLE, DCL (Data Control
Language) gồm các lệnh để điều khiển quyền truy cập trên dữ liệu: GRANT,
REVOKE, …
DML (Data Manipulation Language) được phân thành 2 lớp lớp dùng để cập
nhật dữ liệu: INSERT, UPDATE, DELETE, ... lớp dùng để truy xuất dữ liệu:
SELECT, ...
1.3 Cú pháp câu lệnh SQL
Hầu hết các phần trong câu lệnh SQL là không phân biệt chữ hoa chữ thường, trừ các ký tự
trong chuỗi dữ liệu. Tuy câu lệnh SQL hình thức tdo nhưng để dễ đọc, chúng ta nên
viết mỗi mệnh đề của lệnh trên một dòng, viết bắt đầu một mệnh đề thẳng hàng với các
mệnh đề khác và nếu một mệnh đề có nhiều vế thì nên viết mỗi vế trên một dòng và lùi đầu
55
dòng trong mệnh đề đó.
Ví dụ 4.1: Cho biết họ tên giảng viên nam thuộc khoa “CNTT” hoặc khoa “CNTP”?
SELECT hoten
FROM GIANGVIEN
WHERE phai = 'Nam'
AND (makhoa = 'CNTT' OR makhoa = 'CNTP')
Câu lệnh SQL gồm 2 thành phần: từ khóa tdo người dùng định nghĩa (tên bảng, tên
cột, …). Cú pháp của lệnh SQL được giới thiệu theo dạng mở rộng như sau:
Dấu | chỉ sự lựa chọn.
Dấu { chỉ phần tử bắt buộc phải có.
Dấu [ chỉ phần tử tùy chọn (không bắt buộc).
Dấu ... chỉ thành phần có thể lặp lại từ 0 đến nhiều lần.
2. CÁC LNH ĐỊNH NGHĨA CP NHT CSDL
SQL s dng các thut ng bng (table), hàng (row) ct (column) tương ng quan h
(relation), b (tuple) và thuc tính (attribute). Các thut ng tương ng có th được s dng
thay thế cho nhau trong chương này.
Một lược đồ SQL (SQL schema) được xác định bằng tên lược đồ và bao gm mt s định danh
để ch ra người dùng hoc tài khon s hữu lược đ cũng như các bộ t cho mi phn t
trong lược đồ. Các phn t của lược đồ bao gm các bng, kiu, ràng buc, khung nhìn, min
và các cấu trúc khác để mô t v ợc đồ đó.
2.1 Tạo và cập nhật CSDL
2.1.1 Tạo một cơ sở dữ liệu
Để tạo một cơ sở dữ liệu, chúng ta sử dụng cú pháp được định nghĩa như sau:
CREATE DATABASE [database_name]
với database_name là tên cơ sở dữ liệu cần tạo.
Ví dụ 4.2: Tạo cơ sở dữ liệu QLNCKH?
CREATE DATABASE QLNCKH
2.1.2 Mở một cơ sở dữ liệu để sử dụng
Để thể thực hiện các thao tác như thêm, cập nhật hoặc truy xuất vào các bộ dữ liệu lưu
trữ trong một CSDL thì chúng ta cần thực hiện thao tác mở cơ sở dữ liệu với cú pháp:
USE [database_name]
Ví dụ 4.3: Sau khi tạo sở dữ liệu QLNCKH, thực hiện mở CSDL đó để sử dụng bằng
lệnh
USE QLNCKH
2.1.3 Hủy bỏ (xóa) một cơ sở dữ liệu
56
Sau khi thực hiện các thao tác mong muốn trên một cơ sở dữ liệu, nếu chúng ta không muốn
lưu giữ, sử dụng CSDL đó nữa thì chúng ta thể loại bỏ CSDL bằng cách sử dụng lệnh
DROP với cú pháp:
DROP DATABASE [database_name]
Ví dụ 4.4: loại bỏ cơ sở dữ liệu QLNCKH khi không còn sử dụng
DROP DATABASE QLNCKH
2.1.4 Sửa đổi cơ sở dữ liệu
Sau khi tạo thành công CSDL, chúng ta thể thực hiện thay đổi các thông số của CSDL
đó bằng lệnh ALTER DATABASE với cú pháp:
ALTER DATABASE [database_name] [Options]
Với Options là các tùy chọn đơn giản hoặc phức tạp như thêm file, thay đổi tên, thay đổi
kích thước… của CSDL database_name
Ví dụ 4.5: đổi tên cơ sở dữ liệu QLNCKH thành QuanLyNCKH trong SQL Server sẽ có cú
pháp
ALTER DATABASE QLNCKH MODIFY NAME = QuanLyNCKH
2.2 Tạo bảng và cập nhật dữ liệu
2.2.1 Tạo một bảng dữ liệu
Lệnh CREATE TABLE được sử dụng để tạo một bảng mới trong CSDL với cú pháp:
CREATE TABLE [table_name]([column_list datatype]
[column_constraint])
Trong đó,
table_name: đặc tả tên của bảng dữ liệu được tạo. Tên của bảng một chuỗi
tự bất kỳ, không có kí tự trống và không trùng với từ khóa.
column_list: đặc tả các cột trong bảng, cách nhau bằng dấu phẩy
datatype: đặc tả kiểu dữ liệu của cột
column_constraint: đặc tả các tùy chọn ràng buộc đối với các cột của bảng. Một
số tùy chọn thường gặp như [NULL|NOT NULL], [PRIMARY KEY], [UNIQUE],
[DEFAULT], [IDENTITY], [REFERENCES ref_table (ref_column)],
[CHECK] …
Tùy chọn [NULL] cho phép cột tương ứng có thể có giá trị NULL và ngược lại [NOT
NULL] không cho phép điều trên xảy ra.
Từ khóa [PRIMARY KEY] xác định ràng buộc toàn vẹn thực thể đối với một hoặc
nhiều cột thông qua một chỉ mục duy nhất và mỗi bảng chỉ một ràng buộc
PRIMARY KEY để làm khóa chính.
57
Tùy chọn [UNIQUE] ấn định ràng buộc toàn vẹn thực thể cho một hoặc nhiều cột
thông qua một chỉ mục duy nhất. Một bảng có thể có nhiều ràng buộc UNIQUE.
Tùy chọn [DEFAULT] đặc tả giá trị mặc nhiên cho cột khi giá trị gán cho cột không
được chỉ định tường minh trong quá trình thêm dòng dữ liệu vào bảng.
Tùy chọn [IDENTITY] cho biết rằng khi một dòng mới được thêm vào thì cột nhận
một giá trị tăng lên.
Tùy chọn [REFERENCES ref_table (ref_column)] ấn định ràng buộc toàn
vẹn tham chiếu đến bảng ref_table thông qua ref_column.
Ví dụ 4.6: Tạo bảng tên GIANGVIEN
CREATE TABLE GIANGVIEN(
magv char(5) NOT NULL PRIMARY KEY,
hoten varchar(50),
ngaysinh date,
gioitinh smallint,
hocvi varchar(20),
chucvu varchar(20),
makhoa int NOT NULL REFERENCES KHOA(makhoa)
)
SQL hỗ trợ một số kiểu dựng sẵn bao gồm:
char(n): chuỗi kí tự có chiều dài cố định là n với n do người dùng chỉ định.
varchar(n): chuỗi kí tự có chiều dài thay đổi với độ dài tối đa là n.
int, smallint: kiểu số nguyên (tập hợp con hữu hạn của các số nguyên).
numeric(p, d): số thập phân có tối đa p chữ số trong đó có d chữ số thập phân.
float, real, double precision: số thập phân dấu phẩy động
date: dữ liệu dạng ngày tháng.
2.2.2 Thêm dòng mới vào bảng
Sau khi đã tạo bảng dữ liệu, chúng ta có thể thêm các dòng dữ liệu mới vào bảng thông qua
câu lệnh INSERT với cú pháp:
INSERT INTO [table_name][colum_list] VALUES [expression_list]
trong đó:
table_name: đặc tả tên bảng hoặc khung nhìn nhận dữ liệu thêm vào.
colum_list: nếu tả thì những cột nào không hiện diện phải là các cột
thể mang giá trị NULL, trừ khi nó đã được định nghĩa giá trị mặc định lúc tạo bảng.
Nếu không đặc tả colum_list thì SQL ngầm hiểu tất cả các cột của bảng
với trật tự ban đầu của nó đều được gán trị. Nếu thêm đầy đủ tất cả các cột của bảng