Sql select语句中的子查询在oracle中如何工作

Sql select语句中的子查询在oracle中如何工作,sql,oracle,select,group-by,subquery,Sql,Oracle,Select,Group By,Subquery,我已经到处寻找解释,关于select语句中的子查询是如何工作的,但由于解释非常模糊,我仍然无法理解这个概念 我想知道在oracle中如何在select语句中使用子查询,以及它到底输出了什么 例如,如果我有一个查询,希望显示员工的姓名以及他们从这些表中管理的配置文件的数量 员工(EmpName,EmpId) 配置文件(配置文件ID,…,EmpId) 如何使用子查询 我认为select语句中需要一个子查询来实现GROUPBY函数,以计算每个员工管理的配置文件的数量,但我不太确定 很简单- SELEC

我已经到处寻找解释,关于select语句中的子查询是如何工作的,但由于解释非常模糊,我仍然无法理解这个概念

我想知道在oracle中如何在select语句中使用子查询,以及它到底输出了什么

例如,如果我有一个查询,希望显示员工的姓名以及他们从这些表中管理的配置文件的数量

员工(EmpName,EmpId)

配置文件(配置文件ID,…,EmpId)

如何使用子查询

我认为select语句中需要一个子查询来实现GROUPBY函数,以计算每个员工管理的配置文件的数量,但我不太确定

很简单-

SELECT empname,
       empid,
       (SELECT COUNT (profileid)
          FROM profile
         WHERE profile.empid = employee.empid)
           AS number_of_profiles
  FROM employee;
如果使用如下表联接,则更简单:

  SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
    FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;

对子查询的解释:

本质上,
select
中的子查询获取标量值并将其传递给主查询。
select
中的子查询不允许传递多行多列,这是一种限制。这里,我们将一个
count
传递给主查询,正如我们所知,它始终只是一个数字——一个标量值。如果未找到值,子查询将向主查询返回
null
。此外,子查询可以从主查询的
from
子句访问列,如我的查询中所示,其中
employee.empid
从外部查询传递到内部查询


编辑:

当您在
select
子句中使用子查询时,Oracle实际上将其视为左联接(您可以在查询的中看到这一点),对于左侧的每一行,行的基数仅为右侧的一个


左连接的解释

左连接非常方便,特别是当您由于其限制而希望替换
select
子查询时。这里对
LEFT JOIN
关键字两侧的表行数没有限制


有关在Oracle RDBMS中读取和使用的详细信息,只要(子)输出封装为集合,就可以在select子句中使用多行子查询。特别是,多行select子句子查询可以将其每一行作为封装在xmlforest中的xmlelement输出。

非常感谢!这真的很有帮助。不过有一个问题。您说过子查询不允许传递多个列,所以这意味着如果我想添加一个求和函数,我必须使用另一个子查询?或者在select中是否可能有多个子查询?是。可以在选择列表中使用多个子查询。您必须使用另一个子查询来添加求和函数。感谢您的帮助:)重要信息,如果联接表中有多行匹配,则用联接替换子查询可能会导致不同的结果。关于joins.com/sql/sql\u join.asp的详细说明