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

Mic*_*per 132 mysql sql plsql

我见过很多关于以下内容的查询.

Select 1  
From table
Run Code Online (Sandbox Code Playgroud)

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

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

cwa*_*ole 94

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
 );
Run Code Online (Sandbox Code Playgroud)

基本上,上面的内容将返回表1中的所有内容,表1中有相应的ID.(这显然是一个人为的例子,但我相信它传达了这个想法.就个人而言,我可能会SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);按照我认为的那样做FAR对读者更明确,除非有令人信服的理由不这样做.

编辑

实际上有一个案例我直到现在才忘记了.在您尝试从外部语言确定数据库中存在值的情况下,有时SELECT 1 FROM TABLE_NAME会使用.这并没有提供比选择单个列更大的好处,但是,根据实现,它可以提供相当大的收益SELECT *,因为通常情况下,DB返回到语言的列越多,数据越大结构,这反过来意味着将采取更多的时间.

  • 并且-1用于传播`... EXISTS(SELECT 1 ...`的神话) (5认同)
  • @Gbn不知道为什么我在那里看到它的次数远远超过其他任何东西.我刚刚在那里看到它. (2认同)
  • 一只粘稠的鸡肉?不想吃那个!也许它应该是'恶性鸡蛋问题'? (2认同)
  • @Ben:IN和EXIST通常会针对同一计划进行优化 (2认同)

Sah*_*hoo 87

select 1 from table将为表的每一行返回常量1.当您想要便宜地确定记录是否符合您的where条款和/或时,它非常有用join.

  • 这个答案对我来说最有意义 (4认同)
  • 事实上非常重要的一点:“对于表格中的 *EVERY* 行”。因此,检查“表可用性”作为例如具有数亿行的表的健康检查的一部分,将以数亿“1”的结果集结束。(注意:这不会发生在生产中;);)) (3认同)
  • 感谢您的非居高临下的回答,真正回答了问题。 (3认同)
  • 从字面上看,这应该是这里接受的答案! (2认同)

gbn*_*gbn 38

如果你的意思是

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 
Run Code Online (Sandbox Code Playgroud)

然后这是一个神话,它1比...更好

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 
Run Code Online (Sandbox Code Playgroud)

忽略EXISTS中的1或者*您可以按照ANSI SQL 1992标准的第191页编写它:

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 
Run Code Online (Sandbox Code Playgroud)


Nev*_*uyt 20

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

  • 嗯 - 问题是"它是什么意思",而不是"这是一种好的做法".我同意它从性能的角度来看并没有什么不同 - 但它是开发人员使用的惯例,大概是因为1通常被解释为"真实". (22认同)
  • -1用于传播`... EXISTS(SELECT 1 ...`的神话) (2认同)

Tom*_*Tom 18

select 1 from table 某些数据库使用某些数据库作为查询来测试连接以查看它是否处于活动状态,通常在检索或返回与连接池的连接时使用.

  • 这就是我的情况,在JBOSS和TOMCAT应用程序中很常见。 (2认同)

Tiy*_*ebM 12

结果是1表中的每条记录. __


one*_*hen 9

虽然它并不广为人知,但查询可以有一个HAVING没有GROUP BY子句的子句.

在这种情况下,该HAVING子句适用于整个集合.显然,该SELECT子句不能引用任何列,否则你会(正确)得到错误,"列在select中无效,因为它不包含在GROUP BY中"等.

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

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

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);
Run Code Online (Sandbox Code Playgroud)


Rob*_*tin 6

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

SELECT 1 FROM MyUserTable WHERE user_id = 33487
Run Code Online (Sandbox Code Playgroud)

而不是做

SELECT * FROM MyUserTable WHERE user_id = 33487
Run Code Online (Sandbox Code Playgroud)

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


小智 5

如果您只想根据 WHERE 子句检查 true 或 false,请从 table where 条件中选择 1 是最便宜的方式。


mah*_*que 5

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

SELECT cons_value FROM table_name;
Run Code Online (Sandbox Code Playgroud)

例如:

SELECT 1 FROM employee;
Run Code Online (Sandbox Code Playgroud)
  1. 它将返回一个包含总行数的列,并且所有行具有相同的常量值1(此时它为所有行返回1);
  2. 如果表中没有行,则不返回任何内容.

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


归档时间:

查看次数:

221368 次

最近记录:

6 年,4 月 前