Phép Join trong SQL

Cập nhật: Lượt xem: 508 [ Mysql ]

Phép nối (join) được sử dụng để kết hợp các dòng dữ liệu giữa các bảng

Phép Join trong SQL

Phép nối (join) được sử dụng để kết hợp các dòng dữ liệu giữa các bảng.Trong SQL có các loại nối như sau:
• Inner Join (Equi-join, Natural Join )
• Outer Join (Left outer Join, Right outer join, Full outer join)
• Cross Join
• Self Join
Để minh họa, ta sử dụng 2 bảng Employees và Departments như sau:

--
-- Table structure for table `Employees`
--

CREATE TABLE IF NOT EXISTS `Employees` (
  `id` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `EName` varchar(255) NOT NULL,
  `DeptID` int(11)
);

--
-- Dumping data for table `Employees`
--

INSERT INTO `Employees` (`id`, `Ename`, `DeptID`) VALUES
(1, 'Chuc', 5),
(2, 'Ngoc', 2),
(3, 'Anh', 2),
(4, 'Thuy', 5),
(5, 'Nguyen', 1),
(6, 'Tan', 6),
(7, 'Khoa', NULL)
;

-- --------------------------------------------------------

--
-- Table structure for table `Departments`
--

CREATE TABLE IF NOT EXISTS `Departments` (
  `id` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `DeptName` varchar(255) NOT NULL
);

INSERT INTO `Departments` (`id`, `DeptName`) VALUES
(1, 'Ke Toan'),
(2, 'Ngan Hang'),
(3, 'Luat'),
(4, 'Kinh Te'),
(5, 'Tin Hoc'),
(6, 'Thonng Ke'),
(7, 'Thuong Mai')
;

join-sql-1  join-sql-2

1)Inner Join

Inner join chỉ hiển thị những dòng dữ liệu được so khớp (match) ở trong cả 2 bảng

SELECT  T1.id, T1.EName, T2.DeptName 
FROM Empolyees T1 
INNER JOIN Departments T2 
ON T1.DeptID = T2.id

join-sql-3

Equi-Join

Equi join  là phép nối mà trong đó điều kiện nối chỉ thực thực hiện phép so sánh bằng (=)

SELECT * 
FROM Employees T1 
JOIN Depaartments T2 
ON T1.DeptID = T2.id

join-sql-4

2)Outer Join

Outer join trả về tất cả các dòng của cả 2 bảng cho dù các dòng dữ liệu có được so khớp (match) hay không

outer join có 3 loại sau:

  • Left outer join
  • Right outer join
  • Full outer join

a) Left Outer join

Hiển thị tất cả các dòng trong bảng đầu tiên (bên trái phép nối), các dòng trong bảng thứ 2 nếu không so khớp sẽ nhận giá trị null

SELECT * 
FROM Employees T1 
LEFT OUTER JOIN Departments T2 
ON T1.DeptID = T2.id

join-sql-5

b) Right outer join

Ngược lại với Left Outer Join

SELECT *
FROM Employees T1
RIGHT OUTER JOIN Departments T2
ON T1.DeptID = T2.id

join-sql-6

c) Full outer join

Hiển thị tất cả các dòng trong cả 2 bảng cho dù dữ liệu có được so khớp (match) hay không

SELECT *
FROM Employees T1
FULL OUTER JOIN Departments T2
ON T1.DeptID = T2.id

join-sql-7

3) Cross Join

Cross join  là phép tích đề các  (Cartesian Product) giữa các dòng dữ liệu trong 2 bảng. Kích thước của Cross Join là n*m. Trong đó, n và m là số dòng dữ liệu của 2 bảng.

 

SELECT * 
FROM Employees 
CROSS JOIN Departments

join-sql-9

Chú ý: Cross join có thể viết lại đơn giản như sau

SELECT * FROM Employees, Departments

4) Self Join

Self Join là phép nối 1 bảng với chính nó, Self Join thường được sử dụng khi muốn trích xuất những dòng dữ liệu có mối quan hệ hoặc tương tự với các dòng dữ liệu khác trong cùng một bảng. Vì vậy, ta phải sử dụng các bí danh (alias) khác nhau cho cùng 1 bảng.

Truy vấn sau đây đưa ra các nhân viên có ID trùng với DeptID

SELECT T1.EName 
FROM Employees T1 
INNER JOIN Employees T2 
ON T1.id = T2.DeptID

join-sql-8

Giả sử có bảng hàng hóa (ITEMS) với dữ liệu như sau:

--
-- Table structure for table `Items`
--

CREATE TABLE IF NOT EXISTS `Items` (
  `INO` int(10) unsigned NOT NULL PRIMARY KEY,
  `INAME` varchar(255) NOT NULL,
  `PRICE` int(11)
);

--
-- Dumping data for table `Employees`
--

INSERT INTO `Items` (`INO`, `INAME`, `PRICE`) VALUES
(I001, 'CPU', 120),
(I002, 'MONITOR', 25),
(I003, 'RAM', 70),
(I004, 'MOUSE', 10);

join-sql-10

Yêu cầu: Giảm giá 2 mặt hàng có giá cao nhất xuống 10%

UPDATE ITEMS
SÊT ITEMS.PRICE = T1.PRICE*0.9
FROM (SELECT TOP 2 * FROM ITEMS ORDER BY PRICE DESC) AS T1
WHERE ITEMS.INO = T1.INO

SELECT * FROM ITEMS

join-sql-11