Apa maksudnya dengan memilih 1 dari tabel?


146

Saya telah melihat banyak pertanyaan dengan sesuatu sebagai berikut.

Select 1  
From table

Apa artinya ini 1, bagaimana itu akan dieksekusi dan, apa yang akan kembali?

Juga, dalam jenis skenario apa, dapatkah ini digunakan?


Tolong tunjukkan kami permintaan lengkapnya
gbn

Jawaban:


107

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 WHERE EXISTS (
     SELECT 1 FROM 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.


1
Jawaban ini paling masuk akal bagi saya
Joseph Astrahan

2
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!
Fahad Javed

41

Jika Anda bermaksud sesuatu seperti

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

maka itu adalah mitos bahwa 1itu lebih baik daripada

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

The 1atau *di EXISTS diabaikan dan Anda dapat menulis ini sebagai per Halaman 191 dari ANSI SQL 1992 Standard :

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

1
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.


22
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.


2
Itu adalah kasus saya, itu cukup umum di antara aplikasi JBOSS dan TOMCAT.
Valter Silva

13

Hasilnya adalah 1untuk setiap catatan dalam tabel. __


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:

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

"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

SELECT 1 FROM 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:

SELECT 1 FROM employee;
  1. Ini akan mengembalikan kolom yang berisi jumlah baris & semua baris memiliki nilai konstan yang sama 1 (untuk kali ini mengembalikan 1 untuk semua baris);
  2. 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.


3

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.


3

Jika Anda hanya ingin memeriksa benar atau salah berdasarkan klausa WHERE, pilih 1 dari tabel di mana kondisi adalah cara termurah.


2

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.


0

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


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.