Haruskah saya menggunakan! = Atau <> karena tidak sama dengan T-SQL?

801

Saya telah melihat SQLbahwa penggunaan baik !=dan <>untuk tidak sama . Apa sintaks yang disukai dan mengapa?

Saya suka !=, karena <>mengingatkan saya pada Visual Basic.

Bob The Janitor
sumber
Portabilitas kode. Jika persyaratan Anda mudah dipenuhi oleh ANSI SQL, maka lebih baik menggunakannya. Anda dapat menggunakan kode yang sama di semua DB. Misalnya. Seorang penulis buku SQL yang ingin menggambarkan SQL dasar menggunakan kode sampel.
Steam
1
Saya ingin menambahkan contoh di mana hanya memiliki kode SQL ANSI dapat menjadi masalah - Standar SQL mendukung opsi NULLS FIRST dan NULLS LAST untuk mengontrol bagaimana NULLs menyortir, tetapi T-SQL tidak mendukung opsi ini.
Steam
Tidak perlu membuka kembali. Pertanyaan yang ditandai adalah duplikat, hanya diperpanjang dengan satu opsi lagi NOT (A = B),.
TLama
@Steam, Anda harus menentukan versi tahun dari ansi sql persis yang Anda maksud. Beberapa versi ini bahkan mengharuskan Anda untuk menentukan tingkat kompatabilitas atau bagian yang tepat dari standar tersebut. Manakah dari mereka yang memperkenalkan NULLS FIRST dan NULLS LAST?
Gherman

Jawaban:

539

Secara teknis mereka berfungsi sama jika Anda menggunakan SQL Server AKA T-SQL. Jika Anda menggunakannya dalam prosedur tersimpan, tidak ada alasan kinerja untuk menggunakannya. Kemudian turun ke preferensi pribadi. Saya lebih suka menggunakan <> karena sesuai dengan ANSI.

Anda dapat menemukan tautan ke berbagai standar ANSI di ...

http://en.wikipedia.org/wiki/SQL

DBAndrew
sumber
41
Saya selalu lebih suka menggunakan !=karena keberadaannya dalam setiap bahasa yang dipengaruhi C yang saya gunakan, dan karena dokumentasi Python mengatakan: "Bentuk <>dan !=setara; untuk konsistensi dengan C, !=lebih disukai; di mana !=disebutkan di bawah <>ini juga diterima. The <>ejaan dianggap usang." Tapi SQL bukan Python!
Iain Samuel McLean Penatua
24
Saya suka menggunakan <> karena ini mengingatkan saya pada XML. Tapi SQL bukan XML!
Rob Grant
32
Iya; Microsoft sendiri merekomendasikan penggunaan <>lebih dari !=khusus untuk kepatuhan ANSI, misalnya dalam kit pelatihan Microsoft Press untuk ujian 70-461, "Querying Microsoft SQL Server", mereka mengatakan "Sebagai contoh kapan harus memilih formulir standar, T-SQL mendukung dua" tidak sama dengan "operator: <> dan! =. Yang pertama adalah standar dan yang terakhir tidak. Kasing ini haruslah yang lebih mulia: pilih yang standar!"
Matt Gibson
10
Saya suka <> karena lebih mudah mengetik.
user2023861
731

Sebagian besar basis data mendukung !=(bahasa pemrograman populer) dan <>(ANSI).

Database yang mendukung keduanya !=dan <>:

Basis data yang mendukung operator standar ANSI, secara eksklusif :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>
Bill Karwin
sumber
Django ORM meminta peta untuk NOT (a = b)bukannya (a <> b)atau (a != b). Apakah secara internal sama?
pengguna
7
@ buffer, secara logika mereka sama, yaitu, itu akan cocok atau mengecualikan set baris yang sama. Tetapi apakah merek RDBMS tertentu mengoptimalkannya sama, itu tergantung pada implementasi. Yang mengatakan, saya akan terkejut jika ada perbedaan di seluruh merek database.
Bill Karwin
catatan tambahan: LINQ dalam C # yang harus Anda gunakan! =
Tom Stickel
! = didukung oleh IBM DB2 LUW 10.5+
Cristi S.
10
@TomStickel LINQ di C # bukan SQL.
Craig
109

'<>'berasal dari standar SQL-92 dan '!='merupakan operator T-SQL berpemilik . Ini tersedia di database lain juga, tetapi karena itu bukan standar Anda harus mengambilnya berdasarkan kasus per kasus.

Dalam kebanyakan kasus, Anda akan tahu database apa yang Anda hubungkan sehingga ini bukan masalah. Paling buruk Anda mungkin harus melakukan pencarian dan ganti dalam SQL Anda.

Adam Lassek
sumber
Saya telah melihat mysql sql menggunakannya juga
Bob The Janitor
3
Bisakah kita terus menyebut ekstensi yang begitu luas ke bahasa standar sebagai bahasa yang dipatenkan ? Pada titik ini, sepertinya standar harus diperbarui untuk mengharuskan, atau setidaknya memungkinkan kedua sintaks.
Johan Boulé
3
@JohanBoule yah, ada standar tertulis untuk SQL dan setahu saya !=bukan bagian darinya. Meskipun untuk semua tujuan praktis itu adalah standar de facto, kita tidak boleh membingungkan apa yang menjadi dan bukan fitur standar.
Adam Lassek
24

Keduanya valid dan sama sehubungan dengan SQL Server ,

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation

madcolor
sumber
Itu spesifik SQL Server. Memang dia bertanya tentang SQL Server, tetapi dapatkah Anda menemukan referensi spesifikasi ANSI untuk melihat apakah dijamin portabel untuk kita yang suka mengetahui hal semacam itu?
Joel Coehoorn
6
@ Joel Coehoorn, jika Anda sangat porting kode T-SQL Anda "<>" dan "! =" Akan menjadi yang paling sedikit dari kekhawatiran Anda !!
KM.
1
Porting bukanlah masalah - ini saat, sebagai pengembang, Anda harus bolak-balik di antara lingkungan. Konsistensi baik.
Mark Ransom
20

Tampaknya Microsoft sendiri lebih memilih <>untuk !=dibuktikan di kendala meja mereka. Saya pribadi lebih suka menggunakan !=karena saya dengan jelas membacanya sebagai "tidak sama", tetapi jika Anda memasukkan [field1 != field2]dan menyimpannya sebagai constrait, kali berikutnya Anda meminta, itu akan muncul sebagai [field1 <> field2]. Ini mengatakan kepada saya bahwa cara yang benar untuk melakukannya adalah <>.

Kyle
sumber
15

!=, Meskipun non-ANSI, lebih dalam semangat sebenarnya dari SQL sebagai bahasa yang dapat dibaca. Jeritannya tidak sama. <>mengatakan itu padaku (kurang dari, lebih besar dari) yang aneh. Saya tahu tujuannya adalah bahwa itu kurang dari atau lebih besar dari itu tidak sama, tapi itu cara yang sangat rumit untuk mengatakan sesuatu yang sangat sederhana.

Saya baru saja harus mengambil beberapa pertanyaan SQL panjang dan menempatkannya dengan penuh kasih ke dalam file XML untuk sejumlah alasan bodoh saya tidak akan masuk ke.

Cukuplah untuk mengatakan XML tidak down <>sama sekali dan saya harus mengubahnya !=dan memeriksa diri saya sebelum saya dengan susah payah menghancurkan diri saya sendiri.

Fat Albert
sumber
6
mengapa tidak hanya CDATA saja? apa yang terjadi ketika permintaan Anda mengandung XML?
Janus Troelsen
12

Anda dapat menggunakan mana yang Anda suka di T-SQL. Dokumentasi mengatakan keduanya berfungsi dengan cara yang sama. Saya lebih suka !=, karena berbunyi "tidak sama" dengan pikiran saya (C / C ++ / C #), tetapi guru basis data tampaknya lebih suka <>.

Steve
sumber
10

Saya mengerti bahwa sintaks C !=dalam SQL Server karena warisan Unix (kembali pada hari-hari Sybase SQL Server, sebelum Microsoft SQL Server 6.5).

Karl
sumber
7

Salah satu alternatifnya adalah menggunakan operator NULLIF selain <>atau !=yang mengembalikan NULL jika kedua argumen tersebut sama dengan NULLIF di Microsoft Documents . Jadi saya percaya klausa WHERE dapat dimodifikasi untuk <>dan !=sebagai berikut:

NULLIF(arg1, arg2) IS NOT NULL

Ketika saya menemukan itu, menggunakan <>dan !=tidak berfungsi untuk tanggal dalam beberapa kasus. Oleh karena itu menggunakan ungkapan di atas tidak perlu.

jitendrapurohit
sumber
6
Saya tidak yakin apakah fungsi ini akan berfungsi dengan baik <>sehubungan dengan penggunaan indeks dalam semua kasus sudut. Selain itu, keterbacaannya tentu jauh lebih buruk ...
Lukas Eder
Seperti yang saya sebutkan dalam jawaban, ini bekerja untuk saya di bidang tanggal di sana pada tahun 2014. Tidak yakin apa klausa / kondisi yang membatasi jawaban lain, tetapi melihat beberapa upvotes, ini tampaknya membantu orang lain juga.
jitendrapurohit
1

Saya lebih suka menggunakan !=daripada <>karena kadang-kadang saya menggunakan <s></s>sintaks untuk menulis perintah SQL. Menggunakan !=lebih berguna untuk menghindari kesalahan sintaksis dalam kasus ini.

Andrea Antonangeli
sumber
-6

Keduanya diterima dalam T-SQL. Namun, tampaknya menggunakan <>jauh lebih cepat daripada menggunakan!= . Saya baru saja menjalankan kueri kompleks yang digunakan !=, dan butuh rata-rata sekitar 16 detik untuk berjalan. Saya mengubahnya menjadi <>dan permintaan sekarang rata-rata berjalan sekitar 4 detik. Itu peningkatan besar!

Dusun Javier
sumber
20
Jika Anda menjalankan dua kueri yang sama satu demi satu di SQL Server, kemungkinan data di-cache dalam memori dan dioptimalkan untuk kueri yang serupa. Jika Anda melakukannya dengan urutan terbalik, Anda mungkin menemukan hasil sebaliknya!
codemonkey
2
Ini juga salah, mereka tidak akan memiliki dua operator yang berfungsi sama persis dan satu lebih lambat "hanya karena". Ada banyak faktor penyebab mengapa permintaan yang sama akan menghasilkan waktu eksekusi yang berbeda.
Elliot Peluang
-11

Meskipun mereka berfungsi dengan cara yang sama, !=berarti persis "tidak sama dengan", sementara itu <>berarti lebih dari dan kurang dari nilai yang disimpan.

Pertimbangkan >=atau <=, dan ini akan masuk akal ketika memfaktorkan dalam indeks Anda ke kueri ... <>akan berjalan lebih cepat dalam beberapa kasus (dengan indeks yang tepat), tetapi dalam beberapa kasus lain (bebas indeks) mereka akan berjalan sama saja.

Ini juga tergantung pada bagaimana sistem database Anda membaca nilai !=dan <>. Penyedia basis data dapat memintasnya dan membuatnya berfungsi sama, jadi tidak ada manfaatnya. PostgreSQL dan SQL Server tidak memintaskan ini; itu dibaca seperti yang muncul di atas.

Kevin Kinchen
sumber
3
Apakah Anda memiliki referensi pendukung untuk pernyataan Anda? Kedua operator tampaknya persis sama di PostgreSQL , Oracle dan MySQL .
GhostGambler
8
Ini benar-benar salah, mungkin terlihat seperti "lebih besar dari dan kurang dari nilai yang disimpan" ketika Anda menggabungkan karakter-karakter itu dalam pikiran Anda, tetapi bagi lexer itu hanyalah cara lain untuk mewakili token.
Elliot Peluang
Kurangnya sumber daya terkait!
mostafa8026