■ Nối kết MSSQL với HeidiSQL■ Thiết kế Cơ sở dữ liệu (CREATE DATABASE TABLE)■ Tạo truy vấn (CREATE VIEW)■ Bài tập Quản lý Hàng hóa ≡ Hiển thị Đơn đặt hàng ≡ Hiển thị Đơn đặt hàng theo thời điểm giao hàng ≡ Tính Tổng số lượng, Thành tiền các mặt hàng ≡ Tính tổng số tiền đã đặt hàng theo công ty ≡ Tìm công ty đặt hàng nhiều nhất ...■ Bài tập Quản lý Điểm thi của sinh viên ≡ Cho kết quả các môn thi của 1 sinh viên ≡ Cho biết sinh viên đã thi ít nhất là 1 trong các môn cụ thể ≡ Cho biết những môn mà sinh viên chưa có điểm. ≡ Cho biết những sinh viên có điểm thi môn không thấp nhất khoa...
Trang 2* Kết nối SQL Server
Chạy chương trình HeidiSQL (https://www.heidisql.com/download.php?download=portable) và nối kết vào SQL Server:
Nếu không kết nối được thì cần cài Visual Studio 2008 (máy chạy Windows XP, cài thêm SQLServer
2008 SP1 và 2, chọn Upgrade SQL =>2008) hay Visual Studio 2010 (máy chạy Windows 7 trở lên)
Thực thi xong chọn nút Refresh ([F5]) đề quan sát kết quả Bấm chọn vào Database QLHH
* Tạo Table: KhachHang
CREATE TABLE "KhachHang" (
"MaKH" NVARCHAR(4) NOT NULL,
"TenKH" NVARCHAR(30) NULL DEFAULT NULL,
"DiaChi" NVARCHAR(255) NULL DEFAULT NULL,
"DThoai" NVARCHAR(255) NULL DEFAULT NULL,
VIET-PC: Tên
máy
Trang 3* Tạo Table: MatHang
CREATE TABLE "MatHang" (
"MaMH" NVARCHAR(4) NOT NULL,
"TenMH" NVARCHAR(255) NOT NULL,
"DVT" NVARCHAR(255) NULL DEFAULT NULL,
"DonGia" INT NULL DEFAULT NULL,
PRIMARY KEY ("MaMH")
)
;
* Tạo Table: DonDH
CREATE TABLE DonDH (
"MaDH" NVARCHAR(4) NOT NULL,
"NgayDH" DATE NULL,
"NgayGH" DATE NULL,
"MaKH" NVARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY ("MaDH")
)
;
* Tạo Table: ChiTietDH
CREATE TABLE "ChiTietDH" (
"MaDH" NVARCHAR(4) NOT NULL,
"MaMH" NVARCHAR(4) NOT NULL,
"SoLuong" INT NULL DEFAULT NULL
)
;
* Nhập dữ liệu cho Table: KhachHang
Trang 4* Nhập dữ liệu cho Table: MatHang
* Nhập dữ liệu cho Table: DonDH
* Nhập dữ liệu cho Table: ChiTietDH
Trang 5* Khoá ngoại
Là các cột ở một Table khác nhưng có liên kết dữ liệu đến một cột là khoá chính của một Table
* Hiển thị tất cả các Đơn đặt hàng
SELECT DonDH.MaDH, DonDH.MaKH, KhachHang.TenKH, MatHang.TenMH,
MatHang.DVT, MatHang.DonGia, ChiTietDH.SoLuong, [DonGia]*[SoLuong] AS [Thành tiền]
FROM MatHang INNER JOIN (KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH
ON DonDH.MaDH = ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH) ON
MatHang.MaMH = ChiTietDH.MaMH;
Kết quả như sau:
Khoá
ngoại
Foreign
Trang 6Muốn giới hạn chỉ hiển thị các đơn đặt hàng của công ty Hoàng Hôn, thêm vào điều kiện WHERE SELECT DonDH.MaDH, DonDH.MaKH, KhachHang.TenKH, MatHang.TenMH,
MatHang.DVT, MatHang.DonGia, ChiTietDH.SoLuong, [DonGia]*[SoLuong] AS [Thành tiền]
FROM MatHang INNER JOIN (KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH
ON DonDH.MaDH = ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH) ON
MatHang.MaMH = ChiTietDH.MaMH
Where KhachHang.TenKH = 'Hoàng Hôn'
Kết quả như sau:
Tuy nhiên, để tìm các đơn đặt hàng của Biti’s thì khó hơn một chút:
SELECT DonDH.MaDH, DonDH.MaKH, KhachHang.TenKH, MatHang.TenMH,
MatHang.DVT, MatHang.DonGia, ChiTietDH.SoLuong, [DonGia]*[SoLuong] AS [Thành tiền]
FROM MatHang INNER JOIN (KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH
ON DonDH.MaDH = ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH) ON
MatHang.MaMH = ChiTietDH.MaMH
Where KhachHang.TenKH = 'Biti' + Char(39) + 's'
Kết quả như sau:
* Hiển thị các Đơn đặt hàng có Ngày giao hàng trong thời điểm từ 1-3-2004 đến 30-4-2004 SELECT DonDH.MaDH, DonDH.NgayGH, DonDH.MaKH, KhachHang.TenKH,
MatHang.TenMH, MatHang.DVT, MatHang.DonGia, ChiTietDH.SoLuong,
[DonGia]*[SoLuong] AS [Thành tiền]
FROM MatHang INNER JOIN (KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH
ON DonDH.MaDH = ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH) ON
MatHang.MaMH = ChiTietDH.MaMH
Where DonDH.NgayGH >= '2004-03-01' and DonDH.NgayGH <= '2004-04-30'
Trang 7Kết quả như sau:
* Tính Tổng số lượng và Thành tiền các mặt hàng
SELECT ChiTietDH.MaMH, MatHang.TenMH, Sum(ChiTietDH.SoLuong) AS [So
Luong], Sum([SoLuong]*[DonGia]) AS [Thanh Tien]
FROM MatHang INNER JOIN ChiTietDH ON MatHang.MaMH = ChiTietDH.MaMH
GROUP BY ChiTietDH.MaMH, MatHang.TenMH;
Kết quả như sau:
* Tính tổng số tiền đã đặt hàng theo từng công ty, hiển thị MaKH, TenKH, Tong So Tien Chú ý cột Tong So Tien = DonGia * SoLuong
SELECT DonDH.MaKH, KhachHang.TenKH, Sum([SoLuong]*[DonGia]) AS [Tong so tien]
FROM MatHang INNER JOIN (KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH
ON DonDH.MaDH = ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH) ON
MatHang.MaMH = ChiTietDH.MaMH
GROUP BY DonDH.MaKH, KhachHang.TenKH;
Kết quả như sau:
Trang 8* Tìm công ty đặt hàng có Tổng trị giá cao nhất, hiển thị MaKH, TenKH, Tong So Tien
- Trước tiên, tạo View để hiển thị Tổng thành tiền theo Khách hàng:
Create View "View - Thanh tien theo Khach hang" as
SELECT DonDH.MaKH, KhachHang.TenKH, Sum([SoLuong]*[DonGia]) AS [Tong so tien]
FROM MatHang INNER JOIN (KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH
ON DonDH.MaDH = ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH) ON
MatHang.MaMH = ChiTietDH.MaMH
GROUP BY DonDH.MaKH, KhachHang.TenKH
Kết quả như sau, (vào mục Data để xem):
- Sau đó tìm Công ty có Tổng giá trị mua hàng cao nhất:
SELECT MaKH, TenKH, "Tong so tien"
FROM "View - Thanh tien theo Khach hang"
Where "Tong so tien" = (Select Max("Tong so tien") from "View - Thanh tien theo Khach hang")
Kết quả như sau :
- Cuối cùng, tạo View theo Kết quả trên:
Create View "View - Max Thanh tien theo Khach hang" as
SELECT MaKH, TenKH, "Tong so tien"
FROM "View - Thanh tien theo Khach hang"
Where "Tong so tien" = (Select Max("Tong so tien") from "View - Thanh tien theo Khach hang")
Trang 9* Tìm công ty đặt hàng có Tổng trị giá thấp nhất, hiển thị MaKH, TenKH, TongSoTien
- Tìm Công ty có Tổng giá trị mua hàng thấp nhất:
SELECT MaKH, TenKH, "Tong so tien"
FROM "View - Thanh tien theo Khach hang"
Where "Tong so tien" = (Select Min("Tong so tien") from "View - Thanh tien theo Khach hang")
Kết quả như sau :
- Cuối cùng, tạo View theo Kết quả trên:
Create View "View - Max Thanh tien theo Khach hang" as
SELECT MaKH, TenKH, "Tong so tien"
FROM "View - Thanh tien theo Khach hang"
Where "Tong so tien" = (Select Min("Tong so tien") from "View - Thanh tien theo Khach hang")
* Tìm mặt hàng bán chậm nhất (có Tổng trị giá nhỏ nhất) Hiển thị MaMH, TenMH, Tong So Tien
- Trước tiên, tạo View để hiển thị Tổng thành tiền theo Mặt hàng:
Create View "View – Tong thanh tien theo mat hang" as
Select ChiTietDH.MaMH, MatHang.TenMH, Sum (ChiTietDH.SoLuong *
MatHang.DonGia) as ThanhTien From ChiTietDH Inner Join MatHang on
ChiTietDH.MaMH = MatHang.MaMH
Group by ChiTietDH.MaMH, MatHang.TenMH
Kết quả như sau (vào mục Data để xem):
Trang 10- Sau đó tìm Mặt hàng có Tổng giá trị thấp nhất:
Select MaMH, TenMH, ThanhTien from "View – Tong thanh tien theo mat hang"
Where ThanhTien = (Select Min(ThanhTien) from "View – Tong thanh tien theo mat hang")
Kết quả như sau :
- Cuối cùng, tạo View theo Kết quả trên:
Create View "View - Min Tong thanh tien theo mat hang" as
Select MaMH, TenMH, ThanhTien from "View – Tong thanh tien theo mat hang"
Where ThanhTien = (Select Min(ThanhTien) from "View – Tong thanh tien theo mat hang")
* Tìm mặt hàng bán chạy nhất (có Tổng trị giá cao nhất) Hiển thị MaMH, TenMH, TongSoTien
- Tìm Mặt hàng có Tổng giá trị cao nhất:
Select MaMH, TenMH, ThanhTien from "View – Tong thanh tien theo mat hang"
Where ThanhTien = (Select Max(ThanhTien) from "View – Tong thanh tien theo mat hang")
Kết quả như sau :
- Cuối cùng, tạo View theo Kết quả trên:
Create View "View - Min Tong thanh tien theo mat hang" as
Select MaMH, TenMH, ThanhTien from "View – Tong thanh tien theo mat hang"
Where ThanhTien = (Select Max(ThanhTien) from "View – Tong thanh tien theo mat hang")
Trang 11* Tìm mặt hàng được khách đặt hàng nhiều nhất (có số lần đặt hàng lớn nhất) Hiển thị MaMH, TenMH, SoLanDatHang
- Trước hết, tạo View để chứa số lần đặt hàng của các mặt hàng
Create View "View - Dem Mat hang" as
Select ChiTietDH.MaMH, MatHang.TenMH, Count(ChiTietDH.MaMH) as SoLan From ChiTietDH Inner Join MatHang On ChiTietDH.MaMH = MatHang.MaMH
Group by ChiTietDH.MaMH, MatHang.TenMH
- Kết quả như sau:
- Tiếp tục các mặt hàng được đặt hàng nhiều nhất
Select MaMH, TenMH, SoLan from "View - Dem Mat hang"
Where SoLan = (Select Max(SoLan) from "View - Dem Mat hang")
- Kết quả như sau:
* Tìm Khách hàng có Tổng số tiền đặt hàng trung bình trên một hoá đơn là lớn nhất Hiển thị MaKH, TenKH, SoTienTB_HD
- Trước hết, tạo View để chứa số lượng hoá đơn của các khách hàng
Create View "View - So luong Hoa don" as
SELECT DonDH.MaKH, KhachHang.TenKH, Count(DonDH.MaKH) AS [SoLuongHD]
FROM KhachHang INNER JOIN DonDH ON KhachHang.MaKH = DonDH.MaKH
GROUP BY DonDH.MaKH, KhachHang.TenKH
Trang 12- Kết quả như sau:
- Trong “View – Tong Thanh tien theo Khach hang” đã có Tổng số tiền của từng Khách hàng, Đem số này chia cho Số lượng HĐ là có kết quả:
Create View "View - So tien TB tren HD" as
SELECT "View - So luong Hoa don".MaKH, "View - So luong Hoa don".TenKH,
"View - Thanh tien theo Khach hang"."Tong So Tien" / "View - So luong Hoa don".SoLuongHD as TBSoTienHD
FROM "View - So luong Hoa don" INNER JOIN "View - Thanh tien theo Khach
hang" ON "View - Thanh tien theo Khach hang".MaKH = "View - So luong Hoa don".MaKH
- Kết quả như sau:
- Cuối cùng tìm khách hàng có số tiền TB trên hoá đơn cao nhất:
SELECT MaKH, TenKH, TBSoTienHD
From "View - So tien TB tren HD"
Where TBSoTienHD = (Select Max(TBSoTienHD) from "View - So tien TB tren HD")
- Kết quả như sau:
Trang 13- Tạo View cho truy vấn:
Create View "View - Max So tien TB tren HD" as
SELECT MaKH, TenKH, TBSoTienHD
From "View - So tien TB tren HD"
Where TBSoTienHD = (Select Max(TBSoTienHD) from "View - So tien TB tren HD")
* Tìm các Khách hàng không có đặt hàng trong tháng 5/2004 Hiển thị MaKH, TenKH
- Trước hết, tạo View để tìm các khách hàng có đặt hàng trong tháng 5/2004:
Create View "View - Khach hang dat hang thang 5/2004" as
SELECT CONVERT(VARCHAR(10),NgayGH,103) as [Ngay GH], DonDH.MaKH,
KhachHang.TenKH
FROM KhachHang INNER JOIN (DonDH INNER JOIN ChiTietDH ON DonDH.MaDH =
ChiTietDH.MaDH) ON KhachHang.MaKH = DonDH.MaKH
Where NgayGH >= '2004/05/01' And NgayGH <= '2004/05/31'
- Kết quả như sau:
- Sau đó tìm các khách hàng có trong danh sách KhachHang nhưng không có trong danh sách trên
Create View "View - Khach hang khong dat hang thang 5/2004" as
Select KhachHang.MaKH, KhachHang.TenKH from KhachHang
where KhachHang.MaKH not in (Select MaKH from "View - Khach hang dat hang thang 5/2004")
- Kết quả như sau:
Trang 14* Tìm các Mặt hàng không có khách hàng nào đặt hàng Hiển thị MaMH, TenMH
- Trước hết, tạo View để tìm các mặt hàng có đặt hàng trong tất cả các đơn đặt hàng:
Create View "View - Mat hang co dat hang" as
Select Distinct ChiTietDH.MaMH, MatHang.TenMH from ChiTietDH Inner Join MatHang on ChiTietDH.MaMH = MatHang.MaMH
- Kết quả như sau:
- Tiếp tục tìm các mặt hàng không được đặt hàng:
Create View "View - Mat hang khong co dat hang" as
Select MaMH, TenMH from MatHang
Where MaMH not in
(Select MaMH from "View - Mat hang co dat hang")
- Kết quả như sau:
Trang 16* Tạo Database QuanLySinhVien
- Trước hết, nếu đã có QuanLySinhVien thì xoá đi, sau đó tạo và Chọn QuanLySinhVien để làm việc:
If Exists (Select Name from Sys.Databases Where Name=N'QuanLySinhVien')
Drop Database QuanLySinhVien;
Create Database QuanLySinhVien;
Use QuanLySinhVien;
- Chọn Refresh để xem kết quả:
* Tạo Table SinhVien
- Trước hết, nếu đã có Table SinhVien thì xoá đi, sau đó tạo lại Table SinhVien:
If Exists (Select Name from Sys.Tables Where Name=N'SinhVien') Drop Table SinhVien;
Create Table SinhVien
(
MaSV Int Not Null Primary Key Identity,
TenSV NVarChar(50) Not Null,
* Tạo Table MonHoc
- Nếu đã có Table MonHoc thì xoá đi, sau đó tạo lại Table MonHoc:
If Exists (Select Name from Sys.Tables Where Name=N'MonHoc') Drop Table MonHoc;
Create Table MonHoc
(
MaMH Int Not Null Primary Key Identity,
TenMH NVarChar(50),
DVHT Int
Trang 17* Tạo Table KetQua
- Nếu đã có Table KetQua thì xoá đi, sau đó tạo lại Table KetQua:
If Exists (Select Name from Sys.Tables Where Name=N'KetQua') Drop Table KetQua;
Create Table KetQua
(
MaSV Int,
MaMH Int,
Diem Int,
Constraint Check_Diem Check (Diem Between 0 and 10),
Constraint Primary_Key Primary Key (MaSV, MaMH),
Constraint KhoaNgoai_SV_KQ Foreign Key (MaSV) References SinhVien (MaSV),
Constraint KhoaNgoai_MH_KQ Foreign Key (MaMH) References MonHoc (MaMH) )
* Nhập dữ liệu vào Table SinhVien
Insert Into Sinhvien
Select N 'Phạm Trung Tính', 'Nam', '03/30/1996', N 'Quảng Ninh', 'L01' Union All
Select N 'Trần Bảo Trọng', 'Nam', '12/14/1995', 'Hà Giang', 'L02' Union All
Select N 'Lê Thùy Dung', N 'Nữ', '05/12/1997', N 'Hà Nội', 'L03' Union All
Select N 'Lê Trường An', 'Nam', '11/20/1995', N 'Ninh Bình', 'L04' Union All
Select N 'Phạm Thị Hương Giang', N 'Nữ', '2/21/1999', N 'Hòa Bình', 'L02' Union All
Select N 'Đoàn Duy Thức', 'Nam', '4/12/1994', N 'Hà Nội', 'L01' Union All
Select N 'Dương Tuấn Thông', 'Nam', '4/12/1991', N 'Nam Định', 'L03' Union All
Select N 'Lê Thành Đạt', 'Nam', '4/15/1993', N 'Phú Thọ', 'L04'
- Bấm phím F5 (hoặc chọn Refresh), chọn dbo.SinhVien và mục Data để xem kết quả:
Trang 18* Nhập dữ liệu vào Table MonHoc
Insert Into MonHoc
Select N 'Toán cao cấp', 3 Union All
Select N 'Mạng máy tính', 3 Union All
Select N 'Tin học đại cương', 4 Union All
Select N 'Hệ quản trị cơ sở dữ liệu', 2 Union All
Select N 'Cơ sở dữ liệu', 2
- Tương tự, xem kết quả như sau:
* Nhập dữ liệu vào Table KetQua
Insert Into Ketqua
Select 1,1,8 Union All
Select 1,2,5 Union All
Select 2,2,1 Union All
Select 3,2,7 Union All
Select 4,2,3 Union All
Select 1,3,7 Union All
Select 2,1,9 Union All
Select 4,1,2 Union All
Select 3,1,4 Union All
Select 2,3,2 Union All
Select 5,1,4 Union All
Select 6,1,2 Union All
Select 6,3,9 Union All
Select 6,2,7 Union All
Select 6,5,10
Trang 19- Tương tự, xem kết quả như sau:
Ví dụ 1: Cho biết mã số, tên, điểm thi tất cả các môn của sinh viên Phạm Trung Tính
- Tìm điểm của sinh viên theo tên sinh viên:
Select MH.MaMH, TenMH, Diem
From SinhVien SV, MonHoc MH, KetQua KQ
Where SV.MaSV = KQ.MaSV and MH.MaMH = KQ.MaMH and TenSV = N'Phạm Trung Tính'
- Kết quả như sau:
Ví dụ 2: Cho biết mã số, tên, điểm thi tất cả các môn của sinh viên có mã sinh viên = 2
- Tìm điểm của sinh viên theo mã sinh viên:
Select MH.MaMH, TenMH, Diem
From SinhVien SV, MonHoc MH, KetQua KQ
Where SV.MaSV = KQ.MaSV and MH.MaMH = KQ.MaMH and SV.MaSV = 2
Trang 20- Kết quả như sau:
Ví dụ 3: Cho biết mã số, tên môn và điểm thi ở những môn mà sinh viên Đoàn Duy Thức phải thi lại (điểm<5)
- Thực hiện:
Select MH.MaMH, TenMH, Diem
From SinhVien SV, MonHoc MH, KetQua KQ
Where SV.MaSV = KQ.MaSV and MH.MaMH = KQ.MaMH and Diem < 5
and TenSV = N'Đoàn Duy Thức'
- Kết quả như sau:
Ví dụ 4: Cho biết mã số, tên những sinh viên đã thi ít nhất là 1 trong 3 môn Cơ sở dữ liệu, cấu trúc dữ
liệu, mạng máy tính
- Thực hiện:
Select SV.MaSV, TenSV
From SinhVien SV, MonHoc MH, KetQua KQ
Where SV.MaSV = KQ.MaSV and MH.MaMH = KQ.MaMH and TenMH in (N'Cơ sở dữ liệu', N'Cấu trúc dữ liệu', N'Mạng máy tính')
- Kết quả như sau: