Tài liệu thực hành cơ sở dữ liệu 1

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 12

Tài liệu thực hành thi sql

Cơ bản về sql
SQL không phân biệt hoa thường. Ví dụ: cột hay bảng đặt tên thường cũng có thể gọi hay thao tác nếu
dùng chữ hoa, chỉ phân biệt kí tự không phân biệt hoa thường cả các câu lệnh của sql cũng vậy

Và đừng quên là vận dụng các kiến thức lý thuyết của phần MÔ HÌNH QUAN HỆ và ĐẠI SỐ
QUAN HỆ để hiểu và học lập trình SQL nhanh hơn.

Các câu lệnh cơ bản thao tác với các bảng


Tạo cơ sở dữ liệu
CREATE DATABASE quanLiBDS;

Xóa bảng
DROP TABLE Person

Tạo bảng và khóa chính hoặc thêm khóa chính riêng


CREATE TABLE VANPHONG(

MaVP int primary key,

TenVP varchar(50) not null,

DiaChi varchar(250) not null,

);

Tạo bảng và liên kết khóa ngoại


CREATE TABLE BDS(
MaBDS int primary key,

DiaChi varchar(250) not null,

--Khóa ngoại chủ sở hữu

MaCSH int references CHUSOHUU(MaCSH),

--Khóa ngoại thuộc văn phòng nào

MaVP int references VANPHONG(MaVP)

);

Thêm cột cho một bảng bằng alter


--Thêm cột điện thoại cho bảng nhân viên

ALTER TABLE NHANVIEN

ADD DienThoai varchar(10) not null;

Thêm điều kiện cho một cột


--Thêm cột giá bán cho bảng BDS và GiaBan > 0

ALTER TABLE BDS

ADD CONSTRAINT Check_GiaBan

CHECK (GiaBan>0);

Xóa một cột trong bảng


--Xóa cột ngáy sinh trong bảng nhân thân

ALTER TABLE THANNHAN

DROP NgaySinh;

Các câu lệnh select


Cú pháp câu lệnh select

SELECT <tên cột | biểu thức> [ ,…]


[ FROM <tên bảng> [ ,…] ]
[ WHERE <điều kiện logic trên dòng / bộ> ]
[GROUP BY <các thuộc tính gom nhóm> ]
[HAVING <điều kiện logic gom nhóm> ]
[ ORDER BY <các thuộc tính sắp xếp> ]
Lấy dữ liệu của cột FirstName trong bảng Persons

SELECT FirstName FROM Persons;

Lấy các hàng từ bảng Contest, chỉ lấy hàng thoả mãn điều kiện giá trị ở cột ContestDate lớn
hơn hặc bằng '05/25/2006'
SELECT * FROM Contest

WHERE ContestDate >= '05/25/2006';

Lấy dữ liệu của tất cả các cột trong bảng Persons mà có giá trị ở cột FirstName là
Peter và LastName là JackSon

SELECT * FROM Persons

WHERE FirstName='Peter'

AND LastName='Jackson;

Lấy dữ liệu của tất cả các cột trong bảng Persons

SELECT * FROM Persons ;

Lấy dữ liệu của tất cả các cột trong bảng Persons

mà có giá trị ở cột FirstName bắt đầu là kí tự 'a'

SELECT * FROM Persons

WHERE FirstName LIKE 'a%' ;

Kiểm tra có kí tự không quan tâm đến nằm ở đâu trong cột

LIKE N'%Kí tự cần tìm%'


Hiển thị giá trị lương thấp nhất và cao nhất từ bảng NhanVien

Select min(LUONG),

max(LUONG)

from NHANVIEN;

--b. Hiển thị 10 khách hàng đầu tiên trong bảng khách hàng bao gồm các cột: mã
--khách hàng, họ và tên, email, số điện thoại
SELECT TOP 10* FROM KHACHHANG;

--d. Hiển thị danh sách khách hàng có tên bắt đầu bởi kí tự ‘H’ gồm các cột:
--maKhachHang, hoVaTen, diaChi. Trong đó cột hoVaTen ghép từ 2 cột
--hoVaTenLot và Ten
select makhachhang, hovatenlot + ' ' +ten as 'Ho va ten', diachi
from KHACHHANG
where ten like 'H%';

--g. Hiển thị danh sách các hoá hơn có trạng thái là chưa thanh toán và ngày mua hàng
--trong năm 2016
select * from HOADON
where YEAR(ngaymuahang)=2016
and trangThai like N'%chưa thanh toán%';

Hiển thị thêm cột tổng tiền


SELECT maSanPham, tenSP, donGia*soLuong as 'Tổng tiền tồn kho' FROM SANPHAM;

Hiển thị khách hàng có địa chỉ ở Đà Nằng


SELECT * FROM KHACHHANG
WHERE diaChi LIKE N'%Đà Nẵng%';

Hiển thị các sản phẩm với điều kiện 100 <= soLuong <= 500
SELECT * FROM SANPHAM
WHERE soLuong >= 100
AND soLuong <= 500 ;

Hiển thị tất cả hóa đơn có năm mua bằng 2016 và tháng 12 trong trạng thái chưa thanh toán
SELECT * FROM HOADON
WHERE YEAR(ngayMuaHang)=2016
and MONTH(ngayMuaHang)=12
and TRANGTHAI LIKE N'%Chưa thanh toán%';

Hiển thị tất cả hóa đơn có mã khách hàng là KH001 hoặc KH002 hoặc KH003
SELECT * FROM HOADON
WHERE maKhachHang LIKE 'KH001'
OR maKhachHang LIKE 'KH002'
OR maKhachHang LIKE 'KH003';

Đếm tổng số lượng khách hàng từ bảng khách hàng

SELECT COUNT(*) as 'SLKH' FROM KHACHHANG ;

Hiển thị đơn giá lớn nhấtv từ bảng sản phẩm

SELECT MAX(donGia) as 'DGMAX' FROM SANPHAM ;

Hiển thị số lượng nhỏ nhất trong bảng sản phẩm

SELECT MIN(soLuong) as 'SLMIN' FROM SANPHAM ;

Hiển thị tổng số lượng sản phẩm

SELECT SUM(soLuong) as 'TSL' FROM SANPHAM ;

Hiển thị tất cả hóa đơn mua trong tháng 12 nằm 2016 và trong trạng thái chưa thanh toán

SELECT * FROM HOADON

WHERE YEAR(ngayMuaHang)=2016

and MONTH(ngayMuaHang)=12

and TRANGTHAI LIKE N'%Chưa thanh toán%';

Hiển thị số lượng sản phẩm từ bảng hóa đơn chi tiết và sắp xếp theo mã hóa đơn

SELECT maHoaDon, COUNT(MASANPHAM) as'Số Loại Sản Phẩm'

FROM HOADONCHITIET GROUP BY maHoaDon;

Hiển thị hóa đơn, đếm số loại sản phẩm từ bảng hóa đơn chi tiết và sắp xếp theo mã hóa đơn
nếu tổng mã sản phẩm lớn hơn 1

SELECT maHoaDon, COUNT(MASANPHAM) as'Số Loại Sản Phẩm'


FROM HOADONCHITIET

GROUP BY maHoaDon

HAVING COUNT(MASANPHAM)>=2;

Hiển thị các hóa đơn và sắp xếp theo ngày giảm dần

SELECT maHoaDon,ngayMuaHang,maKhachHang

FROM HOADON ORDER BY ngayMuaHang DESC;

Đếm tổng hóa đơn và sắp xếp theo mã khách hàng

SELECT COUNT(*) as 'SL',maKhachHang as 'maKhackHang' FROM HOADON GROUP BY


maKhachHang ;

Hiển thị tổng hóa đơn đang trong trạng thái chưa thanh toán vfa sắp xếp theo mã khách hàng

SELECT COUNT(*) as 'SỐ LƯỢNG',maKhachHang as 'maKhackHang'

FROM HOADON WHERE TRANGTHAI LIKE N'chưa thanh toán' GROUP BY maKhachHang ;

Liệt kê họ tên và địa chỉ của tất các các phi công từ bảng PHICONG
SELECT hoten, dchi
FROM PHICONG ;

1.1. SELECT ... AS


AS được dùng để đặt lại tên thuộc tính hoặc bí danh cho bảng - ta kết hợp SELECT với từ khoá
AS như sau:

Đặt lại tên thuộc tính


SELECT hoten AS hoten_phicong, dchi AS diachi_phicong
FROM PHICONG ;

Đặt bí danh tạm thời rút ngắn câu lệnh


SELECT p.hoten AS hoten_phicong, p.dchi AS diachi_phicong
FROM PHICONG AS p;
Hoặc rút ngắn hơn nữa
SELECT p.hoten hoten_phicong, p.dchi diachi_phicong
FROM PHICONG p;

1.2. SELECT *
Dùng để thể hiện thị tất cả dữ liệu của một bảng bất kỳ
SELECT * FROM PHICONG;

1.3. SELECT DISTINCT


Giả sử trong trường hợp có nhiều dòng dữ liệu trùng nhau gây khó khăn cho việc
kiểm tra. Ta có thể dùng SELECT DISTINCT để loại bỏ các dòng bị trùng và chỉ giữ
lại một.

Hiện thị họ tên phi công, loại bỏ các dòng trùng nhau
SELECT DISTINCT hoten FROM PHICONG;

2.1. Mệnh đề WHERE


WHERE là một mệnh đề tuỳ chọn, được dùng để chỉ ra một tập các điều kiện chọn -
> những bộ nào thỏa mãn các điều kiện sẽ là các bộ trong bảng kết quả.

 Các điều kiện chọn chỉ có thể đặt sau WHERE hoặc HAVING (xem phần GROUP BY)
 Các phép toán so sánh với các toán tử: <=, >, >=, != (<>)
 Các toán tử AND, OR và NOT với thứ tự ưu tiên NOT, AND, OR
 Các toán tử IN, LIKE, BETWEEN, IS NULL ,..

Tìm họ tên phi công sống ở Paris


SELECT hoten
FROM PHICONG
WHERE dchi = 'Paris';

2.2. Toán tử IN
Mệnh đề IN cho phép chỉ ra nhiều giá trị trong mệnh đề WHERE
Cú pháp:
SELECT <tên cột> [ ,…]
FROM <tên bảng>
WHERE <tên cột> IN (giá trị 1, giá trị 2, …, giá trị n);

Tìm họ tên các phi công ở các nước Anh, Pháp hoặc Úc.
SELECT hoten
FROM PHICONG
WHERE nuoc IN ('Phap','Anh','Uc');

2.3. Toán tử BETWEEN


Toán tử BETWEEN cho phép chọn một giá trị trong một giới hạn. Giá trị có thể là số,
chuỗi hoặc ngày

Cú pháp:
SELECT <tên cột> [ ,…]
FROM <tên bảng>
WHERE <tên cột> BETWEEN <giá trị 1> AND <giá trị 2>;

Tìm thông tin tất cả các chuyến bay từ 10000 km đến 15000 km
SELECT *
FROM CHUYENBAY
WHERE khoangcach BETWEEN 10000 AND 15000;

2.4. Toán tử LIKE


Toán tử LIKE được sử dụng trong mệnh đề WHERE để tìm một mẫu cụ thể trong một
cột.

Cú pháp
SELECT <tên cột> [ ,…]
FROM <tên bảng>
WHERE <tên cột> LIKE <mẫu>;
 %: Không hoặc nhiều ký tự

 -: Một ký tự duy nhất

 [ Danh sách các ký tự ]: Tập hợp các ký tự cùng so khớp

 [^ Danh sách các ký tự ]: Chỉ khớp với một ký tự nằm trong [ ]

Tìm họ tên phi công bắt đầu bằng chữ D.


SELECT hoten
FROM PHICONG
WHERE hoten LIKE 'D%';

Tìm họ tên phi công kết thúc bằng chữ s


SELECT hoten
FROM PHICONG
WHERE hoten LIKE '%s';

Tìm họ tên phi công có chứa ký tự ot


SELECT hoten
FROM PHICONG
WHERE hoten LIKE '%ot%';

Tìm tên phi công có ký tự m ở vị trí thứ 2


SELECT hoten
FROM PHICONG
WHERE hoten LIKE '_m%';

Tìm tên phi công bắt đầu bằng chữ S và có ít nhất 2 ký tự


SELECT hoten
FROM PHICONG
WHERE hoten LIKE 'S_%';

Tìm tên phi công bắt đầu bằng chữ S và có ít nhất 3 ký tự


SELECT hoten
FROM PHICONG
WHERE hoten LIKE 'S__%';
Tìm tên phi công bắt đầu bằng chữ S và kết thúc bằng chữ t
SELECT hoten
FROM PHICONG
WHERE hoten LIKE 'S%t';

Ngược lại, bạn có thể tìm kết quả ngược lại với LIKE bằng NOT LIKE
Tìm tên phi công không bắt đầu bằng chữ S
SELECT hoten
FROM PHICONG
WHERE hoten NOT LIKE 'S%';

2.5. Giá trị NULL


Trong một dòng dữ liệu, một vài thuộc tính có thể nhận giá trị NULL. Giá trị NULL
có thể là: không rõ ràng hoặc không tồn tại
Các kết quả của bất kỳ biểu thức số học với giá trị NULL sẽ là NULL (Ví dụ: 5 + NULL -> NULL). Để
kiểm tra giá trị NULL dùng toán tử IS NULL hoặc IS NOT NULL.

Tìm họ tên phi công không rõ địa chỉ.


SELECT hoten
FROM PHICONG
WHERE dchi IS NULL;

Các hàm SQL Server thao tác với chuỗi, ngày:

 Các hàm chuỗi: LEN, UPPER, LOWER, LEFT, RIGHT, LTRIM, RTRIM, …

 Các hàm ngày: GETDATE, DAY, MONTH, YEAR, DATEDIFF, ISDATE, ...

Các hàm SQL Server hỗ trợ tính toán toán học:

 Hàm AVG (Tính giá trị trung bình) = tổng các giá trị không NULL / số các giá trị không NULL

 Các hàm MIN, MAX, COUNT có thể sử dụng cho CHAR, VARCHAR, DATE và các kiểu dữ
liệu số

 Hàm SUM, AVG chỉ sử dụng duy nhất cho kiểu số

Đếm số công ty có trụ sở tại Anh.


SELECT COUNT(*) AS SOCT_ANH
FROM CONGTY
WHERE nuoc = 'Anh';
Tính tuổi trung bình của các phi công sống tại Pháp
SELECT AVG(AGE) AS TUOI_TB
FROM PHICONG
WHERE DCHI = 'Pháp';

Order by
sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần, dựa trên một hoặc nhiều cột. Một số
cơ sở dữ liệu sắp xếp các kết quả truy vấn theo thứ tự tăng dần theo mặc định. Lệnh ASC
được sử dụng để sắp xếp tăng dần và DESC được sử dụng để sắp xếp giảm dần.

SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

Khối lệnh sau đây sẽ sắp xếp kết quả theo thứ tự tăng dần bởi các trường NAME và SALARY:
SELECT * FROM CUSTOMERS
ORDER BY NAME, SALARY;

Khối lệnh sau sẽ sắp xếp kết quả theo thứ tự giảm dần bởi trường NAME.
SELECT * FROM CUSTOMERS
ORDER BY NAME DESC;

Group by
để sắp xếp dữ liệu giống nhau thành các nhóm. Mệnh đề GROUP BY này tuân theo
mệnh đề WHERE trong câu lệnh SELECT và đứng trước mệnh đề ORDER BY.

SELECT column1, column2


FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2
ORDER BY column1, column2
Nếu bạn muốn biết tổng số tiền lương của mỗi khách hàng, thì truy vấn GROUP BY
sẽ như sau.
SELECT NAME, SUM(SALARY) FROM CUSTOMERS
GROUP BY NAME;

You might also like