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

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

Select 1
From table

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

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

358828 次浏览

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

SELECT 1 FROM TABLE_NAME表示“从表中返回1”。它本身并不显著,所以通常会与WHEREEXISTS一起使用(正如@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);作为SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);,因为我认为这对读者来说更明确,除非有令人信服的理由不这样做)。

编辑

实际上有一种情况我刚刚才忘记。在试图从外部语言确定数据库中是否存在值的情况下,有时会使用SELECT 1 FROM TABLE_NAME。与选择单个列相比,这并没有明显的好处,但是,根据实现的不同,它可能比执行SELECT *有很大的好处,因为通常情况下,DB返回给一种语言的列越多,数据结构就越大,这反过来意味着将花费更多的时间。

select 1 from table将为表中的每一行返回常量1。当你想要确定record是否匹配你的where子句和/或join时,它很有用。

如果你的意思是

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...)

这意味着你想要一个值"1"作为输出,或者大部分时间用作内部查询,因为出于某种原因,你想根据内部查询的结果计算外部查询。不是所有的时候你都使用1,但是你有一些特定的值…

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

更具体地说,您将使用这个来做

SELECT 1 FROM MyUserTable WHERE user_id = 33487

而不是做

SELECT * FROM MyUserTable WHERE user_id = 33487

因为你不关心结果。对于数据库来说,请求数字1非常容易(因为它不需要进行任何查找)。

select 1 from table被一些数据库用作查询来测试连接,以查看它是否活跃,通常用于从连接池中检索或返回连接。

虽然不广为人知,但查询可以有HAVING子句而没有GROUP BY子句。

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

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

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

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

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

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

SELECT cons_value FROM table_name;

例如:

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

因此,我们使用这个SQL查询来知道表&行数表示该表中存在多少行。

它简单地表示您正在从表,,,,检索数字第一列表示 select empl_num,Empl_no From Employees; 这里你使用select 1 from Employees; 这意味着您正在检索Emply_num列。 由于< / p >

对于表中的每条记录,结果都是1< img src = " https://i.stack.imgur.com/2OAqJ.png " alt = " __ " > < / p >

我看到它总是用于SQL注入,例如:

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

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

原因是另一个,至少对MySQL来说是这样。这是来自MySQL手册

InnoDB在表启动后第一次访问该表时计算索引基数值,而不是将这些值存储在表中。在将数据划分为许多表的系统上,这个步骤会花费大量时间。由于此开销只应用于初始的表打开操作,为了“预热”一个表以供以后使用,可以在启动后立即通过发出SELECT 1 FROM tbl_name LIMIT 1这样的语句来访问它

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

select * from [table_name]

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

select 1 from Users

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