Cỏc cõu lệnh thao tỏc dữ liệu trong SQL khụng những chỉ sử dụng để truy vấn dữ liệu mà cũn để thay đổi và cập nhật dữ liệu trong cơ sở dữ liệu. So với cõu lệnh SELECT, việc sử dụng cỏc cõu lệnh để bổ sung, cập nhật hay xoỏ dữ liệu đơn giản hơn nhiều. Trong phần cũn lại của chương này sẽđề cập đến 3 cõu lệnh:
• Lệnh INSERT • Lệnh UPDATE • Lệnh DELETE
2.2.1 Bổ sung dữ liệu
Dữ liệu trong cỏc bảng được thể hiện dưới dạng cỏc dũng (bản ghi). Để bổ sung thờm cỏc dũng dữ liệu vào một bảng, ta sử dụng cõu lệnh INSERT. Hầu hết cỏc hệ quản trị CSDL dựa trờn SQL cung cấp cỏc cỏch dưới đõy để thực hiện thao tỏc bổ
sung dữ liệu cho bảng:
• Bổ sung từng dũng dữ liệu với mỗi cõu lệnh INSERT. Đõy là cỏc sử dụng thường gặp nhất trong giao tỏc SQL.
• Bổ sung nhiều dũng dữ liệu bằng cỏch truy xuất dữ liệu từ cỏc bảng dữ liệu khỏc.
Bổ sung từng dũng dữ liệu với lệnh INSERT
Để bổ sung một dũng dữ liệu mới vào bảng, ta sử dụng cõu lệnh INSERT với cỳ phỏp như sau:
INSERT INTO tờn_bảng[(danh_sỏch_cột)] VALUES(danh_sỏch_trị)
Trong cõu lệnh INSERT, danh sỏch cột ngay sau tờn bảng khụng cần thiết phải chỉ định nếu giỏ trị cỏc trường của bản ghi mới được chỉđịnh đầy đủ trong danh sỏch trị. Trong trường hợp này, thứ tự cỏc giỏ trị trong danh sỏch trị phải bằng với số lượng cỏc trường của bảng cần bổ sung dữ liệu cũng như phải tuõn theo đỳng thứ tự của cỏc trường như khi bảng được định nghĩa.
Vớ dụ 2.48: Cõu lệnh dưới đõy bổ sung thờm một dũng dữ liệu vào bảng KHOA
INSERT INTO khoa
VALUES('DHT10','Khoa Luật','054821135')
Trong trường hợp chỉ nhập giỏ trị cho một số cột trong bảng, ta phải chỉđịnh danh sỏch cỏc cột cần nhập dữ liệu ngay sau tờn bảng. Khi đú, cỏc cột khụng được nhập dữ liệu sẽ nhận giỏ trị mặc định (nếu cú) hoặc nhận giỏ trị NULL (nếu cột cho
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
phộp chấp nhận giỏ trị NULL). Nếu một cột khụng cú giỏ trị mặc định và khụng chấp nhận giỏ trị NULL mà khụng đuợc nhập dữ liệu, cõu lệnh sẽ bị lỗi.
Vớ dụ 2.49: Cõu lệnh dưới đõy bổ sung một bản ghi mới cho bảng SINHVIEN
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES('0241020008','Nguyễn Cụng','Chớnh',1,'C24102')
cõu lệnh trờn cũn cú thểđược viết như sau:
INSERT INTO sinhvien
VALUES('0241020008','Nguyễn Cụng','Chớnh', NULL,1,NULL,'C24102')
Bổ sung nhiều dũng dữ liệu từ bảng khỏc
Một cỏch sử dụng khỏc của cõu lệnh INSERT được sử dụng để bổ sung nhiều dũng dữ liệu vào một bảng, cỏc dũng dữ liệu này được lấy từ một bảng khỏc thụng qua cõu lệnh SELECT. Ở cỏch này, cỏc giỏ trị dữ liệu được bổ sung vào bảng khụng được chỉ định tường minh mà thay vào đú là một cõu lệnh SELECT truy vấn dữ liệu từ bảng khỏc. Cỳ phỏp cõu lệnh INSERT cú dạng như sau:
INSERT INTO tờn_bảng[(danh_sỏch_cột)] cõu_lệnh_SELECT
Vớ dụ 2.50: Giả sử ta cú bảng LUUSINHVIEN bao gồm cỏc trường HODEM, TEN, NGAYSINH. Cõu lệnh dưới đõy bổ sung vào bảng LUUSINHVIEN cỏc dũng dữ liệu cú được từ cõu truy vấn SELECT:
INSERT INTO luusinhvien SELECT hodem,ten,ngaysinh FROM sinhvien
WHERE noisinh like '%Huế%'
Khi bổ sung dữ liệu theo cỏch này cần lưu ý một sốđiểm sau:
• Kết quả của cõu lệnh SELECT phải cú số cột bằng với số cột được chỉđịnh trong bảng đớch và phải tương thớch về kiểu dữ liệu.
• Trong cõu lệnh SELECT được sử dụng mệnh đề COMPUTE ... BY
2.2.2 Cập nhật dữ liệu
Cõu lệnh UPDATE trong SQL được sử dụng để cập nhật dữ liệu trong cỏc bảng. Cõu lệnh này cú cỳ phỏp như sau:
UPDATE tờn_bảng
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
SET tờn_cột = biểu_thức
[, ..., tờn_cột_k = biểu_thức_k] [FROM danh_sỏch_bảng]
[WHERE điều_kiện]
Sau UPDATE là tờn của bảng cần cập nhật dữ liệu. Một cõu lệnh UPDATE cú thể cập nhật dữ liệu cho nhiều cột bằng cỏch chỉđịnh cỏc danh sỏch tờn cột và biểu thức tương
ứng sau từ khoỏ SET. Mệnh đề WHERE trong cõu lệnh UPDATE thường được sử dụng
để chỉ định cỏc dũng dữ liệu chịu tỏc động của cõu lệnh (nếu khụng chỉđịnh, phạm vi tỏc động của cõu lệnh được hiểu là toàn bộ cỏc dũng trong bảng)
Vớ dụ 2.51: Cõu lệnh dưới đõy cập nhật lại sốđơn vị học trỡnh của cỏc mụn học cú số đơn vị học trỡnh nhỏ hơn 2
UPDATE monhoc SET sodvht = 3 WHERE sodvht = 2
Sử dụng cấu trỳc CASE trong cõu lệnh UPDATE
Cấu trỳc CASE cú thểđược sử dụng trong biểu thức khi cần phải đưa ra cỏc quyết định khỏc nhau về giỏ trị của biểu thức
Vớ dụ 2.52: Giả sử ta cú bảng NHATKYPHONG sau đõy
Sau khi thực hiện cõu lệnh:
UPDATE nhatkyphong
SET tienphong=songay*CASE WHEN loaiphong='A' THEN 100 WHEN loaiphong='B' THEN 70 ELSE 50
END
Dữ liệu trong bảng sẽ là:
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
Điều kiện cập nhật dữ liệu liờn quan đến nhiều bảng
Mệnh đề FROM trong cõu lệnh UPDATE được sử dụng khi cần chỉđịnh cỏc
điều kiện liờn quan đến cỏc bảng khỏc với bảng cần cập nhật dữ liệu. Trong truờng hợp này, trong mệnh đề WHERE thường cú điều kiện nối giữa cỏc bảng.
Vớ dụ 2.53: Giả sử ta cú hai bảng MATHANG và NHATKYBANHANG như sau:
Cõu lệnh dưới đõy sẽ cập nhật giỏ trị trường THANHTIEN của bảng NHATKYBANHANG theo cụng thức THANHTIEN = SOLUONG ì GIA
UPDATE nhatkybanhang
SET thanhtien = soluong*gia FROM mathang
WHERE nhatkybanhang.mahang = mathang.mahang
Cõu lệnh UPDATE với truy vấn con
Tương tự như trong cõu lệnh SELECT, truy vấn con cú thểđược sử dụng trong mệnh đề WHERE của cõu lệnh UPDATE nhằm chỉđịnh điều kiện đối với cỏc dũng dữ
liệu cần cập nhật dữ liệu.
Vớ dụ 2.54: Cõu lệnh ở trờn cú thểđược viết như sau:
UPDATE nhatkybanhang
SET thanhtien = soluong*gia FROM mathang
WHERE mathang.mahang =(SELECT mathang.mahang FROM mathang
WHERE mathang.mahang=nhatkybanhang.mahang)
2.2.3 Xoỏ dữ liệu
Để xoỏ dữ liệu trong một bảng, ta sử dụng cõu lệnh DELETE. Cỳ phỏp của cõu lệnh này như sau:
DELETE FROM tờn_bảng [FROM danh_sỏch_bảng] [WHERE điều_kiện]
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
Trong cõu lệnh này, tờn của bảng cần xoỏ dữ liệu được chỉđịnh sau DELETE FROM. Mệnh đề WHERE trong cõu lệnh được sử dụng để chỉđịnh điều kiện đối với cỏc dũng dữ
liệu cần xoỏ. Nếu cõu lệnh DELETE khụng cú mệnh đề WHERE thỡ toàn bộ cỏc dũng dữ
liệu trong bảng đều bị xoỏ.
Vớ dụ 2.55: Cõu lệnh dưới đõy xoỏ khỏi bảng SINHVIEN những sinh viờn sinh tại Huế DELETE FROM sinhvien
WHERE noisinh LIKE '%Huế%'
Xoỏ dữ liệu khi điều kiện liờn quan đến nhiều bảng
Nếu điều kiện trong cõu lệnh DELETE liờn quan đến cỏc bảng khụng phải là bảng cần xúa dữ liệu, ta phải sử dụng thờm mệnh đề FROM và sau đú là danh sỏch tờn cỏc bảng đú. Trong trường hợp này, trong mệnh đề WHERE ta chỉđịnh thờm điều kiện
nối giữa cỏc bảng
Vớ dụ 2.56: Cõu lệnh dưới đõy xoỏ ra khỏi bảng SINHVIEN những sinh viờn lớp Tin K24
DELETE FROM sinhvien FROM lop
WHERE lop.malop=sinhvien.malop AND tenlop='Tin K24'
Sử dụng truy vấn con trong cõu lệnh DELETE
Một cõu lệnh SELECT cú thểđược lồng vào trong mệnh đề WHERE trong cõu lệnh DELETE để làm điều kiện cho cõu lệnh tương tự như cõu lệnh UPDATE.
Vớ dụ 2.57: Cõu lệnh dưới đõy xoỏ khỏi bảng LOP những lớp khụng cú sinh viờn nào học
DELETE FROM lop
WHERE malop NOT IN (SELECT DISTINCT malop FROM sinhvien)
Xoỏ toàn bộ dữ liệu trong bảng
Cõu lệnh DELETE khụng chỉđịnh điều kiện đối với cỏc dũng dữ liệu cần xoỏ trong mệnh đề WHERE sẽ xoỏ toàn bộ dữ liệu trong bảng. Thay vỡ sử dụng cõu lệnh DELETE trong trường hợp này, ta cú thể sử dụng cõu lệnh TRUNCATE cú cỳ phỏp như sau:
TRUNCATE TABLE tờn_bảng
Vớ dụ 2.58: Cõu lệnh sau xoỏ toàn bộ dữ liệu trong bảng diemthi:
DELETE FROM diemthi
cú tỏc dụng tương tự với cõu lệnh
TRUNCATE TABLE diemthi
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
Bài tập chương 2
Cơ sở dữ liệu dưới đõy được sử dụng để quản lý cụng tỏc giao hàng trong một cụng ty kinh doanh. Cỏc bảng trong cơ sở dữ liệu này được biểu diễn trong sơđồ dưới
đõy:
Trong đú:
• Bảng NHACUNGCAP lưu trữ dữ liệu về cỏc đối tỏc cung cấp hàng cho cụng ty.
• Bảng MATHANG lưu trữ dữ liệu về cỏc mặt hàng hiện cú trong cụng ty. •
Bảng LOAIHANG phõn loại cỏc mặt hàng hiện cú.
• Bảng NHANVIEN cú dữ liệu là thụng tin về cỏc nhõn viờn làm việc trong cụng ty.
• Bảng KHACHHANG được sử dụng để lưu giữ thụng tin về cỏc khỏch hàng của cụng ty.
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
• Khỏch hàng đặt hàng cho cụng ty thụng qua cỏc đơn đặt hàng. Thụng tin chung về cỏc đơn đặt hàng được lưu trữ trong bảng DONDATHANG (Mỗi một đơn đặt hàng phải do một nhõn viờn của cụng ty lập và do đú bảng này cú quan hệ với bảng NHANVIEN)
• Thụng tin chi tiết của cỏc đơn đặt hàng (đặt mua mặt hàng gỡ, số lượng, giỏ cả,...) được lưu trữ trong bảng CHITIETDATHANG. Bảng này cú quan hệ với hai bảng DONDATHANG và MATHANG.
Sử dụng cõu lệnh SELECT để viết cỏc yờu cầu truy vấn dữ liệu sau đõy: 2. 1 2. 2 2. 3 2. 4 2. 5 2. 6 2. 7 2. 8 2. 9
Cho biết danh sỏch cỏc đối tỏc cung cấp hàng cho cụng ty.
Mó hàng, tờn hàng và số lượng của cỏc mặt hàng hiện cú trong cụng ty. Họ tờn và địa chỉ và năm bắt đầu làm việc của cỏc nhõn viờn trong cụng ty.
Địa chỉ và điện thoại của nhà cung cấp cú tờn giao dịch VINAMILK là gỡ?
Cho biết mó và tờn của cỏc mặt hàng cú giỏ lớn hơn 100000 và số lượng hiện cú ớt hơn 50.
Cho biết mỗi mặt hàng trong cụng ty do ai cung cấp. Cụng ty Việt Tiếnđó cung cấp những mặt hàng nào?
Loại hàng thực phẩm do những cụng ty nào cung cấp và địa chỉ của cỏc cụng ty
đú là gỡ?
Những khỏch hàng nào (tờn giao dịch) đó đặt mua mặt hàng Sữa hộp XYZ của cụng ty?
2. 10 Đơn đặt hàng số 1 do ai đặt và do nhõn viờn nào lập, thời gian và địa điểm giao hàng là ởđõu?
2. 11 Hóy cho biết số tiền lương mà cụng ty phải trả cho mỗi nhõn viờn là bao nhiờu (lương = lương cơ bản + phụ cấp).
2. 12 Trong đơn đặt hàng số 3 đặt mua những mặt hàng nào và số tiền mà khỏch hàng phải trả cho mỗi mặt hàng là bao nhiờu (số tiền phải trảđược tớnh theo cụng thức SOLUONGìGIABAN - SOLUONGìGIABANìMUCGIAMGIA/100)
2. 13 Hóy cho biết cú những khỏch hàng nào lại chớnh là đối tỏc cung cấp hàng của cụng ty (tức là cú cựng tờn giao dịch).
2. 14 Trong cụng ty cú những nhõn viờn nào cú cựng ngày sinh?
2. 15 Những đơn đặt hàng nào yờu cầu giao hàng ngay tại cụng ty đặt hàng và những
đơn đú là của cụng ty nào?
2. 16 Cho biết tờn cụng ty, tờn giao dịch, địa chỉ và điện thoại của cỏc khỏch hàng và cỏc nhà cung cấp hàng cho cụng ty.
2. 17 Những mặt hàng nào chưa từng được khỏch hàng đặt mua?
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
2. 18 Những nhõn viờn nào của cụng ty chưa từng lập bất kỳ một hoỏ đơn đặt hàng nào?
2. 19 Những nhõn viờn nào của cụng ty cú lương cơ bản cao nhất?
2. 20 Tổng số tiền mà khỏch hàng phải trả cho mỗi đơn đặt hàng là bao nhiờu? 2. 21 Trong năm 2003, những mặt hàng nào chỉđược đặt mua đỳng một lần.
2. 22 Hóy cho biết mỗi một khỏch hàng đó phải bỏ ra bao nhiờu tiền để đặt mua hàng của cụng ty?
2. 23 Mỗi một nhõn viờn của cụng ty đó lập bao nhiờu đơn đặt hàng (nếu nhõn viờn chưa hề lập một hoỏ đơn nào thỡ cho kết quả là 0)
2. 24 Cho biết tổng số tiền hàng mà cửa hàng thu được trong mỗi thỏng của năm 2003 (thời được gian tớnh theo ngày đặt hàng).
2. 25 Hóy cho biết tổng số tiền lời mà cụng ty thu được từ mỗi mặt hàng trong năm 2003.
2. 26 Hóy cho biết tổng số lượng hàng của mỗi mặt hàng mà cụng ty đó cú (tổng số
lượng hàng hiện cú và đó bỏn).
2. 27 Nhõn viờn nào của cụng ty bỏn được số lượng hàng nhiều nhất và số lượng hàng bỏn được của những nhõn viờn này là bao nhiờu?
2. 28 Đơn đặt hàng nào cú số lượng hàng được đặt mua ớt nhất?
2. 29 Số tiền nhiều nhất mà mỗi khỏch hàng đó từng bỏ ra đểđặt hàng trong cỏc đơn
đặt hàng là bao nhiờu?
2. 30 Mỗi một đơn đặt hàng đặt mua những mặt hàng nào và tổng số tiền mà mỗi đơn
đặt hàng phải trả là bao nhiờu?
2. 31 Hóy cho biết mỗi một loại hàng bao gồm những mặt hàng nào, tổng số lượng hàng của mỗi loại và tổng số lượng của tất cả cỏc mặt hàng hiện cú trong cụng ty là bao nhiờu?
2. 32 Thống kờ xem trong năm 2003, mỗi một mặt hàng trong mỗi thỏng và trong cả
năm bỏn được với số lượng bao nhiờu
Yờu cầu: Kết quảđược hiển thị dưới dạng bảng, hai cột cột đầu là mó hàng và tờn hàng, cỏc cột cũn lại tương ứng với cỏc thỏng từ 1 đến 12 và cả năm. Như vậy mỗi dũng trong kết quả cho biết số lượng hàng bỏn được mỗi thỏng và trong cả năm của mỗi mặt hàng.
Sử dụng cõu lệnh UPDATE để thực hiện cỏc yờu cầu sau:
2. 33 Cập nhật lại giỏ trị trường NGAYCHUYENHANG của những bản ghi cú NGAYCHUYENHANG chưa xỏc định (NULL) trong bảng DONDATHANG bằng với giỏ trị của trường NGAYDATHANG.
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
2. 34 Tăng số lượng hàng của những mặt hàng do cụng ty VINAMILK cung cấp lờn gấp đụi.
2. 35 Cập nhật giỏ trị của trường NOIGIAOHANG trong bảng DONDATHANG bằng
địa chỉ của khỏch hàng đối với những đơn đặt hàng chưa xỏc định được nơi giao hàng (giỏ trị trường NOIGIAOHANG bằng NULL).
2. 36 Cập nhật lại dữ liệu trong bảng KHACHHANG sao cho nếu tờn cụng ty và tờn giao dịch của khỏch hàng trựng với tờn cụng ty và tờn giao dịch của một nhà cung cấp nào đú thỡ địa chỉ, điện thoại, fax và e-mail phải giống nhau.
2. 37 Tăng lương lờn gấp rưỡi cho những nhõn viờn bỏn được số lượng hàng nhiều hơn 100 trong năm 2003.
2. 38 Tăng phụ cấp lờn bằng 50% lương cho những nhõn viờn bỏn được hàng nhiều nhất.
2. 39 Giảm 25% lương của những nhõn viờn trong năm 2003 khụng lập được bất kỳ đơn đặt hàng nào.
2. 40 Giả sử trong bảng DONDATHANG cú thờm trường SOTIEN cho biết số tiền mà khỏch hàng phải trả trong mỗi đơn đặt hàng. Hóy tớnh giỏ trị cho trường này. Thực hiện cỏc yờu cầu dưới đõy bằng cõu lệnh DELETE.
2. 41 Xoỏ khỏi bảng NHANVIEN những nhõn viờn đó làm việc trong cụng ty quỏ 40 năm.
2. 42 Xoỏ những đơn đặt hàng trước năm 2000 ra khỏi cơ sở dữ liệu.
2. 43 Xoỏ khỏi bảng LOAIHANG những loại hàng hiện khụng cú mặt hàng.
2. 44 Xoỏ khỏi bảng KHACHHANG những khỏch hàng hiện khụng cú bất kỳđơn đặt hàng nào cho cụng ty.
2. 45 Xoỏ khỏi bảng MATHANG những mặt hàng cú số lượng bằng 0 và khụng được
đặt mua trong bất kỳđơn đặt hàng nào.
Lời giải:
Cỏc phộp nối được sử dụng trong cỏc truy vấn dưới đõy sử dụng cỳ phỏp của SQL2. 2.1 2.2 2.3 SELECT macongty,tencongty,tengiaodich FROM nhacungcap SELECT mahang,tenhang,soluong FROM mathang
SELECT ho,ten,year(ngaylamviec) AS namlamviec FROM nhanvien
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL 2.4 SELECT diachi,dienthoai FROM nhacungcap WHERE tengiaodich='VINAMILK' 2.5 SELECT mahang,tenhang FROM mathang
WHERE giahang>100000 AND soluong<50 2.6 SELECT mahang,tenhang,
nhacungcap.macongty,tencongty,tengiaodich FROM mathang INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap.macongty 2.7 SELECT mahang,tenhang
FROM mathang INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap.macongty WHERE tencongty='Việt Tiến'
2.8 SELECT DISTINCT nhacungcap.macongty,tencongty,diachi FROM (loaihang INNER JOIN mathang
ON loaihang.maloaihang=mathang.maloaihang) INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap.macongty WHERE tenloaihang='Thực phẩm'
2.9 SELECT DISTINCT tengiaodich
FROM ((mathang INNER JOIN chitietdathang
ON mathang.mahang=chitietdathang.mahang) INNER JOIN dondathang
ON chitietdathang.sohoadon=dondathang.sohoadon) INNER JOIN khachhang
ON dondathang.makhachhang=khachhang.makhachhang WHERE tenhang='Sữa hộp'
2.10 SELECT dondathang.manhanvien,ho,ten, ngaygiaohang,noigiaohang FROM nhanvien INNER JOIN dondathang
ON nhanvien.manhanvien=dondathang.manhanvien WHERE sohoadon=1
2.11 SELECT manhanvien,ho,ten, luongcoban + CASE
WHEN phucap IS NULL THEN 0 ELSE phucap
END AS luong FROM nhanvien
2.12 SELECT a.mahang,tenhang,
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
a.soluong*giaban*(1-mucgiamgia/100) AS sotien FROM chitietdathang AS a INNER JOIN mathang AS b
ON a.mahang=b.mahang 2.13 2.14 2.15 2.16 2.17 2.18 2.19 2.20 SELECT makhachhang,khachhang.tencongty, khachhang.tengiaodich
FROM khachhang INNER JOIN nhacungcap