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.
I Ngôn ngữ định nghĩa DDL Tạo database CREATE DATABASE ; VD: CREATE DATABASE db; Nhớ phải sử dụng master ghi USE master Xóa database USE master DROP DATABASE VD: DROP DATABASE db; Tạo bảng - Cách 1: USE CREATE TABLE ( Khai báo cột ràng buộc ); - Cách 2: Chế độ master CREATE TABLE ..( Khai báo cột ràng buộc ) VD: CREATE TABLE db.dbo.bang( … ) Hoặc sử dụng dấu [] tên Việc sử dụng dấu [] để tránh nhầm tên với từ khóa SQL - Tạo bảng tự động sinh giá trị khóa create table student( id int primary key identity(1,1), name varchar(50), sex varchar(50), dob date, age int, jpa float ) Xóa bảng Cũng có hai cách tạo bảng: Cách 1: USE DROP TABLE Cách 2: DROP .. Khai báo thuộc tính bên bảng Cú pháp: ; VD: NAME VARCHAR(32) NOT NULL PRIMARY KEY, - Mỗi khai báo cột bảng phân cách dấu phẩy Cách tạo khóa Có hai cách tạo khóa chính: Đặt sau khai báo tên cột VD: ACCOUNT_ID INT PRIMARY KEY, Sử dụng hàm PRIMARY KEY VD: PRIMARY KEY(ACCOUNT_ID); Bên dấu ngoặc có nhiều khóa Khóa ngoại tham chiếu đến khóa Có cách để tạo khóa ngoại C1: đặt sau khai báo thuộc tính từ khóa sau: REFERENCES (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 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 NOT NULL: không cho phép giá trị NULL cột DEFAULT: khơng gán giá trị mặc định giá trị mặc định VD: DEFAULT , UNIQUE: giá trị cột không trùng lặp ON UPDATE CASECADE: ràng buộc cho khóa ngoại, tức sau khóa bị thay đổi khóa ngoại tham chiếu đến thay đổi ON DELETE CASECADE: ràng buộc cho khóa ngoại áp dụng cho thực thể yếu, tức dòng thực thể bị xóa gây việc xóa tự động dòng tương ứng thực thể yếu CHECK(điều kiện cho cột ): kiểm tra điều kiện cho cột Có cách để ràng buộc cho cột: C1: đặt ràng buộc sau khai bao tên cột C2: Sử dụng cú pháp: CONSTRAINT , 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 dùng để xóa ràng buộc Các kiểu liệu INT INTEGER: số nguyên REAL FLOAT: số thực CHAR(n): kiểu ký tự có độ dài cố định, dù nhập n nhớ cấp n ký tự VARCHAR(n): chuỗi có độ dài thay đổi, max n ký tự NUMERIC(p,d): kiểu số với độ dài p, 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 TIMESTAMP: ngày tháng thời gian: yyyy-mm-dd hh:mm:ss Câu lệnh ALTER Xóa cột Nếu cột khơng có ràng buộc CONSTRAINT ta sử dụng câu lệnh sau để xóa ALTER TABLE DROP COLUMN Nếu cột có ràng buộc CONSTRAINT ta phải xóa ràng buộc trước xóa cột Câu lệnh sau ALTER TABLE DROP CONSTRAINT , COLUMN ; VD: ALTER TABLE bang DROP CONSTRAINT ck1, COLUMN luong; Xóa khóa Muốn xóa khóa phải tạo ràng buộc CONSTRAINT PRIMARY KEY đặt tên cho ràng buộc Đầu tiên xóa ràng buộc, sau xóa tên cột phần xóa cột Lưu ý khơng xóa hết cột, bảng phải có cột Thay đổi kiểu liệu cột Trong trường hợp muốn thay đổi kiểu liệu cho thuộc tính 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 MODIFY ( ) VD: ALTER TABLE PRODUCT MODIFY(V_CODE CHAR(5)); Thêm cột vào bảng Cú pháp: ALTER TABLE ADD VD: ALTER TABLE bang ADD newcot CHAR(8) CONSTRAINT ck1 UNIQUE(newcot); Thêm ràng buộc CONSTRAINT Thêm khóa chính, khóa ngoại - II Thêm khóa chính: Điều kiện chưa có khóa Cú pháp: ALTER TABLE ADD PRIMARY KEY() Lưu ý: Ràng buộc cho cột chọn làm khóa phải NOT NULL - Thêm khóa ngoại: Cú pháp: ALTER TABLE ADD FOREIGN KEY() REFERENCES () Ngôn ngữ thao tác liệu DML Các câu lệnh không truy vấn Thêm ghi vào bảng - Thêm vào tất cột Cú pháp: INSERT INTO VALUES() VD: INSERT INTO bang VALUES(‘Nguyen Ba Nhat’, 123); - Chỉ thêm số cột, cột lại NULL Cú pháp: INSERT INTO () VALUES() VD: INSERT INTO bang(name) VALUES(‘Nguyen Ba Nhat’); Có thể liệt kê ghi () cách 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 ghi bảng Cú pháp: DELETE FROM WHERE Tức hàng thõa mãn điều kiện xóa Chú ý: Nếu khơng có WHERE đằng sau xóa tất ghi Thay đổi liệu nhiều hàng Cú pháp: UPDATE SET = WHERE Tức thay đổi giá trị 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 nhiều cột, cột liệt kê cách 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 thay đổi thực tất hàng Lưu thay đổi bảng Các thay đổi lưu vĩnh viễn, tránh trường hợp liệu bị đột ngột điện Cú pháp: BEGIN TRAN COMMIT TRAN VD: BEGIN TRAN d UPDATE bang SET luong = 12 WHERE name = 'le thi n' COMMIT TRAN d Phục hồi nội dung bảng Nếu bạn chưa sử dụng câu lệnh COMMIT để lưu vĩnh viễn thay đổi, bạn khơi phục lại liệu trước nhờ câu lệnh ROLLBACK BEGIN TRAN ROLLBACK TRAN VD: BEGIN TRAN UPDATE bang SET luong = 14 WHERE name = 'le thi n' ROLLBACK TRAN Câu lệnh truy vấn Chỉ có lệnh SELECT Lấy tất ghi bảng Cú pháp: SELECT * FROM WHERE WHERE có khơng VD: SELECT*FROM bang Lấy số cột SELECT , , … FROM WHERE So sánh thời gian SQL VD: SELECT*FROM bang WHERE ngaySinh > '19980512' Sử dụng cột tính tốn đổi tên cột Giả sử câu truy vấn cần xác định giá trị không lưu trữ vật lý mà tính tốn từ thơng số CSDL VD: SELECT name, tuoi, ngaySinh, (toan+van)/2 AS TB FROM bang Lấy điểm trung bình sinh từ cột toan van CSDL đặt tên TB với từ khóa AS Tính tố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: OR: - NOT: phủ định Các toán tử đặc biệt SQL BETWEEN: kiểm tra giá trị có nằm khoảng khơng VD: SELECT * FROM bang WHERE toan BETWEEN AND IS NULL: dùng để xác định thuộc tính có NULL khơng LIKE: dùng REGEX java VD: SELECT * FROM bang WHERE name LIKE 'nguyen%' Liệt kê học sinh có họ nguyễn Các regex như: + %: chuỗi ký tự VD: ‘B%’ chuỗi bắt đầu B ‘%O%’ chuỗi chứa O + Ký hiệu _: ký tự cịn thiếu: VD: ‘AD_O’: từ có ký tự +Ký hiệu[]: ký tự [] phù hợp VD: ‘Sm[iy]th’ có từ thõa mãn Smith Smyth + Ký hiệu [^]: ký tự ngoại trừ ký tự [] +Ký tự bỏ qua: Để tránh hiểu nhầm ký tự đặc biệt Ví dụ muốn tìm a_ a% VD: SELECT * FROM nhanvien WHERE secret_hint LIKE ‘123!%455’ ESCAPE ‘!’; - Tìm tất nhân viên có secret_hint ‘123%455’, ký tự bỏ qua ‘!’ đặt trước ‘%’ IN: sử dụng để xác định giá trị thuộc tính có nằm danh sách giá trị EXISTS: Xác định tồn truy vấn Cú pháp: WHERE EXITST(subquery) Trả true subquery trả hàng, trả false subquery khơng chứa hàng Khi trả true truy vấn cha thực Sao chép từ bảng sang bảng Đôi ta muốn chép liệu từ bảng sang bảng khác Có TH cần lưu ý: Nếu tất cột bảng đích có thứ tự kiểu liệu trùng với bảng nguồn số lượng cột hai bảng có ví dụ sau: INSERT INTO copy SELECT * FROM bang Nếu số lượng cột bảng đích bé số lượng cột bảng nguồn thứ tự kiểu liệu trùng với bảng nguồn ta dùng câu lệnh sau: INSERT INTO copy SELECT name, tuoi, ngaySinh FROM bang Nếu thứ tự kiểu liệu bảng đích xếp lộn xộn khơng tương ứng với bảng nguồn 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 FROM [WHERE condition] ORDER BY [ASC|DESC] Trong [] nghĩa có khơng ORDER BY áp dụng cho kiểu liệu số 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 tăng dần, khơng có mặc định tăng dần Liệt kê giá trị Sử dụng câu lệnh DISTINCT Các giá trị trùng bị bỏ qua lấy giá trị Cú pháp: SELECT DISTINCT FROM [các phần phụ sau] VD: SELECT DISTINCT ten, tuoi, DOB FROM bang Gom nhóm kết truy vấn Sử dụng câu lệnh GROUP BY Cú pháp: SELECT , ham_tong() FROM [WHERE condition] GROUP BY Lưu ý: tên cột phải thuộc không nằm tên cột ham_tong 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 có nghĩa liệt kê tên max_tuoi ứng với tên Một tên có nhiều tuổi khác ta liệt kê tên với tuổi lớn ứng với tên Các hàm số học: SUM(cột): cột cột cần tính tổng, khơng nhiều cột COUNT(cột): cột cột cần đếm, cột có giá trị NULL bỏ qua khơng đếm giá trị MIN(cột): cột cột cần tìm giá trị MAX(cột): tương tự tìm max AVG(cột): cột 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, 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 với hàm nên ta dùng câu lệnh HAVING thay thế, để đặt điều kiện cho hàm VD: SELECT ten, MAX(tuoi) AS max_tuoi FROM bang GROUP BY ten HAVING MAX(tuoi) > 55 Liệt kê tên với số tuổi lớn tên với điều kiện tuổi lớn phải lớn 55 Một khung nhìn VIEW Là bảng ảo sở liệu Cú pháp: CREATE VIEW AS SELECT FROM WHERE Khi liệu cột bảng mà VIEW tham chiếu đến cập nhật thêm vào liệu VIEW tự động cập nhật theo Hoặc liệu VIEW cập nhật thêm liệu bảng tự động cập nhật theo, cột khơng có VIEW NULL VD: CREATE VIEW viewBang AS SELECT ten, tuoi FROM bang Một VIEW tên viewBang có cột lấy từ bang ten tuoi Câu lệnh UNION (toán tử hợp) Để nối hai lệnh SELECT từ bảng, trả bảng gồm hàng hai bảng, hàng trùng in hàng, để in tất hàng dùng UNION ALL Lưu ý hàng phải có số lượng cột kiểu liệu cột giống VD: SELECT*FROM bang2 UNION SELECT*FROM bang3 Kết nối đệ quy(một bảng kết nối với nó) Ví dụ ta có bảng EMPLOYEE để nhân viên cơng ty, bảng có khóa ngoại ManagerID tham chiếu đến khóa empID Ta hiển thị ID, tên, tuổi quản lý ID, tên, tuổi nhân viên quản lý tương ứng Trong trường hợp ta phải dùng câu lệnh AS để đổi tên bảng, tên ứng với quản lý nhân viên Nếu không đổi tên, hệ quản trị CSDL không hiểu gây lỗi Câu lệ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ự đại số quan hệ) Có loại kết nối ngoài: (1) Kết nối trái, (2) Kết nối phải, (3) Kết nối bên a Kết nối trái Gồm ghi thõa mãn điều kiện kết nối cộng với ghi không thõa mãn bên trái Ví dụ có quan hệ VENDOR PRODUCT, VENDOR có nhiều PRODUCT Hiển thị sản phẩm 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 phải Gồm ghi thõa mãn điều kiện kết nối cộng với 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 hai bên Gồm ghi thõa mãn điều kiện kết nối cộng với ghi không thõa mãn điều kiện kết nối hai bên Giá trị trống 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ả ghi thuộc hai bảng Cú pháp: SELECT cot1, cot2, cot3,… FROM INTERSECT SELECT cot1, cot2, cot3,….FROM Lưu ý: Hai bảng có số lượng cot kiểu liệu giống VD: SELECT ID_VENDOR FROM VENDOR INTERSECT SELECT ID_VENDOR FROM PRODUCT Toán từ trừ (EXCEPT) Chỉ lấy 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 hai SELECT phải khả hợp Cú pháp: SELECT FROM EXCEPT SELECT FROM VD: SELECT ID_VENDOR FROM VENDOR EXCEPT SELECT ID_VENDOR FROM PRODUCT Các loại Join SQL: Inner Join Kết từ Inner join SQL tập hợp liệu giá tr ị dùng đ ể join hai table với có hai bảng, nghĩa kết GIAO c hai t ập h ợp d ữ liệu.Các ghi xuất hai bảng bị loại 2 Outer Join 2.1 Left Outer Join Giữ lại tất hàng table bên trái lấy hàng table bên phải thõa điều kiện ON 2.2 Right Outer Join Giữ lại tất hàng table bên phải lấy hàng table bên trái thõa điều kiện ON 2.3 Full Outer Join Kiểu kết nối trả tất hàng nằm bảng trái phải giá trị NULL đặt nơi không đáp ứng điều kiện Cross Join kết trả CROSS JOIN lấy số dòng bảng bên trái x số dòng c bảng bên phải Ví dụ bảng DIEM_THI có 12 dịng, bảng HOC_VIEN có 12 dịng, k ết trả 12×12 = 144 dòng Tức hàng table bên trái ứng n hàng table bên phải (table bên phải có n hàng) Như table bên trái có m hàng bên phải có n hàng bảng kết có nxm hàng Hàm xử lý date time STT HÀM MÔ TẢ ADDDATE() Thêm khoảng thời gian vào date ADDTIME() Thêm khoảng thời gian vào time CONVERT_TZ() Chuyển đổi múi CURDATE() Trả ngày CURRENT_DATE() Trả ngày CURRENT_TIME() Trả thời gian CURRENT_TIMESTAMP() Trả ngày thời gian CURTIME() Trả thời gian DATE_ADD() Cộng thời gian 10 DATE_FORMAT() Định dạng giá trị thời gian 11 DATE_SUB() Trừ thời gian 12 DATE() Trả phần ngày biểu thức thời gian 13 DATEDIFF() Trả chênh lệch hai giá trị thời gian 14 DAY() Trả thứ tự ngày tháng (từ đến 31) 15 DAYNAME() Trả tên ngày tuần 16 DAYOFMONTH() Trả thứ tự ngày tháng (từ đến 31) 17 DAYOFWEEK() Trả số ngày tuần (1 = Sunday, = Monday = Saturday) 18 DAYOFYEAR() Trả thứ tự ngày năm (từ đến 366) 19 EXTRACT Trích giá trị thời gian từ biểu thức ban đầu 20 FROM_DAYS() Chuyển đổi số thành giá trị ngày 21 FROM_UNIXTIME() Trả ngày đại diện cho tham số Unixtime ban đầu 22 HOUR() Trả phần từ biểu thức thời gian 23 LAST_DAY() Trả giá trị tương ứng cho ngày cuối tháng 24 LOCALTIME() Trả ngày 25 LOCALTIMESTAMP() Trả ngày 26 MAKEDATE() Trả ngày với tham số truyền vào 27 MAKETIME() Trả giá trị thời gian với tham số truyền vào 28 MICROSECOND() Trả microsecond từ biểu thức ban đầu 29 MINUTE() Trả giá trị phút từ biểu thức thời gian 30 MONTH() Trả giá trị tháng từ biểu thức thời gian 31 MONTHNAME() Trả tên tháng từ biểu thức thời gian 32 NOW() Trả ngày 33 PERIOD_ADD() Thêm khoảng thời gian cho tháng năm 34 PERIOD_DIFF() Trả số tháng khoảng thời gian 35 QUARTER() Trả giá trị quý từ biểu thức thời gian 36 SEC_TO_TIME() Chuyển đổi số giây sang định dạng 'HH: MM: SS' 37 SECOND() Trả giá trị giây từ biểu thức thời gian 38 STR_TO_DATE() Chuyển đổi chuỗi thành ngày 39 SUBDATE() Trừ khoảng thời gian từ date truyền vào 40 SUBTIME() Trừ hai khoảng thời gian 41 SYSDATE() Trả ngày 42 TIME_FORMAT() Định dạng giá trị thời gian 43 TIME_TO_SEC() Trả số giây chuyển đổi từ tham số ban đầu 44 TIME() Trả giá trị thời gian từ biểu thức ban đầu 45 TIMEDIFF() Trả chênh lệch hai giá trị thời gian 46 TIMESTAMP() Trả biểu thức datetime 47 TIMESTAMPADD() Cộng khoảng thời gian định vào tham số ban đầu 48 TIMESTAMPDIFF() Trả số nguyên thể chênh lệch thời gian hai biểu thức 49 TO_DAYS() Trả số ngày giá trị thời gian date năm 50 UNIX_TIMESTAMP() Trả số giây theo Unix timestamp từ biểu thức ban đầu 51 UTC_DATE() Trả ngày UTC 52 UTC_TIME() Trả UTC 53 UTC_TIMESTAMP() Trả ngày UTC 54 WEEKDAY() Trả số ngày tuần (0 = Thứ Hai, = Thứ Ba = Chủ Nhật) 55 WEEKOFYEAR() Trả số tuần năm biểu thức thời gian 56 YEAR() Trả năm tương ứng tham số ban đầu ... microsecond từ biểu thức ban đầu 29 MINUTE() Trả giá trị phút từ biểu thức thời gian 30 MONTH() Trả giá trị tháng từ biểu thức thời gian 31 MONTHNAME() Trả tên tháng từ biểu thức thời gian 32 NOW()... WHERE So sánh thời gian SQL VD: SELECT*FROM bang WHERE ngaySinh > ''19980512'' Sử dụng cột tính tốn đổi tên cột Giả sử câu truy vấn cần xác định giá trị khơng lưu trữ vật lý... sách giá trị EXISTS: Xác định tồn truy vấn Cú pháp: WHERE EXITST(subquery) Trả true subquery trả hàng, trả false subquery không chứa hàng Khi trả true truy vấn cha thực Sao chép từ bảng sang bảng