Tại sao lại có lỗi lặp khi select sql năm 2024

Trong SQL có rất nhiều câu lệnh hỗ trợ người dùng trong việc truy vấn dữ liệu. Có lẽ bạn đã từng biết tới Order by, Group by nhưng chưa thực sự biết tới Distinct. Đây cũng là một dạng câu lệnh trả về các giá trị chỉ định riêng biệt trong bảng.

Tại sao lại có lỗi lặp khi select sql năm 2024

Vậy việc sử dụng Distinct trong SQL có ý nghĩa và kết quả như thế nào?

Hãy cùng chúng tôi khám phá cách truy vấn bằng câu lệnh này trong bài viết dưới đây.

Giới thiệu về mệnh đề Select Distinct trong SQL

Trước khi nói về cách sử dụng Distinct trong SQL, bạn cần biết ý nghĩa thực sự của mệnh đề này. Đây là một dạng truy vấn được dùng để loại bỏ các dữ liệu trùng lặp. Điều này có nghĩa nó sẽ chỉ lấy các giá trị riêng biệt khác nhau trong một bảng

Cú pháp mệnh đề DISTINCT như sau:

{{EJS0}}

Câu lệnh truy vấn này cũng có thể sử dụng trong trường hợp nhiều cột. Lúc này cú pháp sẽ như sau:

{{EJS1}}

Đối với các cột đã được chỉ định sau DISTINCT, lệnh sẽ quét qua và chỉ lấy các giá trị khác nhau, không lấy giá trị trùng lặp. Điều này cực kỳ tốt trong trường hợp muốn truy vấn các giá trị duy nhất của một thuộc tính. Trong trường hợp cột bạn truy vấn chứa giá trị NULL, nó sẽ chỉ lấy một kết quả NULL duy nhất. Có thể nói, DISTINCT coi tất cả giá trị NULL trong cột là cùng một giá trị.

Ví dụ về DISTINCT trong SQL

Để có thể hiểu rõ hơn về việc sử dụng Distinct trong SQL, hãy cùng nhìn qua những ví dụ dưới đây: Ví dụ bảng dữ liệu Student chứa các trường sau:

Student_IDFirst_NameLast_NameProvinceDistrictPhone_NumberBirth_DayEmail

Truy vấn Distinct ở một cột của bảng

Bạn muốn truy vấn tất cả các họ của học sinh trong bảng Student thường sử dụng lệnh sau:

{{EJS2}}

Câu lệnh

{{EJS1}}

1 sẽ sắp xếp tất cả giá trị

{{EJS1}}

2 trong bảng theo thứ tự. Tuy nhiên bạn sẽ gặp phải sự trùng lặp các giá trị giống nhau khi học sinh có cùng một

{{EJS1}}

2.

Vậy nếu bạn muốn truy vấn các họ riêng biệt khác nhau không trùng lặp thì chỉ cần thêm

{{EJS1}}

4 sau

{{EJS1}}

5, ví dụ như sau:

{{EJS3}}

Kết quả trả về sẽ bao gồm tất cả giá trị First_Name không trùng nhau mà trong bảng Student có. Chúng được sắp xếp theo thứ tự tăng dần.

Truy vấn Distinct ở nhiều cột

Nếu bạn muốn hiển thị tất cả các Huyện và Tỉnh của học sinh sẽ sử dụng câu lệnh sau:

{{EJS4}}

Tuy nhiên khi thêm mệnh đề DISTRINCT, kết quả trả về sẽ bao gồm các thành phố và huyện khác nhau không trùng lặp. Ví dụ:

{{EJS5}}

Câu lệnh truy vấn trên đã kết hợp giá trị khác nhau ở cả hai cột Province và District để lọc.

Truy vấn Distinct khi có giá trị NULL

Trong bảng ví dụ, cột Phone_Number có thể điền hoặc để trống, vậy nên các giá trị để trống mặc định là NULL. Câu lệnh Distinct sau đây sẽ trả về tất cả các số điện thoại không trùng ở trong bảng:

{{EJS6}}

Vậy nên các giá trị NULL giống nhau sẽ chỉ giữ lại một giá trị duy nhất ở kết quả trả về.

So sánh giữa DISTINCT và GROUP BY

Mọi người thường biết đến

{{EJS1}}

6 và

{{EJS1}}

7 là hai mệnh đề đi với nhau. Kết quả trả về của truy vấn này cũng bao gồm những giá trị khác nhau không trùng của cột. Ví dụ trong trường hợp lấy các giá trị Tỉnh và Huyện không trùng trong bảng trên bằng

{{EJS1}}

6 sẽ như sau:

SELECT Province, District FROM Student GROUP BY Province, District ORDER BY Province, District;

Câu lệnh trả về kết quả tương tự như khi dùng Distinct:

{{EJS7}}

Vậy nên cả

{{EJS1}}

9 và

{{EJS1}}

6 đều thực hiện loại bỏ các giá trị trùng lặp. Có thể nói Group By là một trường hợp đặc biệt của Distinct.

Tuy nhiên người dùng chỉ nên sử dụng Group By trong trường hợp có các hàm tổng hợp (SUM(), MAX(), MIN(), COUNT(),…). Lúc này truy vấn sẽ trả về các giá trị được sắp xếp rất dễ nhìn. Vì Group By thường đi cùng Order By, tuy nhiên Distinct có thể dùng Order By hoặc không.

Tổng kết

Trên đây là cách sử dụng Distinct trong SQL mà chúng tôi muốn giới thiệu đến bạn. Việc truy vấn thông qua mệnh đề này thực sự rất cần thiết trong nhiều trường hợp. Người dùng có thể sử dụng Distinct cho một hoặc nhiều biểu thức, trường giá trị khác nhau.

Nếu bạn còn bất kỳ câu hỏi nào về nội dung trong bài viết trên, hãy để lại ở bên bình luận bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.

P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.

Trong tình huống nào đó mà bảng kết quả trả về có thể có các giá trị trùng nhau, bạn có thể muốn chỉ trả về các dòng khác nhau (loại bỏ trùng nhau) khi đó sẽ sử dụng đến DISTINCT.

Từ khóa DISTINCT được sử dụng kết hợp vói SELECT để loại bỏ các dòng có giá trị trùng nhau (giữ lại 1).

Cú pháp:

SELECT DISTINCT column_name1, column_name2 FROM table_name; Ví dụ lấy tên quốc gia trong bảng Customers

SELECT HoTen, Quocgia FROM Khachhang Chạy câu lệnh trên với dữ liệu mẫu trả về 91 kết quả, trong đó nhiều dòng tên quốc gia trùng nhau.

HoTen QuocGia Đặng Tuấn Anh Đức Hoàng Đức Anh Đức Lưu Trang Anh Mỹ Vũ Thế Hưng Ý

Nếu bạn chỉ quan tâm có bao nhiêu quốc gia khác nhau trong bảng

SELECT DISTINCT Quocgia FROM Khachhang Chạy lại câu lệnh nó sẽ trả về còn 6 quốc gia khác nhau.

QuocGia Đức Mỹ Việt Nam Anh Ý

Ở đây có một file CSDL mẫu dạng SQLite, bạn có thể tải về nghiên cứu, thực hành: CSDL SQLite mẫu. Hoặc sử dụng trực tiếp công cụ Online: Chạy SQL