Αποκωδικοποίηση της Εντολής SQL UPDATE

Μάθετε πώς να χρησιμοποιείτε την εντολή SQL UPDATE για την ενημέρωση των εγγραφών σε έναν πίνακα βάσης δεδομένων.

Ως προγραμματιστής, θα πρέπει να αισθάνεστε άνετα να εργάζεστε με σχεσιακές βάσεις δεδομένων. Η SQL (ή Structured Query Language) είναι μια γλώσσα φιλική προς τους αρχάριους, η οποία είναι διαισθητική στην εκμάθηση και έχει απλή σύνταξη. Η SQL σάς επιτρέπει να δημιουργείτε αντικείμενα βάσης δεδομένων και να ρωτάτε σχεσιακούς πίνακες βάσεων δεδομένων.

Μπορείτε να εκτελέσετε ερωτήματα SQL για να δημιουργήσετε, να διαβάσετε, να ενημερώσετε και να διαγράψετε εγγραφές σε έναν πίνακα βάσης δεδομένων. Ίσως γνωρίζετε ότι αυτές οι λειτουργίες ονομάζονται συλλογικά πράξεις CRUD.

Για να ενημερώσετε τις εγγραφές που είναι αποθηκευμένες σε έναν πίνακα βάσης δεδομένων, μπορείτε να εκτελέσετε την εντολή UPDATE στην SQL.

Σε αυτό το σεμινάριο, θα μάθετε:

  • Η σύνταξη της εντολής UPDATE
  • Τρόπος ενημέρωσης εγγραφών με βάση μια συγκεκριμένη συνθήκη ή πολλαπλές συνθήκες που συνδέονται μεταξύ τους χρησιμοποιώντας λογικούς τελεστές
  • Κοινή προειδοποίηση που πρέπει να γνωρίζετε κατά την εκτέλεση της εντολής SQL UPDATE

Σύνταξη της Εντολής SQL UPDATE

Η σύνταξη της εντολής SQL UPDATE είναι:

UPDATE table_name
SET column = new_value
WHERE condition;

Το παραπάνω ερώτημα ενημερώνει τη στήλη για όλες τις εγγραφές όπου η συνθήκη είναι αληθής.

Για να ενημερώσετε πολλές στήλες (ή πεδία), χρησιμοποιήστε την εντολή SQL UPDATE ως εξής:

UPDATE table_name
SET column_1 = new_value_1, column_2 = new_value_2, ..., column_k = new_value_k
WHERE condition;

Θυμηθείτε ότι σε μια σχεσιακή βάση δεδομένων:

  • Ο πίνακας αντιπροσωπεύει μια οντότητα.
  • Οι σειρές του πίνακα είναι οι εγγραφές και αντιπροσωπεύουν ένα παράδειγμα της οντότητας.
  • Οι στήλες ονομάζονται επίσης πεδία ή χαρακτηριστικά. Σε αυτό το σεμινάριο, θα χρησιμοποιήσουμε στήλες και πεδία εναλλακτικά.

Παραδείγματα χρήσης εντολών SQL UPDATE

Τώρα ας πάρουμε μερικά παραδείγματα.

Προαπαιτούμενα

Πριν ξεκινήσετε την κωδικοποίηση:

  • Αυτό το σεμινάριο χρησιμοποιεί SQLite. Επομένως, θα χρειαστεί να έχετε SQLite και Πρόγραμμα περιήγησης βάσης δεδομένων SQLite (συνιστάται) να κωδικοποιήσετε μαζί. Σημειώστε ότι μπορείτε επίσης να χρησιμοποιήσετε MySQL ή PostgreSQL.
  • Εάν θέλετε να αναπαράγετε το παράδειγμα, χρειάζεστε Python και το Πακέτο Faker Python επισης.
  Υπάρχει American Truck Simulator για το Xbox One;

Δημιουργία πίνακα βάσεων δεδομένων με εγγραφές

Εάν θέλετε να κωδικοποιήσετε μαζί με αυτό το σεμινάριο, τότε μπορείτε να εκτελέσετε το ακόλουθο απόσπασμα κώδικα για να δημιουργήσετε και να συνδεθείτε σε μια βάση δεδομένων πελατών customer_db.db. Σημειώστε ότι χρησιμοποιούμε τη βιβλιοθήκη Faker Python για τη δημιουργία συνθετικών δεδομένων για εισαγωγή στον πίνακα πελατών:

# main.py

import sqlite3
from faker import Faker
import random

# connect to the db
conn = sqlite3.connect('customer_db.db')
cur = conn.cur()

# create a database table
cur.execute('''CREATE TABLE customers (
                  customerID INTEGER PRIMARY KEY,
                  name TEXT,
                  city TEXT,
                  email TEXT,
                  num_orders INTEGER,
                  discount INTEGER DEFAULT 2)''')


# create a Faker object 
fake = Faker()
Faker.seed(42)

for _ in range(15):
    name = fake.name()
    city = fake.city()
    d = fake.domain_name()
    email = f"{name[:2]}.{city[:2]}@{d}"
    num_orders = random.choice(range(200))
    db_cursor.execute('INSERT INTO customers (name, city, email, num_orders) 
    VALUES (?,?,?,?)', (name,city,email,num_orders))

# commit the transaction 
conn.commit()
cur.close()
conn.close()

📑 Για να λειτουργεί αυτός ο κώδικας χωρίς σφάλματα, βεβαιωθείτε ότι έχετε Python 3.7 (ή νεότερη έκδοση) και Απατεών εγκατεστημένο στο περιβάλλον ανάπτυξης σας. Μπορείτε να εγκαταστήσετε το πακέτο Faker Python χρησιμοποιώντας το pip:

pip install faker

Εάν έχετε ήδη μια βάση δεδομένων στην οποία μπορείτε να συνδεθείτε και έναν πίνακα βάσης δεδομένων στον οποίο μπορείτε να υποβάλετε ερωτήματα, μπορείτε επίσης να τον χρησιμοποιήσετε όπως προτιμάτε.

Εκτέλεση του πρώτου μας ερωτήματος SQL

Ο πίνακας πελατών έχει τα ακόλουθα πεδία:

  • Αναγνωριστικό πελάτη: Το αναγνωριστικό πελάτη είναι το κύριο κλειδί που μας βοηθά να προσδιορίσουμε με μοναδικό τρόπο μια εγγραφή σε έναν πίνακα βάσης δεδομένων.
  • όνομα: Το όνομα του πελάτη
  • πόλη: Η πόλη στην οποία ανήκουν.
  • email: Η διεύθυνση email τους.
  • num_orders: Ο αριθμός των παραγγελιών που έχουν υποβάλει.
  • discount: Το ποσοστό έκπτωσης, ένας ακέραιος αριθμός με προεπιλεγμένη τιμή 2. Επειδή το πεδίο έκπτωσης έχει μια προεπιλεγμένη τιμή, δεν χρειάζεται να εισαγάγουμε μια τιμή για αυτό κατά τη συμπλήρωση του πίνακα της βάσης δεδομένων.

📝 Μπορείτε να εκτελέσετε τα ερωτήματα και να προβάλετε τα αποτελέσματα χρησιμοποιώντας τον πελάτη γραμμής εντολών SQLite. Ή μπορείτε να χρησιμοποιήσετε το πρόγραμμα περιήγησης βάσης δεδομένων SQLite.

  Πώς να δείτε πόσο ελεύθερο χώρο είναι διαθέσιμο στο DropBox

Θα παρουσιάσω τα αποτελέσματα από το SQLite DB Browser καθώς είναι εύκολο να ερμηνευτούν.

Εκτελέστε το ακόλουθο ερώτημα για να λάβετε όλες τις εγγραφές στον πίνακα πελατών:

SELECT * FROM customers;

Στην πράξη, θα πρέπει να αποφεύγετε τη χρήση του SELECT * εκτός εάν είναι απαραίτητο. Αλλά για αυτό το παράδειγμα, θα το χρησιμοποιήσουμε καθώς έχουμε μόνο 15 εγγραφές και όχι πολλά πεδία.

Ενημέρωση εγγραφών με βάση μια μόνο συνθήκη

Τώρα που ξέρουμε πώς μοιάζει ο πίνακάς μας, ας εκτελέσουμε μερικά ερωτήματα UPDATE για να ενημερώσουμε τις εγγραφές με βάση την απαιτούμενη συνθήκη.

📋 Σημείωση: Αφού εκτελέσουμε τις δηλώσεις UPDATE, θα εκτελέσουμε το SELECT * FROM πελάτες για να δούμε τις ενημερωμένες εγγραφές.

Ενημέρωση ενός ενιαίου πεδίου

Αρχικά, ας ενημερώσουμε το πεδίο πόλης της εγγραφής με customerID=7:

UPDATE customers
SET city='Codeshire'
WHERE customerID=7;

Ας επιλέξουμε όλες τις στήλες και τις εγγραφές από τον πίνακα πελατών:

SELECT * FROM customers;

Βλέπουμε ότι το πεδίο πόλης της Danielle Ford (customerID=7) έχει ενημερωθεί.

Ενημέρωση πολλών πεδίων

Στο προηγούμενο παράδειγμα, ενημερώσαμε μόνο ένα πεδίο, δηλαδή την πόλη της εγγραφής που αντιστοιχεί στο αναγνωριστικό πελάτη 7. Αλλά μπορούμε επίσης να ενημερώσουμε πολλά πεδία χρησιμοποιώντας τη σύνταξη που μάθαμε.

Εδώ ενημερώνουμε τόσο την πόλη όσο και το πεδίο ηλεκτρονικού ταχυδρομείου που αντιστοιχεί στο αναγνωριστικό πελάτη 1:

UPDATE customers
SET city='East Carlisle',email="[email protected]"
WHERE customerID=1;

Στη συνέχεια, τρέχουμε:

SELECT * FROM customers;

Και εδώ είναι η έξοδος:

Ενημέρωση πολλαπλών εγγραφών

Επειδή χρησιμοποιήσαμε το αναγνωριστικό πελάτη που είναι το πρωτεύον κλειδί που προσδιορίζει μοναδικά μια εγγραφή πελάτη, τα ερωτήματα που έχουμε εκτελέσει μέχρι στιγμής ενημέρωσαν μόνο μία από τις εγγραφές.

Ωστόσο, εάν η συνθήκη ισχύει για περισσότερες από μία εγγραφές στον πίνακα, τότε η εκτέλεση της εντολής ενημέρωσης SQL ενημερώνει όλες τις αντίστοιχες εγγραφές.

Πάρτε αυτό το ερώτημα για παράδειγμα:

UPDATE customers 
SET discount=10
WHERE num_orders > 170;

Τώρα εκτελέστε αυτό το ερώτημα:

SELECT * FROM customers;

Εδώ είναι η έξοδος:

Η εκτέλεση της παραπάνω εντολής ενημέρωσης SQL τροποποιεί τρεις εγγραφές. Όλες έχουν num_orders μεγαλύτερες από 170 και τώρα έχουν αξία έκπτωσης 10.

Ενημέρωση αρχείων με βάση πολλαπλές συνθήκες

Μέχρι στιγμής η ρήτρα WHERE είχε μια απλή συνθήκη, αλλά είναι σύνηθες το κριτήριο φιλτραρίσματος να έχει πολλαπλές συνθήκες που συνδέονται μεταξύ τους από λογικούς τελεστές.

  Πώς μπορώ να αφαιρέσω τον τρόπο πληρωμής από τον λογαριασμό DoorDash

Για να το καταλάβουμε αυτό, ας ορίσουμε την έκπτωση σε 5 με βάση δύο προϋποθέσεις:

  • πόλη LIKE “Νέο%”: αυτή η συνθήκη ελέγχει και περιλαμβάνει τις εγγραφές όπου το πεδίο πόλης ξεκινά με το Νέο, και
  • num_orders > 100 φίλτρα με βάση τον αριθμό των παραγγελιών για να περιλαμβάνουν μόνο εκείνες τις εγγραφές για τις οποίες ο αριθμός των παραγγελιών είναι μεγαλύτερος από 100.

Η δήλωση UPDATE μοιάζει με αυτό:

UPDATE customers
SET DISCOUNT=5
WHERE city LIKE 'New%' AND num_orders>100;

Παρατηρήστε ότι τώρα έχουμε δύο συνθήκες στον όρο WHERE—συνδεόμενες μεταξύ τους από τον λογικό τελεστή AND. Και μόνο εκείνες οι εγγραφές για τις οποίες ισχύουν και οι δύο συνθήκες ενημερώνονται.

Στη συνέχεια εκτελέστε αυτό το ερώτημα και παρατηρήστε το αποτέλεσμα:

SELECT * FROM customers;

Όπως φαίνεται στην έξοδο, το πεδίο έκπτωσης για εκείνες τις εγγραφές για τις οποίες ισχύουν και οι δύο παραπάνω προϋποθέσεις ενημερώνεται:

Συνήθης προειδοποίηση κατά τη χρήση της εντολής SQL UPDATE

Σε όλες τις δηλώσεις UPDATE που έχουν εκτελεστεί μέχρι τώρα, συμπεριλάβαμε την ρήτρα WHERE.

Για παράδειγμα, θέλετε να ενημερώσετε την έκπτωση σε 25 για έναν συγκεκριμένο πελάτη. Και στο ερώτημα ενημέρωσης ypur, ξεχνάτε να συμπεριλάβετε την ρήτρα WHERE με το αναγνωριστικό πελάτη για φιλτράρισμα:

UPDATE customers
SET DISCOUNT=25;

Τώρα τρέξτε:

SELECT * FROM customers;

Θα δείτε ότι όλες οι εγγραφές στον πίνακα ενημερώνονται. Αυτή μπορεί να μην είναι η συμπεριφορά που θα θέλατε.

⚠ Επομένως, θυμηθείτε να συμπεριλάβετε την ρήτρα WHERE όταν θέλετε να ενημερώσετε ένα υποσύνολο εγγραφών με βάση μια συνθήκη. Εάν θέλετε να ενημερώσετε ένα συγκεκριμένο πεδίο για όλες τις εγγραφές, μπορείτε να παραλείψετε τον όρο WHERE.

Σε αυτό το παράδειγμα, ας πούμε ότι πλησιάζει η έκπτωση της Μαύρης Παρασκευής και θέλετε να προσφέρετε σε όλους τους πελάτες σας έκπτωση 25%. Στη συνέχεια, η εκτέλεση του παραπάνω ερωτήματος θα έχει νόημα.

συμπέρασμα

Ακολουθεί μια περίληψη των όσων μάθατε:

  • Όταν θέλετε να ενημερώσετε τις εγγραφές σε έναν πίνακα βάσης δεδομένων, μπορείτε να χρησιμοποιήσετε την εντολή SQL UPDATE.
  • Η πρόταση SQL UPDATE συνήθως περιλαμβάνει την ρήτρα WHERE με τη συνθήκη που καθορίζει το υποσύνολο εγγραφών (γραμμές του πίνακα) προς ενημέρωση.
  • Η παράλειψη της ρήτρας WHERE στη δήλωση UPDATE ενημερώνει όλες τις εγγραφές. Επομένως, πρέπει να προσέχετε να μην παραλείψετε την ρήτρα WHERE εάν η ενημέρωση όλων των σειρών του πίνακα δεν είναι η επιθυμητή συμπεριφορά.

Στη συνέχεια, ελέγξτε αυτό το φύλλο εξαπάτησης SQL για γρήγορη αναφορά.