58
1 Chuong 7 Chuong 7 Ngôn ngữ SQL Ngôn ngữ SQL

Chuong 7 Ngôn ngữ SQL

  • 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

Page 1: Chuong 7 Ngôn ngữ SQL

11

Chuong 7Chuong 7Ngôn ngữ SQLNgôn ngữ SQL

Page 2: Chuong 7 Ngô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

Page 3: Chuong 7 Ngôn ngữ SQL

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

Page 4: Chuong 7 Ngôn ngữ SQL

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

Page 5: Chuong 7 Ngôn ngữ SQL

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

Page 6: Chuong 7 Ngôn ngữ SQL

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 ] ]

Page 7: Chuong 7 Ngôn ngữ SQL

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 ] ]

Page 8: Chuong 7 Ngôn ngữ SQL

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

Page 9: Chuong 7 Ngôn ngữ SQL

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???

Page 10: Chuong 7 Ngôn ngữ SQL

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

Page 11: Chuong 7 Ngôn ngữ SQL

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

Page 12: Chuong 7 Ngôn ngữ SQL

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

Page 13: Chuong 7 Ngôn ngữ SQL

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

Page 14: Chuong 7 Ngôn ngữ SQL

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

Page 15: Chuong 7 Ngôn ngữ SQL

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

Page 16: Chuong 7 Ngôn ngữ SQL

Database sample NorthWindDatabase sample NorthWind Bảng EMployeesBảng EMployees- Note MemoNote Memo- ReporsTo NumberReporsTo Number

1616

Page 17: Chuong 7 Ngôn ngữ SQL

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

Page 18: Chuong 7 Ngôn ngữ SQL

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

Page 19: Chuong 7 Ngôn ngữ SQL

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

Page 20: Chuong 7 Ngôn ngữ SQL

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

Page 21: Chuong 7 Ngôn ngữ SQL

Database sample NorthWindDatabase sample NorthWind Bảng ProductsBảng Products- UnitsOnOrder Number UnitsOnOrder Number

ReOrderLevel ReOrderLevel Number Number- Discontinued Yes/NoDiscontinued Yes/No

2121

Page 22: Chuong 7 Ngôn ngữ SQL

Database sample NorthWindDatabase sample NorthWind Bảng ShippersBảng Shippers- ShipperID AutoNumber ShipperID AutoNumber

CompanyName CompanyName Text Text- Phone TextPhone Text

2222

Page 23: Chuong 7 Ngôn ngữ SQL

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

Page 24: Chuong 7 Ngôn ngữ SQL

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

Page 25: Chuong 7 Ngôn ngữ SQL

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]

Page 26: Chuong 7 Ngôn ngữ SQL

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

Page 27: Chuong 7 Ngôn ngữ SQL

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

Page 28: Chuong 7 Ngôn ngữ SQL

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'

Page 29: Chuong 7 Ngôn ngữ SQL

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

Page 30: Chuong 7 Ngôn ngữ SQL

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

Page 31: Chuong 7 Ngôn ngữ SQL

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

Page 32: Chuong 7 Ngôn ngữ SQL

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)

Page 33: Chuong 7 Ngôn ngữ SQL

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)

Page 34: Chuong 7 Ngôn ngữ SQL

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)

Page 35: Chuong 7 Ngôn ngữ SQL

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ả.

Page 36: Chuong 7 Ngôn ngữ SQL

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

Page 37: Chuong 7 Ngôn ngữ SQL

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

Page 38: Chuong 7 Ngôn ngữ SQL

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]

Page 39: Chuong 7 Ngôn ngữ SQL

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'

Page 40: Chuong 7 Ngôn ngữ SQL

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

Page 41: Chuong 7 Ngôn ngữ SQL

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

Page 42: Chuong 7 Ngôn ngữ SQL

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

Page 43: Chuong 7 Ngôn ngữ SQL

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

Page 44: Chuong 7 Ngôn ngữ SQL

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

Page 45: Chuong 7 Ngôn ngữ SQL

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

Page 46: Chuong 7 Ngôn ngữ SQL

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

Page 47: Chuong 7 Ngôn ngữ SQL

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

Page 48: Chuong 7 Ngôn ngữ SQL

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

Page 49: Chuong 7 Ngôn ngữ SQL

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

Page 50: Chuong 7 Ngôn ngữ SQL

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

Page 51: Chuong 7 Ngôn ngữ SQL

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)

Page 52: Chuong 7 Ngôn ngữ SQL

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'

Page 53: Chuong 7 Ngôn ngữ SQL

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))

Page 54: Chuong 7 Ngôn ngữ SQL

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???

Page 55: Chuong 7 Ngôn ngữ SQL

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)

Page 56: Chuong 7 Ngôn ngữ SQL

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.

Page 57: Chuong 7 Ngôn ngữ SQL

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)

Page 58: Chuong 7 Ngôn ngữ SQL

5858

Subquery với các toán tử so sánhSubquery với các toán tử so sánh