子查询和SQL中的JOIN语句之间的区别

LibraryDB是一个数据库系统,可在假想的图书馆中跟踪有关书籍及其流通的信息。

下面给出了LibraryDB数据库的模式:(请注意book_copy关系跟踪图书馆藏书中书籍的物理副本。)

  • 借入(transactionID,personID *,借阅日期,到期日,返回日期)
  • 作者(authorID,名字,中间名,姓氏)
  • book_copy(bookID,bookdescID *)
  • 书籍(bookdescID,标题,字幕,版本,标题,卷号,语言,位置,年份,isbn,杜威,subjectID *)
  • 借款复制(交易ID *,书ID *)
  • 人员(人员ID,名字,中间名,姓氏,地址,城市,邮政编码,电话号码,电子邮件地址,studentno,idcardno)
  • 发布者(publisherID,publisherfullname)
  • writer_by(bookdescID *,authorID *,角色)
  • Published_by(bookdescID *,publisherID *,角色)
  • 主题(subjectID,subjecttype)

我试图在SQLite中编写两种类型的SQL语句以显示从未借阅的书籍的标题。

一种使用LEFT OUTER JOIN子句:

SELECT title
FROM book INNER JOIN book_copy
     ON book.BOOKDESCID = book_copy.BOOKDESCID
        LEFT OUTER JOIN borrow_copy
        ON borrow_copy.BOOKID = book_copy.BOOKID
        WHERE borrow_copy.TRANSACTIONID IS NULL;

返回323行。

一种不使用OUTER JOIN子句的方法:

SELECT title 
FROM book 
WHERE bookdescID IN 
      (SELECT bookdescID 
       FROM book_copy 
       WHERE bookID NOT IN 
             (SELECT bookID 
              FROM borrow_copy));

仅返回了298行。

为什么这两个SQL语句返回两个不同的结果?

在显示从未借用的书名时,哪一种是正确的?

评论