I- With Grant Option
5. PHẮT BIỂU SQL
6.3. Mệnh đề INNER JOIN
P h á t biểu SQ L dạng SE L E C T có sử dụng m ệnh đề IN N E R J O IN thường dùng dể k ết hợp hai hay nhiều báng dữ liệu lại với nhau, cú pháp của SE L E C T có sử dụng m ệnh đề IN N E R JOIN:
SELECT [SELECT LIST] FROM <FIRST_TABLENAME>
INNER JOIN <SECOND_TABLENAME> ON < JOIN CONDITION>
WHERE <CRITERIANS> ORDER BY <COLUMN LIST>
[ASC / DESC]
Nếu bạn cần lấy ra m ột sô' cột trong các bảng có k ết nối lại với nhau bằng m ệnh dề IN N E R J O IN th ì cú pháp này viết lại như sau:
SELECT [FIELD1,FIELD2, ...] FROM <FIRST_TABLENAME>
ON <JOIN CONDITIONS WHERE <CRITERIANS> ORDER BY cCOLUMN LIST>
[ASC / DESC]
VÍ d u 8-23: INNER JO IN v ớ i m ộ t s ố c ộ t ch ỉ đ inh
I* in ra danh sách khách hàng mua hàng trong tháng 10 *I
Select CustName,OrderlD, OrderDate,Amount,
TotalAmount from tblCustomers inner join tblOrders
on tblCustomers.CustID = tblOrders.CustID where month (OrderDate) = 10
order by CustName
K ết quả trả về như sau:
CustName OrderlD OrđerDate . . TotalAmount
CENTURY Hotel 13 2001-10-17 388800000 CENTURY Hotel 14 2001-10-18 518400000 CENTURY Hotel 16 2001-10-17 388800000 CENTURY Hotel 17 2001-10-18 14400000 CENTURY Hotel 18 2001-10-18 12960000 CENTURY Hotel 110 2001-10-18 216000000 Plaza Hotel 12 2001-10-17 403200000 Plaza Hotel 19 2001-10-17 86400000 Plaza Hotel 11 2001-10-17 576000000 Plaza Hotel 15 2001-10-17 288000000
Nếu bạn cần lấy ra t ấ t cả các cột trong các bảng có k ế t nôi lại với nhau bằng m ệnh dề IN N E R JO IN , cú pháp trê n có th ể viết lại như sau:
SELECT f irst_tablename . * , second_tablename.*
[, next table name] FROM <f irst_tablename>
INNER JOIN <second_tablename> ON < j oin conditions>
[INNER JOIN <next_tablename> ON <join conditions:»]
WHERE <conditions> ORDER BY <column list>
[ASC / DESC]
V i d u 8-24: INNER JO IN v ớ i tấ t c á c trư ờng liê n q uan
I* in ra danh sách khách hàng mua hàng trong tháng 10 * I
Select CustlD,CustName,OrderlD, OrđerDate,TotalAmount
from tblCustomers inner join tblOrders
On TblCustomers.CustID=tblOrders.CustID where month (OrderDate) = 10
order by CustName DESC
CustID CustName .OrderlD .TotalAmount 13 Plaza Hotel .11 576000000 13 Plaza Hotel .15 288000000 12 Plaza Hotel .12 403200000 12 Plaza Hotel .19 86400000 16 CENTURY Hotel .13 388800000 16 CENTURY Hotel .14 518400000 16 CENTURY Hotel .16 388800000 16 CENTURY Hotel .17 14400000 16 CENTURY Hotel .18 12960000 16 CENTURY Hotel .110 .. 216000000
Nếu trong những bảng cần k ế t nối có tê n trường (cột) giống nhau th ì khi thực th i p h á t biểu
SQ L dạng S E L E C T phải chỉ rõ cột thuộc bảng nào. Trong trường hợp cả hai cùng lấy dữ liệu ra th ì bạn cần chuyển á n h xạ tê n khác cho cột thông qua m ệnh đề A S , ví dụ như:
SELECT first_tablename.CustID as CUSTID, second_tablename.CustID as CUSTID FROM <f irst_tablename>
INNER JOIN <second_tablename> ON <join condition>
WHERE <criterians> ORDER BY <column list>
[ASC / DESC]
Nếu trong những bảng cần k ế t nối đó có tê n trường (cột) giống nhau và không được chỉ rõ như trường hợp trê n khi khai báo trong cơ sở dữ liệu SQ L Server, khi thực th i phát biểu SQ L dạng
S E L E C T bạn sẽ bị lỗi, chẳng h ạ n như:
SELECT f irst_tablename. * , second_tablename. * FROM <first_tablename>
INNER JOIN <second_tablename> ON <j oin condition»
WHERE <criterians> ORDER BY ccolumn list>
[ASC / DESC]
Server: Msg 209, Lecel 16, S tate Line 1 Ambiguous column nam e 'CustID'
Tuy nhiên, với p h á t biểu trê n bạn có thể thực thi trong cơ sở dữ liệu M ySQL. Ngoài ra, p h át biểu SQL dạng S E L E C T sử dụng IN N E R JO IN bạn có th ể án h xạ (alias) tê n của bảng th à n h tên ngắn gọn để dễ th am chiếu về sau.
Thực ra p h á t biểu A L IA S có ý nghĩa giông như A S với tên cột trong bảng th à n h tê n cột khác trong phát biểu SELE C T.
Select p . * , s .* from tablenamel inner join tablename2
On tablenamel.fieldl = tablename2.field2
V í d ụ 8-25: INNER JO IN v ớ i á n h xạ t ê n b ản
Select c.CustName,
s .OrderlD,s.OrderDate, s .TotalAmount
from tblCustomer c inner join tblOrders s
On c .CustID=S.CustID
where month (s . OrderDate) =10 order by c . CustName DESC
K ết quả trả về như sau:
CustName OrderlD OrderDate . . TotalAmount
---CENTURY Hotel 13 2001- 10-17 .. 388800000 CENTURY Hotel 14 2001-10-18 .. 518400000 CENTURY Hotel 16 2001-10-17 .. 388800000 CENTURY Hotel 17 2001-10-18 .. 14400000 CENTURY Hotel 18 2001-10-18 .. 12960000 CENTURY Hotel 11 2001-10-18 .. 216000000 Plaza Hotel 12 2001-10-17 .. 403200000 Plaza Hotel 19 2001-10-17 .. 86400000 Plaza Hotel 11 2001-10-17 .. 576000000 Plaza Hotel 15 2001-10-17 .. 288000000
T ất nhiên, bạn cũng có th ể viết p h á t biểu trê n ứng với từng cột muốn lấy ra bằng cách khai báo tê n cột.