Mysql 何时使用左外连接?

Mysql 何时使用左外连接?,mysql,sql,database-design,join,Mysql,Sql,Database Design,Join,我不理解左外连接、右外连接的概念,也不理解为什么我们需要使用连接!我正在努力解决的问题和我正在使用的表格如下: 问题3(b) 在SQL中构造一个命令来解决以下查询,解释为什么它必须使用 (外部)联接方法。[5马克] “查找每位工作人员及其受扶养配偶(如有)的姓名” 问题3(c) 在SQL中构造一个命令来解决以下查询,使用(i)join方法和(ii) 子查询方法。[10马克] “查找在网络上工作超过20小时的每位员工的身份名称 电脑化计划“ 有人能简单地向我解释一下吗?当您需要其中一个联接表的所有

我不理解左外连接、右外连接的概念,也不理解为什么我们需要使用连接!我正在努力解决的问题和我正在使用的表格如下:

问题3(b)

在SQL中构造一个命令来解决以下查询,解释为什么它必须使用 (外部)联接方法。[5马克] “查找每位工作人员及其受扶养配偶(如有)的姓名”

问题3(c)

在SQL中构造一个命令来解决以下查询,使用(i)join方法和(ii) 子查询方法。[10马克] “查找在网络上工作超过20小时的每位员工的身份名称 电脑化计划“


有人能简单地向我解释一下吗?

当您需要其中一个联接表的所有结果时,您可以使用外部联接,无论另一个表中是否有匹配的行。

联接用于将两个相关表组合在一起

在您的示例中,可以组合Employee表和Department表,如下所示:

SELECT FNAME, LNAME, DNAME
FROM
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER
这将产生如下记录集:

FNAME   LNAME   DNAME
-----   -----   -----
John    Smith   Research
John    Doe     Administration
我使用了上面的
内部连接<代码>内部联接
s组合两个表,以便仅显示两个表中具有匹配项的记录,在本例中,这些记录在部门编号(Employee中的字段DNO,department表中的字段DNNumber)上联接

LEFT JOIN
s允许您在第一个表中有记录时合并两个表,但可能在第二个表中没有记录。例如,假设您想要一个包含所有员工以及所有家属的列表:

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
这里的问题是,如果员工没有依赖项,那么他们的记录将根本不会显示——因为依赖项表中没有匹配的记录

因此,您使用一个左联接,它将所有数据保留在“左”(即第一个表)上,并在“右”(第二个表)上拉入任何匹配的数据:

现在我们得到所有员工记录。如果给定员工没有匹配的受抚养人,
dependent\u first
dependent\u last
字段将为空。

示例(不使用示例表:-)

我有一家汽车租赁公司

Table car
id: integer primary key autoincrement
licence_plate: varchar
purchase_date: date

Table customer
id: integer primary key autoincrement
name: varchar

Table rental
id: integer primary key autoincrement
car_id: integer
bike_id: integer
customer_id: integer
rental_date: date
简单对吧?我有10辆车的记录,因为我有10辆车。
我经营这家公司已经10年了,所以我有1000个客户。
我每年租20辆车,每辆车=10年x10辆车x20=2000次租金

如果我把所有东西都存储在一个大表中,我就有了10x1000x2000=2000万条记录。
如果我将其存储在3个表中,我将得到10+1000+2000=3010条记录。
这是3个数量级,所以我用了3个表

但是因为我使用了3个表(以节省空间和时间),所以我必须使用连接才能再次取出数据
(至少如果我想要姓名和车牌而不是号码)

使用内部联接

客户345的所有租金

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
WHERE customer.id = 345.
这是一个
内部连接
,因为我们只想知道与实际发生的客户链接的租赁
的汽车

请注意,我们还有一个bike_id,链接到bike表,它与car表非常相似,但不同。 我们如何为客户345获得所有自行车+汽车租赁。
我们可以尝试这样做

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
INNER JOIN bike on (bike.id = rental.bike_id)
WHERE customer.id = 345.
但那将是一个空集
这是因为租赁既可以是自行车租赁,也可以是汽车租赁,但不能同时是自行车租赁和汽车租赁。
而非工作的
内部联接查询将只给出我们在同一交易中同时出租自行车和汽车的所有租赁的结果。
我们正在尝试使用布尔
连接来获取和布尔
关系

使用外部联接

为了解决这个问题,我们需要一个
外部联接

让我们用
left join

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
WHERE customer.id = 345.
如果创建表并运行查询,则可以看到结果

关于术语

左连接
左外部连接
相同。 没有额外前缀的
连接是
内部连接
还有一个
完全外部连接
。在25年的编程生涯中,我从未使用过它

为什么要离开加入

嗯,涉及到两张桌子。在示例中,我们链接了
要使用
内部联接进行租赁的客户
,在内部联接中,两个表必须链接,因此
左侧:客户
表和
右侧:租赁
表之间没有区别

下一个链接是
left:rental
right:car
之间的
left-join
。在左侧,所有行都必须链接,而右侧则不必链接。这就是为什么它的代码>左联接< /代码>

< p>我认为问题3(b)是混淆的,因为它的整个前提是错误的:你不必使用外部连接来“解决查询”,例如,考虑这个(跟随试卷中的语法风格可能是明智的):

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
WHERE customer.id = 345.
一般而言: 将两张桌子连接在一起。 当您想要“查找”时,可以使用内部联接,例如查找任何特定列的详细信息。
当你想“演示”时,可以使用外部连接,比如列出两个表的所有信息。

这是“如果有的话”。。。左外部联接与左联接(在mysql中)相同,可以使用它们返回行,即使它们不一定与另一个表中的行匹配。此外,还需要使用联接,因为这很简单,就是数据库查询的工作方式。这就像在问为什么我们需要用肺来呼吸。联接是对关系数据库进行查询的机制。连接根本不是一个复杂的概念,如果您遇到问题,我建议您在开始阅读关系数据库时多做一些阅读。如果你真的是一所大学的学生
if a=1 AND a=2 then {this is always false, no result}
if a=1 OR a=2 then  {this might be true or not}
SELECT FNAME, LNAME, DEPENDENT_NAME
  FROM EMPLOYEE, DEPENDENT
 WHERE SSN = ESSN
       AND RELATIONSHIP = 'SPOUSE'
UNION 
SELECT FNAME, LNAME, NULL
  FROM EMPLOYEE
EXCEPT 
SELECT FNAME, LNAME, DEPENDENT_NAME
  FROM EMPLOYEE, DEPENDENT
 WHERE SSN = ESSN
       AND RELATIONSHIP = 'SPOUSE'