【问题标题】:What does it mean by select 1 from table?从表中选择 1 是什么意思?
【发布时间】:2023-03-17 02:50:01
【问题描述】:

我看到很多查询如下。

Select 1  
From table

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

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

【问题讨论】:

  • 请向我们展示完整的查询

标签: mysql sql plsql


【解决方案1】:

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

SELECT cons_value FROM table_name;

举个例子:

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

因此,我们使用此 SQL 查询来了解表中是否有任何数据,并且行数表示该表中存在多少行。

【讨论】:

    【解决方案2】:

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

    select * from [table_name]

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

    select 1 from Users

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

    【讨论】:

      【解决方案3】:

      原因是另一个原因,至少对于 MySQL 而言。这是来自MySQL manual

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          对于表中的每条记录,结果都是1

          【讨论】:

          • 不是,我尝试创建一个空表,然后执行查询,结果是六个1。
          【解决方案6】:

          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 的所有内容。(显然,这是一个人为的示例,但我相信它传达了这个想法。就个人而言,我可能会以 @987654325 的形式执行上述操作@ 因为我认为 FAR 对读者来说更明确,除非有一个令人信服的理由不这样做)。

          编辑

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

          【讨论】:

          • 为什么“通常”使用 EXISTS?你有证据证明为什么
          • 还有一个-1,用于宣传...EXISTS (SELECT 1...的神话
          • @Gbn 不知道为什么我在那里看到它的次数比其他任何地方都多。我只是经常在那里看到它。
          • 粘稠的鸡?不想吃那个!也许这应该是一个“鸡与蛋的恶性问题”?
          • @Ben:IN 和 EXIST 通常会优化到同一个计划
          【解决方案7】:

          这很简单意味着您正在从 table 中检索数字第一列 ,,,,means 从员工中选择 Emply_num,Empl_no ; 在这里,您使用的是从员工中选择 1; 这意味着您正在检索 Emply_num 列。 谢谢

          【讨论】:

          • 我记得这样的语法,但它特定于我不记得的数据库。 PostgreSQL?
          【解决方案8】:

          如果你的意思是这样的

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

          【讨论】:

          • 刚刚证实 postgres 尊重这一点,exists (select 1/0 就像一个魅力
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

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

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

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

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

            【讨论】:

            • “很明显,SELECT 子句不能引用任何列” - 选择布尔表达式不是更合理吗:SELECT MIN(colA) &lt; MAX(colA) FROM tableA
            【解决方案11】:

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

            【讨论】:

            • 这是我的情况,在 JBOSS 和 TOMCAT 应用程序中很常见。
            【解决方案12】:

            更具体一点,你会用这个来做

            SELECT 1 FROM MyUserTable WHERE user_id = 33487
            

            而不是做

            SELECT * FROM MyUserTable WHERE user_id = 33487
            

            因为您不关心查看结果。查询数字 1 对数据库来说非常容易(因为它不需要进行任何查找)。

            【讨论】:

            • 根据上面的 cmets,看起来 Select 1 在性能上并不比 select * 好,是吗?
            【解决方案13】:

            这意味着您希望将值“1”作为输出或大部分时间用作内部查询,因为出于某种原因,您希望根据内部查询的结果计算外部查询。 . 并非一直使用 1,但您有一些特定的值...

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

            【讨论】:

              【解决方案14】:

              select 1 from table 将为表的每一行返回常量 1。当您想廉价地确定记录是否与您的 where 子句和/或 join 匹配时,它很有用。

              【讨论】:

              • 这个答案对我来说最有意义
              • 事实上非常重要的一点:“对于表中的 EVERY 行”。因此,检查“表可用性”作为例如对具有数亿行的表的健康检查的一部分,将以数亿“1”的结果集结束。 (注意:这不会发生……在生产中;);))
              • 从字面上看,这应该是这里公认的答案!
              • 感谢您的非居高临下的回答,实际上回答了这个问题。
              • 这应该是公认的答案。
              【解决方案15】:

              它按照它说的做 - 它总是返回整数 1。它用于检查是否存在与你的 where 子句匹配的记录。

              【讨论】:

              • 嗯 - 问题是“这是什么意思”,而不是“这是一个好习惯”。我同意从性能的角度来看它并没有什么不同 - 但它是开发人员使用的约定,大概是因为 1 通常被解释为“真”。
              猜你喜欢
              • 1970-01-01
              • 2010-12-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-02-02
              • 1970-01-01
              • 2012-02-11
              相关资源
              最近更新 更多