【问题标题】:SQL Query INTERSECTS - Relational AlgebraSQL 查询 INTERSECTS - 关系代数
【发布时间】:2016-08-12 23:57:01
【问题描述】:

我正在尝试将以下 2 个关系代数转换为标准英语,但我无法理解 INTERSECTS 到底是做什么的

我知道 INTERSECT 会找到两个 select 语句中出现的值

我设法找到了它的 SQL 查询,但我就是不知道它用简单的英语询问了什么

有人可以帮忙吗?

关系代数:

Πstudent_name(σcourse id=“CS1850“(student Natural Join enrolled)) ∩
Πstudent_name(σcourse id=“CS1840“(student Natural Join enrolled))

SQL:

SELECT student_name FROM student NATURAL JOIN enrolled WHERE 
course_id='CS1850' INTERSECT SELECT student_name FROM student 
NATURAL JOIN enrolled where student_name='CS1840'

第二个表达方式:

Πstudent_name(σe1.student   
id=e2.student_id∧e1.course_id<>e2.course_id(student natural join 
(ρe1(enrolled) × ρe2(enrolled))))

SELECT student_name FROM student NATURAL JOIN enrolled e1 NATURAL JOIN  
e2 WHERE e1.student_id = e2.student_id

【问题讨论】:

  • 在人类语言中:“查找所有在'CS1850'中注册的学生,并找到所有在'CS1840'中注册的学生,并返回这两个结果集的交集”,或“查找所有在'CS1850'中注册的学生两个“CS1850”和“CS1840”。”
  • @JimmyB - 我明白了 - 关于第二个有什么想法吗?
  • 第二条 SQL 与代数表达式不匹配。它缺少e1.course id&lt;&gt;e2.course
  • 我尽力将表达式转换为查询 - 我哪里出错了?
  • 在人类语言中:“查找所有注册一门课程但同时注册的课程与第一门不同的课程的学生。”或“查找所有注册了至少两个不同课程的学生。”课程。”

标签: mysql sql relational-algebra


【解决方案1】:

首先,不要使用NATURAL JOIN。这是一个等待发生的错误。它根据共同列的 names 匹配表。它甚至没有使用正确声明的外键关系。相反,使用USINGON 来明确用于连接的列。

其次,你不需要INTERSECT。使用GROUP BYJOIN的典型方法有两种。

在英语中,查询获取同时注册了两个班级的学生。

SELECT s.student_name
FROM student s JOIN
     enrolled e
     USING (student_id) -- or whatever
WHERE e.course_id IN ('CS1850', 'CS1840')
GROUP BY s.student_name
HAVING COUNT(*) = 2;

注意:这假设两个学生的名字不同。

另一种方法只使用JOIN

SELECT s.student_name
FROM student s JOIN
     enrolled e1
     USING (student_id) JOIN
     enrolled e2
     USING (student_id)
WHERE e1.course_id = 'CS1850' AND
      e2.course_id = 'CS1840';

如果基础表没有重复项,则不需要GROUP BYDISTINCT

【讨论】:

  • 上述查询或您的查询与 WHERE course_id='CS1850' AND course_id='CS1840'有何不同?
  • @RandomMath 。 . .我的查询将返回两个班级的学生。您的 WHERE 子句将始终过滤掉所有学生(因为 course_id 不能在同一行中同时接受两个值)。
  • 哦,我明白了——我的表达完全上传了——上面还有另一个高级查询,我不知道要翻译成英文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多