WITH TIES: cho phép 1 số hàng được thêm vào bảng kết quả gốc nếu các hàng này có cùng giá trị trong cột ORDER BY với hàng cuối cùng của n hàng đầu tiên được xác định... Được dùng để tổ
Trang 1Chuong 7 Ngôn ngữ SQL
Trang 3Giới thiệu chung
Là ngôn ngữ chuẩn cho các CSDL quan hệ
Chuẩn ANSI SQL được công bố vào năm
1989, 1992 và 1999
Đặc điểm của SQL:
◦ Ngôn ngữ tựa tiếng Anh
◦ Ngôn ngữ phi thủ tục
Gồm 3 nhóm lệnh:
◦ DDL ( D ata D efinition L anguage)
◦ DML ( D ata M anipulation L anguage)
◦ DCL ( D ata C ontrol L anguage)
Trang 5 Là ngôn ngữ thao tác dữ liệu
Gồm các lệnh:
SELECT
INSERT, UPDATE, DELETE, TRUNCATE
Trang 6 Là ngôn ngữ điều khiển dữ liệu
Gồm các lệnh
GRANT/REVOKE/ADD
COMMIT/ROLLBACK
Trang 7DESC ] ]
Trang 8Mệnh đề SELECT
Để đưa ra danh sách các cột cần xem
Cú pháp:
SELECT [ ALL | DISTINCT ][ TOP n [ PERCENT ]
[ WITH TIES ] ] < select_list >
Trang 10Mệnh đề SELECT
TOP n [PERCENT]: chỉ có n hàng đầu tiên
hay n% của các hàng của bảng kết quả
được xuất
WITH TIES: cho phép 1 số hàng được thêm vào bảng kết quả gốc nếu các hàng này có cùng giá trị trong cột ORDER BY với hàng cuối cùng của n hàng đầu tiên được xác
định
Ví dụ: liệt kê 3 hoá đơn có cước phí cao
nhất
Trang 11Mệnh đề SELECT
Trường tính toán được xây dựng từ biểu
thức (Expression) có liên quan đến các
Trang 12Mệnh đề SELECT
Ví dụ 1:
SELECT OrderID, ProductID,
Amount =UnitPrice*Quantity* (1- Discount)
FROM [Order Details]
Trang 13Được dùng để tổng kết các giá trị của 1 cột hay 1
nhóm cột bên trong 1 bảng và cho kết quả là 1 giá trị
Trang 14Ví dụ các hàm gộp trong lệnh select
SELECT sum(Freight) from dbo.Orders
Tính tổng cước phí chuyên chở của tất cả hoá đơn
SELECT count(OrderID) from dbo.Orders
Đếm số hoá đơn
SELECT
SUM(UnitPrice*Quantity*(1-Discount)) FROM dbo.[Order Details]
Tính doanh số bán hàng
Trang 16ASC (ascending) : xếp theo thứ tự tăng
DESC (descending): xếp theo thứ tự giảm
Trang 18Mệnh đề GROUP BY
Cú pháp:
[ GROUP BY [ ALL ]
group_by_expression [ , n ]
ALL: bảng kết quả sẽ chứa tất cả các nhóm
kể cả những nhóm không thỏa mãn điều
kiện lọc trong trong mệnh đề WHERE,
những nhóm không thoả điều kiện sẽ có giá trị null
Trang 21GROUP BY và HAVING
Có thể hạn chế các nhóm trong bảng kết quả bằng mệnh đề HAVING
Chỉ sau khi dữ liệu đã được nhóm và tổng hợp , điều kiện trong mệnh đề HAVING
mới được áp dụng
Không thể dùng 1 cột mà nó không tham gia vào hàm gộp của mệnh đề SELECT
hay của mệnh đề GROUP BY
SELECT pub_id, AVG(price) FROM titles
GROUP BY pub_id HAVING (AVG(price) >
10)
Trang 22Sử dụng WHERE và HAVING
Mệnh đề HAVING giống như mệnh đề
WHERE nhưng chỉ áp dụng cho cả nhóm
trong khi mệnh đề WHERE áp dụng cho
từng hàng
Một truy vấn có thể chứa cả mệnh đề
WHERE và mệnh đề HAVING
◦ Mệnh đề WHERE được áp dụng trước cho các
hàng trong bảng được truy vấn Chỉ những hàng nào thoả mãn điều kiện của mệnh đề WHERE
mới được nhóm dữ liệu.
Trang 23Ví dụ
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10
Trang 24SELECT INTO
Lệnh SELECT với mệnh đề INTO được dùng
dể lưu trữ kết quả truy vấn vào 1 bảng mới
mà không cần phải định nghĩa trước bảng
Trang 25Mệnh đề JOIN
Mệnh đề join dùng để khôi phục dữ liệu từ nhiều hơn 1 bảng
Trang 26Kết nối các bảng
Kết nối chỉ tồn tại trong thời gian truy vấn
Kết nối không thay đổi dữ liệu trong các bảng của cơ sở dữ liệu
Nên tạo bí danh (alias) cho tên bảng để tránh
gõ tên dài và làm truy vấn dễ đọc hơn
Ví dụ
SELECT t.Title_Id, t.Title, p.Pub_Id
from Titles t
Trang 27Các cột tham gia kết nối
Nếu kết nối nhiều hơn 2 bảng thì kết nối 2
bảng trước, sau đó kết nối nhóm này với bảng thứ ba
Trang 29Kết nối nội - Inner joins
Trong kết nối nội, dữ liệu từ nhiều bảng
được hiển thị sau khi so sánh giá trị trong
1 cột chung Chỉ những hàng mà có giá trị thoả mãn điều kiện kết nối trong cột
chung đó mới được hiển thị
Tích Cartesian: việc kết nối nhiều bảng
mà không có điều kiện kết nối trong mệnh
đề ON sẽ tạo ra tích cartesian giữa 2 bảng
Trang 30Kết nối nội - Inner joins
Trang 31Kết nối nội với toán tử lớn
hơn
Có thể thực hiện kết nối 2 bảng với điều
kiện kết nối dùng toán tử không bằng nhau
WHERE p.pub_name = 'New Moon Books'
ORDER BY au_lname ASC, au_fname ASC
Trang 32Kết nối ngoại - Outer joins
Kết nối ngoại được dùng để cho ra kết quả chứa tất cả các hàng của 1 bảng và các
hàng trùng nhau của bảng còn lại Những cột mà không có giá trị phù hợp sẽ được
hiển thị giá trị NULL
Cú pháp
SELECT column_name, column_name
[,column_name]
Trang 33Kết nối trái - LEFT OUTER JOIN
Tất cả các hàng từ bảng bên trái trong
mối kết nối giữa 2 bảng sẽ được hiển thị
Trang 34Cross join
Cross join trả về mọi tổ hợp có thể có của tất cả các hàng trong các bảng kết nối
Cross join không có mệnh đề ON
◦ Nếu không mệnh đề WHERE, cross join sẽ tạo
ra tích Cartesian
◦ Nếu có mệnh đề WHERE, cross join sẽ thực
hiện như 1 kết nối nội
Trang 35Kết nối chéo - Cross join
Ví dụ 1:
SELECT au_fname, au_lname, pub_name FROM
authors CROSS JOIN publishers ORDER BY
au_lname DESC
Kết quả chứa 184 hàng (authors có 23 hàng và
publishers có 8 hàng; 23 x 8 = 184 hàng).
Ví dụ 2:
SELECT au_fname, au_lname, pub_name FROM
authors CROSS JOIN publishers WHERE authors.city
= publishers.city ORDER BY au_lname DESC
SELECT au_fname, au_lname, pub_name FROM
authors INNER JOIN publishers ON authors.city = publishers.city ORDER BY au_lname DESC
Trang 36Truy vấn con - Subqueries
Subquery là lệnh SELECT mà kết quả trả
về là 1 giá trị đơn (single value) và được
đặt lồng vào bên trong các lệnh SELECT, INSERT, UPDATE, hay DELETE, hay bên
trong truy vấn con khác
Subquery có thể được dùng bất kỳ nơi nào
mà biểu thức được phép dùng
Trang 38 Subquery có thể được dùng để khôi phục
dữ liệu từ nhiều bảng và có thể được dùng như 1 cách khác của join (alternative to a join)
Trang 39 Cách 1: dùng subquery
SELECT ProductName FROM Products
WHERE UnitPrice = (SELECT UnitPrice FROM Products WHERE ProductName = 'Sir
Trang 40 Subquery có thể được dùng theo 1 trong các dạng sau:
◦ WHERE expression [NOT] IN (subquery)
◦ WHERE expression comparison_operator [ANY |
ALL] (subquery)
Trang 41Subqueries với toán tử IN
Kết quả của subquery được dùng với IN
(hay với NOT IN) thường là 1 danh sách
(list) chứa từ 0 đến nhiều giá trị
Ví dụ:
SELECT pub_name FROM publishers
WHERE pub_id IN (SELECT pub_id
FROM titles WHERE type = 'business')
Dùng cách 2 với mệnh đề join???
Trang 42Subquery với các toán tử so
sánh
Các toán tử so sánh đơn giản (unmodified comparison operator)
=, < >, >, > =, <, ! >, ! <, or < =
Subquery bắt đầu với toán tử so sánh đơn
giản và trả về 1 giá trị đơn (single
value)
SELECT DISTINCT title FROM titles
Trang 43Subquery với các toán tử so
sánh
Toán tử so sánh phức (Modified
Comparison operators) là toán tử so sánh đơn giản có kèm theo các từ All, any hay some
(=toán tử s/sánh+ [All,Any,some])
Subquery bắt đầu với toán tử so sánh phức
sẽ trả về 1 danh sách (list) của 0 hay
nhiều gia trị và có thể bao gồm cả mệnh
đề GROUP BY hay HAVING
Trang 44Subquery với các toán tử so
sánh
>ALL có nghĩa lớn hơn mọi giá trị
>ANY có nghĩa lớn hơn ít nhất 1 giá trị
Vd: >ALL (1, 2, 3) lớn hơn 3
Ví dụ:
SELECT au_lname, au_fname
FROM authors WHERE city <> ALL (SELECT city FROM publishers)
Trang 45Subquery với các toán tử so
sánh
Trang 46Chiến lược đánh giá câu
truy vấn đơn giản
Bước 1: mệnh đề FROM được đánh giá
trước tạo ra 1 bảng là kết quả tích
Cartesian của các bảng trong mệnh đề
FROM
Bước 2: mệnh đề WHERE được đánh giá Tạo ra 1 bảng mới từ bảng của bước 1 và chỉ chứa các hàng thỏa điều kiện WHERE
Bước 3: mệnh đề SELECT được đánh giá
Trang 47Tương đương giữa câu truy vấn và biểu thức đại số
Liệt kê tên các giáo sư khoa EE
Lệnh SQL
SELECT P.NameFROM PROFESSOR PWHERE P.DEptId = ‘EE’
Trang 48Tương đương giữa câu truy vấn và biểu thức đại số
Liệt kê tên tất cả các giáo sư đã dạy mùa hè 2007
Trang 49Dạng biến đổi chung
Trang 50Các hạn chế của đại số quan
hệ
Không thực hiện được các hàm gộp
Không nhóm được dữ liệu