Ο τελεστής «διάφορο» (not equal), που γράφεται <> ή !=, είναι αληθής όταν δύο τιμές διαφέρουν. Βάλε τον σε ένα WHERE για να αφήσεις έξω τις γραμμές που ταιριάζουν με μια τιμή. Τα παραδείγματα δουλεύουν σε PostgreSQL, MySQL, SQLite και SQL Server.
Πώς χρησιμοποιείς το not equal
Βάλε <> ή != ανάμεσα σε δύο τιμές. Σημαίνουν ακριβώς το ίδιο. Το <> είναι η γραφή του προτύπου SQL, ενώ το != είναι αυτή που χρησιμοποιούν οι περισσότερες γλώσσες προγραμματισμού.
value1 <> value2
value1 != value2
SELECT 5 <> 3;
-- Output: true
SELECT 'apple' != 'apple';
-- Output: false
SELECT NULL <> 3;
-- Output: NULL
-- MySQL and SQLite show true and false as 1 and 0. SQL Server can't
-- select a comparison like this: use it in a WHERE clause there.
Σε ένα query, το not equal μπαίνει στο WHERE και κρατά κάθε γραμμή με διαφορετική τιμή:
-- Input: tickets
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 2 | Typo on pricing page | closed
-- 3 | Export times out | pending
-- 4 | Add a dark theme | NULL
SELECT id, subject, status
FROM tickets
WHERE status <> 'closed';
-- Output:
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 3 | Export times out | pending
Το ticket 4 δεν εμφανίζεται στο αποτέλεσμα, παρόλο που το status του δεν είναι 'closed'. Αυτός είναι ο πρώτος κανόνας παρακάτω.
Κανόνες που πρέπει να ξέρεις
-
Το not equal δεν ταιριάζει ποτέ με NULL. Η σύγκριση του NULL με οτιδήποτε δίνει NULL (άγνωστο) και όχι true, οπότε το
WHEREαπορρίπτει τη γραμμή. ΠρόσθεσεOR column IS NULLγια να κρατήσεις γραμμές χωρίς τιμή:
-- Input: the tickets table above
SELECT id, subject, status
FROM tickets
WHERE status <> 'closed' OR status IS NULL;
-- Output:
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 3 | Export times out | pending
-- 4 | Add a dark theme | NULL
-
Ένα NULL σε λίστα
NOT INαφαιρεί κάθε γραμμή. Τοstatus NOT IN ('closed', 'pending')είναι συντομογραφία τουstatus <> 'closed' AND status <> 'pending', οπότε ένα μόνο NULL στη λίστα κάνει όλη τη συνθήκη άγνωστη. Πρόσεξέ το όταν η λίστα προέρχεται από subquery σε στήλη που επιτρέπει NULL:
-- Input: the tickets table above
SELECT id, status FROM tickets WHERE status NOT IN ('closed', 'pending');
-- Output:
-- id | status
-- ---+-------
-- 1 | open
SELECT id, status FROM tickets WHERE status NOT IN ('closed', NULL);
-- Output:
-- id | status
-- ---+-------
-- (0 rows)
-
Η MySQL και ο SQL Server αγνοούν τα πεζά/κεφαλαία από προεπιλογή, οπότε εκεί το
'Apple' <> 'apple'είναι false. -
Όταν μπορείς, ζήτα αυτό που θέλεις. Το
status <> 'closed'ταιριάζει και με κάθε status που θα προσθέσει κάποιος αργότερα, και επειδή συνήθως ταιριάζει με το μεγαλύτερο μέρος του πίνακα, η βάση δεδομένων σπάνια βοηθιέται από κάποιο index. Αν εννοείς «open ή pending», τοstatus IN ('open', 'pending')το λέει ξεκάθαρα.
Εναλλακτική σύνταξη
Το NOT (status = 'closed') είναι ένας άλλος τρόπος να γράψεις status <> 'closed' και παραλείπει τα NULL με τον ίδιο τρόπο.
Για σύγκριση χωρίς την έκπληξη του NULL, χρησιμοποίησε το IS DISTINCT FROM, ένα NULL-safe not equal που αντιμετωπίζει το NULL ως ξεχωριστή τιμή (ο SQL Server το πρόσθεσε το 2022, η SQLite στην 3.39):
-- Input: the tickets table above
SELECT id, status FROM tickets WHERE status IS DISTINCT FROM 'closed';
-- Output:
-- id | status
-- ---+--------
-- 1 | open
-- 3 | pending
-- 4 | NULL
-- MySQL has no IS DISTINCT FROM. Use its NULL-safe <=> instead:
SELECT id, status FROM tickets WHERE NOT (status <=> 'closed');
Πότε να χρησιμοποιείς το not equal;
Χρησιμοποίησε το not equal όταν ένα query πρέπει να παραλείπει τις γραμμές με μια συγκεκριμένη τιμή. Οι περισσότερες χρήσεις ανήκουν σε μία από αυτές τις πέντε.
Φιλτράρισμα ενός status ή μιας κατηγορίας
Ακυρωμένες παραγγελίες, άκυρα τιμολόγια, μια κατηγορία που δεν έχεις σε απόθεμα: το <> αφήνει έξω τις γραμμές με αυτή την τιμή και κρατά όλες τις υπόλοιπες.
Παράλειψη μιας συγκεκριμένης εγγραφής
Σύγκρινε ένα id για να αφήσεις έξω μια γραμμή ή ομάδα: το άρθρο που διαβάζει κάποιος όταν δείχνεις σχετικά άρθρα, τον συνδεδεμένο χρήστη σε μια λίστα με άλλα μέλη ή ένα τμήμα σε μια εταιρική αναφορά. Οι αριθμοί δεν χρειάζονται εισαγωγικά.
Περιορισμός αποτελεσμάτων με άλλες συνθήκες
Συνδύασε το <> με AND και OR για να εξαιρέσεις μια τιμή ενώ φιλτράρεις σε άλλες στήλες, όπως παραγγελίες που δεν είναι ακυρωμένες και ξεπερνούν ένα ποσό. Για να εξαιρέσεις πολλές τιμές της ίδιας στήλης, χρησιμοποίησε NOT IN.
Εύρεση γραμμών όπου δύο στήλες διαφέρουν
Το not equal δουλεύει και ανάμεσα σε δύο στήλες. Σύγκρινε μια παλιά τιμή με μια νέα, μια μετρημένη ποσότητα με την καταγεγραμμένη ή μια διεύθυνση αποστολής με μια διεύθυνση χρέωσης.
Διατήρηση γραμμών με τιμή που λείπει
Επειδή το <> παραλείπει τα NULL, αποφάσισε αν οι γραμμές χωρίς τιμή ανήκουν στο αποτέλεσμα. Πρόσθεσε OR column IS NULL για να τις κρατήσεις ή χρησιμοποίησε την NULL-safe σύνταξη παραπάνω.
Πραγματικά παραδείγματα του not equal
Σύνολο των τιμολογίων που μετράνε
Τα άκυρα τιμολόγια δεν πρέπει να μετράνε στα έσοδα:
-- Input: invoices
-- invoice_id | customer | status | amount
-- -----------+------------+--------+--------
-- 1001 | Acme Corp | paid | 1200.00
-- 1002 | Birch & Co | void | 450.00
-- 1003 | Acme Corp | open | 300.00
-- 1004 | Cobalt Ltd | paid | 875.50
SELECT SUM(amount) AS invoiced
FROM invoices
WHERE status <> 'void';
-- Output: 2375.50
Λίστα σχετικών άρθρων, εκτός από αυτό που διαβάζεται
Ένας αναγνώστης βρίσκεται στο άρθρο 2. Δείξε τα άλλα άρθρα με το ίδιο θέμα:
-- Input: articles
-- id | title | topic
-- ---+----------------------+-------
-- 1 | Indexing basics | SQL
-- 2 | Your first JOIN | SQL
-- 3 | Docker for beginners | DevOps
-- 4 | Window functions | SQL
SELECT id, title
FROM articles
WHERE topic = 'SQL'
AND id <> 2;
-- Output:
-- id | title
-- ---+-----------------
-- 1 | Indexing basics
-- 4 | Window functions
Εμφάνιση μόνο προϊόντων που μπορείς να πουλήσεις
Άφησε έξω τα προϊόντα που καταργήθηκαν, όσα δεν έχουν τιμή και όσα έχουν εξαντληθεί:
-- Input: products
-- product_name | category | price | stock_quantity
-- ---------------+--------------+-------+---------------
-- Desk Organizer | Office | 18.50 | 40
-- Fax Machine | Discontinued | 89.00 | 3
-- Gift Wrap | Seasonal | 0.00 | 120
-- Trail Backpack | Outdoors | 64.00 | 0
-- Water Bottle | Outdoors | 12.99 | 75
SELECT product_name, category, price
FROM products
WHERE category <> 'Discontinued'
AND price > 0
AND stock_quantity <> 0;
-- Output:
-- product_name | category | price
-- ---------------+----------+------
-- Desk Organizer | Office | 18.50
-- Water Bottle | Outdoors | 12.99
Εύρεση των πεδίων που άλλαξαν πραγματικά
Ένα audit log καταγράφει κάθε αποθήκευση, ακόμα και αυτές που δεν άλλαξαν τίποτα. Σύγκρινε τις δύο στήλες για να κρατήσεις μόνο τις πραγματικές αλλαγές:
-- Input: audit_log
-- log_id | field_name | old_value | new_value
-- -------+------------+-------------+------------
-- 1 | email | dan@old.com | dan@new.com
-- 2 | city | Austin | Austin
-- 3 | plan | free | pro
SELECT log_id, field_name, old_value, new_value
FROM audit_log
WHERE old_value <> new_value;
-- Output:
-- log_id | field_name | old_value | new_value
-- -------+------------+-------------+------------
-- 1 | email | dan@old.com | dan@new.com
-- 3 | plan | free | pro
Αν κάποια από τις στήλες μπορεί να είναι NULL, χρησιμοποίησε IS DISTINCT FROM (ή NOT (old_value <=> new_value) στη MySQL), αλλιώς μια τιμή που ορίζεται για πρώτη φορά δεν θα μετρήσει ως αλλαγή.
Υπενθύμιση σε όσους δεν έχουν πει ναι
Οι καλεσμένοι που δεν έχουν απαντήσει έχουν rsvp NULL, και αυτοί χρειάζονται την υπενθύμιση περισσότερο απ' όλους:
-- Input: invitations
-- guest | email | rsvp
-- ------------+------------------+------
-- Ines Moreau | ines@example.com | yes
-- Raj Patel | raj@example.com | no
-- Hana Sato | hana@example.com | NULL
-- Leo Grant | leo@example.com | maybe
SELECT guest, email, rsvp
FROM invitations
WHERE rsvp <> 'yes' OR rsvp IS NULL;
-- Output:
-- guest | email | rsvp
-- ----------+------------------+------
-- Raj Patel | raj@example.com | no
-- Hana Sato | hana@example.com | NULL
-- Leo Grant | leo@example.com | maybe
Περισσότερα για το not equal
Σε αυτό το blog:
- Οδηγός για το SQL COALESCE: αντικατέστησε τα NULL με μια τιμή πριν συγκρίνεις
-
Οδηγός για το SQL LIKE:
NOT LIKEγια να αφήνεις έξω κείμενο που ταιριάζει με ένα μοτίβο - Οδηγός για το SQL CASE: χρησιμοποίησε συγκρίσεις για να επιλέξεις μια τιμή
- Having vs Where στην SQL: πού μπαίνει ένα φίλτρο όταν ομαδοποιείς γραμμές
- Σύγκριση δύο τιμών στην PostgreSQL: οι άλλοι τελεστές σύγκρισης
Επίσημη τεκμηρίωση:
- PostgreSQL: Τελεστές σύγκρισης
- MySQL:
<>και!= - SQLite: Τελεστές
-
SQL Server:
<>,!=και IS DISTINCT FROM
Το Beekeeper Studio είναι ένα δωρεάν & open source GUI για βάσεις δεδομένων
Το καλύτερο εργαλείο για SQL queries & επεξεργασία που έχω χρησιμοποιήσει ποτέ. Μου δίνει ό,τι χρειάζομαι για να διαχειρίζομαι τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit
Το Beekeeper Studio είναι γρήγορο, εύχρηστο και κατανοητό με την πρώτη ματιά. Υποστηρίζει πάρα πολλές βάσεις δεδομένων και δουλεύει άψογα σε Windows, Mac και Linux.
Τι λένε οι χρήστες για το Beekeeper Studio
«Το Beekeeper Studio αντικατέστησε πλήρως την παλιά μου ροή εργασίας με SQL. Είναι γρήγορο, εύχρηστο και κάνει τη δουλειά με βάσεις δεδομένων ξανά ευχάριστη.»
«Έχω δοκιμάσει πολλά GUI για βάσεις δεδομένων, αλλά το Beekeeper βρίσκει την τέλεια ισορροπία ανάμεσα σε δυνατότητες και απλότητα. Απλώς δουλεύει.»