【问题标题】:Is it possible to just have 'SELECT' clause with subqueries WITHOUT 'FROM' clause?是否可以只使用带有子查询的“SELECT”子句而不使用“FROM”子句?
【发布时间】:2018-06-30 05:10:06
【问题描述】:

是否可以有如下SQL形式:

SELECT
    (
        (SUBQUERY1) -
        (SUBQUERY2)
    )

假设这两个子查询是正确的。由于第一个查询中没有 FROM,因此它看起来与我有关。

谢谢!

只是大学课堂上的一个简单例子:

给定关系:

  • id 为关键字的学生(id、gpa)
  • 在所有三个属性构成键的情况下注册(id、number、term)

找出参加 Class1 的学生的平均 GPA 与参加 Class2 的学生的平均 GPA 之间的差异。假设有学生参加了不止一次。

下面的 SQL 查询可以吗?

SELECT
    (SELECT AVG(gpa)
     FROM Students
     WHERE id IN (SELECT id
                  FROM Enrolls
                  WHERE number = "CLASS1")
    )
    -
    (SELECT AVG(gpa)
     FROM Students
     WHERE id IN (SELECT id
                  FROM Enrolls
                  WHERE number = "CLASS2")
    )

【问题讨论】:

  • 每个子查询只能返回一个字段的一行,除了表中的单个行/字段或每个 SELECT 中的 WHERE 子句可能赋予的关系之外,它们之间不会有任何关系.所以...是的,但可能有更好的方法来解决它可能用来解决的任何问题。
  • 任何特定的 DBMS?已经有许多关于此主题的 SO Q&A 可能对您有所帮助,但如果您可以稍微缩小问题范围会更好,也许有一个更真实的例子。
  • 这取决于数据库。有些数据库需要from 子句,有些则不需要。
  • 刚刚用特定问题更新了问题。
  • 在 IT 领域,与“42”一样普遍的答案是“视情况而定”。

标签: sql


【解决方案1】:

这取决于您使用的 DBMS。在 SQL Server 上,这是有效的。在 Oracle 上,SELECT 需要有一个 FROM,但是如果您的 SELECT 在没有 FROM 子句的情况下工作(如在您的示例)并且只需要 FROM 子句就可以使 SQL 解析器满意。

【讨论】:

  • MySQL 也允许这样做。
【解决方案2】:

是的,有这个结构是可能的。考虑这个例子 (MySQL)

mysql> select ((select length('abcde')) - (select length('xyz')));

+-----------------------------------------------------+
| ((select length('abcde')) - (select length('xyz'))) |
+-----------------------------------------------------+
|                                                   2 |
+-----------------------------------------------------+

【讨论】:

    【解决方案3】:

    可以,只要子查询各自返回一个值。

    比较:

    Select (select 1), (select 2)
    

    Select (1), (2)
    

    ,两者都有效, 到:

    Select (select 1, 3), (select 2, 5)
    

    在 SQL Server 中返回以下错误:

    Msg 116, Level 16, State 1, Line 1 只能使用一个表达式 未引入子查询时在选择列表中指定 存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2019-07-22
      • 2019-04-05
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多