SELECT * FROM tablename ONDE 1

129

Eu tenho ficado curioso. Quais são as diferenças entre essas respectivas consultas:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

Stephen Alexander
fonte
9
existe um sinalizador "muito estreito" para tags? porque isso se aplica a muitos, se não todos, dialetos SQL. Eu o vejo frequentemente no MSSQL e Oracle também. btw quais são os apóstrofos? não é o backtick `usado para citar nomes de objetos mysql?
Cee McSharpface
3
@dlatikay você pode editar as tags ...
Braiam
2
hm. por que não simplesmente ... WHERE TRUE? Estou ciente de que (na maioria dos SQL, incluindo o MySQL) TRUE é apenas uma macro sofisticada para 1- mas ainda assim, não é um pouco mais óbvio para o leitor?
2
2 é inválido, na maioria dos dialetos SQL
edc65

Respostas:

177

2 e 3 são iguais no MySQL, funcionalmente 1 também é o mesmo.

where 1 não é padrão e, como outros já apontaram, não funcionará em outros dialetos.

As pessoas que adicionam mais where 1ou where 1 = 1menos wherecondições podem ser facilmente adicionadas ou removidas para / de uma consulta adicionando / comentando alguns andcomponentes "...".

ie

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
brent
fonte
11
E também quando você está programaticamente a construção de uma consulta em uma seqüência para executá-lo mais tarde, se você adicionar WHERE 1=1você não vai precisar tomar cuidado se a condição que você está tentando adicionar à corda é o primeiro (por isso vai precisar de um WHEREem frente ) ou não.
Vincent Olivert Riera
45
Faz programação há 6 anos e nunca pensou em fazer isso - obrigado!
SimonGates
6
A ORDER BY 1sintaxe @dlatikay é necessária (em vez dos nomes das colunas) se você estiver fazendo uma união de duas ou mais instruções SELECT.
21416 Mark Stewart
5
@SimonGates Eu estive programando por 6 anos e nunca pensei em fazer outra coisa lol
#
4
@WernerCD Eu acho que é muito mais sensato criar uma lista de cláusulas de filtro em uma lista de algum tipo e, em seguida, juntá-las a elas " AND "como delimitador.
Zev Spitz
76

Como você sabe, todos os três produzem os mesmos resultados. (Em um contexto booleano, o MySQL trata o número inteiro "1" como verdadeiro - de fato, qualquer número que não seja "0" é tratado como verdadeiro).

O otimizador do MySQL está explicitamente documentado para remover condições constantes na WHEREcláusula:

  • Remoção de condição constante. . .:

    (B> = ​​5 e B = 5) OU (B = 6 e 5 = 5) OR (B = 7 e 5 = 6) -> B = 5 OU B = 6

Portanto, todos os três serão compilados exatamente no mesmo código.

Todos são funcionalmente equivalentes e devem ter as mesmas características de desempenho.

Dito isto, o primeiro e o terceiro são SQL padrão. O segundo causará algum tipo de erro de expressão booleana em muitos bancos de dados. Então, eu aconselho você a evitar isso (não tenho certeza se funciona ou não no modo SQL estrito do MySQL).

Geralmente, o terceiro é usado ao construir WHEREcláusulas dinâmicas . Torna mais fácil adicionar condições adicionais, AND <condition>sem se preocupar com ANDs remanescentes .

Gordon Linoff
fonte
6
Essa é uma resposta superior para dizer tudo o que a outra resposta faz, mas apontar crucialmente a diferença de que o número 2 não é compatível com ANSI.
Underscore_d
16

Se você está perguntando sobre as diferenças de desempenho e resultado, não há, 2 e 3 são iguais WHERE TRUEe resultarão iguais ao primeiro.

1 - SELECT * FROM table_name

Resultados em todos os dados de table_name(sem filtro)

2 - SELECT * FROM table_name WHERE 1

1 será avaliado como TRUE, portanto - sem filtro - todos os registros serão retornados.

3 - SELECT * FROM table_name where 1=1

Igual ao último, 1 = 1 é uma TRUEexpressão, portanto - sem filtro - todos os registros serão selecionados.

sagi
fonte
14

Todos são iguais, mas 2 e 3 são usados ​​para lidar facilmente com AND/ORcondições como:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Ashraf.Shk786
fonte
8

Em 1, o MySQL não precisa avaliar nenhuma condição WHERE.

Em 2 e 3, a condição where é estática e não se baseia nos valores das linhas. Será avaliado com lógica booleana e sempre será verdadeiro.

Funcionalmente, não há diferença. Você deve escolher 1 para maior clareza do código.

delx
fonte
7

Todos são iguais, mas 2 e 3 são usados ​​para criar consultas dinâmicas para condições AND / OR

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

usamos o formato 2 e 3 para fazer consultas dinâmicas, para que já saibamos a palavra-chave "onde" foi adicionada e continuemos adicionando mais filtros. Gostar

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

depois de algumas linhas, se tivermos novos filtros, adicionamos "AND coulmnb = b" e assim por diante

Você não precisa verificar a consulta sql para onde a palavra-chave foi colocada na primeira ou na consulta inicial

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

Caso contrário, podemos escrever sqlquery = "SELECT * FROM tablename"

então

se não houver cláusula 'where', sqlquery então

sqlquery  = sqlquery + "where columna =a"

outro

sqlquery  = sqlquery + "and columna =a"
Jin Thakur
fonte
4 espaços iniciais indicam um bloco de código. Por favor edite sua resposta para formatá-lo corretamente, e veja a edição de ajuda para toda a Markdown formatação Bíblia.
Mathieu Guindon
4

Todos eles emitem a mesma resposta. No entanto, a maneira como 2 e 3 são escritos é principalmente para ter controle da instrução "Where" para facilitar a adição ou a remoção posterior.

Eu acho que a primeira e a terceira maneira são a maneira correta de escrever. Se você precisar de uma declaração where, como você gosta no número 3, caso contrário, o número 1 seria bom o suficiente.

Cedric F.
fonte
3

No MS SQL 1 e 3 são iguais, no entanto, a opção 2 não funciona, a opção 2 é uma instrução inválida, como no MS SQL, WHERE é usado para comparar alguns valores. Por exemplo:

  1. Selecione * em 'myTable em que ID = 3 (válido)
  2. Selecione * de 'minhaTabela onde 1 = 1 é igual a Selecione * de' minhaTabela onde 2 = 2 é o mesmo que Selecione * de 'minhaTabela onde 3 = 3 você obtém a ideia (válida) é o mesmo que Selecione * De' minhaTabela '
Krishneil
fonte
2
  1. SELECT * FROM nome_tabela : fornecerá todos os registros da tabela com a execução de qualquer instrução where.
  2. SELECT * FROM nome_tabela ONDE 1 : onde a condição é sempre verdadeira, é usada principalmente pelo hacker para entrar em qualquer sistema. Se você ouviu falar de injeções de sql que 2 e 3, os cenários são forçados a serem construídos pelo hacker para obter todos os registros da tabela.
  3. SELECT * FROM nome_da_tabela onde 1 = 1 : Isso fornecerá todos os registros da tabela, mas comparará a instrução where e depois seguirá em frente, basicamente é adicionado para adicionar ou remover mais instruções depois disso.
Ghayyour Ahmed Butt
fonte
1

Resultado - fornece todos os registros da tabela especificada em vez do nome da tabela para as três consultas

SELECT * FROM tablename WHERE 1- Verifique esta resposta

SELECT * FROM tablename WHERE 1=1- Verifique esta resposta

Para obter mais informações sobre otimizações de cláusula WHERE, verifique estas: MYSQL , SQLite , SQL

Keshan Nageswaran
fonte