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 IN
toá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 b
có tồn tại trong table a
hay 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_a
bằng cách kiểm tra giá trị của nó từ table_b
việc sử dụng IN
toá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 null
giá trị vào bảng table_b
và 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 null
giá 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 null
sẽ 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 true
hoặc false
. Nhưng toán hạng thứ ba của tôi a = null
sẽ không đánh giá true
và 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 true
bấ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 null
giá trị từ bảng table_b
trong khi sử dụng NOT IN
toá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ề NULL
các giá trị trong cột khi sử dụng NOT IN
toán tử.
Hãy coi chừng NULL !!
in
câ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=null
mà sẽ không hoạt động.