Các ngôn ngữ thao tác dữ liệu
Trang 1Chương 3: CÁC NGÔN NGỮ THAO TÁC DỮ LIỆU
3.1 Ngôn ngữ truy vấn dữ liệu SQL
Trong mục này trình bày ngôn ngữ dữ liệu (Structered Query Language), SQL là ngôn ngữ con dữ liệu đưọc xác nhận là rất mạnh , phổ dụng và lại dễ sử dụng SQL là ngôn ngữ phi thủ tục, chuẩn mực và điển hình Do vậy hiện nay rất nhiều sản phẩm phần mềm đều được cài đặt SQL như : Oracle, DB2,
Trong phần này sẽ trình bày các khả năng của ngôn ngữ SQL Phép toán cơ bản trong SQL là phép ánh xạ được miêu tả bằng khối lệnh SELECT - FROM - WHERE Các mệnh đề của ngôn ngữ SQL sẽ được trình bày chi tiết bằng ví dụ
Các thuật ngữ trong Cơ Sở Dữ Liệu quan hệ như quan hệ , thuộc tính , bộ, được thay thế bằng các thuật ngữ như : Bảng( Table), cột(colum), bản ghi(Record) hoặc
hàng(Row) trong SQL
Chúng ta sẽ xem các chức năng cơ bản của một hệ quản trị Cơ Sở Dữ Liệu như cung cấp ngôn ngữ định nghĩa dữ liệu (DDM), Ngôn ngữ thao tác dữ liệu(DML) , tìm kiếm và bảo vệ dữ liệu được thể hiện trong ngôn ngữ SQL như thế nào
1 Định nghĩa dữ liệu
Trong SQL cho phép người sử dụng tạo các dữ liệu như Bảng(table), Khung nhìn(View), và các tập chỉ số(Index)
* Lệnh tạo bảng
Cú pháp: CREAT TABLE Ten_Bang(Atr1 Type [NOT NULL], Atr2 Type [NOT
NULL], )
Trong đó Ten_Bang: tên của table tạo ra; tên bảng là xâu ký tự bất kỳ không có ký hiệu trống và không trùng với từ khóa
Atr1, Atr2 : Tên các thuộc tính (Các cột của bảng)
Type: Kiểu dữ liệu cho thuộc tính Một số loại dữ liệu thường dùng như:
integer: số nguyên từ -2 174 483 648 đến 2 174 483 648
Smallinteger: số nguyên từ - 32 768 đến 32 767
decimal(n,p) số thập phân với độ dài tối đa n kể cả p chữ số thập phân ( không tính dấu chấm thập phân) Từ khóa number trong SQL đưọc dùng trong dạng dữ liệu này
float: số dấu phẩy động
char(n): xâu ký tự có độ dài cố định n, n≤ 255
varchar(n) xâu ký tự có độ dài biến đổi, độ dài xâu có thể từ 0 đến n và được xác định tại thời điểm đưa dữ liệu vào lưu trữ
date: dữ liệu dạng ngày tháng
chỉ thị NOT NULL để báo rằng giá trị của thuộc tính đó không được thiếu trong các bộ của quan hệ
Trang 2Ví Dụ:
Tạo Cơ Sở Dữ Liệu gồm 3 bảng S(nhà cung cấp SUPPLIERS), P ( Sản phẩm PRODUCTS) và bảng SP (Cung cấp) như sau:
- Tạo bảng S:
CREATE TABLE S
( S# INTEGER NOT NULL,SNAME VARCHAR(8) NOT NULL,AGES INTEGER NOT NULL, CITY VARCHAR(30) NOT NULL)
Chú ý: NULL là giá trị ngầm định
- Tạo bảng P:(Bảng sản phẩm)
CREATE TABLE P
(P# INTEGER NOT NULL, PNAME VARCHAR(10) NOT NULL, WEIGHT INTEGER NOT NULL, COLOR VARCHAR(10) NOT NULL, CITY VARCHAR(30) NOTNULL)
- Tạo bảng SP:
CREATE TABLE SP
(S# INTEGER NOT NULL, P# INTEGER NOT NULL, QTY INTEGER,SDATE DATE NOT NULL, PRICE DECIMAL(8,2))
Vào dữ liệu :
Có ba cách để vào dữ liệu cho bảng như sau
INSERT INTO S(S#,SNAME,AGES,CITY)
VALUE(1,’Thanh Huong’, 30,’ TP Ho Chi Minh’)
Nếu vị trí của các cột trong bảng cố định, ta có thể viết
INSERT INTO S
VALUE(1,’Thanh Huong’, 30,’ TP Ho Chi Minh’)
Người vào dữ liệu có thể quên vị trí các cột, khi đó ta có thể biểu diễn như sau:
INSERT INTO S(S#,AGES,CITY, SNAME)
VALUE(1, 30, ’ TP Ho Chi Minh’, ’Thanh Huong’)
2 Tìm Kiếm dữ liệu Trong SQL
Đây là chức năng cơ bản nhất của SQL, cho phép người sử dụng tìm kiếm các thông tin trên Cơ Sở Dữ Liệu với Câu lệnh SELECT FROM WHERE
Cú pháp:
SELECT [*| DISTINCT] Danh sách các cột đưa ra
FROM Tên_Bảng/Tên_View
[WHERE biểu thức điều kiện]
[GROUP BY Danh sách các cột]
[HAVING biểu thức điều kiện]
[ORDER BY Tên_cột [ASC/DESC]
Giải thích các tham số bằng các ví dụ
Trang 32.1 Tìm kiếm theo câu hỏi đơn giản
Tìm kiếm không điều kiện:
i Cho biết danh sách các nhà cung cấp:
SELECT *
FROM S
Dấu ‘*’ có nghĩa là chọn toàn bộ các cột trong bảng
Để bảng kết quả sau khi thực hiện một mệnh đề SQL đúng là một quan hệ (Có nghĩa là không có các bộ trùng nhau) thì phải có từ khóa DISTINCT
SELECT DISTINCT PNAME
FROM SP
Tìm kiếm với điều kiện đơn giản
Tìm mã số của những nhà cung cấp đã cung cấp mặt hàng P2
SELECT S#
FROM SP
WHERE P#=’P2’
Tìm kiếm có xử lý xâu ký tự
Xử lý xâu ký tự gần đúng còn gọi là phép tính “thông minh” trong trường hợp người sử dụng không nhớ rõ tên người hoặc địa danh ví dụ là Hoa hay Hoan khi đó ta có thể viết SELECT *
FROM S
WHERE SNAME LIKE ‘HOA%”
Trong SQL sử dụng ký hiệu ‘%’ là thay thế cho một xâu con bất kỳ, dấu phân cách ‘_’ để thay thế cho một ký tự
A%B : Xâu ký tự bắt đầu bằng chữ A và kết thúc bằng chữ B
%A Xâu ký tự bất kỳ kết thúc bằng chữ A
A_B : Xâu bao gồm 3 ký tự , ký tự thứ 2 là bất kỳ
A_ : Xâu có hai ký tự, ký tự đầu là A
Xử lý ngày tháng
Tìm những mặt hàng bán trước ngày 94-04-24 10 ngày
SELECT P#
FROM SP
WHERE ‘94-04-24’ - SDATE =10
Tìm kiếm sử dụng IN và BETWEEN
Tìm những mặt hàng đã cung cấp có giá từ 1000 đến 2000
SELECT P#
FROM SP
WHERE PRICE BETWEEN 1000 AND 2000
Tìm mã số những nhà cung cấp đã cung cấp ít nhất một trong các mặt hàng P1,P2,P3
Trang 4SELECT S#
FROM SP
WHERE P# IN (‘P1’,’P2’,’P3’)
CÁC HÀM THƯ VIỆN
Cũng giống như các ngôn ngữ Cơ Sở Dữ Liệu khác, Trong SQL có các hàm mẫu gồm COUNT, MAX, MIN, SUM, AVG Riêng hàm COUNT khi có đối số là ‘*’ có nghĩa là đếm số bảng ghi thỏa mãn yêu cầu tìm kiếm mà không quan tâm đến bất kỳ cột nào
Ví du
Cho biết số lần mặt hàng P2 đã được cung cấp
SELECT COUNT(*)
FROM SP
WHERE P#=’P2’
Tìm hiệu số mặt hàng P1 bán một lần nhiều nhất và một lần ít nhất của hãng S1
SELECT MAX(QTY) - MIN(QTY)
FROM SP
WHERE S#=’S1’ AND P#=’P1’
Tìm kiếm nhờ mệnh đề GROUPE BY
Tìm mã số những mặt hàng mà mỗi nhà cung cấp đã cung cấp cho khách hàng
SELECT S#,P#
FROM SP
GROUPE BY S#
trong mệnh đề này bảng dữ liệu SP được lấy ra, sau đó phân thành nhóm theo mã số của người cung cấp (S#) Có nghĩa là các bộ có cùng giá trị S# sẽ được xếp liên tiếp nhau, hết nhóm này đến nhóm khác
Tìm kiếm nhờ mệnh đề HAVING
Mệnh đề HAVING thường được sử dụng cùng mệnh đề GROUP BY Sau HAVING la biểu thức điều kiện Biểu thức điều kiện này không tác động vào toàn bảng được chỉ ra ở mệnh đề FROM mà chỉ tác độnầnnnn lượt đến từng nhóm các bản ghi đã chỉ ra tại mệnh đề GOUP BY
Ví dụ: Tìm mã số những nhà cung cấp đã cung cấp ít nhất hơn hai mặt hàng
SELECT S#
FROM SP
GROUP BY S#
HAVING CUONT (DISTINCT P#)>2
Tìm kiếm có sắp xếp
Tìm tên các mặt hàng màu đỏ và sắp xếp theo thứ tự của mã số mặt hàng
SELECT PNAME,P#
Trang 5FROM P
WHERE COLOUR = ‘RED’
ORDER BY P# ASC
Mệnh đề ORDER BY cho phép ta sắp xếp các cột theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC), ngầm định là ASC
Mệnh đề ORDER BY có thể sắp xếp theo nhiều cột Nếu nó đứng sau mệnh đề GROUP
BY thì miền tác động là từng nhóm của cột được chỉ ra trong mệnh đề GROUP BY Nếu cột sắp xếp có mặt ở mệnh đề SELECT thì trong mệnh đề ORDER BY có thể chỉ cần chỉ
ra số thứ tự của cột đó trong danh sách tham chiếu là đủ
trong ví dụ trên ta có thể viết
SELECT PNAME,P#
FROM P
WHERE COLOUR = ‘RED’
ORDER BY 2 ASC
Tìm kiếm với câu hỏi phức tạp
Trong phần này sẽ trình bày việc tìm kiếm dữ liệu trên nhiều bảng thông qua phép kết nối hoặc việc sử dụng các ánh xạ lồng
Khả năng kết nối dữ liệu
Trong phép kết nối, các cột tham gia kết nối phải có miền trị là so sánh được với nhau Tên cột của các bảng khác nhau có thể viết tường minh qua tên bảng
Ví Dụ:
Với mỗi mặt hàng được cung cấp , hãy cho biết mã số của mặt hàng và địa chỉ của hãng đã cung cấp mặt hàng đó
SELECT DISTINCT P#, CITY
FROM SP, S
WHERE SP.S# =S.S#
Aïnh xạ lồng
Ta có thể sử dụng những mệnh đề SELECT lồng nhau
Ví dụ:
Tìm tên những hãng đã cung cấp mặt hàng P2
SELECT SNAME
FROM S
WHERE S# IN( SELECT S#
FROM SP
WHERE P#=’P2’)
Trang 6
Phép lồng nhau có thể lồng nhiều mức hoặc sử dụng sự dẫn trỏ giữa các khối mỗi khi hướng tới một bảng khác nhau
Ví dụ: Tìm tên các hãng không cung ứng mặt hàng P1
SELECT SNAME
FROM S
WHERE ‘P1’ NOT IN
SELECT P#
FROM SP WHERE S#= S.S#
Trong SQL còn cho phép tìm kiếm trên nhiều bảng nhờ mệnh đè EXISTS (tồn tại)
Ví dụ:
Tìm kiếm những nhà cung cấp đã cung cấp ít nhất một mặt hàng nào đó
SELECT *
FROM S
WHERE EXISTS
(SELECT * FROM SP WHERE SP.S#=S.S#) Hoặc có thể biểu diễn bằng cách khác
SELECT *
FROM S
WHERE 0<
(SELECT COUNT(*) FROM SP
WHERE SP.S#=S.S#) Tìm kiếm có sử dụng lượng từ ANY và ALL
Tìm tên những mặt hàng có mã số mặt hàng là mặt hàng nào đó mà hãng S1 đã cung cấp SELECT PNAME
FROM P
WHERE P#= ANY
SELECT P#
FROM SP WHERE S#=’S1’
Tìm tên những nhà cung cấp cung cấp ít nhất một mặt hàng màu đỏ
SELECT SNAME
Trang 7FROM S
WHERE S#= ANY
SELECT S#
FROM SP,S,P WHERE S.S#=SP.S# AND P.P#=SP.P# AND COLOUR=’RED’
Tìm mã số những nhà cung cấp số lượng môyt lần một mặt hàng nào đó lớn hơn hoặc bằng số lượng mỗi lần cung ứng của hãng
SELECT S#
FROM SP
WHERE QTY >= ALL
SELECT QTY FROM SP Mệnh đề trên hoàn toàn tương đương với
SELECT S#
FROM SP
WHERE QTY = (SELECT MAX( QTY)
FROM SP) Tìm những hãng chưa hoạt động
SELECT *
FROM S
WHERE NOT EXISTS
SELECT * FROM SP WHERE SP.S# = S.S#
Chú ý mệnh đề NOT EXISTS có giá trị đúng (True) nếu kết quả của câu hỏi sau nó là một tập rỗng
Tìm kiếm có chứa phép tính tập hợp
Tìm mã số những hãng hiện thời chưa cung cấp một mặt hàng nào cả
SELECT S#
FROM S
MINUS
SELECT S#
FROM SP
Tìm tên các hãng cung cấp, cung cấp tất cả các mặt hàng
SELECT SNAME
FROM S
WHERE ( SELECT P#
Trang 8FRPM SP WHERE S#=S.S#) = (SELECT P#
FRPM P)
3 Các lệnh cập nhật dữ liệu
Thêm một bộ vào trong quan hệ
Cú pháp: INSERT INTO Tên_Bảng(Danh sách tên cột)
VALUES(Danh sách các trị)
[câu hỏi con]
Ví dụ: có thể bổ sung một tập các bản ghi là kết quả xử lý của một câu hỏi nào đó, chẳn hạn:
Giả sử ta có bảng W có cùng lược đồ như bảng P khi đó mệnh đề sau đây sẽ bổ sung vào bảng P tất cả nững bộ từ bảng W những mặt hàng có mầu đỏ
INSERT INTO P
SELECT *
FROM W
WHERE COLOUR =’RED’
+ Xóa các bộ
Cú pháp DELETE FROM tên_bảng
[WHERE btđk]
Ví dụ:
Loại bỏ hãng S1 ra khỏi bảng S
DELETE
FROM S
WHERE S#=’S1’
Lọai bỏ cácmặt hàng được cung cấp sau ngày 20 -5- 1994
DELETE
FROM SP
WHERE SDATE >’1994-5-20’
Loại bỏ các hãng chưa cung cấp mặt hàng nào
DELETE
FROM S
WHERE S# NOT IN (SELECT S# FROM SP)
+ Sửa đổi dữ liệu
Trang 9Cú pháp: UPDATE [Tên_bảng]
SET [Tên_cột=Biểu thức, ]
[FROM Tên_Bảng]
[WHERE btđk]
Ví dụ:
Đổi màu các mặt hàng P2 thành màu vàng
UPDATE P
SET COLOUR =’ YELLOW’
WHERE P#= ‘ P2’
+ Thêm một cột vào bảng
Cú pháp: ALTER TABLE Tên_Bảng
[ADD/MODIFY][(Tên_cột Kiểu dữ liệu ]
ADD: Thêm cột mới vào
MODIFY : Sửa cột dã có trong quan hệ
Ví dụ: thêm cột DONGIA ( đơn giá) cho bảng SP với kiểu dữ liệu dạng số thập phân ALTER TABLE SP ADD DONGIA DECIMAL(8.2)
+ Xóa bảng:
cú pháp: DROP TABLE Tên_bảng
Xóa VIEW
Cú pháp DROP VIEW Tên_view
Tạo tệp chỉ số
Trong SQL không có cơ chế tự động tạo tệp chỉ số cho các cột của bảng Việc tạo tệp chỉ số do người dùng thục hiện
Cú pháp như sau: CREATE [UNIQUE] INDEX tên_tệp_chỉ_số ON tên_bảng (tên_cột [ASC|DESC])
Hủy bỏ chỉ số thì sử dụng mệnh đề
DROP INDEX tên_tệp_chỉ_số
Ví dụ:tạo tệp chỉ số 13 theo cột City tăng dần của bảng S
CREATE INDEX 13 ON S(CITY ASC)
Trong SQL có thể tổ chức đa chỉ số, tức là tổ chức một tệp chỉ số cho nhiều cột, mỗi cột có thể có chiều tăng giảm khác nhau, thứ tự được tính từ trái qua phải
Ví dụ tạo tệp chỉ số 14 cho bảng SP theo cột S# tăng dần và theo cột P# giảm dần
CREATE INDEX 14 ON SP(S# ASC, P# DESC)
4 Các mệnh đề an toàn dữ liệu
Đây là yếu tố không thể thiếu được đối với một hệ quản trị Cơ Sở Dữ Liệu để bảo vệ dữ liệu và ngăn chặn những người không được phép truy cập Các quyền truy cập vào Cơ Sở
Trang 10Dữ Liệu gồm: Read(đọc), Write(ghi), Insert(bổ sung), Update(Sửa
đổi),Select(chọn),Delete(xóa)Run(chạy)
Việc phân phát quyền truy cập vào Cơ Sở Dữ Liệu do người quản trị Cơ Sở Dữ Liệu do người quản trị Cơ Sở Dữ Liệu (database administrator -DBA) thực hiện bởi lệnh sau:
Gián quyền truy cập cho người sử dụng: Lệnh GRANT
cú pháp: GRANT Quyền truy cập ON Tên_bảng/view TO Tên_User [ with GRANT option]
Từ khóa with GRANT option để cho người được cấp quyền có thể tiếp tục trao quyền cho người khác Nếu tên_User là Public hoặc Word thì có nghĩa là cho mọi người sử dụng
Ví dụ: trao quyền sử dụng bảng S cho cô Hồng
GRANT READ ON S TO HONG with GRANT option
Lệnh này cô Hồng có thể trao quyền đọc bảng S cho người dùng khác
Hủy bỏ quyền truy cập:
REVOKE Tên_quyền ON tên_bảng FROM Tên_User
ví dụ:Rút lại quyền đọc bảng S của User Hồng
REVOKE READ ON S FROM HONG