O que significa selecionar 1 da tabela?

146

Eu já vi muitas consultas com algo da seguinte maneira.

Select 1  
From table

O que isso 1significa, como será executado e o que retornará?

Além disso, em que tipo de cenários, isso pode ser usado?

Desenvolvedor Microsoft
fonte
Mostre-nos a consulta completa, por favor
gbn

Respostas:

107

SELECT 1 FROM TABLE_NAMEsignifica "Retornar 1 da tabela". É bastante comum por si só, portanto normalmente será usado com WHEREe com frequência EXISTS(como observa o @gbn, isso não é necessariamente uma prática recomendada, é, no entanto, comum o suficiente para ser observado, mesmo que não seja realmente significativo ( Dito isto, vou usá-lo porque outros o usam e é "mais óbvio" imediatamente. É claro que isso pode ser uma questão de frango viscoso versus ovo, mas geralmente não me importo)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

Basicamente, o texto acima retornará tudo da tabela 1, que tem um ID correspondente da tabela 2. (Este é um exemplo artificial, obviamente, mas acredito que transmite a ideia. Pessoalmente, provavelmente faria o acima, SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);como considero isso como MUITO mais explícito para o leitor, a menos que houvesse uma razão circunstancialmente convincente para não fazê-lo).

EDITAR

Na verdade, há um caso que eu esqueci até agora. No caso em que você está tentando determinar a existência de um valor no banco de dados a partir de um idioma externo, algumas vezes SELECT 1 FROM TABLE_NAMEserá usado. Isso não oferece benefícios significativos em relação à seleção de uma coluna individual, mas, dependendo da implementação, pode oferecer ganhos substanciais em relação à execução de a SELECT *, simplesmente porque geralmente ocorre que quanto mais colunas o banco de dados retornar para um idioma, maiores serão os dados. estrutura, que por sua vez significa que será necessário mais tempo.

cwallenpoole
fonte
E por que "normalmente" com EXISTS? Você tem provas do porquê ?
gbn 24/08
6
E um -1 para propagar o mito de...EXISTS (SELECT 1...
gbn
2
@ Gbn Não faço ideia por que eu o vi lá com muito mais frequência do que qualquer outra coisa. Acabei de vê-lo com muito mais frequência.
precisa saber é o seguinte
2
Uma galinha viscosa? Não gostaria de comer isso! Talvez deva ser um 'problema vicioso de galinha e ovo'?
Noam Newman
2
@ Ben: IN e existe normalmente irá otimizar ao mesmo plano
GBN
106

select 1 from tableretornará a constante 1 para cada linha da tabela. É útil quando você deseja determinar barato se o registro corresponde à sua wherecláusula e / ou join.

Sahil Muthoo
fonte
1
Essa resposta fez mais sentido para mim
Joseph Astrahan
2
Ponto muito importante: "para TODAS as linhas da tabela". Assim, a verificação da "disponibilidade da tabela" como parte de, por exemplo, uma verificação de integridade de uma tabela com centenas de milhões de linhas, terminará em um conjunto de resultados de cem milhões "1". (nota: não que isso iria acontecer ... na produção;);))
conny
Literalmente, esta deve ser a resposta aceita aqui!
Fahad Javed
40

Se você quer dizer algo como

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

então é um mito que o 1melhor

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

O 1ou *no EXISTS é ignorado e você pode escrevê-lo conforme a Página 191 do ANSI SQL 1992 Standard :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 
gbn
fonte
1
apenas verificado que postgres respeita esta, exists (select 1/0funciona como um encanto
alex
22

faz o que diz - sempre retornará o número inteiro 1. É usado para verificar se existe um registro correspondente à sua cláusula where.

Neville Kuyt
fonte
22
uhm - a pergunta era "o que significa", não "é uma boa prática". Concordo que não faz diferença do ponto de vista do desempenho - mas é uma convenção que os desenvolvedores usam, presumivelmente porque 1 é comumente interpretado como "verdadeiro".
Neville Kuyt
20

select 1 from table é usado por alguns bancos de dados como uma consulta para testar uma conexão e verificar se ela está ativa, geralmente usada ao recuperar ou retornar uma conexão de / para um pool de conexões.

Tom
fonte
2
Esse foi o meu caso, é bastante comum entre aplicativos JBOSS e TOMCAT.
Valter Silva
13

O resultado é 1para todos os registros da tabela. __

TiyebM
fonte
Na verdade, não, tentei criar uma tabela vazia e executar a consulta, o resultado são seis 1s.
r0ng
9

Embora não seja amplamente conhecido, uma consulta pode ter uma HAVINGcláusula sem uma GROUP BYcláusula.

Em tais circunstâncias, a HAVINGcláusula é aplicada a todo o conjunto. Claramente, a SELECTcláusula não pode se referir a nenhuma coluna; caso contrário, você (correto) obteria o erro "A coluna é inválida na seleção porque não está contida no GROUP BY" etc.

Portanto, um valor literal deve ser usado (porque o SQL não permite um conjunto de resultados com zero colunas - por quê ?!) e o valor literal 1 ( INTEGER) é comumente usado: se a HAVINGcláusula avaliar TRUE, o conjunto de resultados será uma linha com uma coluna mostrando o valor 1, caso contrário, você obtém o conjunto vazio.

Exemplo: para descobrir se uma coluna possui mais de um valor distinto:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);
um dia quando
fonte
"Claramente, a cláusula SELECT não pode se referir a nenhuma coluna" - Não seria mais razoável selecionar uma expressão booleana SELECT MIN(colA) < MAX(colA) FROM tableA:?
Paul Spiegel
7

Para ser um pouco mais específico, você usaria isso para fazer

SELECT 1 FROM MyUserTable WHERE user_id = 33487

em vez de fazer

SELECT * FROM MyUserTable WHERE user_id = 33487

porque você não se importa em olhar para os resultados. Pedir o número 1 é muito fácil para o banco de dados (já que ele não precisa fazer nenhuma pesquisa).

Robert Martin
fonte
De acordo com os comentários acima, parece que o Select 1 não tem melhor desempenho do que o Select *, não é?
eRaisedToX
5

Se você não souber se existem dados na sua tabela ou não, poderá usar a seguinte consulta:

SELECT cons_value FROM table_name;

Por exemplo:

SELECT 1 FROM employee;
  1. Ele retornará uma coluna que contém o número total de linhas e todas as linhas têm o mesmo valor constante 1 (nesse momento, retorna 1 para todas as linhas);
  2. Se não houver linha na sua tabela, ela não retornará nada.

Portanto, usamos essa consulta SQL para saber se existem dados na tabela e o número de linhas indica quantas linhas existem nessa tabela.

mahbub_siddique
fonte
3

Isso significa que você deseja um valor " 1 " como saída ou a maior parte do tempo usado como consultas internas, porque, por algum motivo, deseja calcular as consultas externas com base no resultado de consultas internas. Nem todo o tempo que você usa 1, mas você tem alguns valores específicos ...

Isso fornecerá estaticamente a saída como valor 1.

DShah
fonte
3

Se você deseja apenas verificar um valor verdadeiro ou falso com base na cláusula WHERE, selecione 1 na tabela em que a condição é a maneira mais barata.


fonte
2

Vejo que é sempre usado na injeção de SQL, como:

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

Esses números podem ser usados ​​para adivinhar onde o banco de dados existe e o nome da coluna do banco de dados que você especificou. E os valores das tabelas.

EmilyAvon
fonte
0

simples significa que você está recuperando o número da primeira coluna da tabela ,,, significa selecionar Emply_num, Empl_no From Employees; aqui você está usando o selecione 1 de Funcionários; isso significa que você está recuperando a coluna Emply_num. obrigado

zeeshan rajput
fonte
Lembro-me dessa sintaxe, mas é específica de um banco de dados que não me lembro. Postgresql?
diynevala
0

O motivo é outro, pelo menos para o MySQL. Isto é do manual do MySQL

O InnoDB calcula os valores de cardinalidade do índice para uma tabela na primeira vez em que a tabela é acessada após a inicialização, em vez de armazenar esses valores na tabela. Esta etapa pode levar um tempo significativo em sistemas que particionam os dados em várias tabelas. Como essa sobrecarga se aplica apenas à operação de abertura da tabela inicial, para "aquecer" uma tabela para uso posterior, acesse-a imediatamente após a inicialização emitindo uma instrução como SELECT 1 FROM nome_tabela LIMIT 1

Ramona Morea
fonte
0

Isso é usado apenas por conveniência com IF EXISTS (). Caso contrário, você pode ir com

select * from [table_name]

Imagem No caso de 'IF EXISTS', precisamos apenas saber que qualquer linha com condição especificada existe ou não, não importa qual seja o conteúdo da linha.

select 1 from Users

código de exemplo acima, retorna no. de linhas é igual a não. de usuários com 1 na coluna única

arvind singh
fonte