Hướng dẫn mysql minus syntax error - mysql trừ lỗi cú pháp

Tôi có hai truy vấn.

Truy vấn đầu tiên trả về 11 hàng và truy vấn thứ hai trả về 6 hàng khi tôi sử dụng toán tử trừ trên chúng, nó sẽ trả lại 5 hàng theo như sự hiểu biết của tôi

SELECT location from uploads where username='Gates' MINUS SELECT fileshare FROM `whiteboard` where username='Gates' and friend='Curlyclouds'

Nhưng tôi đang gặp lỗi sau:following error:

Bạn có lỗi trong cú pháp SQL của mình; Kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để sử dụng gần 'trừ' Chọn Fileshare từ mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 14 trong đó username = 'gates' và friend = 'cur' ở dòng 2

Hy vọng câu hỏi của tôi là rõ ràng và bất kỳ sự giúp đỡ nào cũng sẽ hữu ích cho tôi ..... cảm ơn bạn

Hỏi ngày 26 tháng 8 năm 2012 lúc 8:57Aug 26, 2012 at 8:57

MySQL không hỗ trợ mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 15 hoặc mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 16.

Bạn có thể sử dụng mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 17, mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 18 hoặc mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 19 (cẩn thận với null) để thực hiện tham gia chống bán.

Xem ví dụ và so sánh hiệu suất ở đây

Đã trả lời ngày 26 tháng 8 năm 2012 lúc 8:59Aug 26, 2012 at 8:59

Martin Smithmartin SmithMartin Smith

426K86 Huy hiệu vàng719 Huy hiệu bạc814 Huy hiệu đồng86 gold badges719 silver badges814 bronze badges

1

Sử dụng "không trong" hoặc "không tồn tại" để thực hiện truy vấn "trừ" trên các bộ dữ liệu rất lớn có thể dẫn đến thời gian truy vấn cực kỳ dài. Tôi đã đưa ra một phương pháp bắt chước các hoạt động dựa trên tập hợp được thực hiện bởi các cơ sở dữ liệu khác (hợp nhất, sắp xếp, loại bỏ các bản sao).

select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1

Các chọn ở trên mang lại hiệu suất rất tốt trên các tập dữ liệu lớn so với việc sử dụng không tồn tại hay không. Về cơ bản, nó đang tìm kiếm các hàng chỉ tồn tại trong tập đầu tiên chứ không phải trong thứ hai. Tôi đã sử dụng điều này khá thường xuyên gần đây với thành công rất tốt đối với hiệu suất.

Đã trả lời ngày 25 tháng 9 năm 2015 lúc 20:47Sep 25, 2015 at 20:47

12.4.2 & nbsp; các chức năng và toán tử so sánh

Bảng & NBSP; 12.4 & NBSP; Các toán tử so sánh

TênSự mô tả
(a = x) AND (b = y)0 Lớn hơn nhà điều hành
(a = x) AND (b = y)1 Toán tử lớn hơn hoặc bằng nhau
(a = x) AND (b = y)2 Ít hơn nhà điều hành
(a = x) AND (b = y)3, (a = x) AND (b = y)4 Không phải là toán tử bằng nhau
(a = x) AND (b = y)5 Ít hơn hoặc người vận hành bằng nhau
(a = x) AND (b = y)6 Null-safe bằng người vận hành
(a = x) AND (b = y)7 Toán tử bình đẳng
(a = x) AND (b = y)8 Liệu một giá trị có nằm trong một phạm vi của các giá trị
(a = x) AND (b = y)9 Trả lại đối số không null đầu tiên
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL0 Trả lại đối số lớn nhất
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL1 Liệu một giá trị có nằm trong một tập hợp các giá trị
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL2 Trả về chỉ mục của đối số nhỏ hơn đối số đầu tiên
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL3 Kiểm tra giá trị chống lại Boolean
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL4 Kiểm tra giá trị chống lại Boolean
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL4mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL5
Không kiểm tra giá trị nullmysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL6
Kiểm tra giá trị nullmysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL7
Kiểm tra xem đối số có phải là null khôngmysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL8
Trả lại đối số nhỏ nhấtmysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL9
Phù hợp với mô hình đơn giản(a <=> x) AND (b <=> y)0
Liệu một giá trị không nằm trong một phạm vi của các giá trị(a <=> x) AND (b <=> y)1
Liệu một giá trị không nằm trong một tập hợp các giá trị(a <=> x) AND (b <=> y)2
Sự phủ định của kết hợp mô hình đơn giản(a <=> x) AND (b <=> y)3

So sánh hai chuỗi

Các hoạt động so sánh dẫn đến giá trị (a <=> x) AND (b <=> y)4 ((a <=> x) AND (b <=> y)5), (a <=> x) AND (b <=> y)6 ((a <=> x) AND (b <=> y)7) hoặc (a <=> x) AND (b <=> y)8. Các hoạt động này hoạt động cho cả số và chuỗi. Chuỗi được tự động chuyển đổi thành số và số thành chuỗi khi cần thiết.

= > < >= <= <> !=

Các toán tử so sánh quan hệ sau đây có thể được sử dụng để so sánh không chỉ các toán hạng vô hướng, mà cả các toán hạng hàng:

Các mô tả cho các nhà khai thác sau này trong phần này chi tiết cách chúng làm việc với các toán hạng hàng. Để biết các ví dụ bổ sung về các so sánh hàng trong bối cảnh của các nhóm con hàng, xem Phần & NBSP; 13.2.11.5, các nhóm con hàng của Row.

Ghi chú

Trong các phiên bản trước của MySQL, khi đánh giá một biểu thức chứa mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL8 hoặc mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL0, máy chủ đã cố gắng đoán bối cảnh mà hàm được sử dụng và để buộc các đối số của hàm vào loại dữ liệu của biểu thức nói chung. Ví dụ, các đối số cho mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 18 được đánh giá và sắp xếp dưới dạng chuỗi, để biểu thức này trả về mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 19. Trong MySQL 8.0.3 và sớm hơn, khi đánh giá biểu thức (a <> x) OR (b <> y)0, máy chủ đã chuyển đổi các đối số thành số nguyên (dự đoán việc bổ sung số nguyên 0 thành kết quả) trước khi sắp xếp chúng, do đó trả về 2.

Bắt đầu với MySQL 8.0.4, máy chủ không còn cố gắng suy ra bối cảnh theo kiểu này. Thay vào đó, hàm được thực thi bằng cách sử dụng các đối số như được cung cấp, thực hiện chuyển đổi kiểu dữ liệu sang một hoặc nhiều đối số nếu và chỉ khi chúng không phải là cùng một loại. Bất kỳ loại ép buộc nào được bắt buộc bởi một biểu thức sử dụng giá trị trả về hiện được thực hiện sau khi thực thi chức năng. Điều này có nghĩa là, trong MySQL 8.0.4 trở lên, (a <> x) OR (b <> y)1 đánh giá thành (a <> x) OR (b <> y)2 và do đó là số nguyên 11. (BUG #83895, BUG #25123839)

Để chuyển đổi giá trị thành một loại cụ thể cho mục đích so sánh, bạn có thể sử dụng hàm (a <> x) OR (b <> y)3. Các giá trị chuỗi có thể được chuyển đổi thành một bộ ký tự khác bằng (a <> x) OR (b <> y)4. Xem Phần & NBSP; 12.11, Chức năng Cast Cast và toán tử.

Theo mặc định, các so sánh chuỗi không nhạy cảm trường hợp và sử dụng bộ ký tự hiện tại. Mặc định là (a <> x) OR (b <> y)5.

  • (a = x) AND (b = y)7

    Bình đẳng:

    mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 1

    Để so sánh hàng, (a <> x) OR (b <> y)7 tương đương với:

    (a = x) AND (b = y)
  • (a = x) AND (b = y)6

    ________ 68 an toàn bằng nhau. Toán tử này thực hiện so sánh bình đẳng như toán tử (a = x) AND (b = y)7, nhưng trả về (a <=> x) AND (b <=> y)4 thay vì (a <=> x) AND (b <=> y)8 nếu cả hai toán hạng là (a <=> x) AND (b <=> y)8 và (a <=> x) AND (b <=> y)6 thay vì (a <=> x) AND (b <=> y)8 nếu một toán hạng là (a <=> x) AND (b <=> y)8.

    Toán tử (a = x) AND (b = y)6 tương đương với toán tử SQL mysql> SELECT 0.1 <= 2; -> 18 tiêu chuẩn.

    mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL

    Để so sánh hàng, mysql> SELECT 0.1 <= 2; -> 19 tương đương với:

    (a <=> x) AND (b <=> y)
  • (a = x) AND (b = y)3, (a = x) AND (b = y)4

    Không công bằng:

    mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1

    Để so sánh hàng, select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 02 và select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 03 tương đương với:

    (a <> x) OR (b <> y)
  • (a = x) AND (b = y)5

    Nhỏ hơn hoặc bằng:

    mysql> SELECT 0.1 <= 2; -> 1

    Để so sánh hàng, select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 05 tương đương với:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 0
  • (a = x) AND (b = y)2

    Ít hơn:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 1

    Để so sánh hàng, select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 07 tương đương với:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 2
  • (a = x) AND (b = y)1

    Lớn hơn hoặc bằng:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 3

    Để so sánh hàng, select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 09 tương đương với:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 4
  • (a = x) AND (b = y)0

    Lớn hơn:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 5

    Để so sánh hàng, select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 11 tương đương với:

    select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 6
  • select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 12 giữa select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 13 và select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 14

    Nếu select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 15 lớn hơn hoặc bằng select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 13 và select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 15 nhỏ hơn hoặc bằng select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 14, select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 19 trả về (a <=> x) AND (b <=> y)4, nếu không thì nó sẽ trả về (a <=> x) AND (b <=> y)6. Điều này tương đương với biểu thức (select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 13(select column1, count(*), min(setnum) from ( select distinct column1, 1 as setnum from table1 union all select distinct column1, 2 as setnum from table2 ) as tbl_a group by column1 having count(*) = 1 and min(setnum) = 1 13

Chủ đề