Câu lệnh SELECT có điều kiện trong SQL Server

By 3 năm ago
5 out of 5

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

Trong các ví dụ trên:

  • Đã sử dụng cú pháp IF OBJECT_ID(...) IS NOT NULL DROP TABLE ... để kiểm tra và xóa bảng nếu tồn tại trước khi tạo mới.
  • Đã sử dụng INTO #BicyclesINTO dbo.NewProducts để tạo bảng mới và chèn dữ liệu vào đó từ các câu lệnh SELECT.
  • Đã sử dụng các câu lệnh ALTER DATABASE để thay đổi mức độ phục hồi của cơ sở dữ liệu, ví dụ: BULK_LOGGED và FULL, mặc dù cần chú ý rằng việc thay đổi này cần có quyền thích hợp và cần được thực hiện cẩn thận trong môi trường sản xuất.

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

Trong các ví dụ trên:

  • Đã sử dụng cú pháp IF OBJECT_ID(...) IS NOT NULL DROP TABLE ... để kiểm tra và xóa bảng nếu tồn tại trước khi tạo mới.
  • Đã sử dụng INTO #BicyclesINTO dbo.NewProducts để tạo bảng mới và chèn dữ liệu vào đó từ các câu lệnh SELECT.
  • Đã sử dụng các câu lệnh ALTER DATABASE để thay đổi mức độ phục hồi của cơ sở dữ liệu, ví dụ: BULK_LOGGED và FULL, mặc dù cần chú ý rằng việc thay đổi này cần có quyền thích hợp và cần được thực hiện cẩn thận trong môi trường sản xuất.

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

Share
Thảo Larskanis

Tốt nghiệp Graduated Windesheim 2020, top Đại học lớn nhất thế giới, tôi mở blog chia sẻ kiến thức, kinh nghiệm về SQL