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 WHEREEXISTS(SELECT1FROM 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.
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.
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!
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.
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:
"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
SELECT1FROM 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).
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:
SELECT1FROM employee;
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);
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.
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.
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.
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.
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
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
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
Respostas:
SELECT 1 FROM TABLE_NAME
significa "Retornar 1 da tabela". É bastante comum por si só, portanto normalmente será usado comWHERE
e com frequênciaEXISTS
(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)).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_NAME
será 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 aSELECT *
, 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.fonte
...EXISTS (SELECT 1...
select 1 from table
retornará a constante 1 para cada linha da tabela. É útil quando você deseja determinar barato se o registro corresponde à suawhere
cláusula e / oujoin
.fonte
Se você quer dizer algo como
então é um mito que o
1
melhorO
1
ou*
no EXISTS é ignorado e você pode escrevê-lo conforme a Página 191 do ANSI SQL 1992 Standard :fonte
exists (select 1/0
funciona como um encantofaz o que diz - sempre retornará o número inteiro 1. É usado para verificar se existe um registro correspondente à sua cláusula where.
fonte
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.fonte
O resultado é
1
para todos os registros da tabela.fonte
Embora não seja amplamente conhecido, uma consulta pode ter uma
HAVING
cláusula sem umaGROUP BY
cláusula.Em tais circunstâncias, a
HAVING
cláusula é aplicada a todo o conjunto. Claramente, aSELECT
clá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 aHAVING
cláusula avaliarTRUE
, 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:
fonte
SELECT MIN(colA) < MAX(colA) FROM tableA
:?Para ser um pouco mais específico, você usaria isso para fazer
em vez de fazer
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).
fonte
Se você não souber se existem dados na sua tabela ou não, poderá usar a seguinte consulta:
Por exemplo:
Portanto, usamos essa consulta SQL para saber se existem dados na tabela e o número de linhas indica quantas linhas existem nessa tabela.
fonte
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.
fonte
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
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.
fonte
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
fonte
O motivo é outro, pelo menos para o MySQL. Isto é do manual do MySQL
fonte
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
fonte