从表中选择1是什么意思?


146

我已经看到了许多有关以下内容的查询。

Select 1  
From table

1意味着什么,它将如何执行,返回什么?

另外,在哪种类型的方案中可以使用?


请向我们显示完整查询
gbn

Answers:


107

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的所有内容,而表1则具有来自表2的对应ID。(显然,这是一个人为的示例,但我相信它可以传达这个想法。就我个人而言,我可能会这样做,SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);因为我认为除非有明显的迫不得已的理由,否则FAR对读者更明确。

编辑

直到现在我实际上忘记了一种情况。在尝试从外部语言确定数据库中是否存在值的情况下,有时SELECT 1 FROM TABLE_NAME会使用该值。与选择单个列相比,这不会带来明显的好处,但是,根据实现的不同,它可能会比选择a带来更大的收益,这SELECT *仅仅是因为通常情况下,数据库返回一种语言的列越多,数据就越大。结构,这意味着将花费更多时间。


为什么要“正常”使用EXISTS?你有为什么的证据吗?
gbn

6
和-1用于传播神话...EXISTS (SELECT 1...
-gbn

2
@Gbn不知道为什么我在那里见到的次数比其他任何东西都多。我只是经常在那儿看到它。
cwallenpoole

2
粘鸡?不想吃那个!也许应该是“鸡和蛋的恶性问题”?
No'am Newman 2011年

2
@Ben:IN和EXISTS通常会优化,以同样的计划
GBN

106

select 1 from table将为表的每一行返回常数1。当您想廉价地确定记录是否与您的where子句和/或匹配时,这很有用join


1
这个答案才是最有意义的我
约瑟夫Astrahan

2
实际上非常重要的一点是:“对于表中的每一行”。因此,作为“具有几亿行的表的运行状况检查”的一部分,检查“表可用性”将以一亿个结果“ 1”结束。(注意:这并非永远不会...在生产中发生;);)))
conny

从字面上看,这应该是这里公认的答案!
Fahad Javed

40

如果你的意思是

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 Standard的Page 191编写:

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

1
刚刚验证了postgres尊重这一点,exists (select 1/0就像魅力一样工作
Alex

22

它会执行它所说的-它将始终返回整数1。它用于检查与where子句匹配的记录是否存在。


22
嗯-问题是“这是什么意思”,而不是“这是一种好习惯吗”。我同意从性能的观点来看并没有什么不同-但这是开发人员使用的约定,大概是因为1通常被解释为“ true”。
内维尔·库伊特

20

select 1 from table 某些数据库使用它作为查询来测试连接是否存活的查询,通常在从连接池检索连接或从连接池返回连接时使用。


2
这就是我的情况,在JBOSS和TOMCAT应用程序中很常见。
Valter Silva

13

结果是1针对表中的每个记录的。 __


并非如此,我尝试创建一个空表并执行查询,结果为六个1。
r0ng

9

尽管尚不为人所知,但查询可以具有HAVING不带GROUP BY子句的子句。

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

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

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

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

“显然,SELECT子句可以不参考任何柱” -那岂不是更合理的选择布尔表达式:SELECT MIN(colA) < MAX(colA) FROM tableA
Paul Spiegel

7

具体来说,您可以使用此方法

SELECT 1 FROM MyUserTable WHERE user_id = 33487

而不是做

SELECT * FROM MyUserTable WHERE user_id = 33487

因为您不在乎查看结果。对于数据库来说,索要数字1非常容易(因为它不需要进行任何查找)。


根据上面的评论,看起来Select 1在性能上不比select *好,是吗?
eRaisedToX

5

如果您不知道表中是否存在任何数据,则可以使用以下查询:

SELECT cons_value FROM table_name;

例如:

SELECT 1 FROM employee;
  1. 它将返回一个包含总行数的列,并且所有行都具有相同的常数1(这一次它为所有行返回1);
  2. 如果表中没有行,则不会返回任何内容。

因此,我们使用此SQL查询来了解表中是否有任何数据,并且行数指示该表中存在多少行。


3

这意味着您希望将值“ 1 ”作为输出或大部分时间用作内部查询,因为出于某种原因,您希望基于内部查询的结果来计算外部查询。不是每次都使用1而是您有一些特定的值...

这将静态地为您提供值1的输出。


3

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


2

我看到它总是在SQL注入中使用,例如:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

这些数字可用于猜测数据库的位置以及猜测您指定的数据库的列名以及表的值。


0

这很简单,意味着您要从表中检索第一列的编号,“,”表示从“雇员”中选择“ Emply_num,Empl_no”;在这里,您使用的是“员工”中的select 1;这意味着您正在检索Emply_num列。谢谢


我记得这样的语法,但是它特定于我无法回忆起的数据库。PostgreSQL的?
diynevala

0

原因是另一个原因,至少对于MySQL。这是从MySQL手册

在启动后首次访问该表时,InnoDB会为该表计算索引基数值,而不是将此类值存储在表中。在将数据划分为多个表的系统上,此步骤可能会花费大量时间。由于此开销仅适用于初始表打开操作,因此要“预热”表以供以后使用,请在启动后立即通过发出诸如SELECT 1 FROM tbl_name LIMIT 1之类的语句来访问表


0

IF EXISTS()仅用于方便使用。否则你可以去

select * from [table_name]

图片在“IF存在”的情况下,我们只需要知道与指定条件的行的存在与否并不重要是什么行的内容。

select 1 from Users

上面的示例代码,返回no。行数等于否。一列中有1位用户

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.