CÁC LỆNH SQL GỘP NHÓM

Một phần của tài liệu các kỹ thuật phân mảnh, gộp nhóm trong csdl phân tán (Trang 36 - 52)

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” (adsbygoogle = window.adsbygoogle || []).push({});

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” (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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/ (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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/ (adsbygoogle = window.adsbygoogle || []).push({});

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 đỏ. (adsbygoogle = window.adsbygoogle || []).push({});

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)

Một phần của tài liệu các kỹ thuật phân mảnh, gộp nhóm trong csdl phân tán (Trang 36 - 52)