当一个表为空时,Select语句不返回任何值

时间:2013-11-21 22:02:30

标签: mysql database

我在MySQL中有两个表:

BOOK(id int,isbn,title,publisher,author,...)
LEND(issueid,id int,enrno,dateofissue)

我想显示BOOK

中的行
  1. Id不存在于LEND中(即尚未发布),
  2. 就像'%s%'
  3. 我想在.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的所有行。我该如何解决这个问题?

2 个答案:

答案 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之前曾经遇到过这个问题。