sql—mysql中的子查询,用isbn而不是书名来表示一本书

jaql4c8m  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(291)

我需要使用子查询方法,找到标题为“room”的书作为订单的一部分的次数。
相关架构表
订单详细信息(ono、bookisbn、数量)
图书(isbn、书名、作者、流派、出版年份、出版商、rrprice、avgrating)
它以两种顺序出现,图书isbn和isbn是主键和外键
我试过了

SELECT Count(*)
FROM orderDetails
WHERE  'Room' in (SELECT title
                         FROM book)

尽管书房里只有两份订单,但它还是会返回25张。我能理解为什么它是错的,但我不知道我怎么称呼它的isbn的书(不只是键入323,因为这将是一个快捷方式)

sxpgvts3

sxpgvts31#

where子句的计算结果要么为true,要么为false。它与外部查询不相关,因此:
“true”表示返回(并计数)所有行
“false”表示不返回(并计数)行
您可以使用correlation子句解决此问题:

SELECT Count(*)
FROM orderDetails od
WHERE 'Room' IN (SELECT b.title FROM book b WHERE od.bookISBN = b.ISBN);
zzlelutf

zzlelutf2#

使用此查询

SELECT Count(*)
FROM orderDetails
WHERE bookISBN in (SELECT isbn
                         FROM book where title = 'Room')

你可以用 Like 子查询中的运算符 %Room% 为标题

xfyts7mz

xfyts7mz3#

在我看来,加入会更好:

SELECT Count(*)
FROM orderDetails LEFT JOIN book ON isbn=bookISBN
WHERE  title LIKE N'%Room%'

但如果必须使用子查询:

SELECT Count(*)
FROM orderDetails
WHERE  bookISBN in (SELECT isbn
                    FROM book 
                    WHERE title LIKE N'%Room%')

无论我们用哪种方法,我们总是要用公共域来得到

mrphzbgm

mrphzbgm4#

普通查询,不使用子查询:

SELECT
    COUNT(1)
FROM 
    orderDetails od
    INNER JOIN book b ON b.isbn = od.bookISBN
WHERE
    b.title LIKE '%ROOM%'

异常查询,使用内部查询,我不建议这样做,因为这是不必要的,但我们来看看:

SELECT
    COUNT(1)
FROM 
    orderDetails od
    INNER JOIN (
        SELECT isbn, title FROM book
    ) b ON b.isbn = od.bookISBN
WHERE
    b.title LIKE '%ROOM%

更不正常的子查询查询:

SELECT
    COUNT(1)
FROM
    orderDetails od
WHERE
    od.bookISBN IN (SELECT isbn FROM book WHERE title like '%ROOM%')

提示:
1我用过 count(1) ,因为,对所有列进行计数是没有意义的,因此,您可以只对条件的成功条目进行计数,这样会更快。
2使用子查询会限制编译器的功能,因此,我建议不要使用它。

相关问题