Lý thuyết về câu lệnh SQL

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Lý thuyết về câu lệnh SQL

Bài gửi by nguyenduc on 1/1/2010, 18:14

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ì 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ên QuanHệ.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ện Lọ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)
field GroupBy: 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

nguyenduc
Cống hiến
Cống hiến

Tổng số bài gửi : 312
Join date : 17/09/2009
Age : 38
Đến từ : Bến tre - Hồ chí minh

Về Đầu Trang Go down

Re: Lý thuyết về câu lệnh SQL

Bài gửi by nanaly on 2/1/2010, 00:06

Cao thủ...
avatar
nanaly
Cống hiến
Cống hiến

Tổng số bài gửi : 376
Join date : 18/09/2009
Age : 34
Đến từ : QNgai

Về Đầu Trang Go down

Re: Lý thuyết về câu lệnh SQL

Bài gửi by liongak on 2/1/2010, 03:21

thank bác
avatar
liongak
Cống hiến
Cống hiến

Tổng số bài gửi : 202
Join date : 16/09/2009
Age : 30
Đến từ : Thanh Hóa

Về Đầu Trang Go down

Re: Lý thuyết về câu lệnh SQL

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết