【问题标题】:Struggling to wrap my head around this Database Query努力解决这个数据库查询
【发布时间】:2015-06-06 20:24:34
【问题描述】:

我正在完成斯坦福大学的关系代数课程,但我很难理解其中一个问题,尽管我已经得到了答案。

这是架构:

/* Delete the tables if they already exist */
drop table if exists Person;
drop table if exists Frequents;
drop table if exists Eats;
drop table if exists Serves;

/* Create the schema for our tables */
create table Person(name text, age int, gender text);
create table Frequents(name text, pizzeria text);
create table Eats(name text, pizza text);
create table Serves(pizzeria text, pizza text, price decimal);

/* Populate the tables with our data */
insert into Person values('Amy', 16, 'female');
insert into Person values('Ben', 21, 'male');
insert into Person values('Cal', 33, 'male');
insert into Person values('Dan', 13, 'male');
insert into Person values('Eli', 45, 'male');
insert into Person values('Fay', 21, 'female');
insert into Person values('Gus', 24, 'male');
insert into Person values('Hil', 30, 'female');
insert into Person values('Ian', 18, 'male');

insert into Frequents values('Amy', 'Pizza Hut');
insert into Frequents values('Ben', 'Pizza Hut');
insert into Frequents values('Ben', 'Chicago Pizza');
insert into Frequents values('Cal', 'Straw Hat');
insert into Frequents values('Cal', 'New York Pizza');
insert into Frequents values('Dan', 'Straw Hat');
insert into Frequents values('Dan', 'New York Pizza');
insert into Frequents values('Eli', 'Straw Hat');
insert into Frequents values('Eli', 'Chicago Pizza');
insert into Frequents values('Fay', 'Dominos');
insert into Frequents values('Fay', 'Little Caesars');
insert into Frequents values('Gus', 'Chicago Pizza');
insert into Frequents values('Gus', 'Pizza Hut');
insert into Frequents values('Hil', 'Dominos');
insert into Frequents values('Hil', 'Straw Hat');
insert into Frequents values('Hil', 'Pizza Hut');
insert into Frequents values('Ian', 'New York Pizza');
insert into Frequents values('Ian', 'Straw Hat');
insert into Frequents values('Ian', 'Dominos');

insert into Eats values('Amy', 'pepperoni');
insert into Eats values('Amy', 'mushroom');
insert into Eats values('Ben', 'pepperoni');
insert into Eats values('Ben', 'cheese');
insert into Eats values('Cal', 'supreme');
insert into Eats values('Dan', 'pepperoni');
insert into Eats values('Dan', 'cheese');
insert into Eats values('Dan', 'sausage');
insert into Eats values('Dan', 'supreme');
insert into Eats values('Dan', 'mushroom');
insert into Eats values('Eli', 'supreme');
insert into Eats values('Eli', 'cheese');
insert into Eats values('Fay', 'mushroom');
insert into Eats values('Gus', 'mushroom');
insert into Eats values('Gus', 'supreme');
insert into Eats values('Gus', 'cheese');
insert into Eats values('Hil', 'supreme');
insert into Eats values('Hil', 'cheese');
insert into Eats values('Ian', 'supreme');
insert into Eats values('Ian', 'pepperoni');

insert into Serves values('Pizza Hut', 'pepperoni', 12);
insert into Serves values('Pizza Hut', 'sausage', 12);
insert into Serves values('Pizza Hut', 'cheese', 9);
insert into Serves values('Pizza Hut', 'supreme', 12);
insert into Serves values('Little Caesars', 'pepperoni', 9.75);
insert into Serves values('Little Caesars', 'sausage', 9.5);
insert into Serves values('Little Caesars', 'cheese', 7);
insert into Serves values('Little Caesars', 'mushroom', 9.25);
insert into Serves values('Dominos', 'cheese', 9.75);
insert into Serves values('Dominos', 'mushroom', 11);
insert into Serves values('Straw Hat', 'pepperoni', 8);
insert into Serves values('Straw Hat', 'cheese', 9.25);
insert into Serves values('Straw Hat', 'sausage', 9.75);
insert into Serves values('New York Pizza', 'pepperoni', 8);
insert into Serves values('New York Pizza', 'cheese', 7);
insert into Serves values('New York Pizza', 'supreme', 8.5);
insert into Serves values('Chicago Pizza', 'cheese', 7.75);
insert into Serves values('Chicago Pizza', 'supreme', 8.5);

我正在努力解决问题 6。问题内容如下:找出所有只有 24 岁以下的人才能吃的比萨饼,或者在任何地方提供价格低于 10 美元的比萨饼。

现在,我理解了这个查询。基本上分为两部分:

  1. 24 岁以下的人吃的披萨
  2. 不到 10 美元的比萨饼

我什至理解答案,即(所有提供的比萨饼和价格大于等于 10 美元的比萨饼之间的差异)和(所有被人们吃掉的比萨饼和被超过 24 年的人吃掉的比萨饼之间的差异)的联合。年龄)

(\project_{pizza} (Serves) \diff \project_{pizza} (\select_{price>='10'} Serves))
\union
(\project_{pizza} (Eats) \diff \project_{pizza} (\select_{age>='24'} Person \join Eats))

但是,我不明白为什么相反的查询没有给出相同的答案,即联合(价格低于 10 美元的比萨饼)和(24 岁以下的人吃的比萨饼)。

(\project_{pizza} (\select_{price<'10'} Serves))
\union
(\project_{pizza} (\select_{age<'24'} Person \join Eats))

为什么第二个查询给出的答案与第一个不同。在我看来,他们都应该给出相同的答案。

感谢所有回复。

【问题讨论】:

  • LEFT JOIN 加入比萨饼然后 WHERE 人
  • 嘿,忍者马特,请您详细说明一下。我对逻辑比查询本身更感兴趣。谢谢!

标签: sql database relational-algebra


【解决方案1】:

您的第一个查询找到的比萨饼

任何地方都不会花费超过 10 美元, 或不被任何 24 岁或以上的人食用

而您的最后一个查询是比萨饼

某处以低于 10 美元的价格出售,或 一些 24岁以下的人吃掉

对于在某些地方售价低于 10 美元而在其他地方售价超过 10 美元的比萨饼,或者由 24 岁以下和一些年龄较大的人食用的比萨饼,这些查询将给出不同的结果。

【讨论】:

  • 嘿,非常感谢。现在说得通了!我会支持你,但我没有足够的代表。谢谢!!
  • @philosopher 很高兴能够提供帮助。如果您接受答案(通过单击复选标记),您也将获得声望 (+2)。
  • 谢谢哥们!干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2013-07-11
  • 2021-11-23
  • 2021-07-21
  • 2013-04-13
  • 2017-04-07
  • 1970-01-01
相关资源
最近更新 更多