LỚP CNTT 2 - 2007
Would you like to react to this message? Create an account in a few clicks or log in to continue.

LY THUYET VE CAU LENH SQL

Go down

LY THUYET VE CAU LENH SQL Empty LY THUYET VE CAU LENH SQL

Post  Admin 23/10/2007, 13:00

2 CÂU LỆNH SQL
SQL là ngôn ngữ truy vấn dựa trên đại số quan hệ. Câu lệnh của SQL dùng để rút trích dữ liệu của một một hay nhiều quan hệ. Kết quả của một câu lệnh SQL (truy vấn) là một quan hệ. Để đơn giản trong cách trình bày, ta xem quan hệ mà câu truy vấn sử dụng để tạo ra quan hệ khác gọi là quan hệ nguồn, quan hệ kết quả của truy vấn là quan hệ đích.

I. Truy vấn định nghĩa dữ liệu (data definition query)

Tạo lược đồ quan hệ rSV:
+ Create Table rSV (MASV Text (10) CONSTRAINT khoaChinh PRIMARY
KEY,HOTEN Text (30), NU YesNo, NGAYSINH Date, MALOP Text (10),
TINH Text (50), HOCBONG Double )
Tạo lược đồ quan hệ rKQ:
+ Create Table rKQ (MASV text (10),MAMH Text (10), DIEMTHI
Double,CONSTRAINT khoaChinh PRIMARY KEY (MASV,MAMH) )
Chú ý: Hai cách tạo trên cho ta thấy hai cách tạo khóa: khóa chỉ gồm một thuộc tính và khóa có nhiều thuộc tính
Thêm cột DTHOAI có kiểu dữ liệu text 20 ký tự vào lược đồ quan hệ rSV:
+ Alter Table rSV Add Column DTHOAI Text (20)
Sửa kiểu kiểu dữ liệu của một cột:
+ Alter Table rSV Alter Column DTHOAI double
Xóa cột của một lược đồ đã có:
+ Alter Table rSv Drop Column DTHOAI
Xóa ràng buộc khóa chính:
+ Alter Table rSv Drop Constraint khoaChinh
Thêm ràng buộc khóa chính:
+ Alter Table rSv Add Constraint khoaChinh Primary Key (MASV)
Thêm ràng buộc miền giá trị:
+ ALTER TABLE doc_exd WITH NOCHECK ADD CONSTRAINT exd_check CHECK (column_a > 1)

II. Truy vấn chọn (select query)
Khi có nhu cầu thể hiện các dòng dữ liệu của một quan hệ hay của nhiều quan hệ dưới dạng một quan hệ có số cột và số dòng theo ý muốn như bảng điểm của sinh viên, danh sách sinh viên thì ta sử dụng truy vấn chọn.

Để truy vấn chọn ta sử dụng câu lệnh SQL sau:

Select [Distinct|Top n[%]] field1 [As alias1][,field2 [As alias2][,...]]
From table1 [Inner Join table2 On table1.field1 table2.field2] ...
[Where dieuKien]

[Order By field1[Asc|Desc][,field2[Asc|Desc]][,...]]];
Distinct: loại bỏ các bộ trùng trong quan hệ đích
Top n[%]: Chọn n hay n% mẫu tin đầu tiên.
table: Tên table hay query chứa dữ liệu.
field: Tên field hay một biểu thức.
Alias: Trường hợp field là một biểu thức thì <Alias> là một tên mới của biểu thức.
Inner Join: mỗi mẫu tin của table1 nối với bất kỳ mẫu tin nào của table2 có dữ liệu của field1 thỏa mãn điều kiện so sánh với dữ liệu của field2 tạo thành mẫu tin của query.
điều kiện: Biểu thức mà dữ liệu mẫu tin phải thỏa mãn
Chú ý:
Khi nêu rõ thuộc tính đó thuộc về quan hệ nào ta viết theo cú pháp tênQuanHệ.tênThuộcTính.

Ví dụ: Lập danh sách sinh viên gồm MASV,HOTEN,HOCBONG
SELECT MASV,HOTEN,HOCBONG
FROM Sv;

Ví dụ: Lập danh sách sinh viên nữ , có học bổng thuộc có mã lớp là “CĐTH2B”.
SELECT MASV,HOTEN,HOCBONG
FROM Sv
WHERE NU And MALOP='CĐTH2B' And HOCBONG>0;

Ví dụ: Lập danh sách sinh viên gồm MASV,HOTEN,HOCBONG trong đó học bổng được sắp giảm dần
SELECT MASV,HOTEN,HOCBONG
FROM Sv
ORDER BY HOCBONG DESC;
Ví du : Lập danh sách sinh viên gồm MASV,HOTEN,TENLOP
SELECT MASV,HOTEN,TENLOP
FROM Sv Inner Join Lop On Sv.MALOP=Kh.LOP;
Ví dụ: Lập danh sách sinh viên có MASV,HOTEN,NU,NGAYSINH,DIEMTHI với điểm thi môn ‘CSDL’ >= 8
SELECT Kq.MASV,HOTEN,NU,NGAYSINH,DIEMTHI
FROM Kq Inner Sv On Kq.MASV = Sv.MaSV
WHERE MAMH='CSDL' AND DIEMTHI>=8;
Ví dụ: Lập danh sách sinh viên có ho là “NGUYEN”
SELECT *
FROM Sv
WHERE HOTEN Like “NGUYEN*”;

III. Truy vấn nhóm dữ liệu (Select query có group by)
Khi có nhu cầu chia các bộ theo từng nhóm rồi tính toán trên từng nhóm này như tính điểm trung bình của tất cả các môn học của từng sinh viên, hay là cần tính số lượng sinh viên của mỗi lớp , hay là cần biết tổng số môn mà một sinh viên đã đăng ký học thì ta sử dụng truy vấn theo nhóm.

Để truy vấn cộng nhóm ta sử dụng câu lệnh SQL sau:

Select [Distinct|Top n[%]] field1 [As alias1][,field2 [As alias2][,...]]

From table1 [Inner Join table2 On table1.field1 table2.field2] ...
[Where dieuKienLocMauTinNguon]
[Group By fieldGroupBy[,fieldGroupBy[,...]]
[Having dieuKienLocMauTinTongHop]
[Order By field1[Asc|Desc][,field2[Asc|Desc]][,...]]];
điềuKiệnLọcMẫuTinNguồn: điều kiện mà các mẫu tin nguồn phải thỏa mãn (phép chọn)
fieldGroupBy: tên field mà các mẫu tin có dữ liệu giống nhau trên ấy được xếp vào cùng nhóm. điềuKiệnLọcMẫuTinTổngHợp: điều kiện mà các mẫu tin tổng hợp phải thỏa mãn (phép chọn)

Ví du: Lập danh sách sinh viên có đăng ký ít nhất là ba môn học
SELECT Kq.MASV,HOTEN,NU,NGAYSINH,COUNT(MAMH) As SLMH
FROM Sv Inner Join Kq On Sv.MASV = Kq.MASV
GROUP BY Kq.MASV,HOTEN,NU,NGAYSINH
HAVING COUNT(MAMH)>=3;

Ví du: Đếm số lượng sinh viên nữ của mỗi khoa
SELECT Kh.MAKHOA,TENKHOA,COUNT(Kh.MAKHOA) AS SOLUONG
FROM (Sv Inner Join Lop On Sv.MALOP = LOP.MALOP)
INNER JOIN Kh On Lop.MAKHOA=Kh.MAKHOA
WHERE NU
GROUP BY Kh.MAKHOA,TENKHOA;

IV. Truy vấn lồng nhau (nested query, sub query)
Là những câu lệnh truy vấn mà trong thành phần WHERE hay HAVING có chứa thêm một câu lệnh Select khác. Câu lệnh select khác này gọi là subquery. Ta lồng câu Select vào phần Where hay Having theo cú pháp sau:
o bieuthuc toanTuSoSanh [ANY | ALL | SOME] (cauLenhSQL)
ANY, SOME là bất kỳ, ALL là tất cả Các mẫu tin của query chính thỏa mãn toán tử so sánh với bất kỳ/ tất cả mẫu tin nào của subquery
o bieuThuc [NOT] IN (cauLenhSQL) Các mẫu tin của query chính có giá trị bằng với một giá trị trong subquery
o [NOT] EXISTS (cauLenhSQL).
Các mẫu tin của query chính thỏa mãn khi subquery có mẫu tin
Ví du: Lập danh sách sinh viên có học bổng cao nhất
SELECT *
FROM Sv
WHERE HOCBONG>=ALL(SELECT HOCBONG FROM SV);

Ví du: Lập danh sách sinh viên có điểm thi môn CSDL cao nhất
SELECT SV.MASV,HOTEN,NU,NGAYSINH,DIEMTHI
FROM sv Inner Join kq On Sv.MASV = Kq.MASV
WHERE MAMH='CSDL' AND DIEMTHI >= ALL

(SELECT DIEMTHI FROM KQ WHERE MAMH='CSDL');
Hiểu và vận dụng tốt lệnh truy vấn dữ liệu là một việc làm cực kỳ cần thiết để tạo ra các kết quả cho báo cáo, thống kê số liệu.

v Truy vấn cập nhật dữ liệu (action query, data modification query)
Cú pháp: Update table Set field1 = biểuThức1, field2 = biểuThức2 Where điềuKiện
Cú pháp: Delete From table Where điềuKiện
vi Truy vấn hợp (union query)
Khi có nhu cầu thực hiện truy vấn có kết quả như toán tử hợp, ta sử dụng câu lệnh SQL sau:
Select .....Union Select ....
Ví du: Lệnh sau đây gấp đôi danh sách sinh viên
SELECT MASV,HOTEN,NGAYSINH UNION SELECT MASV,HOTEN,NGAYSINH
Admin
Admin
Admin

Posts : 41
Join date : 2007-09-29

https://cntt207.forumotion.com

Back to top Go down

Back to top


 
Permissions in this forum:
You cannot reply to topics in this forum