4. Những nội dung nghiên cứu chính
2.2. CÁC LỆNH SQL GỘP NHÓM
Các lệnh SQL gộp nhóm chính là các lệnh SQL có sự hỗ trợ của các hàm thƣ viện nhƣ:
Hàm COUNT: Đếm số bộ có trong một quan hệ
Hàm TOTAL: Tính tổng các giá trị trong một trƣờng của một quan hệ Hàm MAX: Cho giá trị cực đại của một trƣờng trong một quan hệ Hàm MIN: Cho giá trị cực tiểu của một trƣờng trong một quan hệ
Hàm AVERAGE: Cho giá trị trung bình cộng của một trƣờng trong một quan hệ.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Câu lệnh SQL là một loại ngôn ngữ con dữ liệu quan hệ đƣợc xác nhận là rất mạnh. Phép toán cơ bản trong SQL là phép ánh xạ, đƣợc mô tả về cú pháp nhƣ là khối SELECT - FROM - WHERE.
Mệnh đề SELECT nghĩa là chọn các thuộc tính ra, hay còn gọi là thuộc tính kết quả, nếu không chỉ ra thuộc tính thì dùng dấu * có nghĩa là tất cả các thuộc tính của quan hệ đang đƣợc chỉ ra sau mệnh đề FROM. Sau mệnh đề WHERE là một biểu thức điều kiện lọc dữ liệu (hay còn gọi là biểu thức logic).
Ngoài ra, đễ mở rộng khả năng của ngôn ngữ, khối SELECT - FROM - WHERE còn đƣợc bổ sung thêm các mệnh đề GROUPE BY, having, order by. Các hàm mẫu và một số phần mềm còn thêm cả mệnh đề contpute, for browse.
Trong các phần sau sè trình bầy chi tiết tiếng mệnh đề. Dạng tổng quát của khối SELECT đƣợc biểu diễn nhƣ sau: SELECT <* | DISTINCT> | danh-sách-thuộc tính>
FROM <danh_sách_tên_bảng | tên_các_wiev> [WHERE <biểu_thức_điều_kiện>]
[GROUPE BY <danh_sách_tên_cột> ] [ HAVING <biểu_thức_điều_kiện>]
[ ORDER BY <tên_cột | số thứ_tự_cột |biểu_thức> [ ASC | DESC ]]
Trong dó mệnh đề WHERE dƣợc biểu diễn dạng: WHERE [NOT] BiểuThức PhépSoSánh BiểuThức WHERE [NOT] tên_cột [ NOT] LlKE xâu_kí_tự
WHERE [NOT] biểu_thức [NOT] BETWEEN biểu_thức AND biểu_thức WHERE [NOT] BiểuThức [NOT] lN ({danhSách | CâuHỏiCon})
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
WHERE [NOT] EXISTS (CâuHỏiCon)
WHERE [NOT] BiểuThức PhépSoSánh { ANY I ALL (CâuHỏiCon)} WHERE [NOT] <TênCột PhépKếtNối TênCột>
WHERE [NOT] <Biểu_thức_logic>
WHERE [NOT] <Biểu_thức> { AND | OR } [NOT] <Biểu_thức> Một số dạng SQL hay dùng (dữ liệu ở hình 1)
Tìm kiếm theo câu hỏi đơn giản
Không có điều kiện và câu hỏi chỉ liên quan tới một quan hệ. Cho biết danh sách các nhân viên.
SELECT *
FROM NhanVien
Các cách kết sau dây là hoàn toàn phù hợp trong SQL SELECT HO_VA_TEN, LUONG, LUONG * 110% FROM NhanVien
Đế bảng kết quả đúng là một quan hệ (không có bộ trùng nhau ), trong mệnh đề select cần thêm từ khoá distinkt
Cho biết tên các mã của các dự án đã đƣợc triển khai SELECT DISTINCT MaDuAn
FROM PhanNhiem
Tìm kiếm với điều kiện đơn giản
Tìm mã số những nhan viên đang làm cho dự án có mã dự án DA2. SELECT MaNV
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
WHERE MaDuAn = “DA2”
Trong SQL các phép sánh đƣợc sử dụng bao gồm >, <, >= , <=, = và <>. Các phép tính trên dùng cho mọi loại dữ liệu.
Tìm kiếm có xử lý xâu kế tự
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à Hải Phòng hay Hà Nội khi đó thì viết:
SELECT * FROM DuAn
WHERE TenDuAn LIKE “H%”
Trong đó ký hiệu % là thay thế cho một xâu con, dấu phân cách „_' để thay thế cho một ký tự.
A%B. xâu ký tự bất kỳ bắt đầu bằng chữ A và kết thúc bảng chữ B %A : xâu ký tự bất kỳ có ký tự kết thúc là A
A_B : xâu gồm ba ký tự có kỷ tự thứ hai là bất kỳ A_ : xâu gồm hai ký tự có ký tự đầu là A.
Xử lý ngày tháng
Ngoài các phép tính thông thƣờng SQL còn có thể xử lý dữ liệu dạng ngày tháng.
Ví dụ 2.2-1 : Tìm những nhân viên sinh trƣớc năm 1965 là 10 năm từ quan
hệ NhanVien (hình 2.1.2a). SELECT *
FROM NhanVien
WHERE NAM_SINH – 1960 = 10
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Tìm tên nhân viên có lƣơng từ 10000000 đến 13000000 SELECT HO_VA_TEN
FROM NhanVien
WHERE LUONG BETWEEN 10000000 AND 13000000
Tìm kiếm sử dụng IN
Tìm mã số nhân viên đang tham gia ít nhất một trong các dự án có mã DA1, DA2 và DA3.
SELECT MaNV FROM PhanNhiem
WHERE MaDuAn IN (“DA1” , “DA2” , ”DA3”)
Các hàm thư viện hay dùng
Trong SQL có các hàm mẫu gồm COUNT (đếm), MAX (giá trị cực đại) , MIN (giá trị cực tiểu) , SUM (tổng), AVG (tính trng bình cộng),….
Hàm COUNT
Riêng hàm COUNT khi có đối số là '*' là chỉ đếm số bản ghi thỏa yêu cầu tìm kiếm mà không cần quan tâm tới bất kỳ cột nào.
Ví dụ 2.2-2:
Cho biết số dự án mà nhân viên có mã NV3 đã tham gia. SELECT COUNT ( * )
FROM PhanNhiem
WHERE MaNV = “NV3”
Hàm MAX, MIN
Tìm sự chênh lệch lớn nhất về thời gian làm việc của nhân viên tham gia dự án có mã DA2 (dữ liệu lấy ở hình 1.2).
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
SELECT MAX(ThoiGianLV) - MIN(ThoiGianLV) FROM PhanNhiem
WHERE MaDuAn = “DA2”
Cách dùng tư khóa DISTINCT
Cho biết danh sách mã số nhân viên (phân biệt) đang tham gia vào một dự án nào đó (số liệu ở hình 1).
SELECT COUNT ( DISTINCT MaNV ) FROM PhanNhiem
Chú ý rằng đối số của các hàm có thể là một biểu thức số học bất kỳ
Các lệnh gom nhóm GROUP BY
Cú pháp
SELECT <Danh sách thuộc tính 1> FROM <Tên quan hệ>
GROUPE BY <Tên thuộc tính>[ | <Danh sách thuộc tính 2>]
Sau mệnh đề này quan hệ đƣợc lấy ra theo danh sách thuộc tính 1 sau đó phân thành nhóm theo <Tên thuộc tính> | <Danh sách thuộc tính 2> sau GROUPE BY, có nghĩa là các hộ có cùng giá trị của <Tên thuộc tính> | <Danh sách thuộc tính 2> đƣợc sắp xếp liên tiếp nhau, hết nhóm này dấn nhóm khác.
Ví dụ 2.2-3 :
Tìm mã số dự án mà mỗi nhân viên đang tham gia trong bảng PhanNhiem sau:
MaNV MaDuAn ChucVu ThoiGianLV
NV3 DA4 Lập trình viên 48
NV2 DA1 Nhân viên phân tích và thiết kế 24
NV4 DA3 Kỹ sƣ 36
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
NV4 DA2 Kỹ sƣ 18
NV5 DA4 Gim đốc 48
NV3 DA3 Nhân viên tƣ vấn 10
NV1 DA1 Giám đốc 12
NV2 DA2 Nhân viên phân tích và thiết kế 6
NV4 DA1 Kỹ sƣ 23
NV5 DA2 Phó giám đốc 24
NV1 DA2 Trợ lý 12
NV5 DA1 Nhân viên tƣ vấn 24
NV1 DA3 Nhân viên tƣ vấn 13
ELECT MaNV, MaDuAn FROM PhanNhiem
GROUPE BY MaNV
Sau mệnh đề này quan hệ NhanVien đƣợc lấy ra sau đó phân thành nhóm theo mã số MaNV, có nghĩa là các hộ có cùng giá trị MaNV đƣợc sắp xếp liên tiếp nhau, hết nhóm này dấn nhóm khác.
Kết quả sẽ là
MaNV MaDuAn ChucVu ThoiGianLV
NV1
DA1 Giám đốc 12
DA2 Trợ lý 12
DA3 Nhân viên tƣ vấn 13
NV2
DA1 Nhân viên phân tích và thiết kế 24
DA2 Nhân viên phân tích và thiết kế 6
NV3
DA4 Lập trình viên 48
DA3 Nhân viên tƣ vấn 10
NV4
DA3 Kỹ sƣ 36
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ DA1 Kỹ sƣ 23 NV5 DA3 Giám đốc 24 DA4 Giám đốc 48 DA2 Phó giám đốc 24
DA1 Nhân viên tƣ vấn 24
Tìm kiếm sử dụng mệnh đề HAVING .
HAVING thƣờng đƣợc sử dụng cùng GROUPE BY. Sau HAVING là 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 sau FROM mà chỉ tác động lần lƣợt từng nhóm các bản ghi đã chỉ ra tại mệnh đề GROUPE BY.
Ví dụ 2.2-4 : Cho ba quan hệ
Nhà cung cấp S (S#, SNAME, STATUS, CITY)
S# SNAME STATUS CITY
S1 S2 S3 S4 Cao sao vàng Điện tử Tân Bình Xe máy Hải Phòng Vietronic Đang hoạt động Đang hoạt động Đang hoạt động Đang hoạt động Hà nội Tân Bình Hải Phòng Hà nội Sản phẩm P (P#, PNAME, COLOR, WEIGHT) các mặt hàng
P# COLOR PNAME P1 P2 P3 P4 Đỏ Xanh Tím Vàng Radio Đầu Vedeo Xe máy Tivi
Các mặt hàng đã cung cấp SP(S#, P#, PNAME, QTY)
S# P# WEIGHT S1 S2 S2 S1 S3 P1 P2 P3 P4 P2 100000 120000 456000 3200 4000
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Tìm mã số những nhà cung cấp đã cung cấp ít nhất hơn hai mặt hàng khi dùng mệnh đề HAVING. SELECT S# FROM SP GROUPE BY S# HAVING COUNT(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ự giảm dần của mã số mặt hàng.
SELECT PNAME, P# FROM P
WHERE COLOUR = ' ĐỎ ' ORDER BY P# ASC
Sau ORDER BY là tên cột rồi đến chiều sắp xếp tăng hoặc giảm ( ASC hoặc DESC ). Có thể sắp xếp nhiều cột và nếu không chỉ ra chiều sắp xếp thì hệ thống ngầm định là ASC.
Mệnh đề ORDER BY nếu đứng sau GROUPE BY thì miền tác động của sắp xếp là trong từng nhóm của cột đƣợc chỉ ra trong GROUPE BY. Nếu cột sắp xếp có ở 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 chiếu là đủ. Ví dụ trên có thể viết:
SELECT PNAME , P# FROM Pv
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
ORDER BY 2 ASC
Tìm kiếm và câu hỏi phức tạp
Tìm kiếm với nhiều bảng qua việc sử dụng ánh xạ lồng nhau hoặc qua phép kết nối.
Phép kết nối
Trong phép kết nối, các cột tham gia kết nối phải có miền trị so sánh đƣợc với nhau. Tên cột của các bảng khác nhau phải gán nhãn 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à tên CITY của hãng đã cung cấp mặt hàng đó.
SELECT DISTINCT P# , CITY FROM SP, S
WHERE SP.S# = S.S#
Chú ý rằng trong các phép tìm kiếm có hơn một bảng, nếu tên các cột là không duy nhất thì bắt buộc phải viết tên cột dạng tƣờng minh. Trƣờng hợp không có mệnh đề where khi đó phép tính Đề-các sẽ đƣợc thực hiện.
Ánh xạ lồng
- 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')
Phép lồng nhau có thể đƣợc lồng nhiều mức hoặc sử dụng ánh xạ lồng với sự dẫn trỏ giữa các khối khi mỗi 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
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ FROM S WHERE 'P1' NOT lN SELECT P# FROM SP WHERE S# = S.S#
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Ví dụ 2.2-5 :
Tì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: 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ố là mặt hàng mà hãng có mã số S1 đã bán. SELECT PNAME
FROM P
WHERE P# = ANY (SELECT P# FROM SP WHERE S# = 'S1‟) Tìm tên những hãng cung cấp ít nhất một mật hàng màu đỏ.
SELECT SNAME FROM S
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
FROM SP , S
WHERE S.S#= SP.S# AND P.P# = SP.P# AND COLOUR = 'Đỏ'
Tìm mã số những hãng cung cấp số lượng một lần một mặt hàng nào đó lớn hơn hặc bằng số lượng mỗi lần cung cấpp của các hãng.
SELECT S# FROM SP
WHERE QTY >= ALL (SELECT QTY FROM SP)
Câu lệnh tương đương
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#) Mệnh đề not exists chỉ đạt giá trị đúng nếu khối câu hỏt con có kết quả là một tập rỗng.
Trong nhiều trƣờng hợp gó thể thay thế giữa các mệnh đề „exists‟ với IN hoặc NOT IN , EQUAL ANY tƣơng đƣơng với not equal all .v.v...
Ví dụ 2.2-6 :
Câu hỏi trên có thể tƣơng dƣơng với: SELECT *
FROM S
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Hoặc SELECT * FROM S
WHERE S# <> ALL (SELECT S# FROM SP)
Tìm kiếm có chứa phép tính tập hợp
Tìm mã số những hãng chƣa cung cấp một mặt hàng nào. SELECT S# FROM S MINUS SELECT S# FROM SP Tìm tên các hãng cung cấp tất cả các mặt hàng. SELECT SNAME FROM S WHERE ( SELECT P# FROM SP
WHERE S# = S.S#) = (SELECT P# FROM P)
Các mệnh đề cập nhật dữ liệu
Thêm một bộ Dạng tổng quát:
INSERT INTO tên-bảng (danh-sách-tên-cột) VALUES (Các giá trị)
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
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ẳng hạn INSERT INTO P SELECT * FROM W WHERE COLOUR = 'Đỏ' nếu nhƣ bảng W và bảng P có cùng lƣợc đồ. Xoá bản ghi
Mệnh đƣợc thực hiện cho một hoặc nhiều bản ghi thoả một điều kiện nào đó. Dạng tổng quát là:
DELETE Tên bảng
[FROM {tên_bản | tên view }] [WHERE biểuthứcđiềukiện ] Loại bỏ hãng S1 khỏi báng S
DELETE FROM S WHERE S# = 'S1'
- Loại bỏ các mặt hàng (ra đƣợc cung cấp trƣớc ngày 20/5/2000. DELETE FROM SP WHERE SDATE < „2000/5/20'
Loại bỏ những 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
Mệnh đề sửa đổi các giá tri của các bản ghi trong bảng của CSDL theo một điều kiện nào đó có dạng tổng quát: UPDATE [tên bảng]
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
[FROM tên-bảng]
[WHERE biểu-thức-điểu-kiện]
Ví dụ 2.2-7:
Đổi mầu các mặt hàng P2 thành màu vàng.
UPDATE P SET COLOUR = „Vàng‟ WHERE P# = „P2” Tạo tệp chỉ số
Việc tạo chỉ số(SQL không tự động tạo tệp này) là do ngƣời sử dụng tự chọn. Mệnh đề tổng quát có dạng:
CREATE [UNIQUE] INDEX TênChỉSố ON tên-bảng (tên-cột [ASC | DESC])
Ngầm định của hệ thống là ASC.
Bỏ chỉ số INDEX thì sử dụng mệnh đề: DROP INDEX tên-chỉ-số
Ví dụ 2.2-8 : Tạo tệp chi số I3 theo cột Cây của bảng S.
CREATE INDEX 13 ON S(CITY)
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ụ 2.2-9 : Tạo tệp chỉ số I4 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)
Tạo view của người sử dụng
Dạng tổng quát:
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Ví dụ 2.2-10 : Tạo view PP gồm các cột P#, Pname từ bảng P của các mặt hàng màu đỏ.
CREATE VIEW PP (P#, PNAME) AS
SELECT P# , PNAME FROM P WHERE COLOUR = „Đo„
Tên các cột của view và tên các cột của bảng chỉ ra trong mệnh đề select có thể khác nhau, tên cột của view là do ngƣời sử dụng tự đặt tƣơng ứng với từng cột của mệnh đề select.
Chẳng hạn, tạo view TINHTOAN gồm các cột P# , S# , SLMOI từ bảng SP với số lƣợng mỗi mặt hàng đều đƣợc tăng thêm lả 20.
CREATE VIEW TINHTOAN (S# , P# , SLMOI) AS
SELECT (S# , P# , QTY+20) FROM SP
Thêm cột mới
Thêm cột DONGIA (đơn giá) cho SP, kiểu số liệu số thập phân. ALTER TABLE SP ADD DONGIA DECIMAL(8.2)