SELECT 1 FROM TABLE_NAMEberarti, "Kembalikan 1 dari tabel". Ini cukup biasa-biasa saja, jadi biasanya akan digunakan dengan WHEREdan sering EXISTS(seperti @gbn mencatat, ini tidak selalu merupakan praktik terbaik, namun, cukup umum untuk dicatat, bahkan jika itu tidak benar-benar bermakna ( yang mengatakan, saya akan menggunakannya karena orang lain menggunakannya dan itu "lebih jelas" segera. Tentu saja, itu mungkin masalah ayam kental vs telur, tapi saya biasanya tidak tinggal di sini)).
SELECT*FROM TABLE1 T1 WHEREEXISTS(SELECT1FROM TABLE2 T2 WHERE T1.ID= T2.ID
);
Pada dasarnya, di atas akan mengembalikan semuanya dari tabel 1 yang memiliki ID yang sesuai dari tabel 2. (Ini adalah contoh yang dibuat-buat, jelas, tapi saya percaya itu menyampaikan ide. Secara pribadi, saya mungkin akan melakukan hal di atas SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);seperti yang saya lihat sebagai JAUH lebih eksplisit untuk pembaca kecuali ada alasan kuat untuk tidak).
EDIT
Sebenarnya ada satu kasus yang saya lupa sampai sekarang. Dalam kasus di mana Anda mencoba menentukan keberadaan nilai dalam database dari bahasa luar, terkadang SELECT 1 FROM TABLE_NAMEakan digunakan. Ini tidak menawarkan manfaat yang signifikan dibandingkan dengan memilih satu kolom, tetapi, tergantung pada implementasinya, itu mungkin menawarkan keuntungan besar daripada melakukan SELECT *, hanya karena sering kali semakin banyak kolom yang dikembalikan DB ke bahasa, semakin besar data struktur, yang pada gilirannya berarti lebih banyak waktu akan diambil.
Dan mengapa "normal" dengan ADA? Apakah Anda punya bukti mengapa ?
gbn
6
Dan -1 untuk menyebarkan mitos...EXISTS (SELECT 1...
gbn
2
@ Gbn Tidak tahu mengapa saya sering melihatnya di sana lebih sering daripada yang lainnya. Saya baru saja melihatnya di sana jauh lebih sering.
cwallenpoole
2
Seekor ayam kental? Tidak mau makan itu! Mungkin itu harus menjadi 'masalah ayam dan telur yang ganas'?
No'am Newman
2
@ Ben: IN dan ADA biasanya akan mengoptimalkan ke rencana yang sama
gbn
107
select 1 from tableakan mengembalikan 1 konstan untuk setiap baris tabel. Ini berguna ketika Anda ingin menentukan dengan murah apakah catatan cocok dengan whereklausa Anda dan / atau join.
Poin yang sangat penting sebenarnya: "untuk SETIAP baris dalam tabel". Dengan demikian memeriksa "ketersediaan tabel" sebagai bagian dari, misalnya pemeriksaan kesehatan dari tabel dengan ratusan juta baris, akan berakhir dalam kumpulan hasil yang bernilai ratusan juta "1". (catatan: bukankah ini akan terjadi ... dalam produksi;);))
conny
Secara harfiah, ini harus menjadi jawaban yang diterima di sini!
baru saja diverifikasi bahwa postgres menghargai ini, exists (select 1/0berfungsi seperti pesona
alex
22
ia melakukan apa yang dikatakannya - ia akan selalu mengembalikan bilangan bulat 1. Ini digunakan untuk memeriksa apakah catatan yang cocok dengan klausa tempat Anda berada.
uhm - pertanyaannya adalah "apa artinya", bukan "apakah ini praktik yang baik". Saya setuju itu tidak membuat perbedaan dari sudut pandang kinerja - tetapi itu adalah konvensi yang digunakan pengembang, mungkin karena saya biasanya ditafsirkan sebagai "benar".
Neville Kuyt
20
select 1 from table digunakan oleh beberapa database sebagai permintaan untuk menguji koneksi untuk melihat apakah itu hidup, sering digunakan ketika mengambil atau mengembalikan koneksi ke / dari kumpulan koneksi.
Tidak juga, saya mencoba membuat tabel kosong, dan menjalankan kueri, hasilnya enam 1s.
r0ng
9
Meskipun tidak diketahui secara luas, kueri dapat memiliki HAVINGklausa tanpa GROUP BYklausa.
Dalam keadaan seperti itu, HAVINGklausa diterapkan ke seluruh set. Jelas, SELECTklausa tidak dapat merujuk ke kolom mana pun, jika tidak Anda akan (memperbaiki) kesalahan, "Kolom tidak valid dalam pilih karena tidak terkandung dalam GROUP BY" dll.
Oleh karena itu, nilai literal harus digunakan (karena SQL tidak mengizinkan resultset dengan nol kolom - mengapa ?!) dan nilai literal 1 ( INTEGER) umumnya digunakan: jika HAVINGklausa mengevaluasi TRUEmaka resultset akan menjadi satu baris dengan satu kolom yang menunjukkan nilai 1, jika tidak Anda mendapatkan set kosong.
Contoh: untuk menemukan apakah suatu kolom memiliki lebih dari satu nilai berbeda:
"Jelas, klausa SELECT tidak dapat merujuk kepada setiap kolom" - Calon itu tidak lebih masuk akal untuk memilih ekspresi bool: SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel
7
Untuk sedikit lebih spesifik, Anda akan menggunakan ini untuk melakukannya
SELECT1FROM MyUserTable WHERE user_id =33487
bukannya melakukan
SELECT*FROM MyUserTable WHERE user_id =33487
karena Anda tidak peduli melihat hasilnya. Meminta nomor 1 sangat mudah untuk basis data (karena tidak perlu melakukan pencarian).
Sesuai komentar di atas, sepertinya Pilih 1 tidak lebih baik dalam kinerjanya daripada pilih *, begitu?
eRaisedToX
5
Jika Anda tidak tahu ada data di tabel Anda atau tidak, Anda bisa menggunakan kueri berikut:
SELECT cons_value FROM table_name;
Sebagai Contoh:
SELECT1FROM employee;
Ini akan mengembalikan kolom yang berisi jumlah baris & semua baris memiliki nilai konstan yang sama 1 (untuk kali ini mengembalikan 1 untuk semua baris);
Jika tidak ada baris di meja Anda, maka tidak akan menghasilkan apa-apa.
Jadi, kami menggunakan kueri SQL ini untuk mengetahui apakah ada data di tabel & jumlah baris menunjukkan berapa banyak baris yang ada di tabel ini.
Ini berarti bahwa Anda menginginkan nilai " 1 " sebagai output atau Sebagian besar waktu digunakan sebagai Kueri Batin karena untuk beberapa alasan Anda ingin menghitung kueri luar berdasarkan hasil kueri dalam .. tidak semua waktu Anda menggunakan 1 tetapi Anda memiliki beberapa nilai spesifik ...
Ini secara statis akan memberi Anda output sebagai nilai 1.
itu sederhana berarti bahwa Anda mengambil nomor kolom pertama dari tabel ,,,, berarti pilih Emply_num, Empl_no Dari Karyawan; di sini Anda menggunakan pilih 1 dari Karyawan; itu berarti Anda mengambil kolom Emply_num. Terima kasih
Saya ingat sintaks seperti itu, tetapi khusus untuk database yang tidak dapat saya ingat. Postgresql?
diynevala
0
Alasannya adalah satu lagi, setidaknya untuk MySQL. Ini dari manual MySQL
InnoDB menghitung nilai kardinalitas indeks untuk tabel saat pertama kali tabel diakses setelah startup, alih-alih menyimpan nilai tersebut dalam tabel. Langkah ini dapat mengambil waktu yang signifikan pada sistem yang mempartisi data menjadi banyak tabel. Karena overhead ini hanya berlaku untuk operasi buka tabel awal, untuk "menghangatkan" tabel untuk digunakan nanti, akses langsung setelah startup dengan mengeluarkan pernyataan seperti SELECT 1 FROM tbl_name LIMIT 1
Jawaban:
SELECT 1 FROM TABLE_NAME
berarti, "Kembalikan 1 dari tabel". Ini cukup biasa-biasa saja, jadi biasanya akan digunakan denganWHERE
dan seringEXISTS
(seperti @gbn mencatat, ini tidak selalu merupakan praktik terbaik, namun, cukup umum untuk dicatat, bahkan jika itu tidak benar-benar bermakna ( yang mengatakan, saya akan menggunakannya karena orang lain menggunakannya dan itu "lebih jelas" segera. Tentu saja, itu mungkin masalah ayam kental vs telur, tapi saya biasanya tidak tinggal di sini)).Pada dasarnya, di atas akan mengembalikan semuanya dari tabel 1 yang memiliki ID yang sesuai dari tabel 2. (Ini adalah contoh yang dibuat-buat, jelas, tapi saya percaya itu menyampaikan ide. Secara pribadi, saya mungkin akan melakukan hal di atas
SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);
seperti yang saya lihat sebagai JAUH lebih eksplisit untuk pembaca kecuali ada alasan kuat untuk tidak).EDIT
Sebenarnya ada satu kasus yang saya lupa sampai sekarang. Dalam kasus di mana Anda mencoba menentukan keberadaan nilai dalam database dari bahasa luar, terkadang
SELECT 1 FROM TABLE_NAME
akan digunakan. Ini tidak menawarkan manfaat yang signifikan dibandingkan dengan memilih satu kolom, tetapi, tergantung pada implementasinya, itu mungkin menawarkan keuntungan besar daripada melakukanSELECT *
, hanya karena sering kali semakin banyak kolom yang dikembalikan DB ke bahasa, semakin besar data struktur, yang pada gilirannya berarti lebih banyak waktu akan diambil.sumber
...EXISTS (SELECT 1...
select 1 from table
akan mengembalikan 1 konstan untuk setiap baris tabel. Ini berguna ketika Anda ingin menentukan dengan murah apakah catatan cocok denganwhere
klausa Anda dan / ataujoin
.sumber
Jika Anda bermaksud sesuatu seperti
maka itu adalah mitos bahwa
1
itu lebih baik daripadaThe
1
atau*
di EXISTS diabaikan dan Anda dapat menulis ini sebagai per Halaman 191 dari ANSI SQL 1992 Standard :sumber
exists (select 1/0
berfungsi seperti pesonaia melakukan apa yang dikatakannya - ia akan selalu mengembalikan bilangan bulat 1. Ini digunakan untuk memeriksa apakah catatan yang cocok dengan klausa tempat Anda berada.
sumber
select 1 from table
digunakan oleh beberapa database sebagai permintaan untuk menguji koneksi untuk melihat apakah itu hidup, sering digunakan ketika mengambil atau mengembalikan koneksi ke / dari kumpulan koneksi.sumber
Hasilnya adalah
1
untuk setiap catatan dalam tabel.sumber
Meskipun tidak diketahui secara luas, kueri dapat memiliki
HAVING
klausa tanpaGROUP BY
klausa.Dalam keadaan seperti itu,
HAVING
klausa diterapkan ke seluruh set. Jelas,SELECT
klausa tidak dapat merujuk ke kolom mana pun, jika tidak Anda akan (memperbaiki) kesalahan, "Kolom tidak valid dalam pilih karena tidak terkandung dalam GROUP BY" dll.Oleh karena itu, nilai literal harus digunakan (karena SQL tidak mengizinkan resultset dengan nol kolom - mengapa ?!) dan nilai literal 1 (
INTEGER
) umumnya digunakan: jikaHAVING
klausa mengevaluasiTRUE
maka resultset akan menjadi satu baris dengan satu kolom yang menunjukkan nilai 1, jika tidak Anda mendapatkan set kosong.Contoh: untuk menemukan apakah suatu kolom memiliki lebih dari satu nilai berbeda:
sumber
SELECT MIN(colA) < MAX(colA) FROM tableA
?Untuk sedikit lebih spesifik, Anda akan menggunakan ini untuk melakukannya
bukannya melakukan
karena Anda tidak peduli melihat hasilnya. Meminta nomor 1 sangat mudah untuk basis data (karena tidak perlu melakukan pencarian).
sumber
Jika Anda tidak tahu ada data di tabel Anda atau tidak, Anda bisa menggunakan kueri berikut:
Sebagai Contoh:
Jadi, kami menggunakan kueri SQL ini untuk mengetahui apakah ada data di tabel & jumlah baris menunjukkan berapa banyak baris yang ada di tabel ini.
sumber
Ini berarti bahwa Anda menginginkan nilai " 1 " sebagai output atau Sebagian besar waktu digunakan sebagai Kueri Batin karena untuk beberapa alasan Anda ingin menghitung kueri luar berdasarkan hasil kueri dalam .. tidak semua waktu Anda menggunakan 1 tetapi Anda memiliki beberapa nilai spesifik ...
Ini secara statis akan memberi Anda output sebagai nilai 1.
sumber
Jika Anda hanya ingin memeriksa benar atau salah berdasarkan klausa WHERE, pilih 1 dari tabel di mana kondisi adalah cara termurah.
sumber
Saya melihatnya selalu digunakan dalam injeksi SQL, seperti:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Angka-angka ini dapat digunakan untuk menebak di mana basis data ada dan menebak nama kolom dari database yang Anda tentukan. Dan nilai-nilai tabel.
sumber
itu sederhana berarti bahwa Anda mengambil nomor kolom pertama dari tabel ,,,, berarti pilih Emply_num, Empl_no Dari Karyawan; di sini Anda menggunakan pilih 1 dari Karyawan; itu berarti Anda mengambil kolom Emply_num. Terima kasih
sumber
Alasannya adalah satu lagi, setidaknya untuk MySQL. Ini dari manual MySQL
sumber
Ini hanya digunakan untuk kenyamanan dengan JIKA ADA (). Kalau tidak, kamu bisa ikut
select * from [table_name]
Image Dalam kasus 'JIKA ADA', kita hanya perlu tahu bahwa ada baris dengan kondisi tertentu ada atau tidak peduli apa isi dari baris.
select 1 from Users
kode contoh di atas, mengembalikan no. baris sama dengan no. pengguna dengan 1 dalam kolom tunggal
sumber