SQL查询:如何改进?

德里克

我在MySQL数据库中有两个表:

Book(title, publisher, year) title is primary key

Author(name, title) title is foreign key to Book

我试图选择从2000年到2005年(每年)出版一本书的作者的姓名。此SQL查询有效,但是有没有办法做到这一点,如果需要,可以更轻松地更改日期范围?

SELECT DISTINCT name
FROM Author
WHERE name IN  (SELECT Author.name 
                FROM Author INNER JOIN Book ON (Author.title = Book.title) 
                WHERE year = 2000)
        AND name IN
                (SELECT Author.name 
                FROM Author INNER JOIN Book ON (Author.title = Book.title)
                WHERE year = 2001)
        AND name IN
                (SELECT Author.name 
                FROM Author INNER JOIN Book ON (Author.title = Book.title)
                WHERE year = 2002)
        AND name IN
                (SELECT Author.name 
                FROM Author INNER JOIN Book ON (Author.title = Book.title)
                WHERE year = 2003)
        AND name IN
                (SELECT Author.name 
                FROM Author INNER JOIN Book ON (Author.title = Book.title)
                WHERE year = 2004)
        AND name IN
                (SELECT Author.name 
                FROM Author INNER JOIN Book ON (Author.title = Book.title)
                WHERE year = 2005);
w

这有两种实现方法,以及另一种方法由于细微的错误而出错的方法。

SQL小提琴

MySQL 5.5.32模式设置

create table Book (title varchar(10), year int) ;
create table Author (name varchar(10), title varchar(10));

insert Book values 
('Book1',2000),('Book2',2000),
('Book3',2000),('Book4',2000),
('Book5',2000),('Book6',2000),
('Book7',2001),('Book8',2002),
('Book9',2003),('Book10',2004),
('Book11',2005);

insert into Author values 
('Author1','Book1'),('Author1','Book2'),
('Author1','Book3'),('Author1','Book4'),
('Author1','Book5'),('Author1','Book6'),
('Author2','Book6'),('Author2','Book7'),
('Author2','Book8'),('Author2','Book9'),
('Author2','Book10'),('Author2','Book11');

# author1 has written 6 books in one year
# author2 has written 1 book in every of the six years

查询1

# incorrect as it matches author1 who has 6 books in a single year
SELECT name from Author 
INNER JOIN BOOK on Author.title = Book.Title 
WHERE year IN (2000,2001,2002,2003,2004,2005) 
GROUP BY name 
HAVING COUNT(name) = 6

结果

|    NAME |
|---------|
| Author1 |
| Author2 |

查询2

# correct as it counts distinct years
SELECT name from Author 
INNER JOIN BOOK on Author.title = Book.Title 
WHERE year IN (2000,2001,2002,2003,2004,2005) 
GROUP BY name 
HAVING COUNT(DISTINCT year) = 6

结果

|    NAME |
|---------|
| Author2 |

查询3

# correct using relational division
SELECT DISTINCT name
FROM Author A1
INNER JOIN Book B1 ON A1.title = B1.Title
WHERE NOT EXISTS (
    SELECT * 
    FROM Book B2
    WHERE year IN (2000,2001,2002,2003,2004,2005) 
    AND NOT EXISTS (
       SELECT *
       FROM Author A2
       INNER JOIN Book B3 ON A2.title = B3.Title
       WHERE (A1.name = A2.name)
        AND (B3.year = B2.year)
    )
)

结果

|    NAME |
|---------|
| Author2 |

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何改进此 SQL 查询?

来自分类Dev

SQL:改进选择查询

来自分类Dev

如何使用多个“ CASE”改进此SQL Server查询?

来自分类Dev

如何使用聚合函数改进慢速 sql 查询

来自分类Dev

熊猫阅读SQL查询改进

来自分类Dev

SQL Select查询性能改进

来自分类Dev

Microsoft SQL Server查询改进

来自分类Dev

SQL查询性能改进的建议

来自分类Dev

SQL Self子查询改进

来自分类Dev

SQL Select查询性能改进

来自分类Dev

Microsoft SQL Server查询改进

来自分类Dev

改进用于 xpath 评估的 SQL 查询

来自分类Dev

如何以良好的性能改进查询以使用SQL Server拆分字符串

来自分类Dev

如何改进具有多个联接和子查询的表上的摘要SQL?

来自分类Dev

如何以良好的性能改进我的查询以使用SQL Server拆分字符串

来自分类Dev

如何通过分组改进查询?

来自分类Dev

改进 SQL INSERT 查询以避免 sql 注入

来自分类Dev

如何从过滤功能改进自制的SQL语法?

来自分类Dev

SQL-改进JOIN查询(需要长时间加载)

来自分类Dev

将SQL转换为LINQ或改进我的查询

来自分类Dev

SQL WHERE子查询具有其他改进?

来自分类Dev

我如何根据解释结果改进此查询

来自分类Dev

如何解决和改进此运行缓慢的查询?

来自分类Dev

如何解决和改进此运行缓慢的查询?

来自分类Dev

我如何根据解释结果改进此查询

来自分类Dev

如何在MVC 4中改进LINQ存储库查询

来自分类Dev

如何改进更新子查询中引用的表字段

来自分类Dev

如何改进具有多个子查询的 SELECT 语句

来自分类Dev

MySQL查询代码改进