【发布时间】:2023-03-17 02:50:01
【问题描述】:
我看到很多查询如下。
Select 1
From table
这个1是什么意思,它将如何执行,它会返回什么?
另外,在什么类型的场景下可以使用?
【问题讨论】:
-
请向我们展示完整的查询
我看到很多查询如下。
Select 1
From table
这个1是什么意思,它将如何执行,它会返回什么?
另外,在什么类型的场景下可以使用?
【问题讨论】:
如果您不知道表中是否存在任何数据,可以使用以下查询:
SELECT cons_value FROM table_name;
举个例子:
SELECT 1 FROM employee;
因此,我们使用此 SQL 查询来了解表中是否有任何数据,并且行数表示该表中存在多少行。
【讨论】:
这只是为了方便使用 IF EXISTS()。否则你可以去
select * from [table_name]
Image 在 'IF EXISTS' 的情况下,我们只需要知道任何具有指定条件的行存在与否,与行的内容是什么无关。
select 1 from Users
上面的示例代码,返回no。行数等于否。单列中有 1 个用户的用户数
【讨论】:
原因是另一个原因,至少对于 MySQL 而言。这是来自MySQL manual
InnoDB 在启动后第一次访问该表时计算该表的索引基数值,而不是将这些值存储在表中。在将数据划分为多个表的系统上,此步骤可能会花费大量时间。由于此开销仅适用于初始表打开操作,因此要“预热”表以供以后使用,请在启动后立即通过发出诸如 SELECT 1 FROM tbl_name LIMIT 1 之类的语句来访问它
【讨论】:
我看到它总是用于SQL注入,例如:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
这些数字可以用来猜测数据库存在的位置,猜测你指定的数据库的列名。以及表的值。
【讨论】:
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 的所有内容。(显然,这是一个人为的示例,但我相信它传达了这个想法。就个人而言,我可能会以 @987654325 的形式执行上述操作@ 因为我认为 FAR 对读者来说更明确,除非有一个令人信服的理由不这样做)。
实际上有一个案例我直到现在才忘记。如果您尝试从外部语言确定数据库中是否存在值,有时会使用SELECT 1 FROM TABLE_NAME。与选择单个列相比,这并没有提供显着的好处,但是,根据实现,它可能比执行SELECT * 提供显着的收益,因为通常情况下,数据库返回到一种语言的列越多,更大的数据结构,这反过来意味着将花费更多的时间。
【讨论】:
...EXISTS (SELECT 1...的神话
这很简单意味着您正在从 table 中检索数字第一列 ,,,,means 从员工中选择 Emply_num,Empl_no ; 在这里,您使用的是从员工中选择 1; 这意味着您正在检索 Emply_num 列。 谢谢
【讨论】:
如果你的意思是这样的
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1 FROM table WHERE...)
那么,1 优于 神话
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT * FROM table WHERE...)
EXISTS 中的1 或* 被忽略,您可以按照Page 191 of the ANSI SQL 1992 Standard 编写:
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1/0 FROM table WHERE...)
【讨论】:
exists (select 1/0 就像一个魅力
如果你只是想根据 WHERE 子句检查一个真假,请从条件是最便宜的方式的表中选择 1。
【讨论】:
虽然并不广为人知,但查询可以有 HAVING 子句而没有 GROUP BY 子句。
在这种情况下,HAVING 子句适用于整个集合。显然,SELECT 子句不能引用任何列,否则您会(更正)得到错误,“列在选择中无效,因为它不包含在 GROUP BY 中”等。
因此,必须使用字面值 (因为 SQL 不允许结果集为零列——为什么?!)并且通常使用字面值 1 (INTEGER):如果HAVING 子句评估TRUE,则结果集将是一行,其中一列显示值为1,否则您将获得空集。
示例:查找列是否具有多个不同的值:
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
【讨论】:
SELECT MIN(colA) < MAX(colA) FROM tableA?
select 1 from table 被一些数据库用作查询来测试连接以查看它是否处于活动状态,通常在从连接池检索或返回连接时使用。
【讨论】:
更具体一点,你会用这个来做
SELECT 1 FROM MyUserTable WHERE user_id = 33487
而不是做
SELECT * FROM MyUserTable WHERE user_id = 33487
因为您不关心查看结果。查询数字 1 对数据库来说非常容易(因为它不需要进行任何查找)。
【讨论】:
这意味着您希望将值“1”作为输出或大部分时间用作内部查询,因为出于某种原因,您希望根据内部查询的结果计算外部查询。 . 并非一直使用 1,但您有一些特定的值...
这将静态地为您提供值 1 的输出。
【讨论】:
select 1 from table 将为表的每一行返回常量 1。当您想廉价地确定记录是否与您的 where 子句和/或 join 匹配时,它很有用。
【讨论】:
它按照它说的做 - 它总是返回整数 1。它用于检查是否存在与你的 where 子句匹配的记录。
【讨论】: