【问题标题】:What does "select 1 from" do?“选择 1 from”有什么作用?
【发布时间】:2020-02-10 17:30:09
【问题描述】:

我看了一些文章,但真的不明白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 子句。优化器很久以前就改进了。它从未替代“从该结果集中获取所有列”。
  • 你试过了吗???

标签: sql-server-2008


【解决方案1】:
select 1 from table

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    【解决方案3】:

    它按照您的要求执行,SELECT 1 FROM table 将为该表中的每一行(返回)1,如果表中有 3 行,您将得到

    1
    1
    1
    

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

    【讨论】:

    • 我为什么要那个?
    • @Imray 当您只对WHERE 子句中的条件是真还是假感兴趣时,这很有用。常用于子查询中。
    【解决方案4】:

    语句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
    

    【讨论】:

      【解决方案5】:
      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) - 无论CONDITIONS 是否满足,NOT EXISTS 条件将始终返回 false。

      SELECT COUNT 1 in EXISTS/NOT EXISTS
      

      EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS) - 如果满足CONDITIONSEXISTS 条件将返回 true。否则为假。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-22
        • 2017-05-20
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 2013-08-24
        • 2015-03-11
        相关资源
        最近更新 更多