Upload
lucas
View
95
Download
1
Embed Size (px)
DESCRIPTION
Chuong 7 Ngôn ngữ SQL. Nội dung. Giới thiệu chung Ba nhóm ngôn ngữ SQL DDL DML DCL Câu lệnh SELECT Lọc dữ liệu Các kiểu kết nối Subquery. Giớ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: - PowerPoint PPT Presentation
Citation preview
11
Chuong 7Chuong 7Ngôn ngữ SQLNgôn ngữ SQL
22
Nội dungNội dung Giới thiệu chungGiới thiệu chung Ba nhóm ngôn ngữ SQLBa nhóm ngôn ngữ SQL
• DDLDDL• DMLDML• DCLDCL
Câu lệnh SELECTCâu lệnh SELECT• Lọc dữ liệuLọc dữ liệu• Các kiểu kết nốiCác kiểu kết nối• SubquerySubquery
33
Giới thiệu chungGiới thiệu chung Là ngôn ngữ chuẩn cho các CSDL Là ngôn ngữ chuẩn cho các CSDL
quan hệquan hệ Chuẩn ANSI SQL được công bố vào Chuẩn ANSI SQL được công bố vào
năm 1989, 1992 và 1999năm 1989, 1992 và 1999 Đặc điểm của SQL:Đặc điểm của SQL:
• Ngôn ngữ tựa tiếng AnhNgôn ngữ tựa tiếng Anh• Ngôn ngữ phi thủ tụcNgôn ngữ phi thủ tục
44
Giới thiệu chungGiới thiệu chung SQL chia thành 3 nhóm:SQL chia thành 3 nhóm:
•Data Definition Language Data Definition Language (DDL): ngôn ngữ định nghĩa dữ (DDL): ngôn ngữ định nghĩa dữ liệu gồm các lệnhliệu gồm các lệnh CREATE/ALTER/DROP DATABASECREATE/ALTER/DROP DATABASE CREATE/ALTER/DROP TABLECREATE/ALTER/DROP TABLE
55
Giới thiệu chungGiới thiệu chung• Data manipulation Language Data manipulation Language
(DML): ngôn ngữ thao tác dữ liệu(DML): ngôn ngữ thao tác dữ liệu SELECTSELECT INSERT, UPDATE, DELETE, TRUNCATEINSERT, UPDATE, DELETE, TRUNCATE
• Data Control Language (DCL): ngôn Data Control Language (DCL): ngôn ngữ điều khiển dữ liệungữ điều khiển dữ liệu GRANT/REVOKE/ADD GRANT/REVOKE/ADD COMMIT/ROLLBACKCOMMIT/ROLLBACK
66
Truy vấn dữ liệuTruy vấn dữ liệu Cú pháp chung của lệnh SELECTCú pháp chung của lệnh SELECTSELECT SELECT select_list select_list
[ INTO [ INTO new_tablenew_table ] ] FROM FROM table_source table_source [ WHERE [ WHERE search_condition search_condition ] ] [ GROUP BY [ GROUP BY group_by_expression group_by_expression ] ] [ HAVING [ HAVING search_condition search_condition ] ] [ ORDER BY [ ORDER BY order_expressionorder_expression [ ASC | [ ASC | DESC ] ] DESC ] ]
77
Mệnh đề SELECTMệnh đề SELECT Để đưa ra danh sách các cột cần xemĐể đưa ra danh sách các cột cần xem Cú pháp:Cú pháp:SELECT [ ALL | DISTINCT ][ TOP SELECT [ ALL | DISTINCT ][ TOP nn [ PERCENT ] [ PERCENT ]
[ WITH TIES ] ] < select_list > [ WITH TIES ] ] < select_list > < select_list > ::= < select_list > ::= { * { *
|{ |{ table_nametable_name | | view_nameview_name | | table_alias table_alias }.* }.* | { | { column_namecolumn_name | | expressionexpression } } [ [ AS ] [ [ AS ] column_aliascolumn_alias ] ] | | column_alias column_alias = = expression expression
} [ ,...} [ ,...n n ] ]
88
Mệnh đề SELECTMệnh đề SELECT ALL (DEFAULT): hiển thị tất cả các ALL (DEFAULT): hiển thị tất cả các
bản ghi kể cả các hàng trùng nhau.bản ghi kể cả các hàng trùng nhau. DISTINCT: chỉ hiển thị các hàng duy DISTINCT: chỉ hiển thị các hàng duy
nhất không trùng nhau trong bảng nhất không trùng nhau trong bảng kết quả. kết quả.
Ví dụ: liệt kê tất cả các thành phố mà Ví dụ: liệt kê tất cả các thành phố mà hiện thời các khách hàng đang sốnghiện thời các khách hàng đang sốngSELECT DISTINCT City , Region FROM SELECT DISTINCT City , Region FROM
CustomersCustomers
99
Mệnh đề SELECTMệnh đề SELECT TOP TOP n n [PERCENT]: ch[PERCENT]: chỉ cỉ có n hàng đầu tiên ó n hàng đầu tiên
hay n% của các hàng của bảng kết quả hay n% của các hàng của bảng kết quả được xuất .được xuất .
WITH TIES: cho phép 1 số hàng được thêm WITH TIES: cho phép 1 số hàng được thêm vào bảng kết quả gốc nếu cvào bảng kết quả gốc nếu các hàng nác hàng này ày có cùng giá trị trong cột ORDER BY với 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 hàng cuối cùng của n hàng đầu tiên được xác định.xác định.
Ví dụ: liệt kê 3 hoá đơn có cước phí cao Ví dụ: liệt kê 3 hoá đơn có cước phí cao nhấtnhấtSELECT top 3 with ties OrderID, Freight from SELECT top 3 with ties OrderID, Freight from
Orders order by Freight DESCOrders order by Freight DESCNNếu hàng thứ tư có cùng cước phí (freight) với ếu hàng thứ tư có cùng cước phí (freight) với
hàng thứ ba trong bảng kết quả thì sao???hàng thứ ba trong bảng kết quả thì sao???
1010
Mệnh đề SELECTMệnh đề SELECT Trường tính toán được xây dựng từ Trường tính toán được xây dựng từ
biểu thức (Expression) có liên quan biểu thức (Expression) có liên quan đến các trường cơ sở. đến các trường cơ sở.
Biểu thức bao gồm:Biểu thức bao gồm:• Các trườngCác trường• Các toán tử số học, logic, so sánhCác toán tử số học, logic, so sánh• Các hàm Các hàm
Database sample NorthWindDatabase sample NorthWind Bảng CategoriesBảng Categories- CategoryID AutoNumber- CategoryID AutoNumber- CategoryName TextCategoryName Text- Dessription MemoDessription Memo- Picture OLE Object- Picture OLE Object
1111
Database sample NorthWindDatabase sample NorthWind Bảng CustomerBảng Customer- CustomerID Text- CustomerID Text- CompanyName TextCompanyName Text- ContectName Text- ContectName Text- ContactTitle TextContactTitle Text- Address TextAddress Text- City TextCity Text- Region Text- Region Text
1212
Database sample NorthWindDatabase sample NorthWind Bảng CustomerBảng Customer- PostalCode Text- PostalCode Text- Country TextCountry Text- Phone Text- Phone Text- Fax TextFax Text
1313
Database sample NorthWindDatabase sample NorthWind Bảng EMployeesBảng EMployees- EmployeeID AutoNumberEmployeeID AutoNumber- LastName TextLastName Text- Title TextTitle Text- TitleOfCourtesty TextTitleOfCourtesty Text- BirthDate Date/timeBirthDate Date/time- HireDate Date/timeHireDate Date/time- Address TextAddress Text
1414
Database sample NorthWindDatabase sample NorthWind Bảng EMployeesBảng EMployees- City TextCity Text- Regoin TextRegoin Text- PostalCode TextPostalCode Text- Country TextCountry Text- HomePhone TextHomePhone Text- Extension Text Extension Text
Photo TextPhoto Text1515
Database sample NorthWindDatabase sample NorthWind Bảng EMployeesBảng EMployees- Note MemoNote Memo- ReporsTo NumberReporsTo Number
1616
Database sample NorthWindDatabase sample NorthWind Bảng Order DetailsBảng Order Details- OderID NumberOderID Number- ProductID NumberProductID Number- UnitPrice CurrencyUnitPrice Currency- QuantityQuantity NumberNumber- DiscountDiscount NumerNumer
1717
Database sample NorthWindDatabase sample NorthWind Bảng OrderBảng Order- OderID AutoNumberOderID AutoNumber- CustomerID TextCustomerID Text- EmployeeID NumberEmployeeID Number- OrderDate OrderDate Date/timeDate/time- RequiredDate Date/timeRequiredDate Date/time- ShippedDate Date/timeShippedDate Date/time- ShipVia ShipVia NumerNumer
1818
Database sample NorthWindDatabase sample NorthWind Bảng OrderBảng Order- Freight CurrencyFreight Currency- ShipName TextShipName Text- ShipAddress TextShipAddress Text- ShipCity ShipCity Text Text- ShipRegion TextShipRegion Text- ShipPostalCode TextShipPostalCode Text- ShipCountry ShipCountry Text Text
1919
Database sample NorthWindDatabase sample NorthWind Bảng ProductsBảng Products- ProductIDt AutoNumberProductIDt AutoNumber- ProductName TextProductName Text- SupplierID NumberSupplierID Number- CategoryID CategoryID NumberNumber- QuantityPerUnit TextQuantityPerUnit Text- UnitPrite CurrentcyUnitPrite Currentcy- UnitsInStock UnitsInStock Number Number
2020
Database sample NorthWindDatabase sample NorthWind Bảng ProductsBảng Products- UnitsOnOrder Number UnitsOnOrder Number
ReOrderLevel ReOrderLevel Number Number- Discontinued Yes/NoDiscontinued Yes/No
2121
Database sample NorthWindDatabase sample NorthWind Bảng ShippersBảng Shippers- ShipperID AutoNumber ShipperID AutoNumber
CompanyName CompanyName Text Text- Phone TextPhone Text
2222
Database sample NorthWindDatabase sample NorthWind Bảng SuppliesBảng Supplies- SupplierID AutoNumber SupplierID AutoNumber
CompanyName CompanyName Text Text- ContactName TextContactName Text- ContactTitle TextContactTitle Text- Address TextAddress Text- City TextCity Text
2323
Database sample NorthWindDatabase sample NorthWind Bảng SuppliesBảng Supplies- Region Region Text Text- PostalCode TextPostalCode Text- Country TextCountry Text- Phone TextPhone Text- Fax TextFax Text- HomePage HyperlinkHomePage Hyperlink
2424
2525
Mệnh đề SELECTMệnh đề SELECT Ví dụ 1:Ví dụ 1:SELECT OrderID, ProductID, SELECT OrderID, ProductID, Amount =UnitPrice*Quantity* (1- Amount =UnitPrice*Quantity* (1-
Discount)Discount)FROM [Order Details]FROM [Order Details]
2626
Các hàm tập hợp (Aggregate function)Các hàm tập hợp (Aggregate function)
Tên hàmTên hàm Ý nghĩaÝ nghĩa
SUMSUM Tính tổng các sốTính tổng các sốMINMIN Trả về giá trị nhỏ nhấtTrả về giá trị nhỏ nhấtMAXMAX Trả về giá trị lớn nhấtTrả về giá trị lớn nhấtAVGAVG Tính giá trị trung bìnhTính giá trị trung bìnhCOUNTCOUNT Đếm số phần tửĐếm số phần tử
Đượ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ị đơn
2727
Ví dụ các hàm gộp trong lệnh selectVí dụ các hàm gộp trong lệnh select
SELECT sum(Freight) from dbo.OrdersSELECT sum(Freight) from dbo.Orders Tính tổng cước phí chuyên chở của tất cả Tính tổng cước phí chuyên chở của tất cả
hoá đơnhoá đơn SELECT count(OrderID) from dbo.OrdersSELECT count(OrderID) from dbo.Orders Đếm số hoá đơn Đếm số hoá đơn SELECT SUM(UnitPrice*Quantity*(1-SELECT SUM(UnitPrice*Quantity*(1-
Discount)) FROM dbo.[Order Details]Discount)) FROM dbo.[Order Details] Tính doanh số bán hàngTính doanh số bán hàng
2828
Mệnh đề WHEREMệnh đề WHERE Chứa điều kiện lọc dữ liệu cần trả vềChứa điều kiện lọc dữ liệu cần trả về Cú pháp: Cú pháp: WHERE <search_condition>WHERE <search_condition> Ví dụ:Ví dụ:SELECT CustomerID, CompanyName SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers FROM Northwind.dbo.Customers WHERE Region = 'WA' WHERE Region = 'WA'
2929
Mệnh đề ORDER BYMệnh đề ORDER BY Xác định thứ tự của bộ kết quảXác định thứ tự của bộ kết quả Cú phápCú pháp[ ORDER BY { [ ORDER BY { order_by_expressionorder_by_expression
[ ASC | DESC ] } [ [ ASC | DESC ] } [ ,,......nn] ] ] ]
ASC (ascending) : xếp theo thứ tự tăngASC (ascending) : xếp theo thứ tự tăngDESC (descending): xếp theo thứ tự DESC (descending): xếp theo thứ tự
giảmgiảm
3030
Nhóm dữ liệu trong bảng kết quảNhóm dữ liệu trong bảng kết quả
Những mệnh đề dùng để nhóm dữ Những mệnh đề dùng để nhóm dữ trong bảng kết quả:trong bảng kết quả:• GROUP BYGROUP BY: tổng hợp bảng kết quả theo : tổng hợp bảng kết quả theo
nhóm bằng cách dùng các hàm gộpnhóm bằng cách dùng các hàm gộp• COMPUTECOMPUTE và và COMPUTE BYCOMPUTE BY: mệnh đề : mệnh đề
COMPUTE trong lệnh SELECT được dùng COMPUTE trong lệnh SELECT được dùng để phát ra các hàng tổng hợp bằng cách để 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 dùng hàm gộp. Mệnh đề COMPUTE BY được dùng để tổng hợp thêm các hàng được dùng để tổng hợp thêm các hàng kết quả theo cộtkết quả theo cột
3131
Mệnh đề GROUP BYMệnh đề GROUP BY Cú phápCú pháp::[ GROUP BY [ ALL ] [ GROUP BY [ ALL ] group_by_expression group_by_expression
[ ,...[ ,...nn ] ] ALL:ALL: bảng kết quả sẽ chứa tất cả các 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 nhóm kể cả những nhóm không thỏa mãn điều kiện lọc trong trong mệnh mãn điều kiện lọc trong trong mệnh đề WHERE, những nhóm không thoả đề WHERE, những nhóm không thoả điều kiện sẽ có giá trị null. điều kiện sẽ có giá trị null.
group_by_expression:group_by_expression: biểu thức dùng biểu thức dùng để xác định cột được nhómđể xác định cột được nhóm
3232
Ví dụVí dụ SELECT Type, Advance = SUM (Advance) SELECT Type, Advance = SUM (Advance)
FROM Titles WHERE Type IN ('business', FROM Titles WHERE Type IN ('business', 'mod_cook', 'trad_cook') GROUP BY Type'mod_cook', 'trad_cook') GROUP BY Type
Type Type AdvanceAdvance------------ ------------ ------------------------------------------business business 25125.000025125.0000mod_cook mod_cook 15000.000015000.0000trad_cook trad_cook 19000.000019000.0000
(3 row(s) affected)(3 row(s) affected)
3333
Ví dụ 2Ví dụ 2 SELECT Type, Advance = SUM (Advance) FROM SELECT Type, Advance = SUM (Advance) FROM
Titles WHERE Type IN ('business', 'mod_cook', Titles WHERE Type IN ('business', 'mod_cook', 'trad_cook') GROUP BY 'trad_cook') GROUP BY ALLALL Type Type
Type Type AdvanceAdvance------------ ------------ ------------------------------------------business business 25125.000025125.0000mod_cook mod_cook 15000.000015000.0000popular_comp popular_comp NULLNULLpsychology psychology NULLNULLtrad_cook trad_cook 19000.000019000.0000UNDECIDED UNDECIDED NULLNULL(6 row(s) affected)(6 row(s) affected)
3434
GROUP BY và HAVINGGROUP BY và HAVING Có thể hạn chế các nhóm trong bảng kết Có thể hạn chế các nhóm trong bảng kết
quả bằng mệnh đề HAVING. quả bằng mệnh đề HAVING. Chỉ sau khi dữ liệu đã được nhóm và tổng Chỉ sau khi dữ liệu đã được nhóm và tổng
hợp , điều kiện trong mệnh đề HAVING mới hợp , điều kiện trong mệnh đề HAVING mới được áp dụng. được áp dụng.
Không thể dùng 1 cột mà nó không tham 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 gia vào hàm gộp của mệnh đề SELECT hay của mệnh đề GROUP BY. của mệnh đề GROUP BY.
SELECT pub_id, AVG(price) FROM titles SELECT pub_id, AVG(price) FROM titles GROUP BY pub_id HAVING (AVG(price) > 10) GROUP BY pub_id HAVING (AVG(price) > 10)
3535
Sử dụng WHERE và HAVINGSử dụng WHERE và HAVING MMệnh đề ệnh đề HAVING giHAVING giống như mệnh ống như mệnh đề đề
WHERE nhưng chỉ áp dụng cho cả nhóm WHERE nhưng chỉ áp dụng cho cả nhóm trong khi mệnh đề WHERE áp dụng cho trong khi mệnh đề WHERE áp dụng cho từng hàng.từng hàng.
Một truy vấn có thể chứa cả mệnh đề Một truy vấn có thể chứa cả mệnh đề WHERE và mệnh đề HAVING. WHERE và mệnh đề HAVING. • Mệnh đề WHERE được áp dụng trước cho các 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 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 nào thoả mãn điều kiện của mệnh đề WHERE mới được nhóm dữ liệu.mới được nhóm dữ liệu.
• Sau đó mệnh đề HAVING sẽ được áp dụng cho 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 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ả. HAVING mới được xuất ra bảng kết quả.
3636
Ví dụVí dụ SELECT titles.pub_id, SELECT titles.pub_id,
AVG(titles.price) AVG(titles.price) FROM titles INNER JOIN publishers FROM titles INNER JOIN publishers ON titles.pub_id = ON titles.pub_id =
publishers.pub_id WHERE publishers.pub_id WHERE publishers.state = 'CA' publishers.state = 'CA'
GROUP BY titles.pub_id GROUP BY titles.pub_id HAVING AVG(price) > 10 HAVING AVG(price) > 10
3737
SELECT INTOSELECT INTO Lệnh SELECT với mệnh đề INTO được dùng 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 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. mà không cần phải định nghĩa trước bảng.
Cú phápCú phápSELECT columns_listSELECT columns_listINTO new_table_nameINTO new_table_nameFROM table_name1, table_name2,………,FROM table_name1, table_name2,………,table_name ntable_name nWHERE condition1, condition2,……….,WHERE condition1, condition2,……….,condition ncondition n
Ví dụVí dụSELECT Title_Id, Title SELECT Title_Id, Title INTOINTO NewTitles NewTitlesFROM Titles WHERE Price > $15FROM Titles WHERE Price > $15
3838
Mệnh đề JOINMệnh đề JOIN Mệnh đề join dùng Mệnh đề join dùng để Liên kết dữ để Liên kết dữ
liệu từ nhiều hơn 1 bảngliệu từ nhiều hơn 1 bảng CCú phápú phápSELECT column_name [,n..] SELECT column_name [,n..] FROM table_name FROM table_name table_aliastable_alias[CROSS|INNER|[LEFT | RIGHT]OUTER][CROSS|INNER|[LEFT | RIGHT]OUTER]
JOIN table_name JOIN table_name table_aliastable_alias[ON table_name.ref_column_name [ON table_name.ref_column_name
join_operator join_operator table_name.ref_column_name]table_name.ref_column_name]
[WHERE search_condition][WHERE search_condition]
3939
Kết nối các bảngKết nối các bảng KKết nối chỉ tồn tại trong thời gian truy vấnết nối chỉ tồn tại trong thời gian truy vấn.. KKết nối không thay đổi dữ liệu trong các bảng ết nối không thay đổi dữ liệu trong các bảng
của cơ sở dữ liệucủa cơ sở dữ liệu.. NNên tạo bí danh (alias) cho tên bảng để tránh ê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ơngõ tên dài và làm truy vấn dễ đọc hơn Ví dụ Ví dụ SELECT t.Title_Id, t.Title, p.Pub_Id SELECT t.Title_Id, t.Title, p.Pub_Id from Titles from Titles ttJOIN Publishers JOIN Publishers pp on t.Pub_Id=p.Pub_Id on t.Pub_Id=p.Pub_IdWHERE Pub_Name='New Moon Books'WHERE Pub_Name='New Moon Books'
4040
Các cột tham gia kết nốiCác cột tham gia kết nối NNếu kết nối nhiều hơn 2 bảng thì kết nối ế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 2 bảng trước, sau đó kết nối nhóm này với bảng thứ ba.với bảng thứ ba.
Ví dụVí dụ SELECT OrderID,p.ProductID, ProductName,SELECT OrderID,p.ProductID, ProductName,CategoryName ,QuantityCategoryName ,QuantityFROM [Order Details] o FROM [Order Details] o JOINJOIN Products p Products p ON o.ProductID ON o.ProductID == p.ProductID p.ProductIDJOINJOIN Categories c Categories c ON p.CategoryID = c.CategoryIDON p.CategoryID = c.CategoryID
4141
Các loại kết nốiCác loại kết nối Inner JoinInner Join Outer JoinOuter Join Cross JoinCross Join Equi JoinEqui Join Natural JoinNatural Join Self JoinSelf Join
4242
Kết nối nội - Inner joinsKết nối nội - Inner joins Trong kết nối nội, dữ liệu từ nhiều bảng 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ị được hiển thị sau khi so sánh giá trị trong 1 cột chung. Chỉ những hàng mà 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 có giá trị thoả mãn điều kiện kết nối trong cột chung đó mới được hiển thị. trong cột chung đó mới được hiển thị.
TíchTích CartesianCartesian: việc kết nối nhiều bảng : việc kết nối nhiều bảng mà không có điều kiện kết nối trong mà không có điều kiện kết nối trong mệnh đề ON sẽ tạo ra tích cartesian mệnh đề ON sẽ tạo ra tích cartesian giữa 2 bảnggiữa 2 bảng
4343
Kết nối nội - Inner joinsKết nối nội - Inner joins VVí dụí dụ::
SELECT t.title,t.price, SELECT t.title,t.price, p.pub_name, p.city, t.pubdatep.pub_name, p.city, t.pubdate
FROM titles t FROM titles t joinjoin publishers p publishers ponon t.pub_id = p.pub_id t.pub_id = p.pub_id
4444
Kết nối nội với toán tử lớn hơnKế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 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.kiện kết nối dùng toán tử không bằng nhau. Ví dụVí dụ::SELECT p.pub_name, p.state, a.au_lname, SELECT p.pub_name, p.state, a.au_lname,
a.au_fname, a.state a.au_fname, a.state FROM FROM publishers p INNER JOIN authors a publishers p INNER JOIN authors a ON a.state > p.stateON a.state > p.state WHERE p.pub_name = 'New Moon Books' WHERE p.pub_name = 'New Moon Books' ORDER BY au_lname ASC, au_fname ASC ORDER BY au_lname ASC, au_fname ASC
4545
Kết nối ngoại - Outer joinsKết nối ngoại - Outer joins KKết nối ngoại được dùng để cho ra kết quả ế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 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 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 cột mà không có giá trị phù hợp sẽ được hiển thị giá trị NULL.hiển thị giá trị NULL.
Cú phápCú phápSELECT column_name, column_name SELECT column_name, column_name
[,column_name][,column_name]FROM table_name FROM table_name [LEFT | RIGHT] OUTER JOIN[LEFT | RIGHT] OUTER JOIN
table_nametable_nameON table_name.ref_column_nameON table_name.ref_column_namejoin_operatorjoin_operator table_name.ref_column_name table_name.ref_column_name
4646
KKết nối trái - ết nối trái - LEFT OUTER JOINLEFT OUTER JOIN
TTất cả các hàng từ bảng bên trái ấ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ẽ trong mối kết nối giữa 2 bảng sẽ được hiển thị trong bảng kết quảđược hiển thị trong bảng kết quả. .
VVí dụí dụ::SELECT a.au_fname, a.au_lname, p.pub_name SELECT a.au_fname, a.au_lname, p.pub_name FROM authors a LEFT OUTER JOIN publishers p FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city ON a.city = p.city ORDER BY p.pub_name ASC, a.au_lname ASC, ORDER BY p.pub_name ASC, a.au_lname ASC,
a.au_fname ASCa.au_fname ASC
4747
Cross joinCross join Cross join trCross join trả về mọi tổ hợp có thể có ả về mọi tổ hợp có thể có
của tất cả các hàng trong các bảng của tất cả các hàng trong các bảng kết nốikết nối. .
Cross join khCross join không có mệnh đề ONông có mệnh đề ON• Nếu không mệnh đề WHERE, cross join Nếu không mệnh đề WHERE, cross join
sẽ tạo ra tích Cartesiansẽ tạo ra tích Cartesian• Nếu có mệnh đề WHERE, cross join sẽ Nếu có mệnh đề WHERE, cross join sẽ
thực hiện như 1 kết nối nộithực hiện như 1 kết nối nội
4848
Kết nối chéo - Cross joinKết nối chéo - Cross join Ví dụ 1:Ví dụ 1:SELECT au_fname, au_lname, pub_name FROM SELECT au_fname, au_lname, pub_name FROM
authors CROSS JOIN publishers ORDER BY au_lname authors CROSS JOIN publishers ORDER BY au_lname DESCDESC
KKết quả chứa 184 hàng (ết quả chứa 184 hàng (authors có authors có 23 hàng và 23 hàng và publishers có 8 hàngpublishers có 8 hàng; 23 x 8 = 184 hàng).; 23 x 8 = 184 hàng).
Ví dụ 2:Ví dụ 2:SELECT au_fname, au_lname, pub_name FROM SELECT au_fname, au_lname, pub_name FROM
authors CROSS JOIN publishers WHERE authors.city authors CROSS JOIN publishers WHERE authors.city = publishers.city ORDER BY au_lname DESC = publishers.city ORDER BY au_lname DESC
SELECT au_fname, au_lname, pub_name FROM SELECT au_fname, au_lname, pub_name FROM authors INNER JOIN publishers ON authors.city = authors INNER JOIN publishers ON authors.city = publishers.city ORDER BY au_lname DESCpublishers.city ORDER BY au_lname DESC
4949
Truy vấn con - SubqueriesTruy vấn con - Subqueries Subquery là lệnh SELECT mà kết quả Subquery là lệnh SELECT mà kết quả
trả về là 1 giá trị đơn (single value) trả về là 1 giá trị đơn (single value) và được đặt lồng vào bên trong các và được đặt lồng vào bên trong các lệnh SELECT, INSERT, UPDATE, hay lệnh SELECT, INSERT, UPDATE, hay DELETE, hay bên trong truy vấn con DELETE, hay bên trong truy vấn con khác. khác.
Subquery có thể được dùng bất kỳ Subquery có thể được dùng bất kỳ nơi nào mà biểu thức được phép nơi nào mà biểu thức được phép dùngdùng
5050
SubqueriesSubqueries Ví dụ 1:Ví dụ 1:SELECT Ord.OrderID, Ord.OrderDate, SELECT Ord.OrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice) (SELECT MAX(OrdDet.UnitPrice) FROM Northwind.dbo.[Order Details] FROM Northwind.dbo.[Order Details]
ASASOrdDet WHERE Ord.OrderID OrdDet WHERE Ord.OrderID
=OrdDet.OrderID=OrdDet.OrderID) AS MaxUnitPrice ) AS MaxUnitPrice FROM Northwind.dbo.Orders AS OrdFROM Northwind.dbo.Orders AS Ord
5151
SubqueriesSubqueries Subquery có thể được dùng để khôi Subquery có thể được dùng để khôi
phục dữ liệu từ nhiều bảng và có thể phục dữ liệu từ nhiều bảng và có thể được dùng như 1 được dùng như 1 cách khác của join cách khác của join (alternative to a join)(alternative to a join)
5252
SubqueriesSubqueries Cách 1: dùng subquery.Cách 1: dùng subquery.SELECT ProductName FROM Products SELECT ProductName FROM Products WHERE UnitPrice = (SELECT UnitPrice FROM WHERE UnitPrice = (SELECT UnitPrice FROM
Products WHERE ProductName = 'Sir Products WHERE ProductName = 'Sir Rodney''s Scones')Rodney''s Scones')
Cách 2: dùng joinCách 2: dùng join SELECT Prd1.ProductName FROM Products SELECT Prd1.ProductName FROM Products
AS Prd1 JOIN Products AS Prd2 AS Prd1 JOIN Products AS Prd2 ON (Prd1.UnitPrice = Prd2.UnitPrice) ON (Prd1.UnitPrice = Prd2.UnitPrice) WHERE Prd2.ProductName = 'Sir Rodney''s WHERE Prd2.ProductName = 'Sir Rodney''s
Scones' Scones'
5353
SubqueriesSubqueries Subquery có thể được dùng theo 1 Subquery có thể được dùng theo 1
trong các dạng sau:trong các dạng sau:
• WHERE WHERE expressionexpression [NOT] IN [NOT] IN ((subquerysubquery))
• WHERE WHERE expression comparison_operatorexpression comparison_operator [ANY | ALL] [ANY | ALL] ((subquerysubquery))
• WHERE [NOT] EXISTS WHERE [NOT] EXISTS ((subquerysubquery))
5454
Subqueries với toán tử INSubqueries với toán tử IN Kết quả của subquery được dùng với Kết quả của subquery được dùng với
IN (hay với NOT IN) thường là 1 danh IN (hay với NOT IN) thường là 1 danh sách (list) chứa từ 0 đến nhiều giá trị. sách (list) chứa từ 0 đến nhiều giá trị.
Ví dụ:Ví dụ:SELECT pub_name FROM publishers SELECT pub_name FROM publishers
WHERE pub_id IN (SELECT pub_id WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business') FROM titles WHERE type = 'business')
Dùng cách 2 với mệnh đề join???Dùng cách 2 với mệnh đề join???
5555
Subquery với các toán tử so sánhSubquery với các toán tử so sánh
Các toán tử so sánh đơn giản Các toán tử so sánh đơn giản (unmodified comparison operator)(unmodified comparison operator)=, < >, >, > =, <, ! >, ! <, or < ==, < >, >, > =, <, ! >, ! <, or < =
Subquery bắt đầu với toán tử so sánh Subquery bắt đầu với toán tử so sánh đơn giản và trả về 1 đơn giản và trả về 1 giá trị đơn giá trị đơn (single value)(single value)
SELECT DISTINCT title FROM titles SELECT DISTINCT title FROM titles WHERE price > (SELECT MIN(price) WHERE price > (SELECT MIN(price) FROM titles)FROM titles)
5656
Subquery với các toán tử so sánhSubquery với các toán tử so sánh Toán tử so sánh phức (Modified Toán tử so sánh phức (Modified
Comparison operators) là toán tử so Comparison operators) là toán tử so sánh đơn giản có kèm theo các từ All, sánh đơn giản có kèm theo các từ All, any hay someany hay some
(=toán tử s/sánh+ [All,Any,some])(=toán tử s/sánh+ [All,Any,some]) Subquery bắt đầu với toán tử so sánh Subquery bắt đầu với toán tử so sánh
phức sẽ trả về 1 danh sách (list) của phức sẽ trả về 1 danh sách (list) của 0 hay nhiều gia trị và có thể bao gồm 0 hay nhiều gia trị và có thể bao gồm cả mệnh đề GROUP BY hay HAVING.cả mệnh đề GROUP BY hay HAVING.
5757
Subquery với các toán tử so sánhSubquery với các toán tử so sánh >ALL>ALL có nghĩa lớn hơn mọi giá trị. có nghĩa lớn hơn mọi giá trị. >ANY>ANY có nghĩa lớn hơn ít nhất 1 giá có nghĩa lớn hơn ít nhất 1 giá
trịtrị Vd: >ALL (1, 2, 3) lớn hơn 3Vd: >ALL (1, 2, 3) lớn hơn 3
>ANY (1, 2, 3) lớn hơn 1>ANY (1, 2, 3) lớn hơn 1 Ví dụ:Ví dụ:SELECT au_lname, au_fname SELECT au_lname, au_fname FROM authors WHERE city <> ALL FROM authors WHERE city <> ALL
(SELECT city FROM publishers) (SELECT city FROM publishers)
5858
Subquery với các toán tử so sánhSubquery với các toán tử so sánh