Tablodan 1'i seçmek ne anlama geliyor?


150

Aşağıdaki gibi birçok sorgu gördüm.

Select 1  
From table

Bu ne anlama 1geliyor, nasıl yürütülecek ve ne geri dönecek?

Ayrıca, bu ne tür senaryolarda kullanılabilir?


Lütfen bize tam sorguyu gösterin
gbn

Yanıtlar:


109

SELECT 1 FROM TABLE_NAME"Masadan 1 döndür" anlamına gelir. Kendi başına oldukça dikkate değer değildir, bu nedenle normalde birlikte WHEREve sıklıkla kullanılacaktır EXISTS(@gbn notlarında olduğu gibi, bu mutlaka en iyi uygulama değildir, ancak gerçekten anlamlı olmasa bile not edilmesi yeterince yaygındır ( yani, bunu başkaları kullandığı için kullanacağım ve hemen "daha bariz" oluyor. Tabii bu viskoz bir tavuk-yumurta sorunu olabilir, ama ben genellikle durmuyorum)).

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

Temel olarak, yukarıdaki tablo 2'deki karşılık gelen bir kimliği olan tablo 1'deki her şeyi döndürecektir. (Bu, açık bir şekilde uydurma bir örnektir, ancak fikri aktardığına inanıyorum. Şahsen, muhtemelen yukarıdakileri SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);, FAR , yapmamak için son derece zorlayıcı bir neden olmadıkça okuyucu için daha açık.

DÜZENLE

Aslında şimdiye kadar unuttuğum bir durum var. Veritabanında bir dış dilden bir değerin varlığını belirlemeye çalıştığınız durumda, bazen SELECT 1 FROM TABLE_NAMEkullanılacaktır. Bu, tek bir sütun seçmeye göre önemli bir fayda sağlamaz, ancak uygulamaya bağlı olarak, a yapmaya göre önemli kazançlar sağlayabilir SELECT *, çünkü genellikle DB bir dile ne kadar çok sütun döndürürse, veriler o kadar büyük olur. yapı, bu da daha fazla zaman alınacağı anlamına gelir.


Ve neden EXISTS ile "normal"? Neden olduğuna dair kanıtınız var mı?
gbn

6
Ve a -1 efsanesini yaymak için...EXISTS (SELECT 1...
gbn

2
@Gbn Onu neden orada her şeyden daha sık gördüğüm hakkında hiçbir fikrim yok. Bunu orada çok daha sık gördüm.
cwallenpoole

2
Viskoz bir tavuk mu? Bunu yemek istemezdim! Belki de 'kısır bir tavuk ve yumurta sorunu' olmalı?
No'am Newman

2
@Ben: IN ve EXIST'ler genellikle aynı plana göre optimizasyon yapar
gbn

114

select 1 from tabletablonun her satırı için 1 sabitini döndürür. Kaydın sizin wherecümlenizle ve / veya ile eşleşip eşleşmediğini ucuza belirlemek istediğinizde kullanışlıdır join.


1
Bu cevap bana çok mantıklı geldi
Joseph Astrahan

2
Aslında çok önemli bir nokta: " tablodaki HER satır için". Bu nedenle, örneğin yüz milyon satırlık bir tablonun sağlık kontrolünün bir parçası olarak "tablo kullanılabilirliğinin" kontrol edilmesi, yüz milyonlarca "1" sonuç kümesiyle sonuçlanacaktır. (not: bu HİÇ gerçekleşmezdi ... üretimde;);))
conny

Kelimenin tam anlamıyla, burada kabul edilen cevap bu olmalı!
Fahad Javed

42

Gibi bir şey demek istiyorsan

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

o zaman bir var efsane olduğunu 1daha iyidir

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

1Veya *göz ardı edilir MEVCUT ve başına bu yazabilirsiniz içinde ANSI SQL 1992 Standardının Sayfa 191 :

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

1
az önce postgres'in buna saygı duyduğunu doğruladı, exists (select 1/0bir cazibe gibi çalışıyor
alex

24

söylediği şeyi yapar - her zaman tamsayı 1'i döndürür. Nerede cümlenizin var olup olmadığını kontrol etmek için kullanılır.


22
uhm - soru "bu ne anlama geliyor", "bu iyi uygulama mı" değil. Performans açısından bir fark yaratmadığına katılıyorum - ancak bu, geliştiricilerin kullandığı bir kuraldır, çünkü muhtemelen 1 genellikle "doğru" olarak yorumlanır.
Neville Kuyt

20

select 1 from table bazı veritabanları tarafından bir bağlantının canlı olup olmadığını görmek için bir sorgu olarak kullanılır, genellikle bir bağlantı havuzundan / havuzundan bir bağlantı alırken veya geri döndürürken kullanılır.


2
Benim durumum buydu, JBOSS ve TOMCAT uygulamaları arasında oldukça yaygındır.
Valter Silva

13

Sonuç, 1tablodaki her kayıt içindir. __


Pek değil, boş bir tablo oluşturmaya ve sorguyu çalıştırmaya çalıştım, sonuç altı 1 oldu.
2017

9

Yaygın olarak bilinmemekle birlikte, bir sorgu, HAVINGcümleci olmayan bir GROUP BYcümle içerebilir .

Bu gibi durumlarda, HAVINGcümle tüm sete uygulanır. Açıkçası, SELECTcümle herhangi bir sütuna atıfta bulunamaz, aksi takdirde "Sütun, GROUP BY içinde yer almadığı için seçimde geçersiz" vb. Hatayı alırsınız (düzeltir).

Bu nedenle, değişmez bir değer olmalıdır (SQL sıfır sütunlu bir resultset izin vermediği için - neden ?!) kullanılabilir ve değişmez değer 1 ( INTEGER) yaygın kullanılır: eğer HAVINGhüküm değerlendirir TRUEsonra resultset biriyle bir satır olacak 1 değerini gösteren sütun, aksi takdirde boş küme elde edersiniz.

Örnek: bir sütunun birden fazla farklı değeri olup olmadığını bulmak için:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"Açıkçası, SEÇ fıkra herhangi bir sütuna başvuramaz" - misiniz bir bool ifadesini seçmek için daha makul olmaz: SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel

7

Biraz daha spesifik olmak gerekirse, bunu yapmak için kullanırsınız

SELECT 1 FROM MyUserTable WHERE user_id = 33487

yapmak yerine

SELECT * FROM MyUserTable WHERE user_id = 33487

çünkü sonuçlara bakmayı umursamıyorsun. Veri tabanı için 1 sayısını sormak çok kolaydır (çünkü herhangi bir arama yapmak zorunda değildir).


Yukarıdaki yorumlara göre, Select 1 performans açısından select * 'den daha iyi değil gibi görünüyor, öyle değil mi?
eRaisedToX

5

Tablonuzda herhangi bir veri olup olmadığını bilmiyorsanız, aşağıdaki sorguyu kullanabilirsiniz:

SELECT cons_value FROM table_name;

Örnek olarak:

SELECT 1 FROM employee;
  1. Toplam satır sayısını içeren bir sütun döndürür ve tüm satırlar aynı sabit değer 1'e sahiptir (bu sefer tüm satırlar için 1 döndürür);
  2. Tablonuzda satır yoksa hiçbir şey döndürmez.

Bu nedenle, tabloda herhangi bir veri olup olmadığını bilmek için bu SQL sorgusunu kullanırız ve satır sayısı bu tabloda kaç satır olduğunu gösterir.


4

WHERE cümlesine göre yalnızca doğru veya yanlışı kontrol etmek istiyorsanız, koşulun en ucuz yol olduğu tablodan 1'i seçin.


3

Bu , çıktı olarak " 1 " değerini istediğiniz anlamına gelir veya Çoğu zaman İç Sorgular olarak kullanılır, çünkü bazı nedenlerden dolayı dış sorguları iç sorguların sonucuna göre hesaplamak istersiniz .. her zaman 1'i değil, bazı özel değerlere sahip ...

Bu statik olarak size değer 1 olarak çıktı verecektir.


2

Her zaman SQL enjeksiyonunda kullanıldığını görüyorum, örneğin:

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

Bu sayılar, veritabanının nerede olduğunu tahmin etmek ve belirttiğiniz veritabanının sütun adını ve tabloların değerlerini tahmin etmek için kullanılabilir.


0

bu basit, tablodan ilk sayı sütununu aldığınız anlamına gelir ,,,, Emply_num, Empl_no from Employees; burada Çalışanlar'dan 1'i seçiyorsunuz; bu, Emply_num sütununu aldığınız anlamına gelir. Teşekkürler


Böyle bir sözdizimi hatırlıyorum, ancak hatırlayamadığım bir veritabanına özgü. Postgresql?
diynevala

0

Nedeni, en azından MySQL için başka bir sebeptir. Bu MySQL kılavuzundan

InnoDB, bu tür değerleri tabloda depolamak yerine, bir tablo için başlangıçtan sonra bu tabloya ilk erişildiğinde endeks kardinalite değerlerini hesaplar. Bu adım, verileri birçok tabloya bölen sistemlerde önemli ölçüde zaman alabilir. Bu ek yük yalnızca ilk tablo açma işlemi için geçerli olduğundan, daha sonra kullanmak üzere bir tabloyu "ısıtmak" için, başlangıçtan hemen sonra SELECT 1 FROM tbl_name LIMIT 1 gibi bir ifade yayınlayarak ona erişin


0

Bu sadece IF EXISTS () ile kolaylık sağlamak için kullanılır. Aksi takdirde gidebilirsin

select * from [table_name]

Image 'IF EXISTS' durumunda, sadece belirtilen koşula sahip herhangi bir satırın var olduğunu veya satır içeriğinin ne olduğu önemli olmadığını bilmemiz gerekir.

select 1 from Users

yukarıdaki örnek kod, no döndürür. satır sayısı hayır'a eşittir. tek sütunda 1 olan kullanıcıların oranı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.