Bài 1: Giới thiệu về Trình quản lý quảng cáo
1. Chuẩn bị dữ liệu mẫu
Trước khi thực hành, chúng ta sẽ tạo một bảng đơn giản để làm việc.
CREATE TABLE [dbo].[TaiKhoanQuanLy]( [ID] [int] IDENTITY(1,1) NOT NULL, [TenDangNhap] [nvarchar](100) NOT NULL, [MatKhau] [nvarchar](100) NOT NULL, [HoVaTen] [nvarchar](100) NOT NULL, [DienThoai] [nvarchar](100) NULL, [Email] [nvarchar](100) NULL, [NgaySinh] [date] NULL, [LuongCoBan] [float] NULL, [Active] [nvarchar](100) NULL)
Chèn một số dữ liệu mẫu vào bảng:
INSERT INTO dbo.TaiKhoanQuanLy (TenDangNhap, MatKhau, HoVaTen, DienThoai, Email, NgaySinh, LuongCoBan, Active) VALUES (N'nguyenvanhieu', N'123@Hieu', N'Nguyễn Văn Hiếu', N'0901234567', N'nguyenvanhieu@gmail.com', '1990-05-15', 12000000, N'True'), (N'phamthimai', N'123@Mai', N'Phạm Thị Mai', N'0902345678', N'phamthimai@gmail.com', '1992-08-22', 11500000, N'True'), (N'letuananh', N'123@Tuan', N'Lê Tuấn Anh', N'0903456789', N'letuananh@gmail.com', '1988-11-05', 13000000, N'True'), (N'dinhthuhuong', N'123@Huong', N'Đinh Thị Hương', N'0904567890', N'dinhthuhuong@gmail.com', '1993-02-28', 11000000, N'True'), (N'votruongson', N'123@Son', N'Võ Trường Sơn', N'0905678901', N'votruongson@gmail.com', '1985-09-18', 14000000, N'True'), (N'nguyenthimai', N'123@Mai2', N'Nguyễn Thị Mai', N'0906789012', N'nguyenthimai@gmail.com', '1991-07-12', 11800000, N'True'), (N'tranquocbao', N'123@Bao', N'Trần Quốc Bảo', N'0907890123', N'tranquocbao@gmail.com', '1987-04-03', 13500000, N'True'), (N'buiminhchau', N'123@Chau', N'Bùi Minh Châu', N'0908901234', N'buiminhchau@gmail.com', '1994-12-25', 12500000, N'True'), (N'caohoangnam', N'123@Nam', N'Cao Hoàng Nam', N'0909012345', N'caohoangnam@gmail.com', '1989-06-10', 12200000, N'True'), (N'phamlethu', N'123@Thu', N'Phạm Lê Thu', N'0910123456', N'phamlethu@gmail.com', '1995-03-30', 11700000, N'True');
2. Các lệnh SQL cơ bản
2.1. Lệnh SELECT – Lấy dữ liệu từ bảng
- Lấy toàn bộ dữ liệu từ bảng tài khoản:
SELECT * FROM TaiKhoanQuanLy;
- Lấy danh sách tài khoản có mức lương cơ bản trên 12 triệu:
SELECT * FROM TaiKhoanQuanLy WHERE LuongCoBan > 12000000;
- Chỉ lấy họ tên và lương của tài khoản:
SELECT HoVaTen, LuongCoBan FROM TaiKhoanQuanLy;
- Sắp xếp tài khoản theo mức lương giảm dần:
SELECT * FROM TaiKhoanQuanLy ORDER BY LuongCoBan DESC;
2.2. Lệnh INSERT – Thêm dữ liệu vào bảng
Thêm một tài khoản quản lý mới:
INSERT INTO TaiKhoanQuanLy
(TenDangNhap, MatKhau, HoVaTen, DienThoai, Email, NgaySinh, LuongCoBan, Active)
VALUES
(N'phamvanhieu', N'123@Hieu', N'Phạm Văn Hiếu', N'0911222333', N'phamvanhieu@gmail.com', '1991-09-09', 12500000, N'True');
2.3. Lệnh UPDATE – Cập nhật dữ liệu
- Cập nhật mức lương của tài khoản có ID = 3:
UPDATE TaiKhoanQuanLy SET LuongCoBan = 20000000 WHERE ID = 3;
- Tăng lương 10% cho toàn bộ tài khoản:
UPDATE TaiKhoanQuanLy SET LuongCoBan = LuongCoBan * 1.1;
2.4. Lệnh DELETE – Xóa dữ liệu
- Xóa tài khoản có ID = 4:
DELETE FROM TaiKhoanQuanLy WHERE ID = 4;
3. Các hàm SQL cơ bản
3.1. Hàm tổng hợp
- Tính tổng mức lương:
SELECT SUM(LuongCoBan) AS TongLuong FROM TaiKhoanQuanLy;
- Tính lương trung bình:
SELECT AVG(LuongCoBan) AS LuongTrungBinh FROM TaiKhoanQuanLy;
- Tìm mức lương cao nhất:
SELECT MAX(LuongCoBan) AS LuongCaoNhat FROM TaiKhoanQuanLy;
- Tìm mức lương thấp nhất:
SELECT MIN(LuongCoBan) AS LuongThapNhat FROM TaiKhoanQuanLy;
3.2. Hàm đếm và nhóm
- Đếm số lượng tài khoản:
SELECT COUNT(*) AS SoTaiKhoan FROM TaiKhoanQuanLy;
- Đếm số tài khoản theo trạng thái hoạt động:
SELECT Active, COUNT(*) AS SoLuong FROM TaiKhoanQuanLy GROUP BY Active;
- Tính tổng lương theo trạng thái hoạt động:
SELECT Active, SUM(LuongCoBan) AS TongLuong FROM TaiKhoanQuanLy GROUP BY Active;
- Tìm tài khoản có mức lương cao thứ hai:
SELECT HoVaTen, LuongCoBan
FROM TaiKhoanQuanLy
ORDER BY LuongCoBan DESC
OFFSET 1 ROW FETCH NEXT 1 ROWS ONLY;
- Đếm số lượng tài khoản có mức lương trên 15 triệu:
SELECT COUNT(*) AS SoLuongTren15Trieu
FROM TaiKhoanQuanLy
WHERE LuongCoBan > 15000000;
- Lấy danh sách tài khoản có họ tên bắt đầu bằng chữ "N":
SELECT * FROM TaiKhoanQuanLy WHERE HoVaTen LIKE N'N%';
- Lấy danh sách tài khoản có mức lương lớn hơn mức trung bình:
SELECT * FROM TaiKhoanQuanLy
WHERE LuongCoBan > (SELECT AVG(LuongCoBan) FROM TaiKhoanQuanLy);
4. Lưu ý khi sử dụng SQL
- Luôn kiểm tra dữ liệu kỹ trước khi thực hiện
DELETEhoặcUPDATE. - Luôn dùng
WHEREđể tránh ảnh hưởng toàn bộ bảng. - Tối ưu hóa truy vấn với
INDEX, đặc biệt khi dữ liệu lớn. - Dùng
JOINthay vì subquery nếu cần hiệu suất tốt. - Dùng
EXECUTION PLAN(SQL Server) để kiểm tra hiệu năng truy vấn. - Không dùng
SELECT *nếu không cần tất cả cột – tránh làm chậm hệ thống. - Nên mã hóa mật khẩu trước khi lưu, ví dụ dùng
HASHBYTES.
Bài tập vận dụng - SQL cơ bản và các hàm SQL
Cho bảng DonHang với cấu trúc sau:
CREATE TABLE DonHang (
ID INT PRIMARY KEY,
KhachHang NVARCHAR(50),
SanPham NVARCHAR(50),
SoLuong INT,
Gia DECIMAL(10,2),
NgayDatHang DATE
);
INSERT INTO DonHang (ID, KhachHang, SanPham, SoLuong, Gia, NgayDatHang) VALUES
(1, 'Nguyen Van A', 'Laptop', 2, 15000000, '2024-03-01'),
(2, 'Tran Thi B', 'Dien Thoai', 1, 12000000, '2024-03-05'),
(3, 'Le Van C', 'May Tinh Bang', 3, 8000000, '2024-03-10'),
(4, 'Pham Thi D', 'Laptop', 1, 16000000, '2024-03-15'),
(5, 'Hoang Van E', 'Dien Thoai', 2, 11000000, '2024-03-20'),
(6, 'Nguyen Thi F', 'Laptop', 1, 15500000, '2024-03-25');
👉 Yêu cầu: Viết các truy vấn SQL để trả lời các câu hỏi sau:
-
Truy vấn dữ liệu cơ bản:
- Lấy toàn bộ thông tin của các đơn hàng.
- Lấy danh sách các sản phẩm đã được đặt hàng, không trùng lặp.
- Lấy danh sách các đơn hàng có giá trị trên 10 triệu.
-
Sắp xếp dữ liệu:
- Sắp xếp đơn hàng theo giá trị đơn hàng (
SoLuong * Gia) giảm dần.
- Sắp xếp đơn hàng theo giá trị đơn hàng (
-
Lọc dữ liệu:
- Tìm các đơn hàng có sản phẩm là "Laptop".
- Tìm các đơn hàng có số lượng mua từ 2 trở lên.
-
Sử dụng hàm tổng hợp:
- Tính tổng doanh thu của tất cả các đơn hàng. (
SUM) - Tính số lượng sản phẩm trung bình trong mỗi đơn hàng. (
AVG) - Tìm đơn hàng có giá trị cao nhất. (
MAX) - Tìm đơn hàng có giá trị thấp nhất. (
MIN)
- Tính tổng doanh thu của tất cả các đơn hàng. (
-
Xử lý chuỗi:
- Lấy danh sách khách hàng có tên bắt đầu bằng chữ "N". (
LIKE)
- Lấy danh sách khách hàng có tên bắt đầu bằng chữ "N". (
-
Sử dụng truy vấn con:
- Lấy danh sách các đơn hàng có giá trị lớn hơn giá trị đơn hàng trung bình.
-
Cập nhật dữ liệu:
- Tăng giá tất cả các sản phẩm lên 5%.
-
Xóa dữ liệu:
- Xóa các đơn hàng có giá trị nhỏ hơn 10 triệu.
👉 Nộp file SQL hoặc word