Sửa đổi dữ liệu Dùng câu lệnh “update …” để cập nhật giá trị của các thuộc tính trong một quan hệ bằng giá trị mới thoả mãn một điều kiện mong muốn Cú pháp: update tên-quan-hệ set
Trang 1SQL (Structured Query Language)
(tiếp theo)
Trang 2Xoá dữ liệu
Dùng câu lệnh “delete from…” để xoá các dữ liệu thoả mãn một điều kiện mong muốn
Cú pháp:
delete from tên-quan-hệ [where điều-kiện];
Mệnh đề where tương tự trong câu lệnh select
VD:
delete from Student where regdate > '2000-01-01';
delete from Book where
Xoá toàn bộ dữ liệu của quan hệ:
Trang 3Sửa đổi dữ liệu
Dùng câu lệnh “update …” để cập nhật giá trị của các
thuộc tính trong một quan hệ bằng giá trị mới thoả mãn một điều kiện mong muốn
Cú pháp:
update tên-quan-hệ set thuộc-tính = giá-trị,
where điều-kiện;
VD:
update Student set class = 'C‘
where name = 'Bill Gates';
update Book set borrowed = 1, date = now()
where id = 1234;
Trang 4Số học
rand(),…
Ví dụ:
select sqrt(5) + power(40, 5) ;
update Product set price = price * (1 + ln(2))
where category = 'laptop';
Trang 5Logic
Các phép toán: and, or, not
So sánh: >, <, >=, <=, =, <>, !=, between … and
…
Ví dụ:
select * from Product
where price >= 50 and count < 10;
So sánh với null: dùng “is null” và “is not null”
select id from Student
where phone is not null;
Tập hợp: in(…)
select id from Student
where class in ('A', 'B');
Trang 6Làm việc với ngày tháng
Các kiểu dữ liệu:
Thời gian hiện tại:
Cộng trừ thời gian:
Trích các tham số:
second()
Trang 7Làm việc với kiểu chuỗi
So sánh: =, !=, >, <, >=, <=
s2), locate(s1, s2), substring(s, p, n),…
Toán tử like: so sánh chuỗi theo khuôn dạng sử
dụng
%: đại diện cho một chuỗi bất kỳ
_: đại diện cho một ký tự bất kỳ
VD:
select * from Student where name like 'Bill%' ;
select * from Word where title like ' %tion' ;
Trang 8Gộp nhóm
Câu hỏi: tính điểm trung bình của học sinh có id = 10
select avg(mark) from Mark where std = 10;
Câu hỏi: tính điểm trung bình của từng học sinh
select std, avg(mark) from Mark group by std;
Các hàm gộp:
avg(): giá trị trung bình
min(): giá trị min
max(): giá trị max
sum(): tổng
count(): số lượng
Ví dụ khác: danh sách sách trong thư viện kèm theo số lượng
select title, count(*) from Book group by title;
Trang 9Gộp nhóm: điều kiện trên nhóm
Trong câu lệnh có gộp nhóm, “where…” là điều kiện đối với từng phần tử, còn “having…” là điều kiện với nhóm
VD:
select s.id, s.name, avg(m.mark)
from Mark m, Student s
where m.std = s.id and s.class = 'B'
group by s.id
having max(m.mark) >= 8;
Danh sách các sinh viên lớp B có điểm trung bình >= 8
Trang 10Gộp kết quả
Phép hợp trong SQL được thực hiện bằng cú pháp:
select … union select …
Chú ý:
Kết quả các phép select phải tương thích với nhau
Có thể thực hiện hợp hai hoặc nhiều phép select với nhau
Có thể dùng ngoặc (…) để cho rõ ràng
Các kết quả trùng sẽ bị loại bỏ, nếu không muốn thì dùng “union all”
Ví dụ:
select name, dob from Student
where class = 'B'
union (
select name, dob from Teacher where city = 'Hanoi');
Trang 11Giao và loại trừ kết quả
Tương tự như phép gộp, nhưng dùng “intersect” và
“except” thay cho “union”
Ví dụ:
select id, name from Employee
where gender = 'male'
intersect (
select id, name from Employee where dob < '1980-01-01'
except (
select id, name from Employee where level = 5 ));
Chú ý:
Trong MySQL không hỗ trợ “intersect” và “except”, mà phải
dùng các câu lệnh lồng nhau
Trang 12Câu lệnh lồng nhau (nested queries)
(subqueries) để tăng tính linh hoạt trong truy vấn
Ví dụ: liệt kê các bài hát (quan hệ Song) thuộc các thể loại được sáng tác bởi các tác giả (quan hệ
Author) sinh trước năm 1950
select * from Song
where author_id in (
select id from Author
Trang 13Toán tử “in”
Dùng để kiểm tra tính thuộc tập hợp
Phủ định dùng “not in…”
Có thể được dùng cho bộ giá trị
select * from Song
where (author, category) in
( (5, 10), (4, 15), (4, 19) );
select * from Author
where (first_name, last_name) in
(select firstn, lastn from Nominated)
Trang 14Toán tử exists
Dùng để kiểm tra một tập hợp có rỗng hay không
Phủ định dùng “not exists…”
Ví dụ: liệt kê các khách hàng chưa mua máy tính ở cửa hàng
select * from Customer
where not exists (
select id from Invoice where customer = Customer.id);
Tương tự:
select * from Customer
where count (
select id from Invoice where customer = Customer.id) > 0;
Trang 15Liên kết giữa các thuộc tính với câu lệnh con
Các thuộc tính của câu lệnh mẹ có thể được sử
dụng trong các câu lệnh con
VD:
select customer from Borrower
where exists (
select * from Depositor where Depositor.customer = Borrower.customer);
Trang 16So sánh tập hợp
Câu hỏi: liệt kê các sinh viên của lớp A có điểm lớn hơn ít nhất một sinh viên của lớp B
select * from Student
where class = 'A' and mark > some (
select mark from Student where class = 'B');
Các kiểu so sánh tập hợp:
some / any: có ít nhất một phần tử thoả mãn
all: so với tất cả
Trang 17Câu lệnh con trong mệnh đề from
Câu lệnh con có thể được sử dụng trong mệnh đề from
Kết quả của câu lệnh con có thể được đổi tên để dễ
tham chiếu
Ví dụ:
select branch-name, avg-balance
from (
select branch-name, avg(balance) from account group by branch-name )
as branch-avg(branch-name, avg-balance) where avg-balance > 1200;
Trang 18Biến
SQL cho phép tạo các biến để lưu tạm thời các giá trị Các biến được dùng theo cú pháp: @tên
Định nghĩa / thay đổi giá trị của biến:
set @VAR = VALUE;
select @VAR := VALUE;
Ví dụ:
set @std = 20;
select @stddob:=dob
from Student where id=@std;
select @stddob;
Trang 19Bài tập
Cho các quan hệ SinhVien, GiaoVien, DangKyHoc, Day, Lop, MonHoc Viết câu truy vấn cho các yêu cầu sau:
Cho các quan hệ Sach, TacGia, NguoiDoc, Muon Viết câu truy vấn cho các yêu cầu sau:
trên