PILIH * DARI tablename DI MANA 1

129

Saya penasaran. Apa perbedaan antara masing-masing kueri ini:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

Stephen Alexander
sumber
9
apakah ada tanda "terlalu sempit" untuk tag? karena itu berlaku untuk banyak, jika tidak semua, dialek SQL. Saya sering melihatnya di MSSQL dan Oracle. btw apa apostrof? bukankah backtick `digunakan untuk mengutip nama objek mysql?
Cee McSharpface
3
@dlatikay Anda dapat mengedit tag ...
Braiam
2
hm kenapa tidak sederhana saja ... WHERE TRUE? Saya sadar bahwa (di sebagian besar SQL, termasuk MySQL) BENAR hanyalah makro yang mewah untuk 1- tapi tetap saja, bukankah ini lebih jelas bagi pembaca?
2
2 tidak valid di sebagian besar dialek SQL
edc65

Jawaban:

177

2 dan 3 sama di MySQL, secara fungsional 1 juga sama.

where 1 tidak standar sehingga, seperti yang telah ditunjukkan orang lain, tidak akan berfungsi dalam dialek lain.

Orang-orang menambahkan where 1atau where 1 = 1lebih wherekondisinya dapat dengan mudah ditambahkan atau dihapus ke / dari permintaan dengan menambahkan / mengomentari beberapa andkomponen "...".

yaitu

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
brent
sumber
11
Dan juga ketika Anda secara terprogram membangun kueri menjadi string untuk mengeksekusinya nanti, jika Anda menambahkan WHERE 1=1Anda tidak perlu berhati-hati jika kondisi yang Anda coba tambahkan ke string adalah yang pertama (sehingga akan membutuhkan WHEREdi depan) ) atau tidak.
Vincent Olivert Riera
45
Sudah pemrograman selama 6 tahun dan tidak pernah berpikir untuk melakukan ini - terima kasih!
SimonGates
6
Diperlukan ORDER BY 1sintaks @dlatikay (alih-alih nama kolom) jika Anda melakukan penyatuan dua atau lebih pernyataan SELECT.
Mark Stewart
5
@SimonGates Saya telah memprogram selama 6 tahun dan tidak pernah berpikir untuk melakukan hal lain lol
WernerCD
4
@ WernerCD Saya pikir itu jauh lebih masuk akal untuk membangun daftar klausa filter dalam daftar semacam, dan kemudian string bergabung dengan mereka " AND "sebagai pembatas.
Zev Spitz
76

Seperti yang Anda ketahui, ketiganya menghasilkan hasil yang sama. (Dalam konteks boolean, MySQL memperlakukan integer "1" sebagai benar - pada kenyataannya, angka apa pun yang bukan "0" diperlakukan sebagai true).

Pengoptimal MySQL didokumentasikan secara eksplisit untuk menghapus kondisi konstan dalam WHEREklausa:

  • Penghapusan kondisi konstan. . .:

    (B> = ​​5 DAN B = 5) ATAU (B = 6 DAN 5 = 5) ATAU (B = 7 DAN 5 = 6) -> B = 5 ATAU B = 6

Oleh karena itu, ketiganya akan dikompilasi menjadi kode yang persis sama.

Mereka semua secara fungsional setara dan harus memiliki karakteristik kinerja yang sama.

Yang mengatakan, yang pertama dan ketiga adalah SQL standar. Yang kedua akan menyebabkan semacam kesalahan ekspresi boolean di banyak basis data. Jadi, saya akan menyarankan Anda untuk menghindari itu (saya tidak yakin apakah itu berfungsi atau tidak dalam mode SQL ketat MySQL).

Seringkali yang ketiga digunakan ketika membangun WHEREklausa dinamis . Ini membuatnya mudah untuk menambahkan kondisi tambahan AND <condition>tanpa perlu khawatir AND.

Gordon Linoff
sumber
6
Ini adalah jawaban yang superior untuk mengatakan segala sesuatu yang dilakukan oleh jawaban yang lain tetapi secara krusial menunjukkan perbedaan bahwa # 2 tidak sesuai dengan ANSI.
underscore_d
16

Jika Anda bertanya tentang perbedaan dalam kinerja dan hasil, tidak ada, 2 dan 3 sama WHERE TRUE, dan mereka akan menghasilkan yang sama seperti yang pertama.

1 - SELECT * FROM table_name

Hasil dalam semua data dari table_name(tanpa filter)

2 - SELECT * FROM table_name WHERE 1

1 akan dievaluasi karena TRUE, karena itu - tidak ada filter - setiap catatan akan dikembalikan.

3 - SELECT * FROM table_name where 1=1

Sama seperti yang terakhir, 1 = 1 adalah TRUEekspresi, oleh karena itu - tanpa filter - setiap catatan akan dipilih.

sagi
sumber
14

Semua sama tetapi 2 dan 3 digunakan untuk menangani AND/ORkondisi seperti:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Ashraf.Shk786
sumber
8

Dalam 1, MySQL tidak perlu mengevaluasi kondisi WHERE.

Dalam 2 dan 3, kondisi di mana statis dan tidak didasarkan pada nilai baris. Ini akan dievaluasi dengan logika boolean dan selalu benar.

Secara fungsional, tidak ada perbedaan. Anda harus memilih 1 untuk kejelasan kode.

delx
sumber
7

Semua sama tetapi 2 dan 3 digunakan untuk membuat kueri dinamis untuk kondisi AND / OR

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

kami menggunakan format 2 dan 3 untuk membuat kueri dinamis sehingga kami sudah tahu kata kunci "di mana" ditambahkan dan kami terus menambahkan lebih banyak filter. Suka

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

setelah beberapa baris jika kita memiliki filter baru kita tambahkan "AND coulmnb = b" dan seterusnya

Anda tidak perlu memeriksa kueri sql untuk kata kunci mana yang ditempatkan di kueri pertama atau awal

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

Kalau tidak, kita bisa menulis sqlquery = "SELECT * FROM tablename"

kemudian

jika tidak ada klausa 'di mana' sqlquery maka

sqlquery  = sqlquery + "where columna =a"

lain

sqlquery  = sqlquery + "and columna =a"
Jin Thakur
sumber
4 spasi terdepan menunjukkan blok kode. Harap edit jawaban Anda untuk memformatnya dengan benar, dan lihat bantuan pengeditan untuk seluruh Alkitab format Markdown.
Mathieu Guindon
4

Mereka semua menghasilkan jawaban yang sama. Namun cara 2 dan 3 ditulis sebagian besar adalah untuk memiliki kontrol atas pernyataan "Di mana" sehingga akan memudahkan untuk menambahkan atau menghapusnya nanti.

Saya pikir cara pertama dan ketiga adalah cara yang tepat untuk menulisnya. Jika Anda memerlukan pernyataan di mana Anda suka di nomor 3 jika tidak, angka 1 akan cukup baik.

Cedric F.
sumber
3

Dalam MS SQL 1 dan 3 sama, namun, opsi 2 tidak akan berfungsi, opsi 2 adalah pernyataan yang tidak valid seperti dalam MS SQL, WHERE digunakan untuk membandingkan beberapa nilai. Sebagai contoh:

  1. Pilih * dari 'myTable di mana ID = 3 (valid)
  2. Pilih * dari 'myTable di mana 1 = 1 sama dengan Select * dari' myTable di mana 2 = 2 sama dengan Select * dari 'myTable di mana 3 = 3 Anda mendapatkan ide (valid) sama dengan Pilih * Dari' myTable '
Krishneil
sumber
2
  1. SELECT * FROM table_name : itu akan memberi Anda semua catatan dari tabel dengan menjalankan pernyataan where any.
  2. SELECT * FROM table_name WHERE 1 : kondisi di mana ini selalu benar, sebagian besar digunakan oleh peretas untuk masuk ke sistem apa pun. Jika Anda mendengar tentang suntikan sql dari 2 & 3 adalah skenario yang dipaksa untuk dibangun oleh peretas untuk mendapatkan semua catatan tabel.
  3. SELECT * FROM table_name mana 1 = 1 : Ini akan memberi Anda semua catatan dari tabel tetapi itu akan membandingkan pernyataan di mana dan kemudian bergerak maju, itu pada dasarnya ditambahkan untuk menambah atau menghapus lebih banyak pernyataan setelah itu.
Ghayyour Ahmed Butt
sumber
1

Hasil - Memberikan semua catatan dalam tabel yang ditentukan alih-alih tablename untuk ketiga kueri

SELECT * FROM tablename WHERE 1- Periksa jawaban ini

SELECT * FROM tablename WHERE 1=1- Periksa jawaban ini

Untuk info lebih lanjut tentang WHERE optimasi klausa periksa ini: MYSQL , SQLite , SQL

Keshan Nageswaran
sumber