Bài viết này trình bày về toán tử NOT IN trong SQL và giải thích chức năng và các trường hợp sử dụng với một số ví dụ NOT IN.

Bạn đang xem : sql không có trong tuyên bố

Bởi: | Cập nhật: 2021-06-30 | Nhận xét (1) | Liên quan: Thêm & gt; TSQL

Vấn đề

Tôi mới sử dụng T-SQL và cần biết về toán tử NOT IN trong Microsoft
SQL Server DBMS. Làm gì
toán tử logic này làm gì? Tôi sử dụng nó khi nào và như thế nào? SQL KHÔNG VÀO được không
toán tử được chạy trong một câu lệnh SELECT hay một thủ tục được lưu trữ? Nếu vậy thì sao
là cú pháp?

Giải pháp

Mẹo này sẽ trình bày chi tiết về toán tử NOT IN. Nó sẽ giải thích
chức năng và giải thích các trường hợp sử dụng. Nó sẽ hiển thị một số ví dụ NOT IN.
Đối với bất kỳ độc giả nào không quen thuộc với toán tử IN,

xem lại mẹo này để tìm hiểu về SQL IN
.

Tất cả các bản trình diễn trong hướng dẫn SQL này sẽ sử dụng cơ sở dữ liệu mẫu WideWorldImporters
có thể là

được tải xuống miễn phí từ Github
.

Tổng quan

Toán tử SQL Server NOT IN được sử dụng để thay thế một nhóm đối số bằng cách sử dụng
& lt; & gt; (hoặc! =) được kết hợp với AND. Nó có thể làm cho mã dễ dàng hơn
để đọc và hiểu các lệnh SQL SELECT, UPDATE hoặc DELETE. Nói chung, nó
sẽ không thay đổi đặc tính hiệu suất. Hãy xem xét truy vấn SQL này:

LỰA CHỌN *
TỪ Bán hàng. Hóa đơn
WHERE LastEditedBy & lt; & gt; 11
  VÀ LastEditedBy & lt; & gt; 17
  VÀ LastEditedBy & lt; & gt; 13;

Điều này không khó hiểu, nhưng sẽ khiến bạn phải truy vấn lâu.

Một cách tiếp cận tốt hơn sẽ là toán tử SQL NOT IN. Toán tử KHÔNG VÀO
hoạt động bằng cách so sánh một giá trị, thường là một cột, với danh sách tiềm năng được phân tách bằng dấu phẩy
khớp các giá trị được giữ trong một tập hợp các dấu ngoặc đơn. Giá trị bên trái của KHÔNG
Toán tử IN sau đó được so sánh từng lần một với toàn bộ danh sách và đối sánh chính xác với
bất kỳ thành viên nào trong danh sách sẽ khiến đối số được đánh giá là sai. Đây
có thể khó hiểu, nhưng sẽ có ý nghĩa hơn sau khi xem một số ví dụ.

Câu lệnh SQL sau chuyển đổi 3 “LastEditedBy & lt; & gt;” tranh luận
thay vào đó, sử dụng một toán tử NOT IN.

LỰA CHỌN *
TỪ Bán hàng. Hóa đơn
Nơi LastEditedBy NOT IN (11,17,13);

Truy vấn này về mặt chức năng tương đương với truy vấn ở trên, nhưng ngắn hơn và dễ dàng hơn
để đọc.

Quy tắc và Thực tiễn Tốt nhất cho SQL KHÔNG TRONG

Toán tử NOT IN chỉ có thể thay thế & lt; & gt; hoặc! = toán tử. Nó không thể
thay thế =, & lt ;, & gt ;, & lt; =, & gt; =, GIỮA hoặc THÍCH. Nó sẽ chỉ tìm thấy và
loại trừ các kết quả phù hợp chính xác. Các giá trị trùng lặp trong danh sách bị bỏ qua.

Điều này có nghĩa là

Nơi nào LastEditedBởi KHÔNG VÀO (11,17,13)

giống với

Ở đâu LastEditedBy NOT IN (11,17,13,11,17)

Từ khóa NOT có thể được đặt ở đầu đối số hoặc trong toán tử.
Hai tùy chọn là tương đương về chức năng và việc chọn cách viết mã nào là hoàn toàn
một sự lựa chọn phong cách. Ví dụ này cho thấy cả hai phương pháp.

Nơi nào LastEditedBởi KHÔNG VÀO (11,17,13)

giống với

NƠI KHÔNG ĐƯỢC Chỉnh sửa Cuối cùng BẰNG VÀO (11,17,13)

Toán tử NOT IN có thể được sử dụng ở bất kỳ nơi nào bất kỳ toán tử nào khác được sử dụng bao gồm
Mệnh đề WHERE, mệnh đề HAVING, câu lệnh IF hoặc các vị từ nối – mặc dù
chúng phải cực kỳ hiếm trong các vị từ nối ( SQL
THAM GIA

SQL
THAM GIA INNER
,
THAM GIA TRÁI SQL ,
THAM GIA QUYỀN SQL ). Trên thực tế, tác giả này chưa bao giờ
đã sử dụng toán tử NOT IN trong một vị từ nối.

Xem Thêm  ĐẶT HÀNG SQL BẰNG - đặt hàng bằng sql

Danh sách các giá trị có thể có ít như một mục không có giới hạn tối đa được xác định,
mặc dù danh sách cực kỳ lớn thường không được chấp nhận. Như một quy luật, điều này
tác giả không sử dụng câu lệnh NOT IN với hơn 5 hoặc 10 mục danh sách.
Với danh sách giá trị chứa một số lượng lớn giá trị, điều đó thường có ý nghĩa hơn
sử dụng OUTER JOIN để thực hiện điều tương tự trong khi cung cấp cho trình tối ưu hóa truy vấn
nhiều lựa chọn hơn.

Cuối cùng, danh sách các giá trị không nhất thiết phải được mã hóa cứng, được phân tách bằng dấu phẩy
danh sách. Nó có thể được xác định bằng một truy vấn. Khi điều này xảy ra, nó sẽ mở ra
khả năng danh sách không có giá trị nào và đối số sẽ đánh giá thành true
cho mọi hàng. Tùy chọn này sẽ được đề cập chi tiết trong phần sau của mẹo.

SQL KHÔNG TRONG với chuỗi

Toán tử NOT IN có thể được sử dụng để so sánh một cột chuỗi (char, nchar, varchar,
nvarchar) vào danh sách các chuỗi. Tập lệnh dưới đây hiển thị 2 chức năng tương đương nhau
Câu lệnh IF – câu lệnh sử dụng nhiều đối số và câu lệnh thứ hai sử dụng
KHÔNG TRONG toán tử.

- Bỏ qua người dùng thử nghiệm - Phiên bảnAND
NẾU @UserName & lt; & gt; 'TrainingUser' VÀ @UserName & lt; & gt; 'TestUser'
BẮT ĐẦU
  
CHẤM DỨT
 
- Bỏ qua người dùng thử nghiệm - Phiên bảnIN
NẾU @UserName KHÔNG VÀO ('TrainingUser', 'TestUser')
BẮT ĐẦU
  
CHẤM DỨT

Các dấu ngoặc kép trong các mục danh sách là cần thiết vì các kiểu dữ liệu của
đa dạng chuỗi.

SQL NOT IN with Numbers

Tập hợp các truy vấn mẫu tiếp theo này đang tìm kiếm những người có tài khoản đã thực hiện
chính xác là 6, 8 hoặc 9 doanh số. Vì các giá trị không đồng thời, không phải GIỮA
toán tử cũng như tổ hợp các đối số sử dụng & lt; và & gt; sẽ hoạt động.

Ví dụ SQL SELECT này giới thiệu việc đặt toán tử NOT IN trong mệnh đề HAVING và sử dụng
toán tử! = thay vì & lt; & gt; – cả hai đều hoạt động theo cùng một cách
IF, WHERE và & lt; & gt; ví dụ.

- Phiên bảnAND
SELECT AccountsPersonID, COUNT (*) TotalInvoices
TỪ Bán hàng. Hóa đơn
NHÓM THEO AccountsPersonID
CÓ ĐẾM (*)! = 6
  VÀ ĐẾM (*)! = 8
  AND COUNT (*)! = 9;
 
- Phiên bảnIN
SELECT AccountsPersonID, COUNT (*) TotalInvoices
TỪ Bán hàng. Hóa đơn
NHÓM THEO AccountsPersonID
CÓ ĐẾM (*) KHÔNG TRONG (6,8,9);

Vì kết quả của hàm COUNT là một số nên không có dấu ngoặc kép nào trong
danh sách giá trị. Điều này sẽ đúng với bất kỳ cột nào có kiểu dữ liệu số (int,
bigint, smallint, tinyint, số, thập phân, float, real, money) nữa.

SQL NOT IN with Dates

Toán tử NOT IN có thể được sử dụng để tìm kiếm bất kỳ giá trị ngày hoặc giờ nào ngoại trừ
những giá trị đó khớp với một từ danh sách các giá trị ngày hoặc giờ. Tưởng tượng
một tình huống trong đó WideWorldImporters muốn nhận được số lượng mục trung bình
đã đặt hàng hàng ngày cho mỗi khách hàng trong năm dương lịch 2013, nhưng muốn loại trừ một số
ngày lễ vì chúng có thể làm sai lệch kết quả thấp hơn. Truy vấn để xác định đầu ra này
có thể trông giống như bên dưới.

- Phiên bảnAND
CHỌN ID khách hàng, AVG (Hàng đã mua) AverageDay
TỪ (
   CHỌN ID khách hàng, Ngày hóa đơn, COUNT (*) mặt hàng đã mua
   TỪ Bán hàng. Hóa đơn
     INNER THAM GIA Sales.InvoiceLines ON Invoices.InvoiceID = InvoiceLines.InvoiceID
   WHERE InvoiceDate! = '25 -Dec-2013'
     AND InvoiceDate! = '4-Jul-2013'
     AND InvoiceDate! = '28 -Nov-2013 '
   NHÓM THEO ID khách hàng, Ngày hóa đơn) SubQuery
NHÓM THEO ID khách hàng;
 
- Phiên bảnIN
CHỌN ID khách hàng, AVG (Hàng đã mua) AverageDay
TỪ (
   CHỌN ID khách hàng, Ngày hóa đơn, COUNT (*) mặt hàng đã mua
   TỪ Bán hàng. Hóa đơn
     INNER THAM GIA Sales.InvoiceLines ON Invoices.InvoiceID = InvoiceLines.InvoiceID
   Ngày lập hóa đơn KHÔNG Ở ĐÂU ('25-Dec-2013', '4-Jul-2013', '28 -Nov-2013 ')
   NHÓM THEO ID khách hàng, Ngày hóa đơn) SubQuery
NHÓM THEO ID khách hàng;

Có một số cách để xử lý việc nhập giá trị ngày và giờ, nhưng cách tốt nhất
phương pháp phổ biến là sử dụng dấu ngoặc kép và nhập một chuỗi có thể dễ dàng chuyển đổi
đến một ngày hoặc giờ hẹn hò.

Xem Thêm  ➧Python cho người mới bắt đầu: Cách sửa đổi một tuple trong Python • Softbranchdevelopers - làm thế nào để sửa đổi một tuple trong python

SQL KHÔNG TRONG với truy vấn con

Tất cả các ví dụ cho đến thời điểm này đều hiển thị một danh sách được mã hóa cứng sau phần KHÔNG VÀO
nhà điều hành. Một trường hợp sử dụng rất phổ biến cho NOT IN là để tạo danh sách
trong khi thực thi truy vấn bởi một truy vấn TSQL khác.

Có 2 điều quan trọng cần nhớ khi tạo truy vấn con là
được đặt trong dấu ngoặc đơn của toán tử NOT IN. Đầu tiên, nó phải trả về chính xác
1 cột. Lỗi sẽ xuất hiện nếu bất kỳ số cột nào khác được chọn.
Thứ hai, truy vấn phải có thể tự chạy – nghĩa là nó không có bên ngoài
sự phụ thuộc.

Hãy xem xét một tình huống trong đó một kiểu thời tiết bất ngờ đang hạn chế hoạt động thương mại
ở bang California. WideWorldImporters cần xây dựng một danh sách các mục
mà nó có thể đặt hàng và nó có thể được giao hàng nhanh chóng. Đây sẽ là
bất kỳ mặt hàng nào không có nguồn gốc từ các nhà cung cấp có trụ sở tại California. Có thể
một truy vấn được viết để giúp xác định các mặt hàng có sẵn?

Truy vấn này liệt kê 3 nhà cung cấp có trụ sở tại California. Thông báo rằng
truy vấn phù hợp với các quy tắc ở trên mà nó có thể được thực thi và trả về chính xác một
cột.

CHỌN ID nhà cung cấp
TỪ Mua hàng. Nhà cung cấp
  INNER THAM GIA [Ứng dụng] .Cities ON PostalCityID = Cities.CityID
  INNER JOIN [Ứng dụng] .StateProvince ON Cities.StateProvinceID = StateProvaries.StateProvinceID
WHERE StateProvaries.StateProvinceName = 'California';

Chỉ cần đặt truy vấn này bên trong dấu ngoặc đơn theo sau toán tử NOT IN,
nhưng làm như vậy mà không có dấu chấm phẩy. Truy vấn sau đây thực hiện điều đó.
Nó sẽ tìm kiếm các mặt hàng có nguồn gốc từ bất kỳ nhà cung cấp nào ngoài California.

LỰA CHỌN *
FROM Warehouse.StockItems
NHÀ Cung cấp KHÔNG Ở ĐÂU (
  CHỌN ID nhà cung cấp
  TỪ Mua hàng. Nhà cung cấp
    INNER THAM GIA [Ứng dụng] .Cities ON PostalCityID = Cities.CityID
    INNER JOIN [Ứng dụng] .StateProvince ON Cities.StateProvinceID = StateProvaries.StateProvinceID
  WHERE StateProvaries.StateProvinceName = 'California');

SQL KHÔNG CÓ TRONG Cân nhắc về Hiệu suất

Các đối số được tạo bằng toán tử NOT IN không có lợi cho việc lập chỉ mục
hoạt động tìm kiếm và thường dẫn đến hoạt động quét chậm hơn. Vì lý do này,
các đối số NOT IN thường xuyên nhất có thể nên được sử dụng cùng với các đối số bổ sung
đối số có thể sử dụng chỉ mục để giảm số hàng được xử lý.
Bằng cách đó, đối số NOT IN chỉ được so sánh trên tập hợp hàng đã giảm này
chứ không phải toàn bộ bảng.

Xem Thêm  Full Stack là gì? Làm thế nào để trở thành một nhà phát triển ngăn xếp đầy đủ - phát triển ngăn xếp đầy đủ là gì

Lời kết

Mặc dù không phổ biến như một số toán tử khác, bao gồm IN, toán tử NOT IN
có thể rất hữu ích trong trường hợp sử dụng phù hợp và chắc chắn phải là một phần của bất kỳ
Tiết mục của nhà văn T-SQL.

Các bước tiếp theo

Giới thiệu về tác giả

Xem tất cả các mẹo của tôi
Eric Blinn là Kiến trúc sư dữ liệu cấp cao cho Squire Patton Boggs. Anh ấy cũng là tác giả SQL và lãnh đạo PASS Local Group.

Bài viết cập nhật lần cuối: 2021-06-30


Xem thêm những thông tin liên quan đến chủ đề sql không có trong tuyên bố

SQL Analytics – Part 1.1 Key Concepts

  • Tác giả: Oracle Learning
  • Ngày đăng: 2013-12-11
  • Đánh giá: 4 ⭐ ( 5275 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: In this podcast we review some of the key concepts around the way data sets are processed by SQL Analytics

    Copyright © 2013 Oracle and/or its affiliates. Oracle® is a registered trademark of Oracle and/or its affiliates. All rights reserved. Oracle disclaims any warranties or representations as to the accuracy or completeness of this recording, demonstration, and/or written materials (the “Materials”). The Materials are provided “as is” without any warranty of any kind, either express or implied, including without limitation warranties of merchantability, fitness for a particular purpose, and non-infringement.

Các lỗ hổng SQL Injection và Cách Ngăn chặn Chúng

  • Tác giả: helpex.vn
  • Đánh giá: 5 ⭐ ( 7760 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bài học lịch sử tiêm SQL ngắn gọn Trong những ngày đầu của Internet, việc xây dựng các trang web rất đơn giản: không có JavaScript, không có CSS ​​và ít hình ảnh. Nhưng khi web trở nên phổ…

Ồn ào quanh tuyên bố ‘dập dịch 10 ngày’ của ông Vũ Đức Đam

  • Tác giả: www.bbc.com
  • Đánh giá: 3 ⭐ ( 7101 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tranh luận sôi nổi sau khi ông Mai Tiến Dũng nói về “trách nhiệm cá nhân” sau tuyên bố ”dập dịch trong 10 ngày” của ông Vũ Đức Đam.

Tuyên bố nguyên tắc của Luật Quốc tế điều chỉnh quan hệ hữu nghị hợp tác giữa các quốc gia phù hợp với Hiến chương liên hợp quốc 1970

  • Tác giả: thuvienphapluat.vn
  • Đánh giá: 5 ⭐ ( 2016 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Học thuyết – Làm thế nào để in ra sql thực, không chỉ là tuyên bố chuẩn bị?

  • Tác giả: qastack.vn
  • Đánh giá: 5 ⭐ ( 2276 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] Doctrine không gửi “truy vấn SQL thực” đến máy chủ cơ sở dữ liệu: thực tế…

Không thể chuẩn bị (các) tuyên bố. (Lỗi SQL 37000)

  • Tác giả: support.microsoft.com
  • Đánh giá: 5 ⭐ ( 2917 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Hướng dẫn học SQL: Lời khuyên học SQL nhanh chóng và hiệu quả

  • Tác giả: vn.bitdegree.org
  • Đánh giá: 5 ⭐ ( 5746 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hướng dẫn học SQL: Những lời khuyên học SQL nhanh chóng và hiệu quả bạn nên biết. Tham khảo hướng dẫn học SQL này để biết thêm chi tiết

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

By ads_php