Truy xuất dữ liệu – Lệnh Select, Truy vấn đơn giản Truy vấn từ nhiều bảng Truy vấn con - SubQuery Các mệnh đề EXISTS, DISTINCT, COMPUTE BY. Sửa chữa dữ liệu, Lệnh INSERT Lệnh UPDATE Lệnh DELETE. Cú pháp lệnh Select SELECT [ALL | DISTINCT] [TOP n [WITH TIES]] select_list [ INTO new_table ] FROM table_source [ WHERE search_condition ] [ GROUP BY group_by_expression ] [ HAVING search_condition ] [ ORDER BY order_expression [ ASC | DESC ] ]
98 trang |
Chia sẻ: franklove | Lượt xem: 2331 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Truy xuất CSDL: Ngôn ngữ thao tác dữ liệu – DMC và DCL, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1
TRUY XUẤT CSDL
Ngôn ngữ thao tác dữ liệu – DMC và DCL
Bài 6
2
Accessing and Modifying Data
1. Truy xuất dữ liệu – Lệnh Select
– Truy vấn đơn giản
– Truy vấn từ nhiều bảng
– Truy vấn con - SubQuery
– Các mệnh đề EXISTS, DISTINCT, COMPUTE BY
2. Sửa chữa dữ liệu
– Lệnh INSERT
– Lệnh UPDATE
– Lệnh DELETE
3
Cú pháp lệnh Select
SELECT [ALL | DISTINCT] [TOP n [WITH TIES]] select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
• ORDER BY : Sắp xếp
• WHERE: Điều kiện
• GROUP BY: Nhóm
• HAVING: Điều kiện nhóm
4
Ví dụ lệnh SELECT
Column
names
Table names
Condition
Sort order
5
Truy vấn đơn giản
Chọn tất cả các cột trong một bảng
Syntax
SELECT * FROM
SELECT * FROM Customers
Example
6
Truy vấn đơn giản
Chọn một vài cột trong một bảng
Syntax
SELECT ,
FROM
SELECT Productid, productName FROM Products
Example
7
Truy vấn đơn giản
Kết nối các cột thành một cột
Syntax
SELECT +
FROM
SELECT FirstName + „ „ + Lastname
FROM Employees
Example
8
Truy vấn đơn giản
Đặt tên cho cột mới
Syntax
SELECT as
FROM
SELECT FirstName +‟ „ +LastName AS
„EmployeeName' FROM Employees
Example
9
Tạo cột tính toán
SELECT Orderid, Quantity*UnitPrice AS
„Total'
FROM [Order details]
Example
Truy vấn đơn giản
10
Loại bỏ những dòng trùng nhau
Syntax
SELECT DISTINCT
FROM
SELECT DISTINCT Customerid
FROM Orders
Example
Truy vấn đơn giản
diadiem
TP HCM
HA NOI
TP HCM
diadiem
TP HCM
HA NOI
SELECT diadiem
FROM DIADIEM_PHG
SELECT DISTINCT diadiem
FROM DIADIEM_PHG
11
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
Syntax
SELECT TOP n [PERCENT]
FROM
SELECT TOP 3 Productid, Unitprice FROM
[Order Details]
SELECT TOP 4 PERCENT Productid FROM
Products
Examples
Truy vấn đơn giản
12
Mệnh đề WHERE
• Chứa điều kiện lọc dữ liệu cần trả về
• Cú pháp: WHERE
13
Phép toán quan hệ - Relational Operators
Operator
Not !
Less Than or Equal To <=
Greater Than or Equal To >=
Less than <
Greater Than >
Equal To =
Meaning
14
Phép toán Logical
Phép toán và AND
SELECT Orderid, orderdate, customerid
FROM Orders
WHERE Month(Orderdate) = 7 AND
Year(Orderdate)=1996
Example
15
Phép toán Logical
OR operator
SELECT * FROM Orders
WHERE Customerid = „TOMSP‟ OR
Customerid = „HANAR‟
Example
16
Logical Operators (contd.)
NOT operator
SELECT * FROM Orders
WHERE NOT Employeeid = 10
Example
17
Wildcard Characters
Example
SELECT Meal_Code FROM Meal
WHERE Meal_Code LIKE ‘C_’
SELECT Meal_Code FROM Meal
WHERE Meal_Code LIKE ‘CO_%’
SELECT * FROM flight WHERE
aircraft_code LIKE ‘9W0[1-2]’
Wildcard
_
%
[]
[^]
Description
Represents a single character
Represents a string of any length
Represents a single character
within the range enclosed in the
brackets
Represents any single character not
within the range enclosed in the
brackets
SELECT * FROM flight WHERE
aircraft_code LIKE ‘9W0[^1-2]’
18
Các toán tử SQL
• LIKE: giống 1 chuỗi
• IS NOT NULL: không phải giá trị rỗng
• BETWEEN…AND: giữa 2 giá trị
• IN: đạt giá trị trong 1 danh sách
• ALL/ ANY (SOME): được dùng trong lệnh truy vấn con và kết
quả là nhiều dòng.
<ANY: Nhỏ hơn trị cao nhất
>ANY: Lớn hơn trị thấp nhất
=ANY: Tương đương với IN
>ALL: Lớn hơn trị cao nhất
<ALL: Nhỏ hơn trị thấp nhất
• EXIST: kiểm tra sự tồn tại của 1 dữ liệu trong nhiều dòng.
19
Các hàm SQL
• Day(Biểu thức ngày): Trả về ngày
• Month(Biểu thức ngày): Trả về tháng
• Year(Biểu thức ngày): Trả về năm
• GetDate(): Trả về ngày giờ hệ thống
• Max(dãy giá trị): Trả về giá trị lớn nhất trong dãy
• Min(dãy giá trị): Trả về giá trị nhỏ nhất trong dãy
• Avg(dãy giá trị): Trả về giá trị trung bình của dãy
• Count(dãy giá trị): Đếm số dòng.
• Sum(dãy giá trị): Trả về tổng các giá trị trong dãy
19
20
So sánh Chuỗi
• So sánh gần đúng sử dụng “like”
– Hai ký tự thay thế: „_‟ và „%‟
• Tìm tất cả các mã nhân viên có 3 ký tự cuoi cua dia chi la RD.
SELECT *
FROM EMPLOYEES
WHERE ADDRESS LIKE '%RD.'
Cho biết tên nhân viên sinh vào những năm 1960
SELECT LastName, FirstName, BirthDate
FROM EMPLOYEES
WHERE convert(char(8), BIRTHDATE,1) like '______6_'
21
Biến bộ
• Cho biết hai nhân viên có cùng lương
SELECT NV1.LASTNAME, NV2.LASTNAME,NV1.CITY
FROM EMPLOYEES NV1, EMPLOYEES NV2
WHERE NV1.CITY = NV2.CITY
• Có thể sử dụng biến bộ bất kỳ lúc nào để thuận tiện và dễ
đọc!
SELECT NV1.LASTNAME, NV2.LASTNAME,NV1.CITY
FROM EMPLOYEES NV1, EMPLOYEES NV2
WHERE NV1.CITY NV2.CITY
tuple variable Các thuộc tính Trùng tên
22
• Danh sách các hoá đơn gồm Mahd, tenkh
SELECT orderid, Orderid.Customerid, CompanyName
FROM Orders, Customers
WHERE orders.customerid = Customers.customerid
• Danh sách các hoá đơn do nhan viên có tên bắt dầu là D lập
SELECT Orders.Orderid, LastName +‟ „+FirstName as
EmployeeName
FROM Employees, Orders
WHERE Employees.employeeid = Orders.Employeeid And
LastName like „D%‟
• Danh sách các hoá đơn do nhan viên có country là USA lập
SELECT O.Orderid, LastName +‟ „+FirstName as EmployeeName
FROM Employees E, Orders O
WHERE E.employeeid =O.Employeeid And Country =„USA‟
Truy vấn từ nhiều bảng & Where
(điều kiện kết nối)
23
Sắp xếp - ORDER BY Clause
Xác định thứ tự của bộ kết quả
Cú pháp
[ ORDER BY { order_by_expression [ ASC | DESC ] } [ ,...n] ]
ASC (ascending) : xếp theo thứ tự tăng
DESC (descending): xếp theo thứ tự giảm
24
Nhóm dữ liệu trong bảng kết quả
• Những mệnh đề dùng để nhóm dữ trong bảng kết quả:
–GROUP BY: tổng hợp bảng kết quả theo nhóm bằng
cách dùng các hàm gộp
–COMPUTE và COMPUTE BY: mệnh đề COMPUTE
trong lệnh SELECT được dùng để phát ra các hàng tổng
hợp bằng cách dùng hàm gộp. Mệnh đề COMPUTE BY
được dùng để tổng hợp thêm các hàng kết quả theo cột
25
Mệ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.
• group_by_expression: biểu thức dùng để xác định cột được
nhóm
26
Mệnh đề GROUP BY
• Ví dụ:
SELECT Orderid, SUM(Quantity * UnitPrice)
AS „Total„ FROM [Order Details]
GROUP BY Orderid
SELECT Orderid, AVG(Quantity * UnitPrice)
AS „AVG TOTAL„ FROM [Order Details]
GROUP BY Orderid
27
Mệnh đề GROUP BY
• Ví dụ:
SELECT Orderid, MIN(Quantity * UnitPrice)
AS „MIN Total„ FROM [Order Details]
GROUP BY Orderid
SELECT Orderid, MAX(Quantity * UnitPrice)
AS „MAX Total„ FROM [Order Details]
GROUP BY Orderid
28
Mệnh đề GROUP BY
• Ví dụ:
SELECT Count(Reportsto)
AS „Count Of Orders„ FROM [Orders]
SELECT Customerid, Count(Orderid)
AS „Count Order of Customers„ FROM Orders
GROUP BY Customerid
SELECT Count(*)
AS „Count Of Orders„ FROM [Orders]
29
Mệnh đề GROUP BY
• Ví dụ:
SELECT Productid, Sum(Quantity) As Total
FROM [Order Details]
WHERE Productid =2
GROUP BY Productid
SELECT Customerid, Count(Orderid)
AS „Count Order of Customers„ FROM Orders
WHERE Customerid like „%m‟
GROUP BY Customerid
30
Ví dụ
• SELECT Type, Advance = SUM (Advance) FROM
Titles WHERE Type IN ('business', 'mod_cook',
'trad_cook') GROUP BY Type
Type Advance
------------ ---------------------
business 25125.0000
mod_cook 15000.0000
trad_cook 19000.0000
(3 row(s) affected)
Mệnh đề GROUP BY
31
Ví dụ 2
• SELECT Type, Advance = SUM (Advance) FROM Titles
WHERE Type IN ('business', 'mod_cook', 'trad_cook')
GROUP BY ALL Type
Type Advance
------------ ---------------------
business 25125.0000
mod_cook 15000.0000
popular_comp NULL
psychology NULL
trad_cook 19000.0000
UNDECIDED NULL
(6 row(s) affected)
Mệnh đề GROUP BY
32
GROUP 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)
33
Sử 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.
–Sau đó mệnh đề HAVING sẽ được áp dụng cho các
nhóm. Chỉ những nhóm thoả mãn điều kiện HAVING
mới được xuất ra bảng kết quả.
34
Ví 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
Sử dụng WHERE và HAVING
35
Ví dụ 2
SELECT Productid, Sum(Quantity) As Total
FROM [Order Details]
GROUP BY Productid
HAVING Sum(Quantity)>=30
SELECT Customerid, Count(Orderid)
AS „Count Order of Customers„ FROM Orders
GROUP BY Customerid
HAVING Count(Orderid) <=5
Sử dụng WHERE và HAVING
36
Sử dụng Group với ROLLUP
• Roll Up sẽ chèn thêm các dòng Total nằm trước các nhóm
mẫu tin được phân thành Group By
SELECT Productid, Orderid, Sum(Quantity) As Total
FROM [Order Details]
WHERE Orderid <10250
GROUP BY Productid, Orderid
ORDER BY Productid, Orderid
SELECT Productid, Orderid, Sum(Quantity) As Total
FROM [Order Details]
WHERE Orderid <10250
GROUP BY Productid, Orderid
WITH ROLLUP
ORDER BY Productid, Orderid
37
Ví dụ
SELECT Productid, Orderid, Sum(Quantity) As Total
FROM [Order Details]
WHERE Orderid <10250
GROUP BY Productid, Orderid
WITH CUBE
ORDER BY Productid, Orderid
Tương tự như Rollup nhưng thêm các dòng Total của mỗi
sự kết hợp có thể có giữa các cột
Sử dụng Group với Cube
38
CUBE and ROLLUP
Kết quả
39
Mệnh đề COMPUTE
• Thường dùng để kiểm tra số liệu, dùng kèm với các hàm thống
kê SUM, AVG, MAX, MIN,…
• COMPUTE…BY…: Có kết nhóm
1) SELECT c.CustomerID, o.OrderID, (od.quantity * od.unitprice) as
'total‘ FROM Orders o, [order details] od, Customers c
WHERE c.CustomerID = o.CustomerID AND o.OrderID =
od.OrderID AND c.CustomerID LIKE 'AN%‘ ORDER BY
c.customerID COMPUTE SUM( od.quantity * od.unitprice)
2) SELECT c.CustomerID, o.OrderID, (od.quantity * od.unitprice)
'total‘ FROM Orders o, [order details] od, Customers c
WHERE c.CustomerID = o.CustomerID AND o.OrderID =
od.OrderID AND c.CustomerID LIKE 'AN%‘ ORDER BY
c.customerID COMPUTE SUM(od.quantity * od.unitprice) BY
c.CustomerID
40
Ví dụ
SELECT Productid, Orderid, Quantity
FROM [Order Details]
ORDER BY Productid, Orderid
COMPUTE Sum(Quantity)
SELECT Productid, Orderid, Sum(Quantity) As Total
FROM [Order Details]
ORDER BY Productid, Orderid
COMPUTE SUM(Quantity) By Productid
COMPUTE SUM(Quantity)
Mệnh đề COMPUTE
41
Mệnh đề JOIN-Kết nối nhiều bảng
• Mệnh đề join dùng để khôi phục dữ liệu từ nhiều hơn 1 bảng
• Cú pháp
SELECT column_name [,n..]
FROM table_name table_alias
[CROSS|INNER|[LEFT | RIGHT]OUTER] JOIN
table_name table_alias
[ON table_name.ref_column_name join_operator
table_name.ref_column_name]
[WHERE search_condition]
42
Kế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
JOIN Publishers p on t.Pub_Id=p.Pub_Id
WHERE Pub_Name='New Moon Books'
43
Cá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.
• Ví dụ
SELECT OrderID,p.ProductID, ProductName,
CategoryName ,Quantity
FROM [Order Details] o JOIN Products p
ON o.ProductID = p.ProductID
JOIN Categories c
ON p.CategoryID = c.CategoryID
44
Các loại kết nối
• Inner Join
• Outer Join
• Cross Join
• Equi Join
• Natural Join
• Self Join
45
Kế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
• Ví dụ:
SELECT t.title,t.price, p.pub_name, p.city, t.pubdate
from titles t join publishers p
on t.pub_id = p.pub_id
46
Kết nối nội - Inner joins
46
SELECT Customers.CustomerID, CompanyName,
OrderID, OrderDate
FROM Customers INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
SELECT ProductName, od.OrderID, Quantity, UnitPrice,
Quantity * UnitPrice AS [Money]
FROM Products AS p INNER JOIN [Order Details]
AS od ON p.ProductID = od.ProductID
INNER JOIN Orders As o
ON od.OrderID = o.OrderID
WHERE Month(OrderDate) = 7
47
Kế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.
• Ví dụ:
SELECT p.pub_name, p.state, a.au_lname, a.au_fname, a.state
FROM publishers p INNER JOIN authors a
ON a.state > p.state
WHERE p.pub_name = 'New Moon Books'
ORDER BY au_lname ASC, au_fname ASC
48
Kế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]
FROM table_name [LEFT | RIGHT] OUTER JOIN
table_name
ON table_name.ref_column_name
join_operator table_name.ref_column_name
49
Kế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ị trong bảng kết quả.
• Ví dụ:
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p ON
a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC,
a.au_fname ASC
50
Cross 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
51
Kế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
52
Truy vấn tự kết nối (self-join)
• Ví dụ: tìm tất cả sinh viên đã học ít nhất là 2 course
SELECT t1.StudID
FROM Transcript t1 JOIN Transcript t2
ON t1.CrsCode = t2.CrsCode AND
t1.StudID = t2.StudID
2( (
[ , 2, 2, 2]))
StudID CrsCode CrsCode
TRANSCRIPT TRANSCRIPT
StudID CrsCode Semester Grade
53
Truy vấn tự kết nối (self-join)
SELECT Customers.CustomerID, CompanyName,
OrderID, OrderDate FROM Customers INNER JOIN
Orders
ON Customers.CustomerID = Orders.CustomerID
SELECT ProductName, od.OrderID, Quantity, UnitPrice,
Quantity * UnitPrice AS [Money] FROM Products AS p
INNER JOIN [Order Details] AS od ON p.ProductID =
od.ProductID
INNER JOIN Orders As o ON od.OrderID = o.OrderID
WHERE Month(OrderDate) = 7
54
55
Truy 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
56
SELECT FROM Table
WHERE =
(SELECT FROM
WHERE =
)
Parent Query
Subquery
Operator
A subquery is a SELECT statement inside
another SELECT statement.
Cú pháp
Truy vấn con - Subqueries
57
• Ví dụ 1:
SELECT Ord.OrderID, Ord.OrderDate, (SELECT
MAX(OrdDet.UnitPrice)
FROM Northwind.dbo.[Order Details] AS
OrdDet WHERE Ord.OrderID =OrdDet.OrderID) AS
MaxUnitPrice
FROM Northwind.dbo.Orders AS Ord
• 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)
57
Truy vấn con - Subqueries
58
• Cách 1: dùng subquery.
SELECT ProductName FROM Products
WHERE UnitPrice = (SELECT UnitPrice FROM Products
WHERE ProductName = 'Sir Rodney''s Scones')
• Cách 2: dùng join
SELECT Prd1.ProductName FROM Products AS Prd1 JOIN
Products AS Prd2
ON (Prd1.UnitPrice = Prd2.UnitPrice)
WHERE Prd2.ProductName = 'Sir Rodney''s Scones'
Truy vấn con - Subqueries
59
• 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)
–WHERE [NOT] EXISTS (subquery)
Truy vấn con - Subqueries
60
Subqueries 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???
61
Subquery 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 WHERE price >
(SELECT MIN(price) FROM titles)
62
Subquery trả về một giá trị
Use Aggregrate Functions in Subquery as
Max(), Min(), Avg(),…
Khi một subquery được sử dụng trong mệnh đề
SELECT, nó trả về dữ liệu thay cho một cột.
Loại subquery này được gọi là scalar query bởi vì
nó chỉ trả về một giá trị.
Ví dụ
SELECT ProductName, UnitPrice FROM Products
WHERE CategoryID =1 and UnitPrice <
(SELECT AVG(Unitprice) FROM Products)
63
Sử dụng toán tử In, Not in, Any, all…
Ví dụ
1) SELECT Ordeid FROM [Order details]
WHERE ProductId
In (SELECT Productid FROM Products
WHERE CategoryID =1)
2) SELECT Ordeid, Productid, Quantity FROM [Order
details] WHERE ProductId =1 and quantity >=All
(SELECT Quantity FROM [Order Details] WHERE
CategoryID =1)
Subquery trả về nhiều giá trị
64
• Cho biết các sản phẩm có đơn giá cao nhất
SELECT *
FROM PRODUCTS
WHERE Unitprice >= ALL
(SELECT unitprice FROM Products)
• Cho biết các sản phẩm có đơn vị tính có chữ Box và có đơn giá cao
nhất
SELECT *
FROM PRODUCTS
WHERE QuantityPerunit like „%box%‟ and
Unitprice >= ALL
(SELECT unitprice FROM Products)
Subquery trả về nhiều giá trị
65
Subquery với các toán tử so sánh
• Subquery trả về một giá trị
SELECT ProductName, UnitPrice FROM Products
WHERE SupplierID=1 and
UnitPrice < ( SELECT AVG(UnitPrice) FROM Products
WHERE SupplierID=1 )
• Subquery trả về một dãy giá trị
Select OrderID from [order details]
Where ProductID IN (select ProductID
From Products
Where SupplierID=1)
66
Subquery với các toán tử so sánh
Select OrderID , productID, quantity from [order deta