SELECT * FROM表名WHERE 1


129

我一直很好奇。这些查询之间有什么区别:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
标签是否有“太窄”的标记?因为这适用于许多(如果不是全部)SQL方言。我也经常在MSSQL和Oracle中看到它。请问撇号是什么?是不是用引号`来引用mysql对象名?
Cee McSharpface '16

3
@dlatikay,您可以编辑标签...
Braiam '16

2
嗯。为什么不简单... WHERE TRUE?我知道(在大多数SQL中,包括MySQL),TRUE只是一个花哨的宏1-但是,对于读者而言,它不是更明显吗?

2
2在大多数SQL语言中都是无效的
edc65 '16

Answers:


177

2和3在MySQL中相同,在功能上1也相同。

where 1 正如其他人指出的那样,这是不标准的,将无法在其他方言中使用。

人们添加where 1where 1 = 1这样where的条件可以很容易地从查询通过添加/注释掉一些“添加或删除到/ and......”组件。

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
而且,当您以编程方式将查询构建到字符串中以在以后执行查询时,如果添加WHERE 1=1,则无需担心要添加到字符串中的条件是否是第一个条件(因此它需要WHERE在前面加一个) 或不。
文森特·奥利维特·里埃拉

45
已经编程6年了,从没想过要这样做-谢谢!
SimonGates

6
ORDER BY 1如果执行两个或更多SELECT语句的并集,则需要@dlatikay 语法(而不是列名)。
马克·斯图尔特

5
@SimonGates我已经编程6年了,从没想过要做其他事情,大声笑
WernerCD '16

4
@WernerCD我认为在某种类型的列表中建立一个过滤器子句列表,然后将它们" AND "作为分隔符进行字符串连接会更明智。
Zev Spitz

76

如您所知,这三个结果都相同。(在布尔值上下文中,MySQL将整数“ 1”视为true -实际上,任何非“ 0”的数字均视为true)。

明确记录了MySQL优化程序以删除该WHERE子句中的常量条件:

  • 恒定条件去除。。::

    (B> = 5 AND B = 5)或(B = 6 AND 5 = 5)或(B = 7 AND 5 = 6)-> B = 5或B = 6

因此,这三个都将被编译成完全相同的代码。

它们在功能上都是等效的,应具有相同的性能特征。

也就是说,第一个和第三个是标准SQL。第二个将在许多数据库中引起某种布尔表达式错误。因此,我建议您避免这种情况(我不确定它是否在MySQL的严格SQL模式下有效)。

通常在构造动态WHERE子句时使用第三个。它使添加其他条件变得容易,AND <condition>而不必担心ANDs 缠绵。


6
对于说其他答案所做的所有事情,这是一个很好的答案,但关键地指出了#2不符合ANSI的区别。
underscore_d

16

如果您询问性能和结果的差异,则没有任何2和3相同WHERE TRUE,它们的结果将与第一个相同。

1 - SELECT * FROM table_name

结果来自table_name(无过滤器)的所有数据

2 - SELECT * FROM table_name WHERE 1

1将被评估为TRUE-因此-没有过滤器-将返回每条记录。

3 - SELECT * FROM table_name where 1=1

与最后一个相同,1 = 1是一个TRUE表达式,因此-没有过滤器-将选择每条记录。


14

都是一样的,但是2和3用于轻松处理以下AND/OR情况:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

在1中,MySQL不需要评估任何WHERE条件。

在2和3中,where条件是静态的,并不基于行的值。它将使用布尔逻辑求值,并且始终为true。

在功能上没有区别。您应该选择1以提高代码清晰度。


7

都是一样的,但是2和3用来为AND / OR条件创建动态查询

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

我们使用2和3格式进行动态查询,因此我们已经知道添加了“ where”关键字,并且我们将继续添加更多过滤器。喜欢

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

在几行之后,如果我们有新的过滤器,我们添加“ AND coulmnb = b”,依此类推

您不必在sql查询中检查在第一个查询或初始查询中放置了where关键字的位置

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

否则我们可以写 sqlquery = "SELECT * FROM tablename"

然后

如果在没有“其中”条款sqlquery ,然后

sqlquery  = sqlquery + "where columna =a"

其他

sqlquery  = sqlquery + "and columna =a"

4个前导空格表示一个代码块。请编辑您的答案以正确设置其格式,并查看有关整个Markdown格式化圣经的编辑帮助
Mathieu Guindon '16

4

它们都输出相同的答案。但是,编写2和3的方式主要是为了控制“ Where”语句,因此可以使其更容易添加或以后删除。

我认为第一种和第三种方式是正确的编写方式。如果您需要where语句,那么您喜欢3号,否则1号就足够了。


3

在MS SQL 1和3中相同,但是,选项2将不起作用,选项2是无效的语句,因为在MS SQL中,WHERE用于比较某些值。例如:

  1. 从'myTable中选择*,其中ID = 3(有效)
  2. 选择* from'myTable,其中1 = 1相同Select * from'myTable,其中2 = 2相同Select * from'myTable,其中3 = 3,您得到的主意(有效)与Select * From'myTable,其中

2
  1. SELECT * FROM table_name:它将通过运行任何where语句为您提供表的所有记录。
  2. SELECT * FROM table_name在1处:条件始终为true的情况,通常由黑客用于进入任何系统。如果您听说过sql注入,那么2和3就是被黑客强制构建以获取表的所有记录的方案。
  3. SELECT * FROM table_name其中1 = 1:这将为您提供表的所有记录,但它将比较where语句,然后继续前进,基本上是在此之后添加或删除更多语句。

1

结果 -为所有三个查询提供指定表中的所有记录,而不是表名

SELECT * FROM tablename WHERE 1-检查这个答案

SELECT * FROM tablename WHERE 1=1-检查这个答案

有关WHERE子句优化的更多信息,请检查以下各项:MYSQLSQLiteSQL

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.