1 Cơ bản về MySQL (phần 3) - Các toán tử và hàm cơ bản Sun Oct 09, 2011 8:45 pm
Trunks-Kun
Administrator
GROUP BY và HAVING
Các hàm tập hợp (ví dụ như SUM) thông thường cần thêm chức năng của mệnh đề GROUP BY.
GROUP BY...
Mệnh đề GROUP BY...được thêm vào SQL bởi vì các hàm tập hợp (như SUM) trả về một tập hợp của các giá trị trong cột mỗi khi chúng được gọi, và nếu không có GROUP BY ta không thể nào tính được tổng của các giá trị theo từng nhóm riêng lẻ trong cột.
Cú pháp của GROUP BY như sau:
Giả sử ta có bảng Sales như sau:
HAVING...
Mệnh đề HAVING...được thêm vào SQL vì mệnh đề WHERE không áp dụng được đối với các hàm tập hợp (như SUM). Nếu không có HAVING, ta không thể nào kiểm tra được điều kiện với các hàm tập hợp.
Cú pháp của HAVING như sau:
CompanySUM(Amount)W3Schools12600
Bí danh
Với SQL, bí danh có thể được sử dụng cho tên của cột và tên của bảng.
Bí danh cột:
Cú pháp bí danh cột như sau:
Bí danh bảng có cú pháp như sau:
Ta có bảng Persons như sau:
Câu lệnh SQL sau:
HọTênHansenOlaSvendsonTovePettersenKari
Câu lệnh JOIN
Nối kết và khoá
Đôi khi chúng ta phải lấy dữ liệu từ hai bảng cùng một lúc, chúng ta thực hiện một kết nối.
Các bảng trong CSDL có thể quan hệ ràng buộc với nhau thông qua các khoá. Một khoá chính (primary key) là một cột mà trong đó mỗi giá trị của hàng phải là duy nhất. Mục đích của khoá là kết nối dữ liệu lại với nhau, từ nhiều bảng khác nhau mà không gây trùng lắp dữ liệu giữa các bảng.
Trong bảng Employees (nhân viên) ở ví dụ dưới đây có cột Employees_ID là khoá chính, bảo đảm rằng không thể có hai dòng nào có trùng Employees_ID. Employees_ID dùng để phân biệt hai nhân viên khi họ trùng tên.
Trong ví dụ dưới đây:
Chúng ta có thể lấy dữ liệu từ hai bảng bằng cách kết nối chúng, tương tự như sau:
Ví dụ: Tìm xem ai đã đặt hàng sản phẩm và họ đã đặt món hàng gì:
Ta có thể sử dụng từ khoá JOIN để kết nối dữ liệu từ hai bảng.
Ví dụ: INNER JOIN
Cú pháp:
kết quả trả về:
Cú pháp:
kết quả trả về:
Cú pháp:
kết quả trả về:
NameHansen, Ola
Internet
Các hàm tập hợp (ví dụ như SUM) thông thường cần thêm chức năng của mệnh đề GROUP BY.
GROUP BY...
Mệnh đề GROUP BY...được thêm vào SQL bởi vì các hàm tập hợp (như SUM) trả về một tập hợp của các giá trị trong cột mỗi khi chúng được gọi, và nếu không có GROUP BY ta không thể nào tính được tổng của các giá trị theo từng nhóm riêng lẻ trong cột.
Cú pháp của GROUP BY như sau:
SELECT tên_cột, SUM(tên_cột) FROM tên_bảng GROUP BY tên_cộtVí dụ sử dụng GROUP BY:
Giả sử ta có bảng Sales như sau:
CompanyAmountW3Schools5500IBM4500W3Schools7100
Câu lệnh SQL sau:SELECT Company, SUM(Amount) FROM Salessẽ trả về kết quả:
CompanySUM(Amount)W3Schools17100IBM17100W3Schools17100
Kết quả trả về ở trên đôi khi không phải là cái mà ta mong đợi. Ta thêm mệnh đề GROUP BY vào trong câu lệnh SQL:SELECT Company, SUM(Amount) FROM Salesvà kết quả trả về lần này sẽ là:
GROUP BY Company
CompanySUM(Amount)W3Schools12600IBM4500
Kết quả này đúng là cái mà ta mong muốn.HAVING...
Mệnh đề HAVING...được thêm vào SQL vì mệnh đề WHERE không áp dụng được đối với các hàm tập hợp (như SUM). Nếu không có HAVING, ta không thể nào kiểm tra được điều kiện với các hàm tập hợp.
Cú pháp của HAVING như sau:
SELECT tên_cột, SUM(tên_cột) FROM tên_bảngTa sử dụng lại bảng Sales ở trên. Câu lệnh SQL sau:
GROUP BY tên_cột
HAVING SUM(tên_cột) điều_kiện giá_trị
SELECT Company, SUM(Amount) FROM Salessẽ trả về kết quả:
GROUP BY Company
HAVING SUM(Amount) > 10000
CompanySUM(Amount)W3Schools12600
Bí danh
Với SQL, bí danh có thể được sử dụng cho tên của cột và tên của bảng.
Bí danh cột:
Cú pháp bí danh cột như sau:
SELECT tên_cột AS bí_danh_cột FROM tên_bảngBí danh bảng:
Bí danh bảng có cú pháp như sau:
SELECT tên_cột FROM tên_bảng AS bí_danh_bảngVí dụ sử dụng bí danh cột:
Ta có bảng Persons như sau:
LastNameFirstNameAddressCityHansenOlaTimoteivn 10SandnesSvendsonToveBorgvn 23SandnesPettersenKariStorgt 20Stavanger
Câu lệnh SQL sau:
SELECT LastName AS Họ, FirstName AS Tên
FROM PersonsSẽ trả về kết quả:
HọTênHansenOlaSvendsonTovePettersenKari
Câu lệnh JOIN
Nối kết và khoá
Đôi khi chúng ta phải lấy dữ liệu từ hai bảng cùng một lúc, chúng ta thực hiện một kết nối.
Các bảng trong CSDL có thể quan hệ ràng buộc với nhau thông qua các khoá. Một khoá chính (primary key) là một cột mà trong đó mỗi giá trị của hàng phải là duy nhất. Mục đích của khoá là kết nối dữ liệu lại với nhau, từ nhiều bảng khác nhau mà không gây trùng lắp dữ liệu giữa các bảng.
Trong bảng Employees (nhân viên) ở ví dụ dưới đây có cột Employees_ID là khoá chính, bảo đảm rằng không thể có hai dòng nào có trùng Employees_ID. Employees_ID dùng để phân biệt hai nhân viên khi họ trùng tên.
Trong ví dụ dưới đây:
- Employee_ID là khoá chính của bảng Employees.
- Prod_ID là khoá chính của bảng Orders.
- Cột Employeed_ID trong bảng Orders được sử dụng để kết nối với bảng Employees, chỉ đến nhân viên trong bảng Employees.
Employees_IDName01Hansen, Ola02Svendson, Tove03Svendson, Stephen04Pettersen, Kari
Bảng Orders:Prod_IDProductEmployee_ID234Printer01657Table03865Chair03
Kết nối hai bảng với nhauChúng ta có thể lấy dữ liệu từ hai bảng bằng cách kết nối chúng, tương tự như sau:
Ví dụ: Tìm xem ai đã đặt hàng sản phẩm và họ đã đặt món hàng gì:
SELECT Employees.Name, Orders.Productkết quả trả về:
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
NameProductHansen, OlaPrinterSvendson, StephenTableSvendson, StephenChair
Ví dụ: Tìm xem ai đã đặt hàng máy in:SELECT Employees.Namekết quả trả về:
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
AND Orders.Product = 'Printer'
NameHansen, Ola
Sử dụng JOINTa có thể sử dụng từ khoá JOIN để kết nối dữ liệu từ hai bảng.
Ví dụ: INNER JOIN
Cú pháp:
SELECT cột_1, cột_2, cột_3Ai đã đặt hàng và họ đã đặt món hàng nào:
FROM bảng_1
INNER JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại
SELECT Employees.Name, Orders.ProductINNER JOIN trả về tất cả các dòng ở cả hai bảng khi chúng tương ứng với nhau. Nếu có một dòng ở bảng Employees không ứng với dòng nào ở bảng Orders, dòng đó sẽ không được tính.
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
kết quả trả về:
NameProductHansen, OlaPrinterSvendson, StephenTableSvendson, StephenChair
Ví dụ: LEFT JOINCú pháp:
SELECT cột_1, cột_2, cột_3Liệt kê tất cả các nhân viên và món hàng mà họ đặt (nếu có):
FROM bảng_1
LEFT JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại
SELECT Employees.Name, Orders.ProductLEFT JOIN trả về tất cả các dòng của bảng thứ nhất (Employees), ngay cả khi các dòng đó không ứng với dòng nào ở bảng thứ hai (Orders). Nếu có một dòng nào ở bảng Employees không ứng với bất cứ dòng nào ở bảng Orders thì dòng đó cũng vẫn được tính.
FROM Employees
LEFT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
kết quả trả về:
NameProductHansen, OlaPrinterSvendson, ToveSvendson, StephenTableSvendson, StephenChairPettersen, Kari
Ví dụ: RIGHT JOINCú pháp:
SELECT cột_1, cột_2, cột_3Liệt kê tất cả các mặt hàng được đặt và tên người đặt hàng (nếu có):
FROM bảng_1
RIGHT JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại
SELECT Employees.Name, Orders.ProductRIGHT JOIN trả về tất cả các dòng ở bảng thứ hai (Orders), ngay cả khi các dòng đó không ứng với dòng nào ở bảng thứ nhất (Employees). Nếu có một dòng nào ở bảng Orders không ứng với bất cứ dòng nào ở bảng Employees thì dòng đó cũng vẫn được tính.
FROM Employees
RIGHT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
kết quả trả về:
NameProductHansen, OlaPrinterSvendson, StephenTableSvendson, StephenChair
Ví dụ: Ai đã đặt hàng máy in:SELECT Employees.Namekết quả trả về:
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
WHERE Orders.Product = 'Printer'
NameHansen, Ola
Internet