You are on page 1of 67

1. Mở đầu (tt.

 CSDL minh họa QLCT

THANH_PHO(matp, tentp)
NHAN_VIEN(manv, honv, tennv, ngaysinh, phai, mucluong, macn, manvquanly)
THAN_NHAN(manv, tenthannhan, ngaysinh, phai, moiquanhe)

CHI_NHANH(macn, tencn, manvptr, ngaynhamchuc)

VPHONG_CN(macn, matp)
CONG_TRINH(mact, tenct, ngaybd, ngaykt, matp, macn)
PHAN_CONG(mact, manv, sogiotuan)

1
(2022) Chương 5: Ngôn ngữ SQL
2.1 Kiểu dữ liệu

 Kiểu số

● INTEGER

● SMALLINT

● NUMERIC, NUMERIC(p), NUMERIC(p, s)

● DECIMAL, DECIMAL(p), DECIMAL(p, s)

● REAL

● DOUBLE PRECISION

● FLOAT, FLOAT(p)

2
(2022) Chương 5: Ngôn ngữ SQL
2.1 Kiểu dữ liệu (tt.)
 Kiểu chuỗi ký tự
● CHARACTER, CHARACTER(n)
● CHARACTER VARYING(x)

 Kiểu ngày
● DATE
● TIME
● TIMESTAMP

 Dữ liệu nhị phân


● Binary(n)
● VarBinary(n)
● Image

3
(2022) Chương 5: Ngôn ngữ SQL
2.1 Kiểu dữ liệu (tt.)

 Kiểu dữ liệu trong MS SQL Server (2014)

● INT, NUMERIC(p, s), …

● CHAR(n), VARCHAR(n), NCHAR(n), NVARCHAR(n), …

● DATE, TIME, DATETIME, …

● Boolean  BIT: TRUE (1), FALSE (0)

● Image, Binary, varBinary…

4
(2022) Chương 5: Ngôn ngữ SQL
2.2 Tạo và xóa CSDL

 Tạo CSDL

CREATE DATABASE <tên CSDL>

● Ví dụ:

CREATE DATABASE QLCT

5
(2022) Chương 5: Ngôn ngữ SQL
2.2 Tạo và xóa CSDL (tt.)

 Xóa CSDL (xóa tất cả các thành phần !)

DROP DATABASE <tên CSDL>

● Ví dụ:
DROP DATABASE QLCT

6
(2022) Chương 5: Ngôn ngữ SQL
2.3 Tạo bảng

 Cú pháp tạo bảng


CREATE TABLE <tên bảng> (
<tên thuộc tính> <kiểu> [<điều kiện ràng buộc>],
<tên thuộc tính> <kiểu> [<điều kiện ràng buộc>],

[ CONSTRAINT <tên RBTV> <điều kiện ràng buộc> ]
)

● Ví dụ:
CREATE TABLE THANH_PHO (
matp CHAR(2),
tentp NVARCHAR(20)
)

7
(2022) Chương 5: Ngôn ngữ SQL
2.3 Tạo bảng (tt.)

 Mô tả <điều kiện ràng buộc>

● NOT NULL

● NULL

● DEFAULT

● PRIMARY KEY

● UNIQUE

● FOREIGN KEY … REFERENCES …

● CHECK

8
(2022) Chương 5: Ngôn ngữ SQL
2.3 Tạo bảng (tt.)

 Ví dụ về khóa chính:


CREATE TABLE CHI_NHANH (
macn CHAR(3) PRIMARY KEY,
tencn NVARCHAR(30) NOT NULL,
manvptr CHAR(3),
ngaynhamchuc DATE DEFAULT (GETDATE())
)

CREATE TABLE PHAN_CONG (


mact CHAR(4) NOT NULL,
manv CHAR(3) NOT NULL,
sogiotuan INT,
PRIMARY KEY (mact, manv)
)
9
(2022) Chương 5: Ngôn ngữ SQL
2.3 Tạo bảng (tt.)

 Ví dụ về khóa ngoại và CHECK:

CREATE TABLE NHAN_VIEN (


manv CHAR(3) PRIMARY KEY,
honv NVARCHAR(20) NOT NULL,
tennv NVARCHAR(10) NOT NULL,
phai NVARCHAR(3) CHECK (phai IN (N'Nam', N'Nữ')),
ngaysinh DATE NOT NULL,
mucluong INT DEFAULT (800000),
macn CHAR(3),
manvquanly CHAR(3),
CONSTRAINT FK1_macn
FOREIGN KEY (macn) REFERENCES CHI_NHANH (macn)
)

10
(2022) Chương 5: Ngôn ngữ SQL
2.4 Sửa đổi bảng

 Sửa đổi các cột

ALTER TABLE <tên bảng>


ADD <tên thuộc tính> <kiểu>
[ <điều kiện ràng buộc> ]

ALTER TABLE <tên bảng>


DROP COLUMN <tên thuộc tính>

ALTER TABLE <tên bảng>


ALTER COLUMN <tên thuộc tính> <kiểu>

11
(2022) Chương 5: Ngôn ngữ SQL
2.4 Sửa đổi bảng (tt.)

 Ví dụ:

ALTER TABLE NHAN_VIEN ADD quoctich CHAR(20)

ALTER TABLE NHAN_VIEN ALTER COLUMN quoctich CHAR(50)

ALTER TABLE NHAN_VIEN DROP COLUMN quoctich

12
(2022) Chương 5: Ngôn ngữ SQL
2.4 Sửa đổi bảng (tt.)

 Sửa đổi ràng buộc toàn vẹn

ALTER TABLE <tên bảng>


ADD CONSTRAINT <tên RBTV> <điều kiện ràng buộc>,
CONSTRAINT <tên RBTV> <điều kiện ràng buộc>,
...

ALTER TABLE <tên bảng> DROP <tên RBTV>

13
(2022) Chương 5: Ngôn ngữ SQL
2.4 Sửa đổi bảng (tt.)

 Ví dụ:

ALTER TABLE CHI_NHANH


ADD CONSTRAINT FK_CN_NV
FOREIGN KEY (manvptr) REFERENCES NHAN_VIEN (manv)

 Khóa ngoại nên được tạo SAU khi đã tạo hết các bảng !

14
(2022) Chương 5: Ngôn ngữ SQL
2.4 Sửa đổi bảng (tt.)

 Xóa 1 bảng

DROP TABLE <tên bảng>

 Lưu ý: Ràng buộc toàn vẹn !

15
(2022) Chương 5: Ngôn ngữ SQL
Nội dung

1. Mở đầu

2. Định nghĩa CSDL và bảng

3. Cập nhật dữ liệu

● Thêm mẩu tin

● Xóa mẩu tin

● Sửa mẩu tin

4. Truy vấn dữ liệu

5. Khung nhìn (View)


16
(2022) Chương 5: Ngôn ngữ SQL
3. Cập nhật dữ liệu
 Thêm 1 mẩu tin

INSERT INTO <tên bảng> [ (<dsách thuộc tính>) ]


VALUES (<dsách giátrị>)

● Ví dụ:
INSERT INTO NHAN_VIEN
VALUES ('N09', N'Lê Ngọc', N'An', N'Nam', '1965/11/10', 800000, 'C03', 'N02');

INSERT INTO NHAN_VIEN(manv, honv, tennv, phai, ngaysinh, mucluong, macn)


VALUES ('N10', N'Lê Văn', N'Sư', N'Nam', '1965/12/25', 800000, 'C01');

 Lưu ý:

● ràng buộc toàn vẹn !

● thêm nhiều mẩu tin cùng lúc theo lệnh truy vấn (xem phần 4)
17
(2022) Chương 5: Ngôn ngữ SQL
3. Cập nhật dữ liệu (tt.)

 Xóa mẩu tin

DELETE FROM <tên bảng> [ WHERE <điều kiện> ]

● Ví dụ: Xóa NV có mã số ‘N09’


DELETE FROM NHAN_VIEN WHERE manv = 'N09'

● Ví dụ: Xóa tất cả NV !


DELETE FROM NHAN_VIEN

 Lưu ý: Ràng buộc toàn vẹn !

18
(2022) Chương 5: Ngôn ngữ SQL
3. Cập nhật dữ liệu (tt.)

 Cú pháp
UPDATE <tên bảng>
SET <tên thuộc tính_1> = <giá trị 1>,
<tên thuộc tính_2> = <giá trị 2>,

[WHERE <điều kiện>]

● Ví dụ:
UPDATE CHI_NHANH
SET manvptr = 'N10' WHERE macn = 'C02'

UPDATE NHAN_VIEN SET mucluong = mucluong*1.1

 Lưu ý: Ràng buộc toàn vẹn !

19
(2022) Chương 5: Ngôn ngữ SQL
Nội dung

1. Mở đầu

2. Định nghĩa CSDL và bảng

3. Cập nhật dữ liệu

4. Truy vấn dữ liệu

● Truy vấn cơ bản

● Truy vấn phân nhóm

● Truy vấn con

● Truy vấn khác

5. Khung nhìn (View)


20
(2022) Chương 5: Ngôn ngữ SQL
4. Truy vấn dữ liệu

 Cú pháp chung của câu truy vấn

SELECT [ DISTINCT ] * | <dsách bthức>

FROM <dsách bảng>

[WHERE <điều kiện>]

[GROUP BY <dsách thuộc tính>] [HAVING <điều kiện trên nhóm>]]

[ORDER BY <dsách thuộc tính>]

21
(2022) Chương 5: Ngôn ngữ SQL
4. Truy vấn dữ liệu (tt.)

 Toán tử

● số: ^, *, /, mod, +, -

● logic: AND, OR, NOT

● so sánh:  ,  ,  ,  ,  , 

● LIKE, BETWEEN

 Hàm kết hợp

● AVG(.), COUNT(.), MAX(.), MIN(.), SUM(.)

22
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chiếu

 Ví dụ:

SELECT manv, honv, tennv


FROM NHAN_VIEN

manv honv tennv

N01 Nguyen Tung


N02 Nguyen Hung
... ... ...

 manv, honv, tennv (NHAN_VIEN)

23
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chiếu (tt.)

 Bí danh

SELECT manv, honv + ' ' + tennv AS 'ho_ten'


FROM NHAN_VIEN

manv ho_ten

N01 Nguyen Tung


N02 Nguyen Hung
... ...

 Hàm kết hợp


SELECT SUM(mucluong) AS tongluong, AVG(mucluong) AS luongtb
FROM NHAN_VIEN NV
WHERE NV.phai = N'Nữ'

24
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chọn

 Ví dụ:

SELECT *
FROM NHAN_VIEN
 macn = 'C02' (NHAN_VIEN)
WHERE macn = 'C02'

manv honv tennv ngaysinh diachi phai mucluo manvptr macn


ng
N01 Nguyen Tung 12/08/1965 638 NVC Q5 M 4N00 NULL C02
N02 Nguyen Hung 09/15/1962 Ba Ria VT M 38N0 N01 C02

25
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chọn (tt.)

 Loại bỏ thông tin trùng lắp


mucluong
SELECT mucluong
FROM NHAN_VIEN 30000
25000
WHERE macn = 'C02' AND phai = N'Nữ'
25000
38000

mucluong
SELECT DISTINCT mucluong
FROM NHAN_VIEN 30000
25000
WHERE macn = 'C02' AND phai = N'Nữ'
38000

26
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chọn (tt.)

 Toán tử BETWEEN

SELECT manv, honv, tennv, mucluong


FROM NHAN_VIEN
WHERE mucluong BETWEEN 1000000 AND 5000000

SELECT manv, honv, tennv, mucluong


FROM NHAN_VIEN
WHERE mucluong NOT BETWEEN 1000000 AND 5000000

27
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chọn (tt.)
 Toán tử LIKE: kết hợp với % và _

SELECT manv, honv, tennv


FROM NHAN_VIEN
WHERE honv LIKE N'Lê%'

SELECT manv, honv, tennv


FROM NHAN_VIEN
WHERE honv NOT LIKE N'Lê%'

28
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chọn (tt.)

 Giá trị NULL

SELECT manv, honv, tennv


FROM NHAN_VIEN
WHERE manvquanly IS NULL

SELECT manv, honv, tennv


FROM NHAN_VIEN
WHERE manvquanly IS NOT NULL

29
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép chọn (tt.)

SELECT TOP 3 mucluong


FROM NHAN_VIEN

SELECT TOP 25 PERCENT mucluong


FROM NHAN_VIEN

30
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Sắp xếp

 Sắp xếp: ASC (ngầm định), DESC


SELECT manv, mact, sogiotuan
FROM PHAN_CONG
ORDER BY manv DESC, mact

manv mact

N04 CT01
N04 CT03
N02 CT01
N02 CT03
N01 CT01
N01 CT02
N01 CT03

31
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Tích Đề-các

 Ví dụ:

SELECT manv, honv, tennv, mact, tenct


FROM NHAN_VIEN, CONG_TRINH

32
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép kết

 Cú pháp

SELECT <dsách bthức>


FROM <bảng 1> JOIN <bảng 2> ON <điều kiện kết>
...

SELECT <dsách bthức>


FROM <bảng 1> LEFT | RIGHT JOIN <bảng 2> ON <điều kiện kết>
...

33
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép kết (tt.)

 Danh sách NV (mã số, họ, tên) của chi nhánh TPHCM

SELECT manv, honv, tennv


FROM NHAN_VIEN NV JOIN CHI_NHANH CN ON NV.macn = CN.macn
WHERE tencn = N'Chi nhánh TPHCM'

SELECT manv, honv, tennv


FROM NHAN_VIEN NV, CHI_NHANH CN
WHERE NV.macn = CN.macn AND tencn = N'Chi nhánh TPHCM'

34
(2022) Chương 5: Ngôn ngữ SQL
4.1 Truy vấn cơ bản – Phép kết (tt.)

SELECT CT.mact, ngaybd, ngaykt, manv


FROM CONG_TRINH CT LEFT JOIN PHAN_CONG PC ON CT.mact = PC.mact

SELECT manv, CT.mact, sogiotuan


FROM CONG_TRINH CT RIGHT JOIN PHAN_CONG PC ON CT.mact = PC.mact

 Xem thêm ví dụ minh họa trên LMS

35
(2022) Chương 5: Ngôn ngữ SQL
4.2 Truy vấn phân nhóm

 Cú pháp

SELECT <dsách bthức>


FROM <dsách bảng>
GROUP BY <dsách thuộc tính>
[HAVING <điều kiện phân nhóm>]
...

36
(2022) Chương 5: Ngôn ngữ SQL
4.2 Truy vấn phân nhóm (tt.)

 Số lượng NV của từng phòng, ban


manv honv tennv ngaysinh diachi phai mucluong nguoiquanly macn

N01 Nguyen Tung 12/08/1965 638 NVC Q5 M 40000 NULL C01


N02 Nguyen Hung 09/15/1962 Ba Ria VT M 38000 N01 C01
N03 Tran Tam 07/31/1972 543 MTL Q1 F 25000 N01 C01
N04 Bui Hang 07/19/1968 33 NTH Q1 F 38000 N05 C02
N05 Le Nhu 07/20/1971 219 TD Q3 F 43000 NULL C02
N06 Tran Quang 04/08/1969 980 LHP Q5 M 25000 N05 C02
N07 Pham Vinh 11/10/1965 450 TV HN M 55000 NULL C03

SELECT macn, COUNT(*) AS sonv macn sonv

FROM NHAN_VIEN C01 3


C02 3
GROUP BY macn
C03 1

37
(2022) Chương 5: Ngôn ngữ SQL
4.2 Truy vấn phân nhóm (tt.)

 Danh sách NV tham gia tối thiểu 2 đề án

SELECT manv, COUNT(*) manv mact sogiotuan


FROM PHAN_CONG N01 CT01 32
GROUP BY manv N01 CT02 7
N02 CT02 10
HAVING COUNT(*) >= 2
N02 CT03 10 dòng
bị loại
N02 CT01 10
N03 CT02 20
N04 CT01 35
N04 CT03 5
N05 CT03 20
N05 CT02 15
N06 CT01 20
N06 CT02 20

38
(2022) Chương 5: Ngôn ngữ SQL
4.2 Truy vấn phân nhóm (tt.)

 Tên những chi nhánh có lương trung bình của nữ > 2000000

SELECT tencn, AVG(mucluong)


FROM NHAN_VIEN NV, CHI_NHANH CN
WHERE (NV.macn = CN.macn) AND (phai = N'Nữ')
GROUP BY tencn
HAVING AVG(mucluong) > 2000000

 So sánh WHERE và HAVING

39
(2022) Chương 5: Ngôn ngữ SQL
 NV làm trên 1 đề án: COUNT()

 Nếu muốn biết cả tên các đề án ?

40
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE

 Cú pháp

SELECT <dsách bthức>


FROM <dsách bảng>
WHERE [cột] <toán tử> (<truy vấn con>)
...

● <truy vấn con>: kết quả là một bảng tạm (trung gian)

● <toán tử>
 IN, ALL, ANY, SOME
 EXISTS

● có thể lồng nhau nhiều cấp


41
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV của các chi nhánh tại thành phố có mã số là 01

SELECT manv, honv, tennv


FROM NHAN_VIEN NV, VPHONG_CN CN
WHERE NV.macn = CN.macn AND matp = '01'

SELECT manv, honv, tennv


truy vấn con:
FROM NHAN_VIEN chi nhánh ở thành phố 01
WHERE macn IN ( SELECT macn
FROM VPHONG_CN
WHERE matp = '01' )

42
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV không có thân nhân

SELECT *
FROM NHAN_VIEN
WHERE manv NOT IN (SELECT DISTINCT manv
FROM THAN_NHAN )

SELECT *
FROM NHAN_VIEN
WHERE manv <> ALL (SELECT manv
FROM THAN_NHAN )

43
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV có lương > ít nhất 1 NV của chi nhánh TPHCM

SELECT *
FROM NHAN_VIEN
WHERE mucluong > ANY (SELECT mucluong
FROM NHAN_VIEN
WHERE macn = (SELECT macn
FROM CHI_NHANH
WHERE tencn = N'Chi nhánh TPHCM'
)
)

44
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV có lương cao hơn tất cả NV chi nhánh TPHCM

SELECT *
FROM NHAN_VIEN
WHERE mucluong > ALL (SELECT mucluong
FROM NHAN_VIEN
WHERE macn = (SELECT macn
FROM CHI_NHANH
WHERE tencn = N'Chi nhánh TPHCM'
)
)

45
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách các trưởng chi nhánh có tối thiểu 1 thân nhân

SELECT *
FROM NHAN_VIEN
WHERE manv IN (SELECT manvptr FROM CHI_NHANH)
AND manv IN (SELECT manv FROM THAN_NHAN)

46
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV tại chi nhánh TPHCM


SELECT manv, honv, tennv
FROM NHAN_VIEN NV, CHI_NHANH CN
WHERE NV.macn = CN.macn
AND tencn = N'Chi nhánh TPHCM'

SELECT manv, honv, tennv


FROM NHAN_VIEN NV
WHERE EXISTS (SELECT *
FROM CHI_NHANH CN
WHERE NV.macn = CN.macn
AND tencn = N'Chi nhánh TPHCM' )

47
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV không có thân nhân

SELECT *
FROM NHAN_VIEN NV
WHERE NOT EXISTS (SELECT *
FROM THAN_NHAN TN
WHERE NV.manv = TN.manv)

48
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV có lương > ít nhất 1 NV của chi nhánh TPHCM

SELECT *
FROM NHAN_VIEN N1
WHERE EXISTS (SELECT *
FROM NHAN_VIEN N2
WHERE N1.mucluong > N2.mucluong
AND N2.macn = (SELECT macn
FROM CHI_NHANH
WHERE tencn = N'Chi nhánh TPHCM'
)
)

49
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách các trưởng chi nhánh có tối thiểu 1 thân nhân

SELECT *
FROM NHAN_VIEN NV
WHERE EXISTS (SELECT *
FROM THAN_NHAN TN
WHERE NV.manv = TN.manv )
AND EXISTS (SELECT *
FROM CHI_NHANH
WHERE NV.manv = manvptr )

50
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Chi nhánh có lương trung bình lớn nhất

SELECT macn, AVG(mucluong)


FROM NHAN_VIEN
GROUP BY macn
HAVING MAX(AVG(mucluong))

SELECT macn, AVG(mucluong)


FROM NHAN_VIEN
GROUP BY macn HAVING AVG(mucluong) >= ALL (SELECT AVG(mucluong)
FROM NHAN_VIEN
GROUP BY macn)

51
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – WHERE (tt.)

 Danh sách NV tham gia tất cả công trình

SELECT NV.manv, honv, tennv


FROM NHAN_VIEN NV, PHAN_CONG A
WHERE NV.manv = A.manv
GROUP BY NV.manv
HAVING COUNT(*) = (SELECT COUNT(*)
FROM CONG_TRINH )

52
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – FROM

 Cú pháp

SELECT <dsách bthức>


FROM <dsách bảng>, (<truy vấn con>) AS <tên bảng>
...

53
(2022) Chương 5: Ngôn ngữ SQL
4.3 Truy vấn con – FROM (tt.)
 Những chi nhánh có lương trung bình > 4000000
SELECT macn, AVG(mucluong)
FROM NHAN_VIEN
GROUP BY macn
HAVING AVG(mucluong) > 4000000

SELECT NV.macn, tencn, AVG(mucluong)


FROM NHAN_VIEN NV, CHI_NHANH CN
WHERE NV.macn = CN.macn
GROUP BY NV.macn, tencn
HAVING AVG(mucluong) > 4000000

SELECT tencn, TEMP.mucluong_tb


FROM CHI_NHANH CN, (SELECT macn, AVG(mucluong) AS mucluong_tb
FROM NHAN_VIEN
GROUP BY macn
HAVING AVG(mucluong) > 400000) AS TEMP
WHERE CN.macn = TEMP.macn
54
(2022) Chương 5: Ngôn ngữ SQL
4.4 Truy vấn khác – Phép toán tập hợp

 Cú pháp

SELECT <dsách bthức> FROM <dsách bảng> WHERE <điều kiện>


UNION | INTERSECT | EXCEPT [ALL]
SELECT <dsách bthức> FROM <dsách bảng> WHERE <điều kiện>

55
(2022) Chương 5: Ngôn ngữ SQL
4.4 Truy vấn khác – Phép chia
 Nhắc lại
S(A1, A2, …, Am) và T(A1, A2, …, An), S*  T* (n > m)
R(S) và S’(T)
Q* = T*  S* = { Am+1, …, An }
Q = R  S’ = { q | sS’, (s, q)  R }

R A B C D E S D E R S A B C

a a a a 1 a 1 a a c
a a c a 1 b 1 c a c
a a c b 1
b a c a 1
b a c b 3
c a c a 1
c a c b 1
c a b b 1
56
(2022) Chương 5: Ngôn ngữ SQL
4.4 Truy vấn khác – Phép chia (tt.)

 Sử dụng EXCEPT

SELECT R1.A, R1.B, R1.C FROM R R1

WHERE NOT EXISTS (

(SELECT S.D, S.E FROM S)

EXCEPT

(SELECT R2.D, R2.E FROM R R2

WHERE R1.A=R2.A AND R1.B=R2.B AND

R1.C=R2.C)

57
(2022) Chương 5: Ngôn ngữ SQL
4.4 Truy vấn khác – Thêm mẩu tin

 Thêm nhiều mẩu tin cùng lúc


INSERT INTO <tên bảng> [ (<dsách thuộc tính>) ]
<truy vấn con>

● Ví dụ:
CREATE TABLE mucluong_CN (
tencn VARCHAR(50), sonv INT, tongcongluong INT)

INSERT INTO mucluong_CN


SELECT tencn, COUNT(manv), SUM(mucluong)
FROM NHAN_VIEN NV, CHI_NHANH CN
WHERE NV.macn = CN.macn
GROUP BY tencn

58
(2022) Chương 5: Ngôn ngữ SQL
Nội dung

1. Mở đầu

2. Định nghĩa CSDL và bảng

3. Truy vấn dữ liệu

4. Cập nhật dữ liệu

5. Khung nhìn (View)

● Định nghĩa

● Truy vấn dữ liệu

● Cập nhật dữ liệu


59
(2022) Chương 5: Ngôn ngữ SQL
5.1 Định nghĩa

 Bảng “ảo” được định nghĩa từ một hoặc nhiều bảng trong CSDL

CREATE VIEW <tên view> AS <lệnh truy vấn>


● Ví dụ: [ WITH CHECK OPTION ]
CREATE VIEW NV_C01 AS
SELECT manv, honv, tennv, mucluong
FROM NHAN_VIEN
WHERE
● Sử dụng View để ‘quan macn
sát’ = 'C01' từ một góc nhìn cụ thể.
database

● Tạo View và gán quyền truy cập sử dụng cho một nhóm user nào
đó  hạn chế khả năng truy cập vào table gốc đối với những
user không có quyền hạn.

● Đối với các câu lệnh phức tạp, chỉ cần tạo một lần dưới dạng view.

60
(2022) Chương 5: Ngôn ngữ SQL
5.2 Truy vấn dữ liệu

 Sau khi tạo View, có thể tiến hành truy vấn dữ liệu trên view đó
bằng các câu lệnh SQL

 Ví dụ:
SELECT SUM(mucluong)
FROM NV_C01

SELECT honv, tennv, tenct


FROM NV_C01 AS NV, PHAN_CONG AS PC, CONG_TRINH AS CT
WHERE NV.manv = PC.manv AND PC.mact = CT.mact

61
(2022) Chương 5: Ngôn ngữ SQL
5.2 Truy vấn dữ liệu

 Xóa View:

DROP VIEW <tên view>

62
(2022) Chương 5: Ngôn ngữ SQL
5.3 Cập nhật dữ liệu cho bảng thông
qua View
 Có thể làm điều này khi view định nghĩa trên 1 bảng R và:

● Thành phần SELECT không chứa DISTINCT

● Thành phần SELECT chứa tất cả thuộc tính NOT NULL của R

● Thành phần SELECT không được chứa các hàm / công thức
tính toán

● Thành phần WHERE không được có truy vấn con

● Không sử dụng truy vấn GROUP BY và HAVING

63
(2022) Chương 5: Ngôn ngữ SQL
5.3 Cập nhật dữ liệu cho bảng thông
qua View (tt.)
 Ví dụ
CREATE VIEW NV_C02 AS
SELECT manv, honv, tennv, phai, ngaysinh, mucluong, macn, manvquanly
FROM NHAN_VIEN
WHERE macn = 'C02'

INSERT INTO NV_C02


VALUES ('N90', N‘Lê Văn', N'An', N'Nữ', '1988/05/12', 800000, ‘C02‘, NULL);

UPDATE NV_C02
SET manvquanly=‘N01’
WHERE manv=‘N90’;

DELETE FROM NV_C02


WHERE manv=‘N90’
64
(2022) Chương 5: Ngôn ngữ SQL
5.3 Cập nhật dữ liệu cho bảng thông
qua View (tt.)
 WITH CHECK OPTION:

● Đảm bảo rằng tất cả sự kiện UPDATE và INSERT view đều


phải thỏa mãn các điều kiện trong định nghĩa View.

 Ví dụ
CREATE VIEW NV_C03 AS
SELECT manv, honv, tennv, phai, ngaysinh, mucluong, macn, manvquanly
FROM NHAN_VIEN
WHERE macn = ‘C03’
WITH CHECK OPTION

65
(2022) Chương 5: Ngôn ngữ SQL
5.3 Cập nhật dữ liệu cho bảng thông
qua View (tt.)
 Ví dụ

INSERT INTO NV_C03


VALUES ('N90', N‘Lê Văn', N'An', N'Nữ', '1988/05/12', 800000, ‘C02‘, NULL);

UPDATE NV_C03
SET manvquanly=‘N03’
WHERE manv=‘N04’;

DELETE FROM NV_C03


WHERE manv=‘N04’

66
(2022) Chương 5: Ngôn ngữ SQL
5.3 Cập nhật dữ liệu cho bảng thông
qua View (tt.)
 View định nghĩa trên nhiều bảng

● Dùng Trigger (chương 9: ràng buộc dữ liệu)

67
(2022) Chương 5: Ngôn ngữ SQL

You might also like