Lưu ý: Vì ai đó tuyên bố rằng liên kết bên ngoài đã chết trong câu trả lời của Sushant Butta, tôi đã đăng nội dung ở đây như một câu trả lời riêng biệt.
Hãy coi chừng NULLS .
Hôm nay tôi đã gặp một hành vi truy vấn rất lạ khi sử dụng IN và các NOT INtoán tử. Trên thực tế, tôi muốn so sánh hai bảng và tìm xem liệu một giá trị từ table bcó tồn tại trong table ahay không và tìm hiểu hành vi của nó nếu cột chứanull giá trị. Vì vậy, tôi chỉ tạo một môi trường để kiểm tra hành vi này.
Chúng tôi sẽ tạo bảng table_a.
SQL> create table table_a ( a number);
Table created.
Chúng tôi sẽ tạo bảng table_b.
SQL> create table table_b ( b number);
Table created.
Chèn một số giá trị vào table_a.
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
Chèn một số giá trị vào table_b.
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
Bây giờ chúng ta sẽ thực hiện một truy vấn để kiểm tra sự tồn tại của một giá trị trong table_abằng cách kiểm tra giá trị của nó từ table_bviệc sử dụng INtoán tử.
SQL> select * from table_a where a in (select * from table_b);
A
3
Thực hiện truy vấn dưới đây để kiểm tra sự không tồn tại.
SQL> select * from table_a where a not in (select * from table_b);
A
1
2
Sản lượng đã đến như mong đợi. Bây giờ chúng ta sẽ chèn một nullgiá trị vào bảng table_bvà xem hai truy vấn trên hoạt động như thế nào.
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
Truy vấn đầu tiên hoạt động như mong đợi nhưng điều gì đã xảy ra với truy vấn thứ hai? Tại sao chúng tôi không nhận được bất kỳ đầu ra nào, điều gì đã nên xảy ra? Có sự khác biệt nào trong truy vấn không? Không .
Sự thay đổi nằm trong dữ liệu của bảng table_b. Chúng tôi đã giới thiệu một nullgiá trị trong bảng. Nhưng tại sao nó lại hoạt động như thế này? Hãy tách hai truy vấn thành "AND"và "OR"toán tử.
Truy vấn đầu tiên:
Truy vấn đầu tiên sẽ được xử lý nội bộ như thế này. Vì vậy, a nullsẽ không tạo ra vấn đề ở đây vì hai toán hạng đầu tiên của tôi sẽ đánh giá đến truehoặc false. Nhưng toán hạng thứ ba của tôi a = nullsẽ không đánh giá truevà cũng không false. Nó sẽ chỉ đánh giá null.
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
Truy vấn thứ hai:
Truy vấn thứ hai sẽ được xử lý như bên dưới. Vì chúng tôi đang sử dụng một "AND"toán tử và bất kỳ thứ gì khác ngoài truebất kỳ toán hạng nào sẽ không cung cấp cho tôi bất kỳ đầu ra nào.
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
Vậy chúng ta phải xử lý việc này như thế nào? Chúng tôi sẽ chọn tất cả các not nullgiá trị từ bảng table_btrong khi sử dụng NOT INtoán tử.
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
1
2
Vì vậy, hãy luôn cẩn thận về NULLcác giá trị trong cột khi sử dụng NOT INtoán tử.
Hãy coi chừng NULL !!
incâu lệnh sẽ được phân tích cú pháp giống hệt nhaufield=val1 or field=val2 or field=val3. Đặt một null vào đó sẽ sôi xuốngfield=nullmà sẽ không hoạt động.