SEÇİN * 1 NEREDE tablo adından


129

Merak ettim. Bu ilgili sorgular arasındaki farklar nelerdir:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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


9
etiketler için "çok dar" bir bayrak var mı? çünkü bu hepsi olmasa da birçok SQL lehçesi için geçerlidir. Bunu MSSQL ve Oracle'da da sıklıkla görüyorum. btw kesme işaretleri nelerdir? mysql nesne adlarını alıntılamak için kullanılan ters işaret değil mi?
Cee McSharpface

3
@dlatikay etiketleri düzenleyebilirsiniz ...
Braiam

2
hm. neden basitçe değil ... WHERE TRUE? (MySQL dahil çoğu SQL'de) TRUE'nun sadece fantezi bir makro olduğunun farkındayım 1- ama yine de okuyucu için biraz daha açık değil mi?

2
2 çoğu SQL lehçesinde geçersiz
edc65

Yanıtlar:


177

MySQL'de 2 ve 3 aynıdır, işlevsel olarak 1 de aynıdır.

where 1 standart değildir, bu nedenle diğerlerinin de belirttiği gibi, diğer lehçelerde çalışmayacaktır.

İnsanlar eklemek where 1veya where 1 = 1öylesine wherekoşullar kolayca bazı "dışında yorum / de ekleyerek bir sorgudan / olarak eklenebilir veya çıkartılabilir and..." bileşenleri.

yani

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
Ayrıca, daha sonra yürütmek için programlı olarak bir dizeye bir sorgu oluşturduğunuzda WHERE 1=1, eklerseniz dizeye eklemeye çalıştığınız koşulun ilk olup olmadığına dikkat etmeniz gerekmez (bu nedenle, WHEREön tarafta ) ya da değil.
Vincent Olivert Riera

45
6 yıldır programlama yapıyorum ve bunu yapmayı hiç düşünmedim - teşekkürler!
SimonGates

6
ORDER BY 1İki veya daha fazla SELECT ifadesinin birleşimini yapıyorsanız @dlatikay sözdizimi gereklidir (sütun adları yerine).
Mark Stewart

5
@SimonGates 6 yıldır programlama yapıyorum ve başka bir şey yapmayı hiç düşünmedim lol
WernerCD

4
@WernerCD Bir çeşit listede filtre cümlelerinin bir listesini oluşturmanın ve ardından bunlara " AND "sınırlayıcı olarak dize katmanın çok daha mantıklı olduğunu düşünüyorum .
Zev Spitz

76

Bildiğiniz gibi, üçü de aynı sonuçları veriyor. (Boole bağlamında, MySQL "1" tamsayısını doğru kabul eder - aslında "0" olmayan herhangi bir sayı doğru olarak değerlendirilir).

MySQL iyileştirici, cümledeki sabit koşulları kaldırmak için açıkça belgelenmiştirWHERE :

  • Sürekli durum giderme. . .:

    (B> = ​​5 VE B = 5) VEYA (B = 6 VE 5 = 5) VEYA (B = 7 VE 5 = 6) -> B = 5 VEYA B = 6

Bu nedenle, üçü de tamamen aynı kodda derlenecektir.

Hepsi işlevsel olarak eşdeğerdir ve aynı performans özelliklerine sahip olmalıdır.

Bununla birlikte, birinci ve üçüncü standart SQL'dir. İkincisi, birçok veritabanında bir tür mantıksal ifade hatasına neden olur. Bu yüzden, bundan kaçınmanızı tavsiye ederim (MySQL'in katı SQL modunda çalışıp çalışmadığından emin değilim).

Genellikle üçüncüsü, dinamik WHEREcümlecikler oluştururken kullanılır . AND <condition>Kalan ANDe- postalar hakkında endişelenmeden ek koşullar eklemeyi kolaylaştırır .


6
Bu, diğer yanıtın yaptığı her şeyi söylemenin mükemmel bir yanıtıdır, ancak 2 numaralı farkın ANSI uyumlu olmadığına işaret eder.
underscore_d

16

Performanslar ve sonuçlardaki farklılıkları soruyorsanız, hiçbiri yoktur, 2 ve 3 aynıdır WHERE TRUEve sonuç ilkiyle aynı olacaktır.

1 - SELECT * FROM table_name

table_name(Filtresiz) kaynaklı tüm verilerde sonuçlar

2 - SELECT * FROM table_name WHERE 1

1 TRUE, bu nedenle - filtre yok - olarak değerlendirilecek - her kayıt döndürülecek.

3 - SELECT * FROM table_name where 1=1

Sonuncusuyla aynı, 1 = 1 bir TRUEifadedir, bu nedenle - filtre yok - her kayıt seçilecektir.


14

Hepsi aynıdır, ancak 2 ve 3 aşağıdaki AND/ORgibi durumlarla kolayca başa çıkmak için kullanılır :

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

8

1'de, MySQL'in herhangi bir WHERE koşulunu değerlendirmesine gerek yoktur.

2 ve 3'te, nerede koşulu statiktir ve satırların değerlerine dayalı değildir. Boole mantığı ile değerlendirilecek ve her zaman doğru olacaktır.

İşlevsel olarak hiçbir fark yoktur. Kod netliği için 1'i seçmelisiniz.


7

Hepsi aynıdır, ancak 2 ve 3, VE / VEYA koşulları için Dinamik sorgular oluşturmak için kullanılır

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

Dinamik sorgu yapmak için 2 ve 3 biçimini kullanıyoruz, böylece anahtar kelimenin "nerede" eklendiğini zaten biliyoruz ve daha fazla filtre eklemeye devam ediyoruz. Sevmek

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

birkaç satırdan sonra yeni filtrelerimiz varsa "AND coulmnb = b" ekleriz vb.

İlk veya ilk sorguda anahtar kelimenin nerede yerleştirildiğini görmek için sql sorgusunu kontrol etmenize gerek yok

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

Aksi takdirde yazabiliriz sqlquery = "SELECT * FROM tablename"

sonra

hiçbir 'nerede' hüküm bulunmaması halinde ise sqlquery o zaman

sqlquery  = sqlquery + "where columna =a"

Başka

sqlquery  = sqlquery + "and columna =a"

Önde gelen 4 boşluk bir kod bloğunu belirtir. Lütfen düzenlemek düzgün biçimlendirmek ve görmek cevabınızı yardım düzenleme bütün Markdown İncil'i biçimlendirme için.
Mathieu Guindon

4

Hepsi aynı cevabı verir. Bununla birlikte, 2 ve 3'ün yazılma şekli çoğunlukla "Where" ifadesinin kontrolüne sahip olmak içindir, böylece daha sonra eklemeyi veya kaldırmayı kolaylaştırır.

Bence birinci ve üçüncü yol, onu yazmanın doğru yolu. Eğer 3 numarada beğendiğiniz bir where ifadesine ihtiyacınız varsa, aksi takdirde 1 numara yeterli olacaktır.


3

MS SQL 1 ve 3'te aynıdır, ancak 2. seçenek çalışmaz, 2. seçenek MS SQL'deki gibi geçersiz bir ifadedir, bazı değerleri karşılaştırmak için NEREDE kullanılır. Örneğin:

  1. MyTable'dan * seçin, burada ID = 3 (geçerli)
  2. 'MyTable'dan * seçin, burada 1 = 1,' myTable'dan * Select ile aynıdır, burada 2 = 2, 'myTable'dan * Select ile aynıdır, burada 3 = 3 fikri alırsınız (geçerli)' myTable'dan * Seç * ile aynıdır

2
  1. SELECT * FROM table_name : herhangi bir where ifadesini çalıştırarak size tablonun tüm kayıtlarını verecektir.
  2. SELECT * FROM table_name NEREDE 1 : koşul her zaman doğru olduğunda, genellikle bilgisayar korsanı tarafından herhangi bir sisteme girmek için kullanılır. Eğer 2 & 3'ten daha fazla sql enjeksiyonu duyduysanız, tablonun tüm kayıtlarını almak için bilgisayar korsanı tarafından oluşturmaya zorlanan senaryolardır.
  3. 1 = 1 olan table_name'DEN SEÇİN * : Bu size tablonun tüm kayıtlarını verir, ancak where ifadesini karşılaştırır ve sonra ileriye doğru hareket eder, temelde bundan sonra daha fazla ifade eklemek veya kaldırmak için eklenir.

1

Sonuç - Üç sorgu için tablo adı yerine belirtilen tablodaki tüm kayıtları verir

SELECT * FROM tablename WHERE 1- Bu yanıtı kontrol edin

SELECT * FROM tablename WHERE 1=1- Bu yanıtı kontrol edin

WHERE yan tümcesi optimizasyonları hakkında daha fazla bilgi için şunları kontrol edin: MYSQL , SQLite , SQL

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.