Eu já vi muitas consultas com algo da seguinte maneira.
Select 1
From table
O que isso 1
significa, como será executado e o que retornará?
Além disso, em que tipo de cenários, isso pode ser usado?
Eu já vi muitas consultas com algo da seguinte maneira.
Select 1
From table
O que isso 1
significa, como será executado e o que retornará?
Além disso, em que tipo de cenários, isso pode ser usado?
Respostas:
SELECT 1 FROM TABLE_NAME
significa "Retornar 1 da tabela". É bastante comum por si só, portanto normalmente será usado com WHERE
e 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).
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 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.
...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 à sua where
cláusula e / ou join
.
Se você quer dizer algo como
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1 FROM table WHERE...)
então é um mito que o 1
melhor
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT * FROM table WHERE...)
O 1
ou *
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...)
exists (select 1/0
funciona como um encanto
faz o que diz - sempre retornará o número inteiro 1. É usado para verificar se existe um registro correspondente à sua cláusula where.
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.
Embora não seja amplamente conhecido, uma consulta pode ter uma HAVING
cláusula sem uma GROUP BY
cláusula.
Em tais circunstâncias, a HAVING
cláusula é aplicada a todo o conjunto. Claramente, a SELECT
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 a HAVING
clá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);
SELECT MIN(colA) < MAX(colA) FROM tableA
:?
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).
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;
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.
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.
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
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