是否可以仅使用带有子查询的“ SELECT”子句而没有“ FROM”子句?

时间:2018-06-29 20:26:57

标签: sql

是否可能具有以下SQL形式:

SELECT
    (
        (SUBQUERY1) -
        (SUBQUERY2)
    )

假定这两个子查询正确。由于第一个查询中没有FROM,因此对我来说似乎是有线的。

谢谢!

仅是大学课程中的一个简单示例:

给予关系:

  • 其中id是关键的学生(id,gpa)
  • 在所有三个属性组成键的地方注册(id,数字,术语)

找出参加Class1的学生和参加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")
    )

3 个答案:

答案 0 :(得分:3)

这取决于您使用的DBMS。在SQL Server上,这是有效的。在Oracle上,SELECT需要有一个FROM,但是如果您的dual可以在不使用SELECT的情况下使用,则可以使用FROM这是系统提供的只读的单行一列表。一个FROM子句(如您的示例),只需要使用mydf = pd.DataFrame({'date_ym':['2018-01', '2018-01','2018-01','2018-01','2018-02','2018-02','2018-03'],'category':['A','A','A','B','A','B','B'], 'values':[np.nan,4.0,5.1,np.nan,6.2,np.nan,np.nan]}) mydf Out[134]: category date_ym values 0 A 2018-01 NaN 1 A 2018-01 4.0 2 A 2018-01 5.1 3 B 2018-01 NaN 4 A 2018-02 6.2 5 B 2018-02 NaN 6 B 2018-03 NaN 子句即可使SQL解析器满意。

答案 1 :(得分:2)

是的,可能有此构造。考虑这个示例(MySQL

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

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

答案 2 :(得分:1)

是的,只要子查询每个返回一个值。

比较:

Select (select 1), (select 2)

Select (1), (2)

,两者均有效, 到:

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

在SQL Server中返回以下错误:

  

消息116,级别16,状态1,行1   未在子查询中引入子查询时在选择列表中指定   存在。