Truy vấn nâng cao HIENLTH - Database
Truy vấn là gì? SQL Server Truy vấn Dữ liệu trong các bảng Khởi tạo Người sử dụng Khởi tạo Đưa ra một câu hỏi cần quan tâm Trả lời câu hỏi – Trả về tập hợp kết quả Xử lý bởi SQL Nâng Cao – HIENLTH – Slide 2
Cú pháp – Thứ tự truy vấn SELECT <danh sách các cột> FROM <danh sách các bảng> WHERE <điều kiện> GROUP BY <danh sách các cột gom nhóm> HAVING <điều kiện trên nhóm> ORDER BY Cột ASC|DESC SQL Nâng Cao – HIENLTH – Slide 3
Câu lệnh SELECT trong truy vấn Truy vấn trên nhiều hàng và cột Có thể truy vấn trên nhiều bảng hoặc nhiều CSDL. Xác định các cột yêu cầu trong truy vấn được chỉ ra. Các cột kết quả có cùng thứ tự trong truy vấn. SQL Nâng Cao – HIENLTH – Slide 4
Truy vấn trên nhiều bảng Có 3 cách để kết nối dữ liệu từ nhiều bảng - Kết nối: Kết nối các hàng từ nhiều bảng - Các truy vấn con - Truy vấn con là truy vấn nằm trong một truy vấn khác - Các phép kết nối - Kết nối các cột từ nhiều bảng. SQL Nâng Cao – HIENLTH – Slide 5
Các truy vấn con Truy vấn con : là một câu lệnh SELECT lồng trong câu lệnh SELECT khác Truy vấn cha Select <Column Name> From Table WHERE <Column Name> = Select <Column Name> From <Table> WHERE <Column> = <Criteria > Toán tử Truy vấn con SQL Nâng Cao – HIENLTH – Slide 6
Điều kiện kết ở mệnh đề FROM Kết bằng Kết ngoài SELECT <danh sách các cột> FROM R1 [INNER] JOIN R2 ON <biểu thức> WHERE <điều kiện> SELECT <danh sách các cột> FROM R1 LEFT|RIGHT [OUTER] JOIN R2 ON <biểu thức> WHERE <điều kiện> SQL Nâng Cao – HIENLTH – Slide 7
Nhận xét IN và EXISTS IN EXISTS <tên cột> IN <câu truy vấn con> Thuộc tính ở mệnh đề SELECT của truy vấn con phải có cùng kiểu dữ liệu với thuộc tính ở mệnh đề WHERE của truy vấn cha EXISTS Không cần có thuộc tính, hằng số hay biểu thức nào khác đứng trước Không nhất thiết liệt kê tên thuộc tính ở mệnh đề SELECT của truy vấn con Những câu truy vấn có = ANY hay IN đều có thể chuyển thành câu truy vấn có EXISTS SQL Nâng Cao – HIENLTH – Slide 8
Sử dụng EXISTS và NOT EXISTS Nó có chức năng kiểm tra sự tồn tai. EXISTS được sử dụng để kiểm tra sự tồn tại của các hàng được truy vấn Truy vấn con không trả về bất kỳ dữ liệu nào, nó trả về TRUE hoặc FALSE SQL Nâng Cao – HIENLTH – Slide 9
Các truy vấn lồng nhau Ví dụ Truy vấn lồng 2 cấp Các truy vấn lồng nhau được truy vấn trong các truy vấn con Ví dụ Truy vấn lồng 2 cấp SQL Nâng Cao – HIENLTH – Slide 10
Sự liên quan giữa các truy vấn con Truy vấn con liên quan đến truy vấn cha Truy vấn con định lại giá trị cho mọi lần lặp trong trong truy vấn cha. Ví dụ SQL Nâng Cao – HIENLTH – Slide 11
Phép toán tập hợp trong SQL SQL có cài đặt các phép toán Hội (UNION) Giao (INTERSECT) Trừ (EXCEPT) Kết quả trả về là tập hợp Loại bỏ các bộ trùng nhau Để giữ lại các bộ trùng nhau UNION ALL INTERSECT ALL EXCEPT ALL SQL Nâng Cao – HIENLTH – Slide 12
Phép toán tập hợp trong SQL (tt) Cú pháp SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện> UNION [ALL] SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện> INTERSECT [ALL] SELECT <ds cột> FROM <ds bảng> WHERE <điều kiện> EXCEPT [ALL] SQL Nâng Cao – HIENLTH – Slide 13
Phép toán tập hợp trong SQL Toán tử kết hợp : Kết nối hai hoặc nhiều câu lệnh SELECT vào một tập hợp kết quả Toán tử Union SELECT statement UNION [ALL] SELECT statement Mệnh đề ALL không loại bỏ được sự trùng lặp dữ liệu SQL Nâng Cao – HIENLTH – Slide 14
Phép toán tập hợp trong SQL Mỗi lệnh select phải có cấu trúc giống nhau Kiểu dữ liệu trong các cột phải tương thích với nhau và có cùng số lượng cột Ví dụ: SELECT empno, ename, sal FROM emp UNION SELECT empno, ename, sal FROM ret_emp SQL Nâng Cao – HIENLTH – Slide 15
Truy vấn trên tất cả các hàng Ví dụ SQL Nâng Cao – HIENLTH – Slide 16
Dùng lệnh Select lựa chọn các cột Ví dụ SQL Nâng Cao – HIENLTH – Slide 17
Sử dụng mệnh đề WHERE với lệnh Select Mệnh đề WHERE trong truy vấn dùng để lọc bớt số lượng hàng hiển thị trong truy vấn dựa trên điều kiện đã chỉ ra. Cú pháp: SELECT <Column Name> FROM <table Name> WHERE <Condition> Ví dụ SQL Nâng Cao – HIENLTH – Slide 18
Các toán tử quan hệ và mệnh đề WHERE Chúng ta có thể sử dụng các loại điều kiện tìm kiếm khác nhau và các toán tử so sánh trong mệnh đề WHERE . Bảng dưới đây liệt kê danh sách các toán tử so sánh có thể sử dụng trong truy vấn. Toán tử Ý nghĩa = Bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng Không bằng <> ! Phủ định SQL Nâng Cao – HIENLTH – Slide 19
Các ký tự đại diện Ký tự đại diện Diễn giải Ví dụ ‘_’ Một ký tự đơn Select Branch_Code From Branch Where Branch_Code Like ‘L__’ % Một chuỗi có độ dài bất kỳ Select Route_Code From FlightSchedule Where Route_Code Like ‘AMS-%’ [] Một ký tự đơn thuộc khoảng nằm trong ngoặc Select Airbusno From FlightSchedule Where Airbusno Like ‘AB0[1-5]’ [^] Bất kỳ một ký tự nào không thuộc trong khoảng nằm trong ngoặc Select Airbusno From FlightSchedule Where Airbusno Like ‘AB0[^1-5]’ SQL Nâng Cao – HIENLTH – Slide 20
Sử dụng các ký tự đại diện với toán tử LIKE Ví dụ SQL Nâng Cao – HIENLTH – Slide 21
Các hàm xử lý chuỗi Hàm LEN(s): Lấy chiều dài chuỗi s Hàm LEFT(s,n): Lấy n ký tự tính từ bên trái chuỗi s Hàm RIGHT(s,n): Lấy n ký tự tính từ bên phải chuỗi s Hàm SUBSTRING(s,k,n): Lấy n ký tự trong chuỗi s tính từ vị trí k Hàm CHARINDEX(s1, s2): Trả về vị trí xuất hiện của chuỗi s1 trong chuỗi s2 Hàm LTRIM(s), RTRIM(s), LOWER, UPPER, ASCII, CHAR, REVERSE, SPACE, STR, UNICODE SQL Nâng Cao – HIENLTH – Slide 22
CAST and CONVERT CAST ( expression AS data_type ) CONVERT (data_type [(length)],expression [,style]) Ví dụ: CAST ( (5 + 2 * 7 - 8) AS NVARCHAR(6)) + N’Đồng’ CONVERT (INT, LEFT(‘4 + 6 = 10’, 1)) SQL Nâng Cao – HIENLTH – Slide 23
Các hàm toán học ABS, ACOS, ASIN, ATAN, CEILING, COS, COT, DEGREES, EXP, FLOOR, LOG, LOG10, PI, POWER, RADIANS, RANK, ROUND, SIGN, SIN, SQUARE, SQRT, TAN SQL Nâng Cao – HIENLTH – Slide 24
Sử dụng toán tử logic phủ định (Not) Ví dụ SQL Nâng Cao – HIENLTH – Slide 25
Sử dụng toán tử logic AND Ví dụ SQL Nâng Cao – HIENLTH – Slide 26
Sử dụng toán tử logic OR Ví dụ SQL Nâng Cao – HIENLTH – Slide 27
Mệnh đề ORDER BY Mệnh đề ORDER BY sắp xếp truy vấn trên một hoặc nhiều cột Có thể sắp xếp tăng dần (ASC) hoặc giảm dần (DESC) Mặc định, các bản ghi được sắp xếp theo thứ tự tăng dần (ASC). SQL Nâng Cao – HIENLTH – Slide 28
Hiển thị dữ liệu được sắp xếp với lệnh SELECT và mệnh đề ORDER BY Ví dụ SQL Nâng Cao – HIENLTH – Slide 29
Mệnh đề DISTINCT Để loại trừ các bản ghi lặp lại sử dụng DISTINCT với lệnh SELECT Cú pháp: SELECT DISTINCT <column1> FROM <tablename> Ví dụ: SELECT DISTINCT deptno FROM emp SQL Nâng Cao – HIENLTH – Slide 30
Sử dụng mệnh đề DISTINCT Ví dụ Mỗi kiểu (type) được trả về là duy nhất SQL Nâng Cao – HIENLTH – Slide 31
Hàm kết hợp COUNT MIN MAX SUM AVG COUNT(*) đếm số dòng COUNT(<tên thuộc tính>) đếm số giá trị khác NULL của thuộc tính COUNT(DISTINCT <tên thuộc tính>) đếm số giá trị khác nhau và khác NULL của thuộc tính MIN MAX SUM AVG Các hàm kết hợp được đặt ở mệnh đề SELECT SQL Nâng Cao – HIENLTH – Slide 32
Các hàm xử lý ngày giờ Thể hiện ngày giờ trong phép chọn: SELECT * FROM CAUTHU WHERE NGAYSINH BETWEEN ‘5-11-1980’ AND ‘5-11-1990’ Lấy ngày hiện tại: GETDATE() Hàm DAY(d): Lấy ngày trong d Hàm MONTH(d): Lấy tháng trong d Hàm YEAR(d): Lấy năm trong d SQL Nâng Cao – HIENLTH – Slide 33
Các hàm xử lý ngày giờ Hàm DATEPART(p,d): lấy thông tin ngày, tháng, năm, giờ, phút, hoặc giây trong d, với p thuộc bảng sau: SQL Nâng Cao – HIENLTH – Slide 34
Các hàm xử lý ngày giờ Hàm DATEADD(p,n,d): tìm ngày cách d một khoảng n ngày, tháng, năm, giờ, phút, hoặc giây,…(phụ thuộcvào p ∈ Z) Ví dụ: Muốn xác định sau ngày 30/4/2008, 60 ngày là ngày nào ? DATEADD(“dd”, 60, ’04/30/2008’) = 29/06/2008 Muốn xác định sau ngày 30/4/2008, 15 tuần là ngày nào? DATEADD(“ww”, 15, ’04/30/2008’) = 13/08/2008 SQL Nâng Cao – HIENLTH – Slide 35
Các hàm xử lý ngày giờ Hàm DATEDIFF(p, d1, d2): tính khoảng cách giữa hai ngày d1 và d2 (khoảng ngày, tháng, năm, giờ, phút, hoặc giây,…phụ thuộc vào p) Ví dụ: Giả sử ngày hiện hành là ngày 30/04/2008, muốn xác định còn bao nhiêu ngày nữa đến ngày 02/09/2008? DATEDIFF(“dd”, ’04/30/2008’, ’09/02/2008’) = 125 Giả sử ngày hiện hành là ngày 30/04/2008, muốn xác định còn bao nhiêu tuần nữa đến ngày 02/09/2008? DATEDIFF(“ww”, ’04/30/2008’, ’09/02/2008’) = 18 SQL Nâng Cao – HIENLTH – Slide 36
Mệnh đề COMPUTE Mệnh đề COMPUTE sinh ra những giá trị tổng kết rị và xuất hiện trên các hàng thêm vào, là một tập hợp kết quả của các hàm tập hợp. Giá trị tổng kết xuất hiện như là một hàng bổ sung. Các hàng chi tiết và hàng tổng kết có thể nhìn thấy trong cùng một kết quả của câu truy vấn. Cú pháp: COMPUTE <Expression1>, <Expression2> SQL Nâng Cao – HIENLTH – Slide 37
Sử dụng COMPUTE Ví dụ SQL Nâng Cao – HIENLTH – Slide 38
Sử dụng COMPUTE BY Nếu trong ví dụ trước thay vì sử dụng COMPUTE, ta sử dụng mệnh đề COMPUTE BY thì kết quả sẽ được hiển thị như sau SQL Nâng Cao – HIENLTH – Slide 39
Mệnh đề SELECT INTO Bất kỳ khi nào chúng ta muốn tạo lập một bảng dựa trên một bảng khác và lưu trữ nó với một tập kết quả lấy được từ bảng tồn tại chúng ta sử dụng cấu trúc SELECT INTO. SELECT INTO cũng có thể sử dụng để kết nối dữ liệu từ nhiều bảng vào một bảng. Table 1 SELECT INTO Table 2 SQL Nâng Cao – HIENLTH – Slide 40
Sử dụng SELECT INTO Ví dụ dưới đây tạo lập một bảng mới gọi là publishers2 dựa trên bảng đã có publishers. Bảng mới cũng có nội dung giống bảng publishers. SQL Nâng Cao – HIENLTH – Slide 41