【问题标题】:Oracle database where clauseOracle 数据库 where 子句
【发布时间】:2015-04-19 16:23:47
【问题描述】:

我有以下带有表的数据库,并且我确实尝试查询它们: 检索所有借出超过五本书的借款人的姓名、地址和借出的图书数量。 我已经创建了查询

select name, Address
from BORROWER
where BOOK_LOANS.BookId >= 5;

似乎我需要加入表格,我被困在这里,我可以寻求帮助吗?

CREATE TABLE BOOK ( 
  BookId CHAR(20) NOT NULL,
  Title VARCHAR(30) NOT NULL,
  PublisherName VARCHAR(20),
  PRIMARY KEY (BookId),
  FOREIGN KEY (PublisherName) REFERENCES PUBLISHER (PublisherName) 
);

CREATE TABLE BOOK_AUTHORS ( 
  BookId CHAR(20) NOT NULL,
  AuthorName VARCHAR(30) NOT NULL,
  PRIMARY KEY (BookId, AuthorName),
  FOREIGN KEY (BookId) REFERENCES BOOK (BookId)
  ON DELETE CASCADE 
);

// PublisherName was added, as it was referenced by another 
// table but did not exist as an attribute.

CREATE TABLE PUBLISHER ( 
  PublisherName VARCHAR(20) NOT NULL,
  Address VARCHAR(40) NOT NULL,
  Phone CHAR(12),
  PRIMARY KEY (PublisherName) 
);

CREATE TABLE BOOK_COPIES ( 
  BookId CHAR(20) NOT NULL,
  BranchId INTEGER NOT NULL,
  No_Of_Copies INTEGER NOT NULL,
  PRIMARY KEY (BookId, BranchId),
  FOREIGN KEY (BookId) REFERENCES BOOK (BookId)
  ON DELETE CASCADE,
  FOREIGN KEY (BranchId) REFERENCES BRANCH (BranchId)
  ON DELETE CASCADE
);

CREATE TABLE BORROWER ( 
  CardNo INTEGER NOT NULL,
  Name VARCHAR(30) NOT NULL,
  Address VARCHAR(40) NOT NULL,
  Phone CHAR(12),
  PRIMARY KEY (CardNo) 
);

CREATE TABLE BOOK_LOANS ( 
  CardNo INTEGER NOT NULL,
  BookId CHAR(20) NOT NULL,
  BranchId INTEGER NOT NULL,
  DateOut DATE NOT NULL,
  DueDate DATE NOT NULL,
  PRIMARY KEY (CardNo, BookId, BranchId),
  FOREIGN KEY (CardNo) REFERENCES BORROWER (CardNo)
  ON DELETE CASCADE,
  FOREIGN KEY (BranchId) REFERENCES BRANCH (BranchId)
  ON DELETE CASCADE,
  FOREIGN KEY (BookId) REFERENCES BOOK (BookId)
  ON DELETE SET NULL 
);

CREATE TABLE BRANCH ( 
  BranchId INTEGER NOT NULL,
  BranchName VARCHAR(20) NOT NULL,
  Address VARCHAR(40) NOT NULL,
  PRIMARY KEY (BranchId) 
);

【问题讨论】:

  • 是的,您需要加入。幸运的是,它们有很好的文档记录。你试过什么?
  • 您标记了 MySQL,但说的是 Oracle。你指的是哪一个?
  • MySQL 也是 Oracle。 ;-) 然而,这是您的第三个问题,需要进行一些认真的重新标记,并且没有显示出任何努力尝试自己解决问题。因此,我对你的问题投了反对票。请先搜索并尝试自己解决问题。如果您对实际尝试有兴趣,我们随时为您提供帮助。另外,也请努力解决您的问题。需要解决的是你的问题。
  • 好吧,Oracle 拥有,但它的 SQL 与 Oracle 完全不同。所以我还是建议正确的标签。
  • @GolezTrol 我编辑了问题并删除了标签,以后我会更加小心。谢谢。

标签: join oracle11g


【解决方案1】:

您确实需要一个将BORROWER 表与BOOK_LOANS 表连接起来的连接。连接应该在共享密钥(CardNO)上。

要计算借阅的书籍数量,请使用 COUNT() 聚合函数,并将其与 GROUP BY 子句结合起来,该子句根据 CardNo, Name, Address 的唯一组合将数据划分为组。

现在您可以计算每个卡号的借书数量。

最后,您应用 HAVING 子句过滤组,以仅包括那些有五本或更多图书借阅的组。

SELECT b.Name, b.Address, COUNT(*) AS BookCount
FROM BORROWER b
JOIN BOOK_LOANS bl ON b.CardNo = bl.CardNo
GROUP BY b.CardNO, b.Name, b.Address
HAVING COUNT(bl.BookID) >= 5

【讨论】:

  • 谢谢!!!很好的解释,我现在正在寻找 HAVING Clause。我是按计数和 ORDER BY 做的
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2023-03-31
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2023-04-03
  • 2011-10-08
相关资源
最近更新 更多