Câu lệnh SELECT là một câu lệnh quen thuộc trong SQL, được sử dụng để lấy về các kết quả ở các bảng trong CSDL ở SQL server. Cùng tìm hiểu chi tiết hơn về câu lệnh này nhé.
Mục lục
1. Cú pháp lệnh SELECT trong SQL
1.1 Cú pháp ở dạng đơn giản
Câu lệnh SELECT đơn giản nhất thường là:
SELECT column1, column2, … FROM table_name
Trong đó :
SELECT column1, column2, …các cột bạn muốn lấy từ bảng table_name
. Các tên cột này được phân cách bằng dấu phẩy.
FROM table_name là cách đơn giản và rõ ràng để truy vấn dữ liệu từ một bảng trong SQL, cho phép bạn chọn từng cột cụ thể từ bảng đã chỉ định
SELECT * FROM table_name
Dấu sao *
trong câu lệnh SELECT có ý nghĩa là “lấy tất cả các cột” từ bảng đã chỉ định.
1.2 Cú pháp ở dạng đầy đủ
Còn dạng đầy đủ câu lệnh sẽ dài hơn với
SELECT [ ALL | DISTINCT ] [ TOP (gia_tri_dau) [ PERCENT ] [ WITH TIES ] ] “Biểu thức” FROM “bảng” [WHERE “điều kiện”] [GROUP BY “biểu thức”] [HAVING “điều kiện”] [ORDER BY “biểu thức” [ ASC | DESC ]];
2. Tên biến hoặc giá trị biến
2.1 Tên biến và giá trị
Ngoài ra khi kết hợp với câu lệnh SELECT chúng ta sẽ kết hợp các biến sau
ALL – Tùy chọn. Kết quả trả về tất cả các hàng phù hợp
DISTINCT – Tùy chọn. Loại tất cả các giá trị bị trùng khỏi kết quả trả về.
TOP (gia_tri_dau) – Tùy chọn. Trả về toàn bộ kết quả ở hàng đầu tiên dựa vào gia_tri_dau đã chọn. Ví dụ TOP(5) thì kết quả trả về là 5 hàng đầu tiên.
WITH TIES – Tùy chọn. Nếu chỉ định cụ thể thì các hàng cố định ở cuối trong kết quả có giới hạn sẽ được trả về. Điều này có thể khiến cho số hàng trả về nhiều hơn biến TOP cho phép.
PERCENT – Tùy chọn. Nếu chỉ định cụ thể thì các hàng đầu tiên dựa theo phần trăm trên bộ kết quả (chỉ định bằng gia_tri_dau). Ví dụ TOP(5) PERCENT sẽ trả về top 5% kết quả đầu tiên trong bộ kết quả.
Biểu thức – Cột hoặc giá trị tính toán mà bạn muốn lấy. Dùng dấu * nếu bạn muốn lấy toàn bộ các cột.
Bảng – Kết quả trả về sẽ là bảng của bạn chọn. Phải có ít nhất 1 bảng được liệt kê trong lệnh FROM.
WHERE “điều kiện” – Tùy chọn. Kết quả trả về sẽ phải đáp ứng được điều kiện được đặt ra.
GROUP BY “biểu thức” – Tùy chọn. Nhóm các kết quả theo một hay nhiều cột từ dữ liệu thu thập được thông qua các bảng ghi.
HAVING “điều kiện” – Tùy chọn. Dùng lệnh này kết hợp với GROUP BY để giới hạn nhóm các hàng trả về khi đáp ứng được điều kiện.
ORDER BY “biểu thức” – Tùy chọn. Được dùng để lọc các kết quả. Sử dụng ASC để lọc theo thứ tự tăng dần và DESC để lọc theo thứ tự giảm dần.
2.2 Các ví dụ
Chọn toàn bộ trường trong một bảng
SELECT * FROM hangtonkho WHERE soluong > 10 ORDER BY hangtonkho_id ASC;
Sử dụng dấu * để chọn tất cả các giá trị trong bảng hangtonkho nhưng phải thỏa mãn giá trị là soluong > 10. Kết quả trả về sẽ được sắp xếp theo thứ tự tăng dần dựa trên bảng hangtonkho_id
Chọn một vài trường trong bảng
SELECT hangtonkho_id, hangtonkho_type, soluong FROM hangtonkho WHERE hangtonkho_id >= 555 AND hangtonkho_type = ‘phanmem’ ORDER BY soluong DESC, hangtonkho_id ASC;
Ở lệnh trên, kết quả trả về sẽ là số lượng, id, loại hàng và được lấy từ bảng hangtonkho khi thỏa mãn điều kiện id >= 555, loại hàng cũng cần thỏa mãn là “phanmem” (phần mềm).
Các kết quả trả về sẽ được sắp xếp theo số lượng giảm dần và tăng dần của id
Chọn từ nhiều bảng khác nhau
SELECT hangtonkho.hangtonkho_id, sanpham.sanpham_ten, hangtonkho.soluong FROM hangtonkho INNER JOIN sanpham ON hangtonkho.sanpham_id = sanpham.sanpham_id ORDER BY hangtonkho_id;
Trong ví dụ này tôi sẽ chọn ra từ các bảng hantonkho và sanpham để lấy ra các giá trị hangtonkho_id, sanpham_ten và soluong. Để làm được như vậy thì ID ở bảng hangtonkho phải giống với bảng sanpham.
Kết quả trả về sẽ được sắp theo thứ tự tăng dần của ID.
Sử dụng keyword TOP
SELECT TOP(3) hangtonkho_id, hangtonkho_type, soluong FROM hangtonkho WHERE hangtonkho_type = ‘phanmem’ ORDER BY hangtonkho_id ASC;
Trong ví dụ này thì tôi sẽ lấy ra 3 hàng đầu tiên trong bảng hangtonkho và thỏa mãn điều kiện loại hàng là “phanmem” (phần mềm). Kết quả trả về gồm id, loại hàng, số lượng và được sắp xếp từ tăng dần theo mã id.
Sử dụng keyword TOP PERCENT
SELECT TOP(10) PERCENT hangtonkho_id, hangtonkho_type, soluong FROM hangtonkho WHERE hangtonkho_type = ‘phanmem’ ORDER BY hangtonkho_id ASC;
Gần tương tự như trên nhưng chỉ 10% giá trị đầu tiên được trả về thỏa mãn điều kiện là loại sản phẩm là phần mềm. 90% còn lại không được hiện ra.
Dùng DISTINCT với SELECT
Dưới đây là việc viết lại nội dung theo yêu cầu của bạn, với ví dụ sử dụng DISTINCT để loại bỏ các tiêu đề trùng lặp:
USE AdventureWorks2012; GO
SELECT DISTINCT JobTitle FROM HumanResources.Employee ORDER BY JobTitle;
Tạo bảng với SELECT INTO
Dưới đây là việc viết lại hai ví dụ tạo bảng, một là tạo bảng tạm thời và hai là tạo bảng cố định, nhưng sử dụng cú pháp hiện đại hơn:
Ví dụ tạo bảng tạm thời #Bicycles trong tempdb:
USE tempdb; GO IF OBJECT_ID('tempdb..#Bicycles', 'U') IS NOT NULL DROP TABLE #Bicycles; SELECT * INTO #Bicycles FROM AdventureWorks2012.Production.Product WHERE ProductNumber LIKE 'BK%'; GO
Ví dụ tạo bảng cố định NewProducts trong AdventureWorks2012:
USE AdventureWorks2012; GO IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL DROP TABLE dbo.NewProducts; ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED; GO SELECT * INTO dbo.NewProducts FROM Production.Product WHERE ListPrice > 25 AND ListPrice < 100; GO ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL; GO
Câu lệnh SELECT là một câu lệnh quen thuộc trong SQL, được sử dụng để lấy về các kết quả ở các bảng trong CSDL ở SQL server. Cùng tìm hiểu chi tiết hơn về câu lệnh này nhé.
1. Cú pháp lệnh SELECT trong SQL
1.1 Cú pháp ở dạng đơn giản
Câu lệnh SELECT đơn giản nhất thường là:
SELECT column1, column2, … FROM table_name
Trong đó :
SELECT column1, column2, …các cột bạn muốn lấy từ bảng table_name
. Các tên cột này được phân cách bằng dấu phẩy.
FROM table_name là cách đơn giản và rõ ràng để truy vấn dữ liệu từ một bảng trong SQL, cho phép bạn chọn từng cột cụ thể từ bảng đã chỉ định
SELECT * FROM table_name
Dấu sao *
trong câu lệnh SELECT có ý nghĩa là “lấy tất cả các cột” từ bảng đã chỉ định.
1.2 Cú pháp ở dạng đầy đủ
Còn dạng đầy đủ câu lệnh sẽ dài hơn với
SELECT [ ALL | DISTINCT ] [ TOP (gia_tri_dau) [ PERCENT ] [ WITH TIES ] ] “Biểu thức” FROM “bảng” [WHERE “điều kiện”] [GROUP BY “biểu thức”] [HAVING “điều kiện”] [ORDER BY “biểu thức” [ ASC | DESC ]];
2. Tên biến hoặc giá trị biến
2.1 Tên biến và giá trị
Ngoài ra khi kết hợp với câu lệnh SELECT chúng ta sẽ kết hợp các biến sau
ALL – Tùy chọn. Kết quả trả về tất cả các hàng phù hợp
DISTINCT – Tùy chọn. Loại tất cả các giá trị bị trùng khỏi kết quả trả về.
TOP (gia_tri_dau) – Tùy chọn. Trả về toàn bộ kết quả ở hàng đầu tiên dựa vào gia_tri_dau đã chọn. Ví dụ TOP(5) thì kết quả trả về là 5 hàng đầu tiên.
WITH TIES – Tùy chọn. Nếu chỉ định cụ thể thì các hàng cố định ở cuối trong kết quả có giới hạn sẽ được trả về. Điều này có thể khiến cho số hàng trả về nhiều hơn biến TOP cho phép.
PERCENT – Tùy chọn. Nếu chỉ định cụ thể thì các hàng đầu tiên dựa theo phần trăm trên bộ kết quả (chỉ định bằng gia_tri_dau). Ví dụ TOP(5) PERCENT sẽ trả về top 5% kết quả đầu tiên trong bộ kết quả.
Biểu thức – Cột hoặc giá trị tính toán mà bạn muốn lấy. Dùng dấu * nếu bạn muốn lấy toàn bộ các cột.
Bảng – Kết quả trả về sẽ là bảng của bạn chọn. Phải có ít nhất 1 bảng được liệt kê trong lệnh FROM.
WHERE “điều kiện” – Tùy chọn. Kết quả trả về sẽ phải đáp ứng được điều kiện được đặt ra.
GROUP BY “biểu thức” – Tùy chọn. Nhóm các kết quả theo một hay nhiều cột từ dữ liệu thu thập được thông qua các bảng ghi.
HAVING “điều kiện” – Tùy chọn. Dùng lệnh này kết hợp với GROUP BY để giới hạn nhóm các hàng trả về khi đáp ứng được điều kiện.
ORDER BY “biểu thức” – Tùy chọn. Được dùng để lọc các kết quả. Sử dụng ASC để lọc theo thứ tự tăng dần và DESC để lọc theo thứ tự giảm dần.
2.2 Các ví dụ
Chọn toàn bộ trường trong một bảng
SELECT * FROM hangtonkho WHERE soluong > 10 ORDER BY hangtonkho_id ASC;
Sử dụng dấu * để chọn tất cả các giá trị trong bảng hangtonkho nhưng phải thỏa mãn giá trị là soluong > 10. Kết quả trả về sẽ được sắp xếp theo thứ tự tăng dần dựa trên bảng hangtonkho_id
Chọn một vài trường trong bảng
SELECT hangtonkho_id, hangtonkho_type, soluong FROM hangtonkho WHERE hangtonkho_id >= 555 AND hangtonkho_type = ‘phanmem’ ORDER BY soluong DESC, hangtonkho_id ASC;
Ở lệnh trên, kết quả trả về sẽ là số lượng, id, loại hàng và được lấy từ bảng hangtonkho khi thỏa mãn điều kiện id >= 555, loại hàng cũng cần thỏa mãn là “phanmem” (phần mềm).
Các kết quả trả về sẽ được sắp xếp theo số lượng giảm dần và tăng dần của id
Chọn từ nhiều bảng khác nhau
SELECT hangtonkho.hangtonkho_id, sanpham.sanpham_ten, hangtonkho.soluong FROM hangtonkho INNER JOIN sanpham ON hangtonkho.sanpham_id = sanpham.sanpham_id ORDER BY hangtonkho_id;
Trong ví dụ này tôi sẽ chọn ra từ các bảng hantonkho và sanpham để lấy ra các giá trị hangtonkho_id, sanpham_ten và soluong. Để làm được như vậy thì ID ở bảng hangtonkho phải giống với bảng sanpham.
Kết quả trả về sẽ được sắp theo thứ tự tăng dần của ID.
Sử dụng keyword TOP
SELECT TOP(3) hangtonkho_id, hangtonkho_type, soluong FROM hangtonkho WHERE hangtonkho_type = ‘phanmem’ ORDER BY hangtonkho_id ASC;
Trong ví dụ này thì tôi sẽ lấy ra 3 hàng đầu tiên trong bảng hangtonkho và thỏa mãn điều kiện loại hàng là “phanmem” (phần mềm). Kết quả trả về gồm id, loại hàng, số lượng và được sắp xếp từ tăng dần theo mã id.
Sử dụng keyword TOP PERCENT
SELECT TOP(10) PERCENT hangtonkho_id, hangtonkho_type, soluong FROM hangtonkho WHERE hangtonkho_type = ‘phanmem’ ORDER BY hangtonkho_id ASC;
Gần tương tự như trên nhưng chỉ 10% giá trị đầu tiên được trả về thỏa mãn điều kiện là loại sản phẩm là phần mềm. 90% còn lại không được hiện ra.
Dùng DISTINCT với SELECT
Dưới đây là việc viết lại nội dung theo yêu cầu của bạn, với ví dụ sử dụng DISTINCT để loại bỏ các tiêu đề trùng lặp:
USE AdventureWorks2012; GO
SELECT DISTINCT JobTitle FROM HumanResources.Employee ORDER BY JobTitle;
Tạo bảng với SELECT INTO
Dưới đây là việc viết lại hai ví dụ tạo bảng, một là tạo bảng tạm thời và hai là tạo bảng cố định, nhưng sử dụng cú pháp hiện đại hơn:
Ví dụ tạo bảng tạm thời #Bicycles trong tempdb:
USE tempdb; GO IF OBJECT_ID('tempdb..#Bicycles', 'U') IS NOT NULL DROP TABLE #Bicycles; SELECT * INTO #Bicycles FROM AdventureWorks2012.Production.Product WHERE ProductNumber LIKE 'BK%'; GO
Ví dụ tạo bảng cố định NewProducts trong AdventureWorks2012:
USE AdventureWorks2012; GO IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL DROP TABLE dbo.NewProducts; ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED; GO SELECT * INTO dbo.NewProducts FROM Production.Product WHERE ListPrice > 25 AND ListPrice < 100; GO ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL; GO
Như vậy là chúng ta lại hoàn thành thêm một bài học khá hữu ích về lệnh SELECT trong SQL Server. Đón xem các bài viết tiếp theo của tôi nhé.