我在MySQL中有两个表:
BOOK(id int,isbn,title,publisher,author,...)
LEND(issueid,id int,enrno,dateofissue)
我想显示BOOK
Id
不存在于LEND
中(即尚未发布),'%s%'
我想在.NET C#应用程序(datagridview)
中使用此查询我写了这个查询:
select * from book where id!=(select distinct id from lend) and title like '%" + textBox1.Text + "%';";
where textbox1.text is entered in textbox
当LEND
为空时,此查询不显示任何行。这是问题所在,它应该显示BOOK
的所有行。我该如何解决这个问题?
答案 0 :(得分:3)
!=
运算符比较两个标量值。如果您正在寻找一种方法来检查列表中是否存在特定值,您可以执行以下操作之一:
NOT IN
:select *
from book where id NOT IN (
select distinct id from lend
) and title like '%" + textBox1.Text + "%' -- <<== Parameterize this!
NOT EXISTS
:select *
from book where NOT EXISTS (
select id from lend where lend.id = book.id
) and title like '%" + textBox1.Text + "%' -- <<== Parameterize this!
在这两种情况下,您都应该使用查询参数替换用户输入的数据。这非常重要,因为否则您的系统将对SQL注入攻击开放。确切的语法取决于您托管查询的编程语言。
答案 1 :(得分:1)
我个人推荐加入:
SELECT
book.*
FROM
book LEFT JOIN lend ON book.id = lend.id
WHERE
lend.id IS NULL AND book.title LIKE '%" + textBox1.Text + "%'
基于我所读到的内容,这将比NOT IN更有效,因为IN在索引上运行速度非常慢(我假设NOT IN大致相同,但我可能会弄错)。 “id”将是PRIMARY KEY,这是一个索引。
值得注意的是,如果表格非常小,那么使用NOT IN不会产生巨大的差异。这种效率只是使用非常大的表的一个问题,我个人在使用IN之前曾经遇到过这个问题。