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
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:
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
Đ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]
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
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:
rong đú:
ảng NHACUNGCAP lưu trữ dữ liệu về cỏc đối tỏc cung cấp hàng cho
• THANG lưu trữ dữ liệu về cỏc mặt hàng hiện cú trong cụng ty. hõn viờn làm việc trong
• ACHHANG được sử dụng để lưu giữ thụng tin về cỏc khỏch hàng của cụng ty. T • B cụng ty. Bảng MA • 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 n cụng ty. Bảng KH
• 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
•
ITIETDATHANG. Bảng này cú quan hệ
Sử dụng c liệu sau đõy:
. 1 Cho biết danh sỏch cỏc đối tỏc cung cấp hàng cho cụng ty.
g ty. trong cụng ty. ỡ? n cú 2. 7 ệt Tiến đó cung cấp những mặt hàng nào? và địa chỉ của cỏc cụng ty đõu? cơ bản + phụ cấp).
iờu (số tiền phải trảđược tớnh theo cụng thức 2. 13
2. 15 hàng ngay tại cụng ty đặt hàng và những
ụng ty.
2. 17 Những mặt hàng nào chưa từng được khỏch hàng đặt mua?
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 CH
với hai bảng DONDATHANG và MATHANG. õu lệnh SELECT để viết cỏc yờu cầu truy vấn dữ 2
2. 2 Mó hàng, tờn hàng và số lượng của cỏc mặt hàng hiện cú trong cụn 2. 3 Họ tờn và địa chỉ và năm bắt đầu làm việc của cỏc nhõn viờn
2. 4 Địa chỉ và điện thoại của nhà cung cấp cú tờn giao dịch VINAMILK là g 2. 5 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ệ
ớt hơn 50.
2. 6 Cho biết mỗi mặt hàng trong cụng ty do ai cung cấp. Cụng ty Vi
2. 8 Loại hàng thực phẩm do những cụng ty nào cung cấp đú là gỡ?
2. 9 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à ở
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
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 nh
SOLUONGìGIABAN – SOLUONGìGIABANìMUCGIAMGIA/100)
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? Những đơn đặt hàng nào yờu cầu giao
đơ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
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. 21 năm 2003, những mặt hàng nào chỉđược đặt mua đỳng một lần.
n để đặt mua hàng hõn viờn 2. 24 số tiền hàng mà cửa hàng thu được trong mỗi thỏng của năm 2003
2. 25 c từ mỗi mặt hàng trong năm
2. 26 i mặt hàng mà cụng ty đó cú (tổng số 2. 27 iờ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 2. 28 àng được đặt mua ớt nhất?
ố tiền mà mỗi đơn 2. 31 loại hàng bao gồm những mặt hàng nào, tổng số lượng
quảđược hiển thị dưới dạng bảng, hai cột cột đầu là mó hàng và ượng hàng bỏn được mỗi thỏng và trong
Sử dụn
2. 33 g NGAYCHUYENHANG của những bản ghi cú NGAYCHUYENHANG chưa xỏc định (NULL) trong bảng DONDATHANG 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?
Trong
2. 22 Hóy cho biết mỗi một khỏch hàng đó phải bỏ ra bao nhiờu tiề 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 n chưa hề lập một hoỏ đơn nào thỡ cho kết quả là 0)
Cho biết tổng
(thời được gian tớnh theo ngày đặt hàng).
Hóy cho biết tổng số tiền lời mà cụng ty thu đượ 2003.
Hóy cho biết tổng số lượng hàng của mỗ lượng hàng hiện cú và đó bỏn).
Nhõn v
bỏn được của những nhõn viờn này là bao nhiờu? Đơn đặt hàng nào cú số lượng h
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 đặt hàng phải trả là bao nhiờu?
Hóy cho biết mỗi một
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
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
cả năm của mỗi mặt hàng.
g cõu lệnh UPDATE để thực hiện cỏc yờu cầu sau: Cập nhật lại giỏ trị trườn
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.
Cập nhật giỏ trị của trường NOIGIAOHANG tro
2. 35 ng bảng DONDATHANG bằng
trị trường NOIGIAOHANG bằng NULL).
hải giống nhau.
2. 38 àng nhiều
2. 39 ng nhõn viờn trong năm 2003 khụng lập được bất kỳ 2. 40 trong bảng DONDATHANG cú thờm trường SOTIEN cho biết số tiền
2. 41
năm.
sở dữ liệu.
2. 44 hỏi bảng KHACHHANG những khỏch hàng hiện khụng cú bất kỳ đơn đặt ng được
ruy vấn dưới đõy sử dụng cỳ phỏp của QL2.
macongty,tencongty,tengiaodich
LECT mahang,tenhang,soluong
r(ngaylamviec) AS namlamviec
đị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ỏ
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 p
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.
Tăng phụ cấp lờn bằng 50% lương cho những nhõn viờn bỏn được h nhất.
Giảm 25% lương của nhữ đơn đặt hàng nào.
Giả sử
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.
Xoỏ khỏi bảng NHANVIEN những nhõn viờn đó làm việc trong cụng ty quỏ 40 2. 42 Xoỏ những đơn đặt hàng trước năm 2000 ra khỏi cơ
2. 43 Xoỏ khỏi bảng LOAIHANG những loại hàng hiện khụng cú mặt hàng. Xoỏ k
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ụ đặ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 t S 2.1 SELECT FROM nhacungcap 2.2 SE FROM mathang 2.3 SELECT ho,ten,yea FROM nhanvien
2.4 SELECT diachi,dienthoai ch='VINAMILK' ng<50 cap.macongty,tencongty,tengiaodich y=nhacungcap.macongty iến' encongty,diachi athang.maloaihang) macongty 9 athang.mahang) sohoadon) g=khachhang.makhachhang 10 C ,ho,ten, dondathang g.manhanvien 1
N phucap IS NULL THEN 0
luong OM anv n FROM nhacungcap WHERE tengiaodi 2.5 SELECT mahang,tenhang FROM mathang
WHERE giahang>100000 AND soluo 2.6 SELECT mahang,tenhang,
nhacung
FROM mathang INNER JOIN nhacungcap ON mathang.macongt
2.7 SELECT mahang,tenhang
FROM mathang INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap.macongty WHERE tencongty='Việt T
2.8 SELECT DISTINCT nhacungcap.macongty,t FROM (loaihang INNER JOIN mathang ON loaihang.maloaihang=m
INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap. WHERE tenloaihang='Thực phẩm'
2. SELECT DISTINCT tengiaodich
FROM ((mathang INNER JOIN chitietdathang ON mathang.mahang=chitietd
INNER JOIN dondathang
ON chitietdathang.sohoadon=dondathang. INNER JOIN khachhang
ON dondathang.makhachhan WHERE tenhang='Sữa hộp'
2. SELE T dondathang.manhanvien ngaygiaohang,noigiaohang FROM nhanvien INNER JOIN
ON nhanvien.manhanvien=dondathan WHERE sohoadon=1 2.1 SELECT manhanvien,ho,ten, luongcoban + CASE WHE ELSE phucap END AS FR nh ie 2.12 SELECT a.mahang,tenhang,
a.soluong*giaban*(1-mucgiamgia/100) AS sotien hang AS a INNER JOIN mathang AS b
3 hacungcap .tengiaodich 4 LEC .ngaysinh 5 OM g.diachi 6 LEC chi,dienthoai 7 ng,tenhang
(SELECT mahang FROM chitietdathang mahang=mathang.mahang)
8 en,ho,ten
ERE OT IST ang
nhanvien=nhanvien.manhanvien) 9 en,ho,ten,luongcoban .makhachhang, y,tengiaodich, ondathang.makhachhang) ng.sohoadon thang.sohoadon FROM chitietdat ON a.mahang=b.mahang 2.1 SELECT makhachhang,khachhang.tencongty, khachhang.tengiaodich
FROM khachhang INNER JOIN n
ON khachhang.tengiaodich=nhacungcap 2.1 SE T a.ho,a.ten,b.ho,b.ten,b