我看到过很多这样的问题。

Select 1  
From table

这个1是什么意思,它将如何执行,它将返回什么?

另外,在什么类型的场景中可以使用它?


当前回答

如果你的意思是

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

那么1优于

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

EXISTS中的1或*被忽略,你可以按照ANSI SQL 1992标准的第191页写:

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

其他回答

如果你只是想根据WHERE子句检查是真还是假,从表中选择1,其中条件是最便宜的方法。

这只是为了方便使用IF EXISTS()。否则你可以跟我走

Select * from [table_name]

在'IF EXISTS'的情况下,我们只需要知道任何具有指定条件的行存在与否与行内容无关。

select 1 from Users

上面的示例代码,返回no。等于no。单列中有1的用户

SELECT 1 FROM TABLE_NAME表示“从表中返回1”。它本身是非常不起眼的,所以通常会与WHERE和EXISTS一起使用(正如@gbn所指出的,这不一定是最佳实践,然而,它是足够常见的,即使它没有真正的意义(也就是说,我将使用它,因为其他人使用它,它“更明显”。当然,这可能是一个有鸡还是有蛋的问题,但我通常不会去思考))。

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

基本上,上面的代码将返回表1中与表2中的ID相对应的所有内容。(显然,这是一个人为的例子,但我相信它传达了这个想法。就我个人而言,我可能会这样做:SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);因为我认为这对读者来说要明确得多,除非有令人信服的理由不这样做)。

EDIT

There actually is one case which I forgot about until just now. In the case where you are trying to determine existence of a value in the database from an outside language, sometimes SELECT 1 FROM TABLE_NAME will be used. This does not offer significant benefit over selecting an individual column, but, depending on implementation, it may offer substantial gains over doing a SELECT *, simply because it is often the case that the more columns that the DB returns to a language, the larger the data structure, which in turn mean that more time will be taken.

一个查询可以有一个HAVING子句而没有GROUP BY子句,尽管这一点并不广为人知。

在这种情况下,HAVING子句应用于整个集合。显然,SELECT子句不能引用任何列,否则您将(纠正)得到错误,“列在SELECT中无效,因为它不包含在GROUP BY中”等。

因此,必须使用文字值(因为SQL不允许结果集为零列——为什么?!),通常使用文字值1 (INTEGER):如果HAVING子句的值为TRUE,则结果集将是一行,其中一列显示值1,否则您将得到空集。

示例:查找一个列是否有多个不同的值:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

它做了它所说的——它总是返回整数1。它用于检查是否存在与where子句匹配的记录。