“从中选择1个”有什么作用?


80

我读了一些文章,但真的不明白该怎么select 1 from做?有人说“您应该使用select 1而不是select *”。这是一个示例表:

cust_id     cust_name       cust_address

1000000001  Village Toys    Mapl
1000000002  Kids Place      South
1000000003  Fun4All         Sunny
1000000004  Fun4All         Riverside
1000000005  The Toy Store   53rd

当我写select 1 from customer_table这条语句做什么时,结果将是什么?


大约十年前,建议select 1不要select *使用EXISTS条款来建议。优化器在很久以前就得到了改进。它不能替代“从此结果集中获取所有列”。
Damien_The_Unbeliever

12
你尝试过了吗?
Jimmy D

Answers:


72
select 1 from table

将为表格中的每一行返回1列。您可以将其与where语句一起使用,以检查是否有给定键的条目,如:

if exists(select 1 from table where some_column = 'some_value')

您的朋友可能在说什么,而不是使用select * from table进行批量选择,您应该精确指定所需的列,这有两个原因:

1)性能&您可能会检索比实际需要更多的数据。

2)查询的用户可能依赖于列的顺序。如果您的表得到更新,则客户端将以不同于预期的顺序接收列。


33

该结构通常用于“存在”检查

if exists(select 1 from customer_table where customer = 'xxx')

要么

if exists(select * from customer_table where customer = 'xxx')

两种构造是等效的。过去人们说select *更好,因为查询调控器将使用最佳索引列。事实证明这是不正确的。


24

它做你问什么,SELECT 1 FROM tableSELECT(回)一个1在该表中的每一行,如果有你会得到表3级的行

1
1
1

看一下Count(*)vs Count(1),这可能是您所描述的问题。


3
我为什么要那个?
CodyBugstein 2013年

7
@Imray当您仅对WHERE子句中的条件是true还是false感兴趣时,这很有用。它通常在子查询中使用。
Andreas

9

该语句SELECT 1 FROM SomeTable仅返回一列,其中包含1表中每一行的值。如果您在其中添加了另一列,SELECT 1, cust_name FROM SomeTable则可以使它更加清晰:

            cust_name
----------- ---------------
1           Village Toys
1           Kids Place
1           Fun4All
1           Fun4All
1           The Toy Store

4
SELECT COUNT(*) in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)-EXISTS无论是否满足条件,条件将始终返回true。

NOT EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)-NOT EXISTS无论CONDITIONS是否满足,条件将始终返回false 。

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)-EXISTS如果CONDITIONS满足,条件将返回true 。其他错误。

NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)-NOT EXISTS如果CONDITIONS满足,条件将返回false 。否则。

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.