Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Kỳ lạ ở mọi nơi

Cập nhật :Sau khi phân tích sâu hơn và mở ra > ALL của MySQL thực hiện lẻ. Câu trả lời này nên được coi là dành riêng cho MySQL. Vì vậy, để có thêm tuyên bố từ chối trách nhiệm, hãy giải thích về câu trả lời ở đây liên quan đến > ALL không áp dụng cho các RDBMS khác (trừ khi có các RDBMS khác đã sao chép việc triển khai MySQL). Bản dịch nội bộ từ > ALL thành MAX cấu trúc, chỉ áp dụng cho MySQL.

Cái này:

select id from t1 where id > all (select id from t2); 

tương đương về mặt ngữ nghĩa với:

select id from t1 where id > (select max(id) from t2); 

select max(id) from t2 trả về 1, truy vấn thứ hai trở thành hiện thực:

select id from t1 where id > 1

Đó là lý do tại sao nó trả về cả 102 từ bảng t1

Một trong những trường hợp áp dụng quy tắc NULL là khi bạn sử dụng NOT IN , một ví dụ:

DDL:

create table t1(id int);

insert into t1 values (10),(2);


create table t2(id int); 

insert into t2 values (0),(null),(1);

Truy vấn:

select * from t1 where id not in (select id from t2);

-- above is evaluated same as the following query, so the rules about null applies,
-- hence the above and following query will not return any record.    

select * from t1 where id <> 0 and id <> null and id <> 1;



-- to eliminate null side-effect, do this:
select * from t1 where id not in (select id from t2 where id is not null);

-- which is equivalent to this:
select * from t1 where id <> 0 and id <> 1;

Hai truy vấn cuối cùng trả về 102 , trong khi hai truy vấn đầu tiên trả về tập hợp rỗng

Kiểm tra trực tiếp: http://www.sqlfiddle.com/#!2/82865/ 1

Hy vọng những ví dụ này sẽ xóa bỏ sự nhầm lẫn của bạn với các quy tắc NULL.

Về

Sql được tối ưu hóa là điều này:

select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`
test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`)))

Điều đó thực sự tương đương với truy vấn ban đầu của bạn:select id from t1 where id > all (select id from t2);

Cấu trúc t1.field > all (select t2.field from t2) chỉ là một đường cú pháp cho:

t1.field > (select max(t2.field) from t2)

Nếu bạn áp dụng định lý DeMorgan trên SQL được tối ưu hóa bởi MySql:

not (t1.id <= (select max(t2.id) from t2))

Điều đó tương đương với:

t1.id > (select max(t2.id) from t2)

Đến lượt nó, tương đương với đường cú pháp ALL :

t1.id > ALL(select t2.id from t2)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nối các bảng trong hai cơ sở dữ liệu bằng SQLAlchemy

  2. Làm cách nào để thiết lập phpmyadmin và SQL để nhắn tin qua REST-api?

  3. Sự cố khi tạo lệnh cấm .htaccess động

  4. Làm cách nào để kiểm tra xem một chỉ mục có tồn tại trên một trường bảng trong MySQL hay không?

  5. Kết nối với nhiều phiên bản CloudSQL bằng Cloud sql proxy?