Answers:
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 (SELECT 1...
select 1 from table
将为表的每一行返回常数1。当您想廉价地确定记录是否与您的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 Standard的Page 191编写:
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1/0 FROM table WHERE...)
exists (select 1/0
就像魅力一样工作
它会执行它所说的-它将始终返回整数1。它用于检查与where子句匹配的记录是否存在。
select 1 from table
某些数据库使用它作为查询来测试连接是否存活的查询,通常在从连接池检索连接或从连接池返回连接时使用。
尽管尚不为人所知,但查询可以具有HAVING
不带GROUP BY
子句的子句。
在这种情况下,该HAVING
子句将应用于整个集合。显然,该SELECT
子句不能引用任何列,否则您将(正确)得到错误,“列在select中是无效的,因为它不包含在GROUP BY中”等。
因此,必须使用文字值(因为SQL不允许结果集的列数为零-为什么?!),并且INTEGER
通常使用文字值1():如果HAVING
子句求值,TRUE
则结果集将是一行且一行加一列显示值1,否则将获得空集。
示例:查找一列是否具有多个不同的值:
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
SELECT MIN(colA) < MAX(colA) FROM tableA
?
具体来说,您可以使用此方法
SELECT 1 FROM MyUserTable WHERE user_id = 33487
而不是做
SELECT * FROM MyUserTable WHERE user_id = 33487
因为您不在乎查看结果。对于数据库来说,索要数字1非常容易(因为它不需要进行任何查找)。
如果您不知道表中是否存在任何数据,则可以使用以下查询:
SELECT cons_value FROM table_name;
例如:
SELECT 1 FROM employee;
因此,我们使用此SQL查询来了解表中是否有任何数据,并且行数指示该表中存在多少行。
如果只想根据WHERE子句检查是非,则从表中选择1,条件是最便宜的方法。
我看到它总是在SQL注入中使用,例如:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
这些数字可用于猜测数据库的位置以及猜测您指定的数据库的列名以及表的值。
这很简单,意味着您要从表中检索第一列的编号,“,”表示从“雇员”中选择“ Emply_num,Empl_no”;在这里,您使用的是“员工”中的select 1;这意味着您正在检索Emply_num列。谢谢
原因是另一个原因,至少对于MySQL。这是从MySQL手册
在启动后首次访问该表时,InnoDB会为该表计算索引基数值,而不是将此类值存储在表中。在将数据划分为多个表的系统上,此步骤可能会花费大量时间。由于此开销仅适用于初始表打开操作,因此要“预热”表以供以后使用,请在启动后立即通过发出诸如SELECT 1 FROM tbl_name LIMIT 1之类的语句来访问表