I Ngôn ngữ định nghĩa DDL Tạo database CREATE DATABASE ; VD CREATE DATABASE db; Nhớ phải sử dụng master hoặc ghi USE master Xóa database USE master DROP DATABASE VD DROP D.
Trang 1I Ngôn ngữ định nghĩa DDL
Tạo database
CREATE DATABASE <tên database>;
VD: CREATE DATABASE db;
Nhớ phải sử dụng master hoặc ghi USE master
Xóa database
USE master
DROP DATABASE <tên database>
VD: DROP DATABASE db;
Tạo bảng
- Cách 1:
USE <Tên database chứa bảng>
CREATE TABLE <tên bảng>(
Khai báo các cột và ràng buộc );
- Cách 2:
Chế độ master
CREATE TABLE <tên database>.<dbo>.<tên bảng>(
Khai báo các cột và ràng buộc )
VD: CREATE TABLE db.dbo.bang(
… )
Hoặc sử dụng cả dấu [] ở tên
Việc sử dụng dấu [] để tránh nhầm tên với các từ khóa của SQL
- Tạo bảng tự động sinh giá trị khóa chính
create table student(
id int primary key identity( , ),
name varchar(50),
sex varchar(50),
dob date,
age int,
jpa float
)
Xóa bảng
Cũng có hai cách như tạo bảng:
Cách 1:
USE <tên database chứa bảng>
DROP TABLE <tên bảng>
Cách 2: DROP <tên database>.<dbo>.<tên bảng>
Trang 2Khai báo các thuộc tính bên trong bảng
Cú pháp: <tên cột> <kiểu dữ liệu> <các ràng buộc cho cột>;
VD: NAME VARCHAR(32) NOT NULL PRIMARY KEY,
- Mỗi khai báo cột của bảng được phân cách nhau bởi dấu phẩy
Cách tạo khóa chính
Có hai cách tạo khóa chính:
1 Đặt ngay sau khai báo tên cột
VD: ACCOUNT_ID INT PRIMARY KEY,
2 Sử dụng hàm PRIMARY KEY
VD: PRIMARY KEY(ACCOUNT_ID);
Bên trong dấu ngoặc có thể có nhiều khóa chính
Khóa ngoại tham chiếu đến khóa chính
Có 2 cách để tạo khóa ngoại
C1: đặt ngay sau khai báo thuộc tính từ khóa sau: REFERENCES <tên bảng>(tên thuộc tính tham chiếu đến)
VD: CUS_CODE CHAR(8) NOT NULL REFERENCES
CUSTOMER(CUS_CODE),
C2: sử dụng cú pháp sau:
FOREIGN KEY (tên khóa ngoại) REFERENCES <tên bảng cần tham chiếu đến> (tên thuộc tính tham chiếu đến)
VD: FOREIGN KEY(CUS_CODE) REFERENCES CUSTOMER(CUS_CODE)
Các ràng buộc cho cột
1 NOT NULL: không cho phép giá trị NULL trong cột
2 DEFAULT: nếu không gán giá trị thì mặc định là giá trị mặc định
VD: DEFAULT <giá trị mặc định>,
3 UNIQUE: giá trị của cột không được trùng lặp
4 ON UPDATE CASECADE: ràng buộc cho khóa ngoại, tức là sau khi khóa chính
bị thay đổi thì khóa ngoại tham chiếu đến cũng thay đổi
5 ON DELETE CASECADE: ràng buộc cho khóa ngoại và áp dụng cho thực thể yếu, tức một dòng của thực thể chính bị xóa thì sẽ gây ra việc xóa tự động dòng tương ứng trong thực thể yếu
6 CHECK(điều kiện cho cột ): kiểm tra điều kiện cho cột
Có 2 cách để ràng buộc cho cột:
C1: đặt ràng buộc ngay sau khai bao tên cột
C2: Sử dụng cú pháp: CONSTRAINT <tên ràng buộc> <ràng buộc>,
Có thể có ràng buộc cho nhiều biến
VD: CONSTRAINT CUS_UI1 UNIQUE (CUS_LNAME, CUS_FNAME);
Tên ràng buộc để sau này có thể dùng để xóa ràng buộc
Các kiểu dữ liệu
INT hoặc INTEGER: đây là số nguyên
REAL hoặc FLOAT: đây là số thực
Trang 3CHAR(n): đây là kiểu ký tự có độ dài cố định, dù nhập ít hơn n thì bộ nhớ vẫn cấp n
ký tự
VARCHAR(n): chuỗi có độ dài thay đổi, max là n ký tự
NUMERIC(p,d): là kiểu số với độ dài p, và d chữ số sau dấu phẩy
DATE: kiều ngày tháng, định dạng: yyyy-mm-dd
TIME: thời gian có định dạng hh:mm:ss
DATETIME hoặc TIMESTAMP: cả ngày tháng và thời gian: yyyy-mm-dd hh:mm:ss
Câu lệnh ALTER
1 Xóa cột
Nếu cột không có ràng buộc CONSTRAINT thì ta sử dụng câu lệnh sau để xóa ALTER TABLE <tên bảng>
DROP COLUMN<tên cột>
Nếu cột có ràng buộc CONSTRAINT thì ta phải xóa ràng buộc trước rồi mới xóa cột Câu lệnh như sau
ALTER TABLE <tên bảng>
DROP CONSTRAINT <tên ràng buộc>,
COLUMN <tên cột>;
VD: ALTER TABLE bang
DROP CONSTRAINT ck1,
COLUMN luong;
2 Xóa khóa chính
Muốn xóa khóa chính thì phải tạo ràng buộc CONSTRAINT PRIMARY KEY và đặt tên cho ràng buộc
Đầu tiên xóa ràng buộc, sau đó xóa tên cột như phần xóa cột
Lưu ý là không được xóa hết cột, vì một bảng phải có ít nhất một cột
3 Thay đổi kiểu dữ liệu của cột
Trong trường hợp muốn thay đổi kiểu dữ liệu cho thuộc tính thì phải đáp ứng hai điều kiện: (1) cột thuộc tính phải rỗng, (2) không có thuộc tính khác tham chiếu đến
Cú pháp: ALTER TABLE <tên bảng>
MODIFY (<tên cột> <kiểu dữ liệu mới>)
VD: ALTER TABLE PRODUCT
MODIFY(V_CODE CHAR(5));
4 Thêm cột vào bảng
Cú pháp: ALTER TABLE <tên bảng>
ADD <tên cột> <kiểu dữ liệu> <ràng buộc nếu cần>
VD: ALTER TABLE bang
ADD newcot CHAR(8) CONSTRAINT ck1 UNIQUE(newcot);
5 Thêm ràng buộc CONSTRAINT
6 Thêm khóa chính, khóa ngoại
Trang 4- Thêm khóa chính: Điều kiện chưa có khóa chính
Cú pháp: ALTER TABLE <tên bảng>
ADD PRIMARY KEY(<tên các cột>) Lưu ý: Ràng buộc cho cột được chọn làm khóa chính phải là NOT NULL
- Thêm khóa ngoại:
Cú pháp: ALTER TABLE <tên bảng>
ADD FOREIGN KEY(<tên khóa ngoại>) REFERENCES <tên bảng tham chiếu đến>(<tên cột tham chiếu đến>)
II Ngôn ngữ thao tác dữ liệu DML
1 Các câu lệnh không truy vấn
Thêm các bản ghi vào bảng
- Thêm vào tất cả các cột
Cú pháp: INSERT INTO <tên bảng> VALUES(<các giá trị của từng cột>)
VD: INSERT INTO bang VALUES(‘Nguyen Ba Nhat’, 123);
- Chỉ thêm một số cột, các cột còn lại là NULL
Cú pháp: INSERT INTO <tên bảng>(<tên các cột cần thêm>) VALUES(<giá trị các cột>)
VD: INSERT INTO bang(name) VALUES(‘Nguyen Ba Nhat’);
Có thể liệt kê các bản ghi trong () cách nhau bởi dấu phẩy sau từ VALUES
VD: INSERT INTO bang VALUES('nguyen thi e', 22),
('nguyen thi na', 33), ('le thi be', 18)
Xóa các bản ghi của bảng
Cú pháp: DELETE FROM <tên bảng> WHERE <biểu thức điều kiện>
Tức là những hàng nào thõa mãn điều kiện sẽ được xóa
Chú ý: Nếu không có WHERE đằng sau thì sẽ xóa tất cả bản ghi
Thay đổi dữ liệu của một hoặc nhiều hàng
Cú pháp: UPDATE <tên bảng>
SET <tên cột> = <giá trị mới> WHERE <biểu thức điều kiện>
Tức là thay đổi giá trị của cột thõa mãn điều kiện
VD: UPDATE bang
SET name = ‘Le Thi e’ WHERE luong = 22
Có thể thay đổi trên nhiều cột, các cột được liệt kê cách nhau bởi dấu phẩy
VD: UPDATE bang
SET name = ‘Le thi n’, luong = 11 WHERE luong IS NULL Nếu không có câu lệnh WHERE thì thay đổi sẽ được thực hiện trên tất cả các hàng
Lưu các thay đổi trong bảng
Các thay đổi sẽ được lưu vĩnh viễn, tránh được trường hợp dữ liệu bị mất khi đột ngột mất điện
Trang 5Cú pháp: BEGIN TRAN <tên giao dịch>
<Các câu lệnh thay đổi>
COMMIT TRAN <tên giao dịch>
VD: BEGIN TRAN d
UPDATE bang
SET luong = 12 WHERE name = 'le thi n'
COMMIT TRAN d
Phục hồi nội dung của bảng
Nếu bạn chưa sử dụng câu lệnh COMMIT để lưu vĩnh viễn những thay đổi, bạn
có thể khôi phục lại dữ liệu trước đó nhờ câu lệnh ROLLBACK
BEGIN TRAN <tên giao dịch>
<Các câu lệnh để thay đổi>
ROLLBACK TRAN <tên giao dịch>
VD: BEGIN TRAN
UPDATE bang
SET luong = 14 WHERE name = 'le thi n'
ROLLBACK TRAN
2 Câu lệnh truy vấn
Chỉ có một lệnh là SELECT
Lấy tất cả các bản ghi của bảng
Cú pháp: SELECT * FROM <tên bảng> WHERE <điều kiện>
WHERE có thể có hoặc không
VD: SELECT*FROM bang
Lấy một số các cột
SELECT <tên cột 1>, <tên cột 2>, … FROM <tên bảng> WHERE <điều kiện>
So sánh về thời gian trong SQL
VD: SELECT*FROM bang WHERE ngaySinh > '19980512'
Sử dụng các cột tính toán và đổi tên các cột
Giả sử câu truy vấn cần xác định một giá trị không được lưu trữ vật lý mà được tính toán từ các thông số trong CSDL
VD: SELECT name, tuoi, ngaySinh, (toan+van)/2 AS TB
FROM bang
Lấy điểm trung bình được sinh ra từ cột toan và van trong CSDL đặt tên là TB với
từ khóa AS
Tính toán với thời gian
VD: SELECT name, tuoi, ngaySinh, toan, van, GETDATE()
- 20 AS [day] FROM bang
Các phép toán AND, OR, NOT
AND: và
OR: hoặc
Trang 6NOT: phủ định
Các toán tử đặc biệt trong SQL
- BETWEEN: kiểm tra giá trị có nằm trong khoảng nào đó không
VD: SELECT * FROM bang WHERE toan BETWEEN 8 AND 9
- IS NULL: được dùng để xác định một thuộc tính có NULL không
- LIKE: dùng như REGEX trong java
VD: SELECT * FROM bang WHERE name LIKE 'nguyen%'
Liệt kê các học sinh có họ là nguyễn
Các regex như:
+ %: chỉ một chuỗi ký tự
VD: ‘B%’ chỉ chuỗi bắt đầu bằng B
‘%O%’ chỉ chuỗi chứa O
+ Ký hiệu _: chỉ ký tự còn thiếu:
VD: ‘AD_O’: chỉ một từ có 4 ký tự
+Ký hiệu[]: chỉ một trong các ký tự trong [] sẽ phù hợp
VD: ‘Sm[iy]th’ sẽ có 2 từ thõa mãn là Smith và Smyth
+ Ký hiệu [^]: bất kể ký tự nào ngoại trừ ký tự trong []
+Ký tự bỏ qua: Để tránh hiểu nhầm ký tự đặc biệt
Ví dụ muốn tìm a_ hoặc a%
VD: SELECT *
FROM nhanvien
WHERE secret_hint LIKE ‘ 123 !% 455 ’ ESCAPE ‘!’;
Tìm tất cả nhân viên có secret_hint là ‘123%455’, ký tự bỏ qua là ‘!’ đặt trước
‘%’
- IN: được sử dụng để xác định giá trị của thuộc tính có nằm trong một danh sách các giá trị
- EXISTS: Xác định sự tồn tại của truy vấn con
Cú pháp: WHERE EXITST(subquery)
Trả về true nếu subquery trả về ít nhất một hàng, trả về false nếu subquery không chứa hàng nào
Khi trả về true thì truy vấn cha mới được thực hiện
Sao chép từ bảng sang bảng
Đôi khi ta muốn sao chép dữ liệu từ bảng này sang bảng khác
Có 3 TH cần lưu ý:
Nếu tất cả cột ở bảng đích có thứ tự kiểu dữ liệu trùng với bảng nguồn và số lượng cột hai bảng bằng nhau thì có ví dụ sau:
INSERT INTO copy
SELECT * FROM bang
Trang 7Nếu số lượng cột ở bảng đích bé hơn số lượng cột ở bảng nguồn và thứ tự các kiểu dữ liệu trùng với bảng nguồn thì ta dùng câu lệnh sau:
INSERT INTO copy
SELECT name, tuoi, ngaySinh FROM bang
Nếu thứ tự các kiểu dữ liệu ở bảng đích sắp xếp lộn xộn không tương ứng với bảng nguồn thì ta dùng câu lệnh sau:
INSERT INTO copy(ten, age, DOB) SELECT name, tuoi, ngaySinh FROM bang
Sắp xếp danh sách
Sử dụng câu lệnh ORDER BY
Cú pháp: SELECT <danh sách cột> FROM <tên bảng> [WHERE condition]
ORDER BY <danh sách cột> [ASC|DESC]
Trong [] nghĩa là có thể có hoặc không
ORDER BY áp dụng được cho cả kiểu dữ liệu số và chữ
VD: SELECT * FROM bang ORDER BY tuoi DESC
Sắp xếp học sinh theo thứ tự tuổi giảm dần
ASC theo sau thì là tăng dần, không có gì thì mặc định là tăng dần
Liệt kê các giá trị duy nhất
Sử dụng câu lệnh DISTINCT
Các giá trị trùng sẽ bị bỏ qua và chỉ lấy 1 giá trị duy nhất
Cú pháp: SELECT DISTINCT <danh sách cột> FROM <tên bảng> [các phần phụ sau]
VD: SELECT DISTINCT ten, tuoi, DOB FROM bang
Gom nhóm các kết quả truy vấn
Sử dụng câu lệnh GROUP BY
Cú pháp: SELECT <danh sách các cột>, ham_tong(<tên cột 1>) FROM <tên bảng> [WHERE condition] GROUP BY <tên cột 2>
Lưu ý: tên cột 2 phải thuộc <danh sách các cột> và không nằm trong tên cột 1 ham_tong có thể là các hàm sau: SUM, COUNT, MIN, MAX, AVG
VD: SELECT ten, MAX(tuoi) AS max_tuoi FROM bang GROUP
BY ten
Câu lệnh trên có nghĩa là liệt kê ra tên và max_tuoi ứng với tên Một tên có thể có nhiều tuổi khác nhau thì ta chỉ liệt kê 1 tên duy nhất cùng với tuổi lớn nhất ứng với tên đó
Các hàm số học:
SUM(cột): cột là 1 cột nào đó cần tính tổng, không được nhiều cột
Trang 8COUNT(cột): cột là một cột nào đó cần đếm, nếu cột có giá trị NULL thì bỏ qua không đếm giá trị đó
MIN(cột): cột là cột cần tìm giá trị min
MAX(cột): tương tự nhưng tìm max
AVG(cột): cột là cột mà bạn muốn tính giá trị trung bình
Câu lệnh HAVING
Được dùng kết hợp với câu lệnh GROUP BY, là câu lệnh điều kiện, đứng sau GROUP BY, bắt buộc phải kết hợp với GROUP BY
Do câu lệnh WHERE không áp dụng được với các hàm nên ta dùng câu lệnh HAVING thay thế, để có thể đặt điều kiện cho các hàm
VD: SELECT ten, MAX(tuoi) AS max_tuoi FROM bang GROUP
BY ten HAVING MAX(tuoi) > 55
Liệt kê ra tên cùng với số tuổi lớn nhất của tên đó với điều kiện tuổi lớn nhất đó phải lớn hơn 55
Một khung nhìn VIEW
Là một bảng ảo trong cơ sở dữ liệu
Cú pháp: CREATE VIEW <tên view>
AS SELECT <danh sách cột> FROM <tên bảng> WHERE <điều kiện>
Khi dữ liệu của các cột của các bảng mà một VIEW tham chiếu đến được cập nhật hoặc được thêm vào thì dữ liệu trong VIEW cũng tự động cập nhật theo Hoặc khi dữ liệu ở VIEW được cập nhật hoặc thêm mới thì dữ liệu trong bảng cũng tự động cập nhật theo, các cột không có trong VIEW thì là NULL
VD: CREATE VIEW viewBang AS
SELECT ten, tuoi FROM bang
Một VIEW tên viewBang sẽ có 2 cột lấy từ bang là ten và tuoi
Câu lệnh UNION (toán tử hợp)
Để nối hai lệnh SELECT từ 2 bảng, trả về bảng gồm các hàng của cả hai bảng, nếu 2 hàng trùng nhau chỉ in 1 hàng, để in tất cả các hàng dùng UNION ALL Lưu ý là 2 hàng phải có cùng số lượng cột và kiểu dữ liệu của cột giống nhau VD: SELECT*FROM bang2
UNION
SELECT*FROM bang3
Kết nối đệ quy(một bảng kết nối với chính nó)
Ví dụ ta có một bảng EMPLOYEE để chỉ nhân viên trong một công ty, bảng này
có một khóa ngoại ManagerID tham chiếu đến khóa chính empID của chính nó.
Trang 9Ta hiển thị ra ID, tên, tuổi của quản lý cùng ID, tên, tuổi của nhân viên được quản lý tương ứng.
Trong trường hợp này ta phải dùng câu lệnh AS để đổi tên bảng, mỗi tên ứng với quản lý và nhân viên Nếu không đổi tên, hệ quản trị CSDL sẽ không hiểu được và
sẽ gây ra lỗi.
Câu lệnh như sau:
SELECT m.empID, m.ten, m.tuoi, e.empID, e.ten, e.tuoi FROM employee AS e, employee AS m
WHERE e.managerID = m.empID ORDER BY m.empID
Kết nối ngoài(tương tự như trong đại số quan hệ)
Có 3 loại kết nối ngoài: (1) Kết nối ngoài trái, (2) Kết nối ngoài phải, (3) Kết nối
cả 2 bên
a Kết nối ngoài trái
Gồm các bản ghi thõa mãn điều kiện kết nối cộng với các bản ghi không thõa mãn ở bên trái
Ví dụ có 2 quan hệ VENDOR và PRODUCT, một VENDOR có thể có nhiều PRODUCT
Hiển thị ra sản phẩm cùng nhà cung cấp sản phẩm đó
Câulệnh:
SELEC
TID_PRODUCT,PRODUCT.ten,PRODUCT.ID_VENDOR,VENDOR.t
en,diachi
FROM PRODUCT LEFT JOIN VENDOR ON PRODUCT.ID_VENDOR
= VENDOR.ID_VENDOR
b Kết nối ngoài phải
Gồm các bản ghi thõa mãn điều kiện kết nối cộng với các bản ghi không thõa mãn bên phải
Câu lệnh:
SELECT VENDOR.ID_VENDOR, VENDOR.ten, diachi,
ID_PRODUCT, PRODUCT.ten
FROM PRODUCT RIGHT JOIN VENDOR ON PRODUCT.ID_VENDOR
= VENDOR.ID_VENDOR
c Kết nối ngoài cả hai bên
Trang 10Gồm các bản ghi thõa mãn điều kiện kết nối cộng với các bản ghi không thõa mãn điều kiện kết nối ở cả hai bên Giá trị trống sẽ là NULL
Câu lệnh:
SELECT VENDOR.ID_VENDOR, VENDOR.ten, diachi, ID_PRODUCT, PRODUCT.ten
FROM VENDOR FULL JOIN PRODUCT ON VENDOR.ID_VENDOR = PRODUCT.ID_VENDOR
Toán tử giao (INTERSECT)
Trả về các bản ghi thuộc cả hai bảng
Cú pháp: SELECT cot1, cot2, cot3,… FROM <tên bảng 1>
INTERSECT SELECT cot1, cot2, cot3,….FROM <tên bảng 2>
Lưu ý: Hai bảng có cùng số lượng cot và kiểu dữ liệu giống nhau
VD: SELECT ID_VENDOR FROM VENDOR
INTERSECT SELECT ID_VENDOR FROM PRODUCT
Toán từ trừ (EXCEPT)
Chỉ lấy bản ghi ở câu lệnh SELECT bên trái mà không thuộc câu lệnh SELECT bên phải Điều kiện là hai SELECT phải khả hợp
Cú pháp: SELECT <các cột của bảng 1> FROM <tên bảng 1>
EXCEPT SELECT <các cột của bảng 2> FROM <tên bảng 2>
VD: SELECT ID_VENDOR FROM VENDOR
EXCEPT SELECT ID_VENDOR FROM PRODUCT
Các loại Join trong SQL:
1 Inner Join
K t qu t Inner join trong SQL là t p h p d li u trong đó giá tr dùng đ join hai ế ả ừ ậ ợ ữ ệ ị ể table v i nhau đ u có c hai b ng, nghĩa là k t qu là GIAO c a hai t p h p d ớ ề ở ả ả ế ả ủ ậ ợ ữ
li u.Các b n ghi ch xu t hi n m t trong hai b ng s b lo i.ệ ả ỉ ấ ệ ở ộ ả ẽ ị ạ