Hệ quản trị cơ sở dữ liệu - Chương 2: SQL
MỤC ĐÍCH
Giới thiệu một hệCSDL chuẩn, SQL, các thành phần cơbản của của nó.
YÊU CẦU
Hiểu các thành phần cơbản của SQL-92
Hiểu và vận dụng phương pháp "dịch" từcâu vấn tin trong ngôn ngữtựnhiên sang ngôn
ngữSQL và ngược lại
Hiểu và vận dụng cách thêm (xen), xóa dữliệu
rị của thuộc tính và số thành phần của bộ phải bằng với ngôi của quan hệ. “Xen vào quan hệ Account một bộ có số tài khoản là A-9732, số cân đối là 1200$ và tài khoản này được mở ở chi nhánh Perryridge” INSERT INTO Account VALUES (‘Perryridge’, ‘A-9732’, 1200); CHƯƠNG II SQL trang 28 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU Trong ví dụ này thự tự các giá trị thuộc tính cần xen trùng khớp với thứ tự các thuộc tính trong sơ đồ quan hệ. SQL cho phép chỉ rõ các thuộc tính và các giá trị tương ứng cần xen: INSERT INTO Account (Branch_name, Account_number, Balance) VALUES (‘Perryridge’, ‘A-9732’, 1200); INSERT INTO Account (Account_number, Balance, Branch_name) VALUES (‘A-9732’, 1200, ‘Perryridge’); “Cấp cho tất cả các khách hàng vay ở chi nhánh Perryridge một tài khoản với số cân đối là 200$ như một quà tặng sử dụng số vay như số tài khoản“ INSERT INTO Account SELECT Branch_name, Loan_number, 200 FROM Loan WHERE Branch_name = ‘Perryridge’ INSERT INTO Depositor SELECT Customer_name, Loan_number FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number AND Branch_name = ‘Perryridge’ CẬP NHẬT (Update) Câu lệnh UPDATE cho phép thay đổi giá trị thuộc tính của các bộ “Thêm lãi hàng năm vào số cân đối với tỷ lệ lãi suất 5%” UPDATE Account SET Balance = Balance*1.05 Giả sử các tài khoản có số cân đối > 10000$ được hưởng lãi suất 6%, các tài khoản có số cân đối nhỏ hơn hoặc bằng 10000 được hưởng lãi suất 5% UPDATE Account SET Balance = Balance*1.06 WHERE Balance > 10000 UPDATE Account SET Balance = Balance*1.05 WHERE Balance <= 10000 SQL92 đưa vào cấu trúc CASE như sau: CASE WHEN P1 THEN Result1 WHEN P2 THEN Result2 ... WHEN Pn THEN Resultn ELSE Result0 END trong đó Pi là các vị từ, Resulti là các kết quả trả về của hoạt động CASE tương ứng với vị từ Pi đầu tiên thỏa mãn. Nếu không vị từ Pi nào thỏa mãn CASE trả về Result0. Với cấu trúc CASE như vậy ta có thể viết lại yêu cầu trên như sau: UPDATE Account SET Balance = CASE WHEN Balance > 10000 THEN Balance*1.06 ELSE Balance*1.05 END “Trả 5% lãi cho các tài khoản có số cân đối lớn hơn số cân đối trung bình” UPDATE Account CHƯƠNG II SQL trang 29 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU SET Balance = Balance*1.05 WHERE Balance > SELECT AVG(Balance) FROM Account CÁC QUAN HỆ NỐI SQL92 cung cấp nhiều cơ chế cho nối các quan hệ bao hàm nối có điều kiện và nối tự nhiên cũng như các dạng của nối ngoài. Loan INNER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number Nối quan hệ Loan và quan hệ Borrower với điều kiên: Loan.Loan_number = Borrower.Loan_number Quan hệ kết quả có các thuộc tính của quan hệ Loan và các thuộc tính của quan hệ Borrower (như vậy thuộc tính Loan_number xuất hiện 2 lần trong quan hệ kết quả). Để đổi tên quan hệ (kết quả) và các thuộc tính, ta sử dụng mệnh đề AS Loan INNER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number AS LB(Branch, Loan_number, Amount, Cust, Cust_Loan_number) Loan LEFT OUTER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number Phép nối ngoài trái được tính như sau: Đầu tiên tính kết quả của nối trong INNER JOIN. Sau đó đối với mỗi bộ t của quan hệ trái (Loan) không tương xứng với bộ nào trong quan hệ bên phải (borrower) khi đó thêm vào kết quả bộ r gồm các giá trị thuộc tính trái là các giá trị thuộc tính của t, các thuộc tính còn lại (phải) được đặt là null. Loan NATURAL INNER JOIN Borrower Là nối tự nhiên của quan hệ Loan và quan hệ Borrower (thuộc tính trùng tên là Loan_number). NGÔN NGỮ ĐỊNH NGHĨA DỮ LIỆU (DDL) DDL SQL cho phép đặc tả: o Sơ đồ cho mỗi quan hệ o Miền giá trị kết hợp với mỗi thuộc tính o các ràng buộc toàn vẹn o tập các chỉ mục được duy trì cho mỗi quan hệ o thông tin về an toàn và quyền cho mỗi quan hệ o cấu trúc lưu trữ vật lý của mỗi quan hệ trên đĩa CÁC KIỂU MIỀN TRONG SQL SQL-92 hỗ trợ nhiều kiểu miền trong đó bao hàm các kiểu sau: o char(n) / charater: chuỗi ký tự dộ dài cố định, với độ dài n được xác định bởi người dùng o vachar(n) / character varying (n): chuỗi ký tự độ dài thay đổi, với độ dài tối đa được xác dịnh bởi người dung là n o int / integer: tập hữu hạn các số nguyên o smallint: tập con của tập các số nguyên int o numeric(p, d): số thực dấu chấm tĩnh gồm p chữ số (kể cả dấu) và d trong p chữ số là các chữ số phần thập phân o real, double precision: số thực dấu chấm động và số thực dấu chấm động chính xác kép o float(n): số thực dấu chấm động với độ chính xác được xác định bởi người dùng ít nhất là n chữ số thập phân CHƯƠNG II SQL trang 30 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU o date: kiểu năm tháng ngày (YYYY, MM, DD) o time: kiểu thời gian (HH, MM, SS) SQL-92 cho phép định nghĩa miền với cú pháp: CREATE DOMAIN Ví dụ: CREATE DOMAIN hoten char(30); Sau khi đã định nghĩa miền với tên hoten ta có thể sử dụng nó để định nghĩa kiểu của các thuộc tính ĐỊNH NGHĨA SƠ ĐỒ TRONG SQL. Lệnh CREATE TABLE với cú pháp CREATE TABLE ( , ... , , ... ) Các ràng buộc toàn vẹn cho phép bao gồm: primary key ( ) A,...,A,A iii m21 và check(P) Đặc tả primary key chỉ ra rằng các thuộc tính tạo nên khoá chính của quan hệ. Mệnh đề check xác định một vị từ P mà mỗi bộ trong quan hệ phải thoả mãn. A,...,A,A iii m21 Ví dụ: CREATE TABLE customer ( customer_name CHAR(20) not null, customer_street CHAR(30), customer_city CHAR(30), PRIMARY KEY(customer_name)); CREATE TABLE branch ( branch_name CHAR(15) not null, branch_city CHAR(30), assets INTEGER, PRIMARY KEY (branch_name), CHECK (assets >= 0)); CREATE TABLE account ( account_number CHAR(10) not null, branch_name CHAR(15), balance INTEGER, PRIMARY KEY (account_number), CHECK (balance >= 0)); CREATE TABLE depositor ( customer_name CHAR(20) not null, account_number CHAR(10) not null, PRIMARY KEY (customer_name, account_namber)); Giá trị null là giá trị hợp lệ cho mọi kiểu trong SQL. Các thuộc tính được khai báo là primary key đòi hỏi phải là not null và duy nhất. do vậy các khai báo not null trong ví dụ trên là dư (trong SQL-92). CREATE TABLE student ( CHƯƠNG II SQL trang 31 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU name CHAR(15) not null, student_ID CHAR(10) not null, degree_level CHAR(15) not null, PRIMARY KEY (student_ID), CHECK (degree_level IN (‘Bachelors’, ‘Masters’, ‘Doctorats’)); • Xoá một quan hệ khỏi CSDL sử dụng lệnh Drop table với cú pháp: DROP TABLE • Thêm thuộc tính vào bảng đang tồn tại sử dụng lệnh Alter table với cú pháp: ALTER TABLE ADD • Xoá bỏ một thuộc tính khỏi bảng đang tồn tại sử dụng lệnh Alter table với cú pháp: ALTER TABLE DROP SQL NHÚNG (Embedded SQL) Một ngôn ngữ trong đó các vấn tin SQL được nhúng gọi là ngôn ngữ chủ (host language), cấu trúc SQL cho phép trong ngôn ngữ chủ tạo nên SQL nhúng. Chương trình được viết trong ngôn ngữ chủ có thể sử dụng cú pháp SQL nhúng để truy xuất và cập nhật dữ liệu được lưu trữ trong CSDL. BÀI TẬP CHƯƠNG II II.1. Xét CSDL bảo hiểm sau: person(ss#, name, address): Số bảo hiểm ss# sở hữu bởi người tên name ở địa chỉ address car(license, year, model): Xe hơi số dăng ký license, sản xuất năm year, nhãn hiệu Model accident(date, driver, damage_amount): tai nạn xảy ra ngày date, do người lái driver, mức hư hại damage_amount owns(ss#, license): người mang số bảo hiểm ss# sở hữu chiếc xe mang số đăng ký license log(license, date, driver): ghi sổ chiếc xe mang số đăng ký license, bị tai nạn ngày do người lái driver các thuộc tính được gạch dưới là các primary key. Viết trong SQL các câu vấn tin sau: 1. Tìm tổng số người xe của họ gặp tai nạn năm 2001 2. Tìm số các tai nạn trong đó xe của"John"liên quan tới 3. Thêm khách hàng mới: ss# =”A-12345”, name ="David”, address ="35 Chevre Road”, license ="109283”, year =”2002”, model ="FORD LASER"vào CSDL 4. xoá các thông tin lien quan dến xe model "MAZDA"của"John Smith” 5. Thêm thông tin tai nạn cho chiếc xe"TOYOTA"của khách hàng mang số bảo hiểm số"A-84626” CHƯƠNG II SQL trang 32 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU II.2. Xét CSDL nhân viên: employee (E_name, street, city): Nhân viên có tên E_name, cư trú tại phố street, trong thành phố city works (E_name, C_name, salary): Nhân viên tên E_name làm việc cho công ty C_name với mức lương salary copany (C_name, city): Công ty tên C_name đóng tại thành phố city manages(E_name, M_name): Nhân viên E_name dưới sự quản lý của nhân viên M_name Viết trong SQL các câu vấn tin sau: 1. Tìm tên của tất cả các nhân viên làm việc cho First Bank 2. Tìm tên và thành phố cư trú của các nhân viên làm việc cho First Bank 3. Tìm tên, phố, thành phố cư trú làm việc cho First Bank hưởng mức lương > 10000$ 4. Tìm tất cả các nhân viên trong CSDL sống trong cùng thành phố với công ty mang họ làm việc cho 5. Tìm tất cả các nhân viên sông trong cùng thành phố, cùng phố với người quản lý của họ 6. Tìm trong CSDL các nhân viên không làm việc cho First Bank 7. Tìm trong CSDL, các nhân viên hưởng mức lương cao hơn mọi nhân viên của Small Bank 8. Giả sử một công ty có thể đóng trong một vaì thành phố. Tìm tất cả các công ty đóng trong mỗi thành phố trong đó Small Bank đóng. 9. Tìm tất cả các nhân viên hưởng múc lương cao hơn mức lương trung bình của công ty họ làm việc 10. Tìm công ty có nhiều nhân viên nhất 11. Tìm công ty có tổng số tiền trả lương nhỏ nhất 12. Tìm tất cả các công ty có mức lương trung bình cao hơn mức luong trung bình của công ty First Bank 13. Thay đổi thành phố cư trú của nhân viên"Jones"thành NewTown 14. Nâng lương cho tất cả các nhân viên của First Bank lên 10% 15. nâng lương cho các nhà quản lý của công ty First Bank lên 10% 16. Xoá tất cả các thông tin liên quan tới cong ty Bad Bank CHƯƠNG II SQL trang 33 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU CHƯƠNG II SQL trang 34
File đính kèm:
- HQT_CSDL_chuong2.pdf