连接操作

连接操作是一种二进制操作,用于根据两个或多个表之间的共同字段来合并数据或行。INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN是不同类型的联接。

例子 –

tb_orders (OrderID, CustomerID, OrderDate);
tb_customers (CustomerID, CustomerName, ContactName, Country);

查找已订购的客户的详细信息。

SELECT * FROM tb_customers JOIN tb_orders 
ON tb_orders.CustomerID=tb_customers.CustomerID;

子查询

当一个查询被包含在另一个查询中时,外部查询被称为主查询,内部查询被称为子查询。

嵌套查询 –
在嵌套查询中,内部查询首先运行,而且只运行一次。外层查询用内层查询的结果来执行。因此,内层查询被用于执行外层查询。
例子 –

tb_customers (OrderID, CustomerID, OrderDate);
tb_orders (CustomerID, CustomerName, ContactName, Country);

查找已订购的客户的详细信息。

SELECT * FROM tb_customers WHERE 
CustomerID IN (SELECT CustomerID FROM tb_orders);

关联查询
在关联查询中,首先执行外层查询,对于每一个外层查询行,都执行内层查询。因此,内部查询使用外部查询的值。
例子 –

SELECT * FROM tb_customers where 
EXISTS (SELECT CustomerID FROM tb_orders 
WHERE tb_orders.CustomerID=tb_customers.CustomerID);

联合操作和子查询的应用

要了解嵌套子查询、相关子查询和联接操作之间的区别,首先我们必须了解我们在哪里使用子查询,在哪里使用联接。

当我们想从多个表中获取数据时,那么可以使用连接操作。
例子。让我们考虑两个关系,即 –

tb_employee (eid, ename, esalary, did);
tb_department (did, dname, city);

现在,需要找到在上海工作的雇员姓名和部门名称。这里,从 tb_employee 表中显示eName,从tb_department表中显示dName。因此,使用Join操作。

SELECT e.eName, d.dName from tb_employee e, 
tb_department d 
where e.dId=d.dId and d.city="上海";

当想从一个表中获取数据,而条件是基于另一个表的时候,可以使用Join或Subquery。假设要找出在上海工作的雇员姓名。在这里,从tb_employee 表中只显示eName,因此可以使用Join操作或Subquery。
使用连接操作

SELECT e.eName from tb_employee e, tb_department d 
where e.dId=d.dId and d.city="上海";

使用子查询

SELECT eName from tb_employee 
where dId=(SELECT dId from tb_department where city="上海");

在了解了Join和Subqueries的基本区别后,现在我们将了解嵌套子查询、相关子查询和Join操作之间的区别。

嵌套查询、相关查询和连接操作之间的区别 –

参数 嵌套查询 相关查询 联合操作
定义 在嵌套查询中,一个查询被写入另一个查询中,内部查询的结果被用于执行外部查询。 在关联查询中,一个查询被嵌套在另一个查询中,内部查询使用外部查询的值。 联接操作用于根据两个或多个表之间的共同字段将数据或行结合起来。INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN是不同类型的联接。
方法 自下而上的方法,即首先运行内部查询,而且只运行一次。外层查询用内层查询的结果来执行。 从上到下的方法,即先执行外层查询,对于每一个外层查询行都执行内层查询。 这基本上是满足一个条件的交叉乘积。
依赖性 内部查询的执行不依赖于外部查询。 内部查询依赖于外部查询。 不存在内查询或外查询。因此,不存在依赖性。
性能 表现比关联查询好,但比联合操作慢。 比嵌套查询和连接操作都慢,因为每一个外部查询都要执行内部查询。 通过使用连接操作,我们最大限度地减轻了数据库的计算负担,但是连接操作被服务器优化得更好,所以使用连接操作的查询的检索时间几乎总是比子查询的检索时间快。