Professional Documents
Culture Documents
DB_SALES
Nội dung
Lược đồ cơ sở dữ liệu
Bài tập
DB_SALES 1
Lược đồ cơ sở dữ liệu
Dữ liệu mẫu
category_id category_name
c01 Máy tính bảng
c02 Laptop
c03 Linh kiện
c04 Máy in
DB_SALES 2
Thuộc tính Diễn giải Kiểu dữ liệu Khóa
product_id Mã sản char(10) primary key
phẩm
category_id địa chỉ char(10) foreign key (category_id)
references
Product_category(category
_id)
product_name Tên sản nvarchar(100)
phẩm not null)
price Đơn giá int
Dữ liệu mẫu
Dữ liệu mẫu
DB_SALES 4
Dữ liệu mẫu
Dữ liệu mẫu
DB_SALES 5
i04 p01 1 1000
i05 p06 2 265
i06 p06 4 265
i06 p09 2 150
i07 p09 1 130
i08 p09 1 140
i09 p09 2 150
i10 p02 1 14000
i10 p09 1 150
i10 p11 1 5020
Bài tập
I. Truy vấn trả về 1 trị thông qua các hàm tính toán tổng hợp (aggregate
function)
1. Tổng số lượng nhân viên
Thực hiện 1:
SELECT COUNT(*) AS [NoEmployee] FROM dbo.customers
2. Nhân viên có lương cao nhất
Thực hiện 1:
SELECT MAX(salary) FROM dbo.employee
3. Số lượng sản phẩm 'Laptop'
SELECT
c.firstname,c.lastname,inv.Invoice_number,inv.Invoice_date
FROM dbo.customers AS c JOIN dbo.invoices AS inv
ON inv.customer_id = c.customer_id
Thực hiện 2:
DB_SALES 6
SELECT
c.firstname,c.lastname,inv.Invoice_number,inv.Invoice_date
FROM dbo.customers AS c, dbo.invoices AS inv
WHERE inv.customer_id = c.customer_id
2. Thông tin chi tiết của hóa đơn 01 gồm tên sản phẩm số lượng, đơn giá
bán, thành tiền.
3. Danh sách các nhân viên và các hóa đơn mà họ đã bán (bao gồm cả nhân
viên chưa bán được hóa đơn nào).
Thực hiện 1:
SELECT e.name,inv.Invoice_number,inv.Invoice_date
FROM dbo.employee AS e LEFT JOIN dbo.invoices AS inv
ON inv.employee_id = e.employee_id
Thực hiện 2: chỉ là cách viết khác thực hiện 1 (không phải là cách khác) thực
hiện tìm max cho từng nhóm rời mới kết dữ liệu với bảng Product_category
Thực hiện 2:
DB_SALES 8
▪ Điều kiện trên hàm tính toán tổng hợp thì dùng Having
1. Tổng số hóa đơn được xuất trong tháng 4/2018
2. Số lượng hóa đơn bán laptop
Thực hiện 1:
SELECT COUNT(*) AS [No OF invoices]
FROM dbo.products AS p JOIN dbo.invoice_detail AS ind
ON ind.product_id = p.product_id
JOIN dbo.Product_category AS pc
ON pc.category_id = p.category_id
where pc.category_name =N'laptop'
Thực hiện 2:
DB_SALES 9
JOIN dbo.invoice_detail AS ind
ON ind.Invoice_number = inv.Invoice_number
GROUP BY em.employee_id,em.name
HAVING SUM(ind.quantity*ind.unit_price) >20000
V. Subquery
Lưu ý:
▪ Subquery trả về 1 trị thường đặt trong Select hoặc 1 vế trong biểu
thức so sánh của mệnh đề where
▪ Subquery trả về 1 cột thường đặt sau toán tử ALL, Any, In trong mệnh
đề where (trước all, any phải có toán tử so sánh >,=,<…)
▪ Subquery trả về 1 bảng (trường hợp đặc biệt là 1 bảng chỉ có 1 cột)
thường nằm trong mệnh đề From với một bí danh nào đó.
▪ Có thể sử dụng In để thay cho việc dùng Join trong trường hợp truy
vấn liên quan đến thông tin trên 2 bảng nhưng câu lệnh select chỉ
chọn những giá trị trên 1 bảng.
1. Danh sách nhân viên được tuyển dụng chung ngày với nhân viên ‘002’
Thực hiện 1:
SELECT *
FROM dbo.employee
WHERE startdate= (SELECT startdate
FROM dbo.employee
WHERE employee_id='002')
AND employee_id<>'002'
2. Danh sách khách hàng mua hàng từ các nhân viên được tuyển dụng
trong năm 2017.
VI. Truy vấn tìm giá trị lớn nhất và nhỏ nhất
▪ Sử dụng so sánh với Subquery trả về 1 giá trị khi sử dụng Select…
max()
▪ Sử dụng toán tử so sánh và ALL với Subquery trả về 1 danh sách
▪ Có thể sử dụng cấu trúc group by để tính toán tìm ra các giá trị trước
khi so sánh.
1. Nhân viên có lương lớn nhất.
Thực hiện 1:
DB_SALES 10
WHERE salary >=ALL (SELECT salary FROM dbo.employee)
Thực hiện 2:
2. Mỗi loại sản phẩm bán nhiều nhất là bao nhiêu sản phẩm.
3. Hóa đơn có trị giá thấp nhất.
VII. Truy vấn theo phép hợp
▪ Danh sách gồm nhiều tập dữ liệu thỏa mãn các điều kiện khác nhau
(tập dữ liệu thỏa mãn điều kiện thứ 1 hoặc thỏa mãn điều kiện thứ 2).
▪ Các tập dữ liệu có cùng số thuộc tính (số cột) và kiểu dữ liệu giữa các
cột tương ứng phải tương thích nhau.
▪ Sử dụng toán tử Union
1. Lập danh sách các hóa đơn được lập trong tháng 4 năm 2018 hoặc có
ngày giao hàng trong tháng 5 năm 2017. Thông tin gồm mã hóa đơn, mã
nhân viên và ngày (ngày lập hoặc ngày giao hàng).
Thực hiện 1:
SELECT *
FROM dbo.invoices
WHERE YEAR(Invoice_date)='2018'
AND MONTH(Invoice_date) =4
UNION
SELECT *
FROM dbo.invoices
WHERE YEAR(delivery_date)='2017'
AND MONTH(delivery_date) =5
2. Lập danh sách khách hàng quận 1 mua máy laptop và khách hàng quận
4 mua các mặt hàng thuộc nhóm linh kiện.
VIII. Truy vấn theo phép giao: tập dữ liệu thỏa nhiều điều kiện cùng lúc trên
cùng 1 nhóm thuộc tính.
Sử dụng IN, Exists hoặc Intersect
1. Danh sách các khách hàng đã mua laptop và Ram.
2. Danh sách nhân viên bán hàng cho những khách hàng quận 1 và quận 4.
Thực hiện 1: Sử dụng Exists
DB_SALES 11
SELECT DISTINCT em.employee_id, em.name
FROM dbo.customers AS c JOIN dbo.invoices AS inv
ON inv.customer_id = c.customer_id
JOIN dbo.employee AS em
ON em.employee_id = inv.employee_id
WHERE c.address='quan 1' AND
EXISTS (SELECT * FROM dbo.customers AS c1
JOIN dbo.invoices AS inv1
ON c1.customer_id=inv1.customer_id
WHERE c1.address='quan 4'
AND inv1.employee_id=inv.employee_id
)
Thực hiện 2: Sử dụng Intersect
IX. Truy vấn với từ khóa “CHƯA” (hoặc từ “không”) (có từ khóa “CHƯA”
trong câu hỏi hoặc câu hỏi được diễn đạt lại với từ “CHƯA” theo ngữ nghĩa)
▪ Hãy chú ý các quan hệ 1-n.
▪ Liên tưởng đến phép trừ
▪ Sử dụng NOT IN, NOT Exists, Except HOẶC COUNT()=0
1. Sản phẩm nào chưa được bán trong tháng 4 năm 2018 (Lấy tập dữ liệu tất
cả các sản phẩm trừ đi tập dữ liệu các sản phẩm được bán trong tháng 4
năm 2018)
Thực hiện 1: Sử dụng NOT EXISTS
Thực hiện 4: Sản phẩm chưa được bán là sản phẩm có số lần bán sản phẩm
đó =0
DB_SALES 13
JOIN dbo.invoice_detail AS ind
ON ind.Invoice_number = inv.Invoice_number
WHERE MONTH(inv.Invoice_date)=4
AND YEAR(inv.Invoice_date)=2018
AND ind.product_id=P.product_id) = 0
2. Nhân viên chưa xuất được hóa đơn nào trong tháng 4 năm 2018
3. Các khách hàng không mua hàng trong năm 2017
X. Truy vấn với từ khóa “CHỈ” (có từ ‘CHỈ’ trong câu hỏi hoặc câu hỏi được
diễn đạt lại có từ CHỈ theo ngữ nghĩa)
▪ Chú ý đến các bảng bên n trong quan hệ 1-n
1. Hóa đơn chỉ mua các sản phẩm có giá dưới 300. Thông tin gồm số hóa
đơn và ngày lâp hóa đơn.
Thực hiện 1: Sử dụng NOT EXISTS. Tìm các dòng có số hóa đơn thỏa điều
kiện <300 và kiểm tra đối với số hóa đơn đó không tồn tại 1 dòng chi tiết
hóa đơn nào có đơn giá >300.
3. Danh sách các nhân viên chỉ bán hàng cho các khách hàng quận 1.
XI. Truy vấn với từ khóa “Tất cả” (có từ khóa tất cả trong câu hỏi hoặc câu
hỏi được diễn đạt lại có từ tất cả theo ngữ nghĩa)
▪ Sử dụng not exists hoặc except
1. Danh sách các khách hàng đã mua sản phẩm với tất cả nhân viên bán
hàng.
Thực hiện 3: Sử dụng hàm COUNT(*). Tìm số lượng nhân viên mà khách
hàng đã mua hàng so sánh với số lượng tất cả nhân viên.
SELECT C.customer_id,C.firstname,C.lastname
FROM dbo.customers AS C
Where (SELECT DISTINCT COUNT(*)
FROM dbo.invoices
WHERE customer_id=c.customer_id)
= (SELECT COUNT(*) FROM dbo.employee)
2. Sản phẩm được bán trong tất cả hóa đơn trong ngày 24/4/2018.
3. Danh sách nhân viên đã bán được tất cả các sản phẩm.
4. Danh sách khách hàng mua tất cả các loại sản phẩm (product_category)
XII. Cập nhật dữ liệu
▪ Sử dụng câu lệnh Update
1. Cập nhật giá các loại laptop thêm 200.
Thực hiện 1:
UPDATE dbo.products
SET price=price+ 200
WHERE category_id='c02'
Thực hiện 2: sử dụng phép kết để ghi đúng điều kiện loại hàng là laptop
UPDATE dbo.products SET price=price+ 200
FROM dbo.products AS p JOIN dbo.Product_category AS pc
ON pc.category_id = p.category_id
DB_SALES 17
WHERE pc.category_name='laptop'
2. Thay đổi ngày chuyển hàng trong tháng 4/2018 dời lại 1 ngày.
3. Tăng lương thêm 300 cho các nhân viên được tuyển dụng năm 2016.
DB_SALES 18