Εισαγωγή, διαγραφή, ενημέρωση εγγραφών στη βάση δεδομένων. Πώς να στείλετε ένα ερώτημα σε μια βάση δεδομένων χρησιμοποιώντας VBA Access Δημιουργία ερωτημάτων sql σε συνονόματα πρόσβασης

Εργαστηριακή εργασία Νο 1

SQL: EXTRACT DATA - εντολήΕΠΙΛΕΓΩ

Στόχος της εργασίας:

  • εξοικειωθείτε με τις δηλώσεις SQL.
  • μάθετε πώς να δημιουργείτε απλά ερωτήματα SQL στην Access χρησιμοποιώντας την εντολή SELECT.

· χρήση τελεστών IN, BETWEEN, LIKE, IS NULL.

Ασκηση№1. Δημιουργήστε ένα ερώτημα για να επιλέξετε σε λειτουργία SQL όλες τις τιμές των πεδίων FIRST NAME και LAST NAME από τον πίνακα STUDENTS.

ΕΠΙΛΕΞΤΕ ΟΝΟΜΑ, ΕΠΩΝΥΜΟ

ΑΠΟ ΜΑΘΗΤΕΣ?

Ασκηση№2 . Δημιουργήστε ένα ερώτημα για να επιλέξετε σε λειτουργία SQL όλες τις στήλες του πίνακα STUDENTS.

ΕΠΙΛΟΓΗ *

ΑΠΟ ΜΑΘΗΤΕΣ?


Εργασία Νο. 3.Δημιουργήστε ένα ερώτημα για να επιλέξετε σε λειτουργία SQL τα ονόματα των πόλεων όπου ζουν οι μαθητές, πληροφορίες για τις οποίες βρίσκονται στον πίνακα ΠΡΟΣΩΠΙΚΑ ΔΕΔΟΜΕΝΑ.

ΕΠΙΛΕΞΤΕ ΞΕΧΩΡΙΣΤΗ ΠΟΛΗ

ΑΠΟ [ΠΡΟΣΩΠΙΚΑ ΔΕΔΟΜΕΝΑ].

Εργασία Νο. 4.Δημιουργήστε ένα ερώτημα επιλογής σε λειτουργία SQL που ανακτά τα ονόματα όλων των μαθητών με το επώνυμο Ivanov, πληροφορίες για το οποίο βρίσκονται στον πίνακα STUDENTS.

ΕΠΙΛΕΞΤΕ ΕΠΩΝΥΜΟ, ΟΝΟΜΑ

ΑΠΟ ΜΑΘΗΤΕΣ

WHERE LAST NAME="Ivanov";

Εργασία Νο. 5. Δημιουργήστε ένα ερώτημα επιλογής σε λειτουργία SQL για να λάβετε το όνομα και το επώνυμο των μαθητών που σπουδάζουν στην ομάδα UIT-22 σε μια οικονομική μορφή εκπαίδευσης.

ΕΠΙΛΕΞΤΕ ΕΠΩΝΥΜΟ, ΟΝΟΜΑ

ΑΠΟ ΜΑΘΗΤΕΣ

WHERE GROUP="UIT-22" AND BUDGET=true;

Εργασία Νο. 6. Δημιουργήστε ένα ερώτημα σε λειτουργία SQL. για δείγμα από τον πίνακα ΕΞΕΤΑΣΕΩΝ, πληροφορίες για μαθητές που έχουν βαθμούς μόνο 4 και 5.

ΕΠΙΛΟΓΗ *

ΑΠΟ [ΑΛΛΑΓΗΕΞΕΤΑΣΕΙΣ]

ΟΠΟΥΒΑΘΜΟΣIN(4,5);

Εργασία Νο. 7.Δημιουργήστε μια λειτουργία zanpoc και SQL για να επιλέξετε πληροφορίες σχετικά με μαθητές που έχουν βαθμό εξέτασης 3 στο μάθημα IOSU.

ΕΠΙΛΟΓΗ *

ΑΠΟ [ΑΛΛΑΓΗΕΞΕΤΑΣΕΙΣ]

ΟΠΟΥΕΙΔΟΣ=" IOSU"ΚαιΒΑΘΜΟΣΌχι σε (4,5);

Εργασία Νο. 8.Δημιουργήστε ένα ερώτημα σε λειτουργία SQL για να επιλέξετε εγγραφές για στοιχεία των οποίων οι ώρες είναι μεταξύ 100 και 130.

ΕΠΙΛΟΓΗ *

ΑΠΟΕΙΔΗ

ΟΠΟΥΠΑΡΑΚΟΛΟΥΘΩΜΕΤΑΞΥ 100 ΚΑΙ 130.


Εργασία Νο. 9.Δημιουργήστε ένα ερώτημα σε λειτουργία SQL για να επιλέξετε από τον πίνακα STUDENTS πληροφορίες σχετικά με τους μαθητές των οποίων τα επώνυμα αρχίζουν, για παράδειγμα, με το γράμμα "C".

ΕΠΙΛΟΓΗ *

ΑΠΟΦΟΙΤΗΤΕΣ

ΟΠΟΥΕΠΩΝΥΜΟΑΡΕΣΕΙ"ΜΕ*";

Συμπέρασμα:Στη διάρκεια εργαστηριακές εργασίεςεξοικειώθηκε με τις οδηγίες SQL, έμαθε πώς να δημιουργεί απλά ερωτήματα SQL στην Access χρησιμοποιώντας την εντολή SELECT χρησιμοποιώντας τους τελεστές IN, BETWEEN, LIKE.

Αυτό το μάθημα είναι αφιερωμένο σε Ερωτήματα SQLστη βάση δεδομένων στις Πρόσβαση VBA. Θα δούμε πώς γίνονται τα ερωτήματα INSERT, UPDATE, DELETE στη βάση δεδομένων στο VBA και θα μάθουμε επίσης πώς να λαμβάνουμε μια συγκεκριμένη τιμή από ένα ερώτημα SELECT.

Όσοι προγραμματίζουν Πρόσβαση VBAκατά την εργασία με τη βάση δεδομένων Διακομιστής SQL, πολύ συχνά αντιμετωπίζουν μια τόσο απλή και απαραίτητη εργασία όπως η αποστολή ενός ερωτήματος SQL σε μια βάση δεδομένων, είτε είναι INSERT, UPDATE είτε ένα απλό ερώτημα SQL SELECT. Και επειδή είμαστε αρχάριοι προγραμματιστές, θα πρέπει επίσης να μπορούμε να το κάνουμε αυτό, οπότε σήμερα θα κάνουμε ακριβώς αυτό.

Έχουμε ήδη αγγίξει το θέμα της απόκτησης δεδομένων από έναν διακομιστή SQL, όπου γράψαμε κώδικα σε VBA για να λάβουμε αυτά τα δεδομένα, για παράδειγμα, στο άρθρο σχετικά με τη Μεταφόρτωση δεδομένων σε αρχείο κειμένου από το MSSql 2008, ή αγγίξαμε επίσης ένα λίγο στο υλικό Μεταφόρτωση δεδομένων από την Access σε ένα πρότυπο Word και Excel, αλλά με τον ένα ή τον άλλο τρόπο, το εξετάσαμε αυτό επιφανειακά και σήμερα προτείνω να μιλήσουμε για αυτό με λίγο περισσότερες λεπτομέρειες.

Σημείωση! Όλα τα παρακάτω παραδείγματα λαμβάνονται υπόψη χρησιμοποιώντας το έργο Access 2003 ADP και τη βάση δεδομένων MSSql 2008. Εάν δεν γνωρίζετε τι είναι έργο ADP, τότε εξετάσαμε αυτό στο υλικό Πώς να δημιουργήσετε και να ρυθμίσετε ένα έργο Access ADP

Πηγή δεδομένων για παραδείγματα

Ας υποθέσουμε ότι έχουμε έναν πίνακα test_table, ο οποίος θα περιέχει τους αριθμούς και τα ονόματα των μηνών του έτους (τα ερωτήματα εκτελούνται χρησιμοποιώντας Management Studio)

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ .( ΟΧΙ NULL, (50) NULL) ON GO

Όπως είπα ήδη, θα χρησιμοποιήσουμε ένα έργο ADP που έχει ρυθμιστεί να λειτουργεί με το MS SQL 2008, στο οποίο δημιούργησα μια δοκιμαστική φόρμα και πρόσθεσα ένα κουμπί έναρξης με υπογραφή "Τρέξιμο", το οποίο θα χρειαστεί να δοκιμάσουμε τον κώδικά μας, π.χ. Θα γράψουμε όλο τον κώδικα στο πρόγραμμα χειρισμού συμβάντων " Πατήστε το κουμπί».

Ερωτήματα στη βάση δεδομένων INSERT, UPDATE, DELETE σε VBA

Για να μην καθυστερήσουμε πολύ, ας ξεκινήσουμε αμέσως, ας πούμε ότι πρέπει να προσθέσουμε μια σειρά στον πίνακα δοκιμών μας ( σχολιάστηκε ο κώδικας)/

Private Sub start_Click() "Δηλώστε μια μεταβλητή για αποθήκευση της συμβολοσειράς ερωτήματος Dim sql_query As String "Γράψτε το ερώτημα που χρειαζόμαστε σε αυτό sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "June")" "Execute it DoCmd RunSQL sql_query End Sub

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

Όπως μπορείτε να δείτε, τα δεδομένα έχουν εισαχθεί.

Για να διαγράψουμε μία γραμμή γράφουμε τον παρακάτω κώδικα.

Private Sub start_Click() "Δηλώστε μια μεταβλητή για την αποθήκευση της συμβολοσειράς ερωτήματος Dim sql_query As String "Write a delete query into it sql_query = "DELETE test_table WHERE id = 6" "Run it DoCmd.RunSQL sql_query End Sub

Αν ελέγξουμε, θα δούμε ότι η επιθυμητή γραμμή έχει διαγραφεί.

Για να ενημερώσετε τα δεδομένα, γράψτε στη μεταβλητή sql_query αίτημα ενημέρωσης, ελπίζω το νόημα να είναι ξεκάθαρο.

ΕΠΙΛΟΓΗ ερωτήματος σε μια βάση δεδομένων σε VBA

Εδώ τα πράγματα είναι λίγο πιο ενδιαφέροντα από ό,τι με άλλες κατασκευές SQL.

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

Private Sub start_Click() "Δήλωση μεταβλητών "Για ένα σύνολο εγγραφών από τη βάση δεδομένων Dim RS As ADODB.Recordset "Σειρά ερωτήματος Dim sql_query As String "Συμβολοσειρά για εμφάνιση συνοπτικών δεδομένων σε μήνυμα Dim str As String "Δημιουργία νέου αντικειμένου για εγγραφές set RS = New ADODB .Recordset "Query line sql_query = "SELECT id, name_mon FROM test_table" "Εκτέλεσε το ερώτημα χρησιμοποιώντας τις τρέχουσες ρυθμίσεις σύνδεσης έργου RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Loop through RS.EOF) "Συμπληρώστε τη μεταβλητή για να εμφανιστεί το μήνυμα str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "μετάβαση στην επόμενη εγγραφή RS.MoveNext Wend " Εξαγωγή του μηνύματος msgbox str Τέλος υπο

Εδώ χρησιμοποιούμε ήδη βρόχους VBA Access για να επαναλάβουμε όλες τις τιμές στο σύνολο εγγραφών μας.

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

Private Sub start_Click() "Declare variables" Για ένα σύνολο εγγραφών από τη βάση δεδομένων Dim RS As ADODB.Recordset "Query string Dim sql_query As String "String για εμφάνιση της τελικής τιμής Dim str Ως συμβολοσειρά "Δημιουργία νέου αντικειμένου για το σύνολο εγγραφών RS = New ADODB.Recordset "Query line sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "Εκτέλεσε το ερώτημα χρησιμοποιώντας τις τρέχουσες ρυθμίσεις σύνδεσης έργου RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Get. Fields(0) msgbox str Τέλος υπο

Για καθολικότητα, εδώ έχουμε ήδη αναφερθεί όχι με το όνομα του κελιού, αλλά με το ευρετήριό του, δηλ. 0, και αυτή είναι η πρώτη τιμή στο Ρεκόρ σετ, στο τέλος πήραμε την αξία "Ενδέχεται".

Όπως μπορείτε να δείτε, όλα είναι πολύ απλά. Εάν χρειάζεται συχνά να λαμβάνετε μια συγκεκριμένη τιμή από τη βάση δεδομένων ( όπως στο τελευταίο παράδειγμα), τότε προτείνω την έξοδο όλου του κώδικα σε μια ξεχωριστή συνάρτηση (Πώς να γράψετε μια συνάρτηση στο VBA Access 2003) με μία παράμετρο εισόδου, για παράδειγμα, τον κωδικό μήνα ( αν αναλογιστούμε το παράδειγμά μας) και απλά, όπου είναι απαραίτητο να εμφανιστεί αυτή η τιμή, καλέστε τη συνάρτηση που χρειαζόμαστε με την απαιτούμενη παράμετρο και τέλος, με αυτόν τον τρόπο θα μειώσουμε σημαντικά τον κώδικα VBA και θα βελτιώσουμε την αντίληψη του προγράμματός μας.

Αυτά για σήμερα. Καλή τύχη!

Περιγραφή του εκπαιδευτικού έργου "Κατάστημα"

Διάγραμμα σύνδεσης πίνακα

Περιγραφή πινάκων

m_category - κατηγορίες προϊόντων

m_income - απόδειξη εμπορευμάτων

m_outcome - κατανάλωση αγαθών

m_product - κατάλογος, περιγραφές προϊόντων

m_supplier - κατάλογος; πληροφορίες προμηθευτή

m_unit - κατάλογος; μονάδες

Για να δοκιμάσετε πρακτικά τα παραδείγματα που δίνονται σε αυτό το εκπαιδευτικό υλικό, πρέπει να έχετε το ακόλουθο λογισμικό:

Microsoft Access 2003 ή νεότερο.

Ερώτημα SQL σε MS Access. Αρχή

Για να δείτε τα περιεχόμενα του πίνακα, κάντε διπλό κλικ στο όνομα του πίνακα στον αριστερό πίνακα:

Για να μεταβείτε στη λειτουργία επεξεργασίας πεδίων πίνακα, κάντε κλικ πάνω πάνελεπιλέξτε τη λειτουργία σχεδίασης:

Για να εμφανίσετε το αποτέλεσμα ενός ερωτήματος SQL, κάντε διπλό κλικ στο όνομα του ερωτήματος στο αριστερό παράθυρο:

Για να μεταβείτε στη λειτουργία επεξεργασίας ερωτημάτων SQL, επιλέξτε λειτουργία SQL στον επάνω πίνακα:

Ερώτημα SQL. Παραδείγματα στο MS Access. ΕΠΙΛΟΓΗ: 1-10

Σε ένα ερώτημα SQL, η πρόταση SELECT χρησιμοποιείται για την επιλογή από πίνακες βάσης δεδομένων.

SQL Query Q001.Παράδειγμα ερωτήματος SQL για να λάβετε μόνο τα απαιτούμενα πεδία στην επιθυμητή ακολουθία:

SELECT dt, product_id, ποσό


ΑΠΟ m_income;

SQL Query Q002.Σε αυτό το παράδειγμα ερωτήματος SQL, ο χαρακτήρας αστερίσκος (*) χρησιμοποιείται για τη λίστα όλων των στηλών του πίνακα m_product, με άλλα λόγια, για να ληφθούν όλα τα πεδία της σχέσης m_product:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_product;

ΑίτησηSQL Q003.Η δήλωση DISTINCT χρησιμοποιείται για την εξάλειψη των διπλότυπων εγγραφών και τη λήψη πολλαπλών μοναδικών εγγραφών:

ΕΠΙΛΕΞΤΕ ΞΕΧΩΡΙΣΤΟ αναγνωριστικό προϊόντος


ΑΠΟ m_income;

SQL Query Q004.Η πρόταση ORDER BY χρησιμοποιείται για την ταξινόμηση (παραγγελίας) εγγραφών με βάση τις τιμές ενός συγκεκριμένου πεδίου. Το όνομα του πεδίου καθορίζεται μετά τη δήλωση ORDER BY:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_income


ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ τιμή?

SQL Query Q005.Η δήλωση ASC χρησιμοποιείται ως συμπλήρωμα της εντολής ORDER BY και χρησιμεύει για τον καθορισμό της αύξουσας ταξινόμησης. Η πρόταση DESC χρησιμοποιείται επιπλέον της πρότασης ORDER BY και χρησιμοποιείται για τον καθορισμό της φθίνουσας ταξινόμησης. Στην περίπτωση που δεν καθορίζονται ούτε ASC ούτε DESC, η παρουσία ASC (προεπιλογή) θεωρείται:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_income


ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ dt DESC , τιμή;

Ερώτημα SQL Q006.Για να επιλέξετε τις απαραίτητες εγγραφές από τον πίνακα, χρησιμοποιούνται διάφορες λογικές εκφράσεις που εκφράζουν τη συνθήκη επιλογής. Η έκφραση Boolean εμφανίζεται μετά την πρόταση WHERE. Ένα παράδειγμα λήψης όλων των εγγραφών από τον πίνακα m_income για τον οποίο η τιμή του ποσού είναι μεγαλύτερη από 200:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_income


ΠΟΥ ποσό>200;

SQL Query Q007.Για έκφραση δύσκολες συνθήκεςχρησιμοποιήστε τους λογικούς τελεστές AND (σύνδεση), OR (διάσπαση) και NOT (λογική άρνηση). Ένα παράδειγμα λήψης από τον πίνακα m_outcome όλων των εγγραφών για τις οποίες η τιμή του ποσού είναι 20 και η τιμή τιμής είναι μεγαλύτερη ή ίση με 10:

Τιμή


ΑΠΟ m_outcome
ΠΟΥ ποσό=20 ΚΑΙ τιμή>=10;

SQL Query Q008.Για να ενώσετε δεδομένα από δύο ή περισσότερους πίνακες, χρησιμοποιήστε τις οδηγίες ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ, ΔΕΞΙΑ ΣΥΝΔΕΣΗ. Το ακόλουθο παράδειγμα ανακτά τα πεδία dt, product_id, ποσό, τιμή από τον πίνακα m_income και το πεδίο τίτλος από τον πίνακα m_product. Η εγγραφή του πίνακα m_income ενώνεται με την εγγραφή του πίνακα m_product όταν η τιμή του m_income.product_id είναι ίση με την τιμή του m_product.id:



ON m_income.product_id=m_product.id;

SQL Query Q009.Υπάρχουν δύο πράγματα που πρέπει να σημειώσετε σε αυτό το ερώτημα SQL: 1) το κείμενο που αναζητάτε περικλείεται μεμονωμένα εισαγωγικά("); 2) η ημερομηνία δίνεται με τη μορφή #Month/Day/Year#, η οποία ισχύει για την MS Access. Σε άλλα συστήματα, η μορφή για την εγγραφή της ημερομηνίας μπορεί να είναι διαφορετική. Ένα παράδειγμα εμφάνισης πληροφοριών σχετικά με την απόδειξη γάλακτος στις 12 Ιουνίου 2011. Σημειώστε τη μορφή ημερομηνίας #6/12/2011#:

SELECT dt, product_id, τίτλος, ποσό, τιμή


ΑΠΟ m_income INNER JOIN m_product

WHERE title="(!ΓΛΩΣΣΑ:Γάλα" And dt=#6/12/2011#; !}

SQL Query Q010.Η εντολή BETWEEN χρησιμοποιείται για να ελέγξει εάν μια τιμή ανήκει σε ένα συγκεκριμένο εύρος. Ένα παράδειγμα ερωτήματος SQL που εμφανίζει πληροφορίες σχετικά με προϊόντα που ελήφθησαν από την 1η Ιουνίου έως τις 30 Ιουνίου 2011:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_income INNER JOIN m_product


ON m_income.product_id=m_product.id
ΠΟΥ dt ΜΕΤΑΞΥ #6/1/2011# και #6/30/2011#;

Ερώτημα SQL. Παραδείγματα στο MS Access. ΕΠΙΛΟΓΗ: 11-20

Ένα ερώτημα SQL μπορεί να είναι ένθετο μέσα σε ένα άλλο. Ένα υποερώτημα δεν είναι τίποτα άλλο από ένα ερώτημα μέσα σε ένα ερώτημα. Συνήθως, χρησιμοποιείται ένα δευτερεύον ερώτημα στον όρο WHERE. Υπάρχουν όμως και άλλοι τρόποι χρήσης υποερωτημάτων.

Ερώτημα Q011.Εμφανίζονται πληροφορίες για προϊόντα από τον πίνακα m_product, οι κωδικοί των οποίων βρίσκονται επίσης στον πίνακα m_income:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_product


WHERE id IN (SELECT product_id FROM m_income);

Ερώτημα Q012.Εμφανίζεται μια λίστα προϊόντων από τον πίνακα m_product, οι κωδικοί των οποίων δεν βρίσκονται στον πίνακα m_outcome:

ΕΠΙΛΟΓΗ *
ΑΠΟ m_product


WHERE id NOT IN (SELECT product_id FROM m_outcome);

Αίτημα Q013.Αυτό το ερώτημα SQL εμφανίζει μια μοναδική λίστα κωδικών προϊόντων και ονομάτων που βρίσκονται στον πίνακα m_income αλλά όχι στον πίνακα m_outcome:

ΕΠΙΛΟΓΗ DISTINCT product_id, τίτλος


ΑΠΟ m_income INNER JOIN m_product
ON m_income.product_id=m_product.id
WHERE product_id NOT IN (SELECT product_id FROM m_outcome);

Ερώτημα Q014.Μια μοναδική λίστα κατηγοριών των οποίων τα ονόματα αρχίζουν με το γράμμα M εμφανίζεται από τον πίνακα m_category:

ΕΠΙΛΟΓΗ ΔΙΑΚΡΙΤΟΥ τίτλου


ΑΠΟ m_product
ΟΠΟΥ τίτλος LIKE "M*"?

Ερώτημα Q015.Ένα παράδειγμα εκτέλεσης αριθμητικών πράξεων σε πεδία σε ένα ερώτημα και μετονομασία πεδίων σε ένα ερώτημα (ψευδώνυμο). Αυτό το παράδειγμα υπολογίζει έξοδο = ποσότητα*τιμή και κέρδος για κάθε καταχώριση εξόδων στοιχείου, υποθέτοντας ότι το κέρδος είναι 7 τοις εκατό των πωλήσεων:


ποσό*τιμή/100*7 AS κέρδος
ΑΠΟ m_outcome;

Ερώτημα Q016.Αναλύοντας και απλοποιώντας αριθμητικές πράξεις, μπορείτε να αυξήσετε την ταχύτητα εκτέλεσης ερωτήματος:

SELECT dt, product_id, ποσό, τιμή, ποσό*τιμή AS outcome_sum,


outcome_sum*0,07 AS κέρδος
ΑΠΟ m_outcome;

Αίτημα Q017.Μπορείτε να χρησιμοποιήσετε τη δήλωση ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ για να ενώσετε δεδομένα από πολλούς πίνακες. Στο παρακάτω παράδειγμα, ανάλογα με την τιμή του ctgry_id, κάθε καταχώρηση στον πίνακα m_income αντιστοιχίζεται με το όνομα της κατηγορίας από τον πίνακα m_category στον οποίο ανήκει το προϊόν:

ΕΠΙΛΟΓΗ γ.τίτλος, β.τίτλος, dt, ποσό, τιμή, ποσό*τιμή AS εισόδημα_άθροισμα


FROM (m_income AS INNER JOIN m_product AS b ON a.product_id=b.id)
ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_category AS c ON b.ctgry_id=c.id
ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ c.title, b.title;

Αίτημα Q018.Συναρτήσεις όπως SUM - άθροισμα, COUNT - ποσότητα, AVG - αριθμητική μέση τιμή, MAX - μέγιστη τιμή, MIN - ελάχιστη τιμή ονομάζονται συναρτήσεις συγκεντρωτικών. Δέχονται πολλές τιμές και μετά την επεξεργασία τους επιστρέφουν μία μόνο τιμή. Ένα παράδειγμα υπολογισμού του αθροίσματος του γινομένου των πεδίων ποσού και τιμής χρησιμοποιώντας τη συνάρτηση συγκεντρωτικού SUM:

ΕΠΙΛΕΞΤΕ ΠΟΣΟ (ποσό*τιμή) AS Total_Sum


ΑΠΟ m_income;

Ερώτημα Q019.Ένα παράδειγμα χρήσης πολλών αθροιστικών συναρτήσεων:

SELECT Sum(amount) AS Amount_Sum, AVG(amount) AS Amount_AVG,


MAX(amount) AS Amount_Max, Min(amount) AS Amount_Min,
Μέτρηση(*) AS Total_Number
ΑΠΟ m_income;

Αίτημα Q020.Σε αυτό το παράδειγμα, υπολογίζεται το ποσό όλων των αγαθών με κωδικό 1, με κεφαλαιοποίηση τον Ιούνιο του 2011:

ΕΠΙΛΕΞΤΕ Άθροισμα(ποσό*τιμή) ΩΣ εισόδημα_άθροισμα


ΑΠΟ m_income
WHERE product_id=1 ΚΑΙ dt ΜΕΤΑΞΥ #6/1/2011# ΚΑΙ #6/30/2011#;.

Ερώτημα Q021.Το ακόλουθο ερώτημα SQL υπολογίζει το ποσό των πωλήσεων των ειδών με κωδικό 4 ή 6:

ΕΠΙΛΕΞΤΕ Άθροισμα (ποσό*τιμή) ως άθροισμα_αποτέλεσης


ΑΠΟ m_outcome
ΠΟΥ product_id=4 Ή product_id=6;

Ερώτημα Q022.Υπολογίζεται πόσα προϊόντα με κωδικό 4 ή 6 πωλήθηκαν στις 12 Ιουνίου 2011:

ΕΠΙΛΕΞΤΕ Άθροισμα(ποσό*τιμή) ΩΣ άθροισμα_αποτέλεσης


ΑΠΟ m_outcome
ΠΟΥ (product_id=4 Ή product_id=6) ΚΑΙ dt=#6/12/2011#;

Ερώτημα Q023.Το καθήκον είναι αυτό. Υπολογίστε τη συνολική ποσότητα των προϊόντων στην κατηγορία «Προϊόντα Αρτοποιίας» που κεφαλαιοποιήθηκαν.

Για να λύσετε αυτό το πρόβλημα, πρέπει να λειτουργήσετε με τρεις πίνακες: m_income, m_product και m_category, επειδή:


- η ποσότητα και η τιμή των κεφαλαιοποιημένων αγαθών αποθηκεύονται στον πίνακα m_income.
- ο κωδικός κατηγορίας κάθε προϊόντος αποθηκεύεται στον πίνακα m_product.
- το όνομα της κατηγορίας τίτλου αποθηκεύεται στον πίνακα m_category.

Για να λύσουμε αυτό το πρόβλημα θα χρησιμοποιήσουμε τον ακόλουθο αλγόριθμο:


- προσδιορισμός του κωδικού κατηγορίας "Προϊόντα αρτοποιίας" από τον πίνακα m_category χρησιμοποιώντας ένα δευτερεύον ερώτημα.
- σύνδεση των πινάκων m_income και m_product για τον προσδιορισμό της κατηγορίας κάθε αγορασμένου προϊόντος.
- υπολογισμός του ποσού απόδειξης (= ποσότητα*τιμή) για εμπορεύματα των οποίων ο κωδικός κατηγορίας είναι ίσος με τον κωδικό που ορίζεται από το παραπάνω υποερώτημα.
ΕΠΙΛΕΓΩ
ΑΠΟ m_product AS INNER JOIN m_income AS b ON a.id=b.product_id
WHERE ctgry_id = (SELECT id FROM m_category WHERE title="Bakery products"); !}

Ερώτημα Q024.Θα λύσουμε το πρόβλημα του υπολογισμού του συνολικού ποσού των κεφαλαιοποιημένων αγαθών στην κατηγορία «Προϊόντα Αρτοποιίας» χρησιμοποιώντας τον ακόλουθο αλγόριθμο:
- για κάθε καταχώρηση στον πίνακα m_income, ανάλογα με την αξία του product_id της, από τον πίνακα m_category, αντιστοιχίστε το όνομα της κατηγορίας.
- επιλέξτε εγγραφές για τις οποίες η κατηγορία είναι «Προϊόντα Αρτοποιίας».
- υπολογίστε το ποσό της απόδειξης = ποσότητα*τιμή.

FROM (m_product AS INNER JOIN m_income AS b ON a.id=b.product_id)

WHERE c.title="Προϊόντα αρτοποιίας"; !}

Ερώτημα Q025.Αυτό το παράδειγμα υπολογίζει πόσα είδη αγαθών καταναλώθηκαν:

SELECT COUNT(product_id) AS product_cnt


FROM (ΕΠΙΛΟΓΗ DISTINCT product_id FROM m_outcome) ΩΣ t;

Ερώτημα Q026.Η πρόταση GROUP BY χρησιμοποιείται για την ομαδοποίηση εγγραφών. Συνήθως, οι εγγραφές ομαδοποιούνται με βάση την τιμή ενός ή περισσότερων πεδίων και εφαρμόζεται κάποια συγκεντρωτική λειτουργία σε κάθε ομάδα. Για παράδειγμα, το ακόλουθο ερώτημα δημιουργεί μια αναφορά σχετικά με την πώληση αγαθών. Δηλαδή, δημιουργείται ένας πίνακας που περιέχει τα ονόματα των αγαθών και το ποσό για το οποίο πωλήθηκαν:

ΕΠΙΛΟΓΗ τίτλου, SUM(ποσό*τιμή) AS outcome_sum


ΑΠΟ m_product ΩΣ ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_αποτέλεσμα ΩΣ β
ON a.id=b.product_id
ΟΜΑΔΑ ΑΝΑ Τίτλο.

Αίτημα Q027.Αναφορά πωλήσεων ανά κατηγορία. Δηλαδή, δημιουργείται ένας πίνακας που περιέχει τα ονόματα των κατηγοριών προϊόντων, το συνολικό ποσό για το οποίο πωλήθηκαν προϊόντα αυτών των κατηγοριών και το μέσο ποσό πωλήσεων. Η συνάρτηση ROUND χρησιμοποιείται για τη στρογγυλοποίηση της μέσης τιμής στο πλησιέστερο εκατοστό (το δεύτερο ψηφίο μετά το δεκαδικό διαχωριστικό):

SELECT c.title, SUM(amount*price) AS outcome_sum,


ROUND(AVG(ποσό*τιμή),2) AS outcome_sum_avg
FROM (m_product AS INNER JOIN m_outcome AS b ON a.id=b.product_id)
ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_category AS c ON a.ctgry_id=c.id
ΟΜΑΔΑ ΑΝΑ c.title;

Ερώτημα Q028.Ο συνολικός και ο μέσος αριθμός των εισπράξεών του υπολογίζεται για κάθε προϊόν και εμφανίζει πληροφορίες για προϊόντα των οποίων οι συνολικές εισπράξεις είναι τουλάχιστον 500:

SELECT product_id, SUM(amount) AS ποσό_sum,


Round(Avg(amount),2) AS ποσό_μέσο
ΑΠΟ m_income
GROUP BY product_id
ΕΧΟΝΤΑΣ Ποσό(ποσό)>=500;

Ερώτημα Q029.Αυτό το ερώτημα υπολογίζει για κάθε προϊόν το ποσό και το μέσο όρο των εισπράξεών του το δεύτερο τρίμηνο του 2011. Εάν το συνολικό ποσό της απόδειξης προϊόντος είναι τουλάχιστον 1000, τότε εμφανίζονται πληροφορίες σχετικά με αυτό το προϊόν:

ΕΠΙΛΟΓΗ τίτλου, ΠΟΣΟ(ποσό*τιμή) ΩΣ εισόδημα_άθροισμα


ΑΠΟ m_income a INNER JOIN m_product b ON a.product_id=b.id
ΠΟΥ dt ΜΕΤΑΞΥ #4/1/2011# ΚΑΙ #6/30/2011#
ΟΜΑΔΑ ΑΝΑ Τίτλο
ΕΧΟΝΤΑΣ ΠΟΣΟ(ποσό*τιμή)>=1000;

Ερώτημα Q030.Σε ορισμένες περιπτώσεις, πρέπει να αντιστοιχίσετε κάθε εγγραφή κάποιου πίνακα με κάθε εγγραφή άλλου πίνακα. που ονομάζεται καρτεσιανό προϊόν. Ο πίνακας που προκύπτει από μια τέτοια σύνδεση ονομάζεται πίνακας του Descartes. Για παράδειγμα, εάν κάποιος πίνακας Α έχει 100 εγγραφές και ο πίνακας Β έχει 15 εγγραφές, τότε ο καρτεσιανός πίνακας του θα αποτελείται από 100*15=150 εγγραφές. Το ακόλουθο ερώτημα ενώνει κάθε εγγραφή στον πίνακα m_income με κάθε εγγραφή στον πίνακα m_outcome:
ΑΠΟ m_income, m_outcome;

Ερώτημα Q031.Ένα παράδειγμα ομαδοποίησης εγγραφών κατά δύο πεδία. Το ακόλουθο ερώτημα SQL υπολογίζει για κάθε προμηθευτή την ποσότητα και την ποσότητα των αγαθών που έλαβε από αυτόν:


SUM(ποσό*τιμή) AS εισόδημα_άθροισμα

Αίτημα Q032.Ένα παράδειγμα ομαδοποίησης εγγραφών κατά δύο πεδία. Το ακόλουθο ερώτημα υπολογίζει για κάθε προμηθευτή την ποσότητα και την ποσότητα των προϊόντων του που πωλούνται από εμάς:

SELECT προμηθευτής_αναγνωριστικό, αναγνωριστικό_προϊόντος, SUM(ποσό) AS ποσό_άθροισμα,




ΟΜΑΔΑ ΚΑΤΑ προμηθευτή_αναγνωριστικό, αναγνωριστικό_προϊόντος;

Ερώτημα Q033.Σε αυτό το παράδειγμα, τα δύο παραπάνω ερωτήματα (q031 και q032) χρησιμοποιούνται ως δευτερεύοντα ερωτήματα. Τα αποτελέσματα αυτών των ερωτημάτων χρησιμοποιώντας τη μέθοδο LEFT JOIN συνδυάζονται σε μία αναφορά. Το ακόλουθο ερώτημα εμφανίζει μια αναφορά σχετικά με την ποσότητα και την ποσότητα των προϊόντων που λαμβάνονται και πωλούνται για κάθε προμηθευτή. Λάβετε υπόψη ότι εάν κάποιο προϊόν έχει ήδη παραληφθεί, αλλά δεν έχει πουληθεί ακόμη, τότε το κελί outcome_sum για αυτήν την καταχώρηση θα είναι κενό. ότι αυτό το ερώτημα είναι μόνο ένα παράδειγμα χρήσης σχετικά σύνθετων ερωτημάτων ως υποερώτημα. Η απόδοση αυτού του ερωτήματος SQL με μεγάλο όγκο δεδομένων είναι αμφίβολη:

ΕΠΙΛΟΓΗ *
ΑΠΟ



SUM(ποσό*τιμή) AS εισόδημα_άθροισμα

ON a.product_id=b.id ΟΜΑΔΑ ΑΝΑ προμηθευτή_id, product_id) ΩΣ α
ΑΡΙΣΤΕΡΑ ΣΥΜΜΕΤΟΧΗ
(ΕΠΙΛΟΓΗ Αναγνωριστικό_προμηθευτή, Αναγνωριστικό_προϊόντος, SUM(ποσό) AS ποσό_άθροισμα,
SUM(ποσό*τιμή) AS outcome_sum
ΑΠΟ m_outcome AS ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_product AS β
ON a.product_id=b.id GROUP BY provider_id, product_id) ΩΣ β
ON (a.product_id=b.product_id) ΚΑΙ (a.supplier_id=b.supplier_id);

Ερώτημα Q034.Σε αυτό το παράδειγμα, τα δύο παραπάνω ερωτήματα (q031 και q032) χρησιμοποιούνται ως δευτερεύοντα ερωτήματα. Τα αποτελέσματα αυτών των ερωτημάτων χρησιμοποιώντας τη μέθοδο RIGTH JOIN συνδυάζονται σε μία αναφορά. Το παρακάτω ερώτημα εμφανίζει μια αναφορά για το ποσό των πληρωμών κάθε πελάτη ανάλογα με τα συστήματα πληρωμών που χρησιμοποίησε και το ποσό των επενδύσεων που έκανε. Το ακόλουθο ερώτημα εμφανίζει μια αναφορά σχετικά με την ποσότητα και την ποσότητα των προϊόντων που λαμβάνονται και πωλούνται για κάθε προμηθευτή. Λάβετε υπόψη ότι εάν κάποιο προϊόν έχει ήδη πουληθεί, αλλά δεν έχει φτάσει ακόμη, τότε το κελί εισοδήματος_άθροισμα για αυτήν την καταχώρηση θα είναι κενό. Η παρουσία τέτοιων κενών κελιών αποτελεί ένδειξη λάθους στη λογιστική των πωλήσεων, καθώς πριν από την πώληση είναι απαραίτητο πρώτα να φτάσει το αντίστοιχο προϊόν:

ΕΠΙΛΟΓΗ *
ΑΠΟ


(ΕΠΙΛΟΓΗ Αναγνωριστικό_προμηθευτή, Αναγνωριστικό_προϊόντος, SUM(ποσό) AS ποσό_άθροισμα,
SUM(ποσό*τιμή) AS εισόδημα_άθροισμα
ΑΠΟ m_income AS INNER JOIN m_product AS b ON a.product_id=b.id
ΟΜΑΔΑ ΑΝΑ προμηθευτή_αναγνωριστικό, προϊόν_αναγνωριστικό) ΩΣ α
ΔΕΞΙΑ ΣΥΝΔΕΣΗ
(ΕΠΙΛΟΓΗ Αναγνωριστικό_προμηθευτή, Αναγνωριστικό_προϊόντος, SUM(ποσό) AS ποσό_άθροισμα,
SUM(ποσό*τιμή) AS outcome_sum
FROM m_outcome AS ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_product AS b ON a.product_id=b.id
ΟΜΑΔΑ ΑΝΑ προμηθευτή_αναγνωριστικό, προϊόν_αναγνωριστικό) ΩΣ β
ON (a.supplier_id=b.supplier_id) ΚΑΙ (a.product_id=b.product_id);

Ερώτημα Q035.Εμφανίζεται μια αναφορά που δείχνει το ποσό των εσόδων και εξόδων ανά προϊόν. Για να γίνει αυτό, δημιουργείται μια λίστα προϊόντων σύμφωνα με τους πίνακες m_income και m_outcome, στη συνέχεια για κάθε προϊόν από αυτήν τη λίστα το άθροισμα των εσόδων του υπολογίζεται σύμφωνα με τον πίνακα m_income και το ποσό των εξόδων του σύμφωνα με τον πίνακα m_outcome:

SELECT product_id, SUM(in_amount) AS έσοδα_amount,


SUM(out_amount) AS outcome_amount
ΑΠΟ
(SELECT product_id, ποσό AS in_amount, 0 AS out_amount
ΑΠΟ m_income
ΕΝΩΣΗ ΟΛΩΝ
SELECT product_id, 0 AS in_amount, ποσό AS out_amount
ΑΠΟ m_αποτέλεσμα) ΩΣ t
GROUP BY product_id;

Ερώτημα Q036.Η συνάρτηση EXISTS επιστρέφει TRUE εάν το σύνολο που της έχει μεταβιβαστεί περιέχει στοιχεία. Η συνάρτηση EXISTS επιστρέφει FALSE εάν το σύνολο που της έχει διαβιβαστεί είναι κενό, δηλαδή δεν περιέχει στοιχεία. Το ακόλουθο ερώτημα εμφανίζει τους κωδικούς προϊόντων που περιέχονται στους πίνακες m_income και m_outcome:

ΕΠΙΛΕΞΤΕ ΞΕΧΩΡΙΣΤΟ αναγνωριστικό προϊόντος


ΑΠΟ m_income AS α
ΠΟΥ ΥΠΑΡΧΕΙ(ΕΠΙΛΟΓΗ_αναγνωριστικό προϊόντος ΑΠΟ m_αποτέλεσμα ΩΣ β

Ερώτημα Q037.Εμφανίζονται οι κωδικοί προϊόντων που περιέχονται στους πίνακες m_income και m_outcome:

ΕΠΙΛΕΞΤΕ ΞΕΧΩΡΙΣΤΟ αναγνωριστικό προϊόντος


ΑΠΟ m_income AS α
WHERE product_id IN (SELECT product_id FROM m_outcome)

Ερώτημα Q038.Εμφανίζονται κωδικοί προϊόντων που περιέχονται στον πίνακα m_income, αλλά δεν περιλαμβάνονται στον πίνακα m_outcome:

ΕΠΙΛΕΞΤΕ ΞΕΧΩΡΙΣΤΟ αναγνωριστικό προϊόντος


ΑΠΟ m_income AS α
ΠΟΥ ΔΕΝ ΥΠΑΡΧΕΙ(ΕΠΙΛΟΓΗ_αναγνωριστικό προϊόντος ΑΠΟ m_αποτέλεσμα ΩΣ β
ΠΟΥ b.product_id=a.product_id);

Ερώτημα Q039.Εμφανίζεται μια λίστα προϊόντων με το μέγιστο ποσό πωλήσεων. Ο αλγόριθμος είναι ο εξής. Για κάθε προϊόν υπολογίζεται το ποσό των πωλήσεών του. Στη συνέχεια, καθορίζεται το μέγιστο από αυτά τα ποσά. Στη συνέχεια, για κάθε προϊόν, υπολογίζεται ξανά το άθροισμα των πωλήσεών του και εμφανίζεται ο κωδικός και το άθροισμα πωλήσεων των εμπορευμάτων των οποίων το άθροισμα πωλήσεων είναι ίσο με το μέγιστο:

SELECT product_id, SUM(amount*price) AS ποσό_άθροισμα


ΑΠΟ m_outcome
GROUP BY product_id
ΕΧΟΝΤΑΣ ΠΟΣΟ (ποσό*τιμή) = (ΕΠΙΛΟΓΗ ΜΕΓ.(s_amount)
FROM (ΕΠΙΛΟΓΗ ΠΟΣΟΣ(ποσό*τιμή) ΩΣ s_amount FROM m_outcome GROUP BY product_id));

Ερώτημα Q040.Δεσμευμένη λέξη IIF ( υπό όρους χειριστή) χρησιμοποιείται για την αξιολόγηση μιας Boolean έκφρασης και την εκτέλεση μιας ενέργειας ανάλογα με το αποτέλεσμα (TRUE ή FALSE). Στο παρακάτω παράδειγμα, η παράδοση του είδους θεωρείται "μικρή" εάν η ποσότητα είναι μικρότερη από 500. Διαφορετικά, δηλαδή, η ποσότητα παραλαβής είναι μεγαλύτερη ή ίση με 500, η ​​παράδοση θεωρείται "μεγάλη":

SELECT dt, product_id, ποσό,


IIF(ποσό FROM m_income;

Ερώτημα SQL Q041.Στην περίπτωση που ο χειριστής IIF χρησιμοποιείται πολλές φορές, είναι πιο βολικό να τον αντικαταστήσετε με τον χειριστή SWITCH. Ο τελεστής SWITCH (τελεστής πολλαπλής επιλογής) χρησιμοποιείται για την αξιολόγηση μιας λογικής έκφρασης και την εκτέλεση μιας ενέργειας ανάλογα με το αποτέλεσμα. Στο παρακάτω παράδειγμα, η παρτίδα που παραδόθηκε θεωρείται "μικρή" εάν η ποσότητα των εμπορευμάτων στην παρτίδα είναι μικρότερη από 500. Διαφορετικά, εάν δηλαδή η ποσότητα των αγαθών είναι μεγαλύτερη ή ίση με 500, η ​​παρτίδα θεωρείται "μεγάλη ":

SELECT dt, product_id, ποσό,


ΔΙΑΚΟΠΤΗΣ (ποσό =500"μεγάλο") ΩΣ ένδειξη
ΑΠΟ m_income;

Ερώτημα Q042.Στην επόμενη αίτηση, εάν η ποσότητα των εμπορευμάτων στην παρτίδα που ελήφθη είναι μικρότερη από 300, τότε η παρτίδα θεωρείται «μικρή». Διαφορετικά, δηλαδή, εάν το ποσό συνθήκης SELECT dt, product_id, ποσό,
IIF(ποσό IIF(ποσό FROM m_income;

Ερώτημα SQL Q043.Στην επόμενη αίτηση, εάν η ποσότητα των εμπορευμάτων στην παρτίδα που ελήφθη είναι μικρότερη από 300, τότε η παρτίδα θεωρείται «μικρή». Διαφορετικά, δηλαδή, εάν το ποσό συνθήκης SELECT dt, product_id, ποσό,
SWITCH (ποσό ποσού>=1000"μεγάλο") ΩΣ ένδειξη
ΑΠΟ m_income;

Ερώτημα SQL Q044.Στο ακόλουθο ερώτημα, οι πωλήσεις χωρίζονται σε τρεις ομάδες: μικρές (έως 150), μεσαίες (από 150 έως 300), μεγάλες (300 ή περισσότερες). Στη συνέχεια, το συνολικό ποσό υπολογίζεται για κάθε ομάδα:

SELECT Κατηγορία, SUM(outcome_sum) AS Ctgry_Total


FROM (ΕΠΙΛΟΓΗ ποσού*τιμής ΩΣ outcome_sum,
IIf(ποσό*τιμή IIf(ποσό*τιμή ΑΠΟ m_outcome) AS t
ΟΜΑΔΑ ΑΝΑ Κατηγορία;

Ερώτημα SQL Q045.Η συνάρτηση DateAdd χρησιμοποιείται για την προσθήκη ημερών, μηνών ή ετών σε μια δεδομένη ημερομηνία και τη λήψη νέας ημερομηνίας. Επόμενο αίτημα:
1) προσθέτει 30 ημέρες στην ημερομηνία από το πεδίο dt και εμφανίζει τη νέα ημερομηνία στο πεδίο dt_plus_30d.
2) προσθέτει 1 μήνα στην ημερομηνία από το πεδίο dt και εμφανίζει τη νέα ημερομηνία στο πεδίο dt_plus_1m:

SELECT dt, dateadd("d",30,dt) AS dt_plus_30d, dateadd("m",1,dt) AS dt_plus_1m


ΑΠΟ m_income;

Ερώτημα SQL Q046.Η συνάρτηση DateDiff έχει σχεδιαστεί για να υπολογίζει τη διαφορά μεταξύ δύο ημερομηνιών σε διαφορετικές μονάδες (ημέρες, μήνες ή έτη). Το ακόλουθο ερώτημα υπολογίζει τη διαφορά μεταξύ της ημερομηνίας στο πεδίο dt και της τρέχουσας ημερομηνίας σε ημέρες, μήνες και έτη:

SELECT dt, DateDiff("d",dt,Date()) AS last_day,


DateDiff("m",dt,Date()) ΩΣ last_months,
DateDiff("εεεε",dt,Date()) ΩΣ last_years
ΑΠΟ m_income;

Ερώτημα SQL Q047.Ο αριθμός των ημερών από την ημερομηνία παραλαβής των αγαθών (πίνακας m_έσοδα) έως την τρέχουσα ημερομηνία υπολογίζεται χρησιμοποιώντας τη συνάρτηση DateDiff και συγκρίνεται η ημερομηνία λήξης (πίνακας m_product):


DateDiff("d",dt,Date()) ΩΣ last_days
ΑΠΟ m_income ΩΣ ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_product AS β
ON a.product_id=b.id;

Ερώτημα SQL Q048.Υπολογίζεται ο αριθμός των ημερών από την ημερομηνία παραλαβής των εμπορευμάτων μέχρι την τρέχουσα ημερομηνία και στη συνέχεια ελέγχεται εάν αυτή η ποσότητα υπερβαίνει την ημερομηνία λήξης:

SELECT a.id, product_id, dt, lifedays,


DateDiff("d",dt,Date()) AS last_days, IIf(last_days>lifedays,"Yes","No") AS date_expire
ΑΠΟ m_income μια ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ m_product β
ON a.product_id=b.id;

Ερώτημα SQL Q049.Υπολογίζεται ο αριθμός των μηνών από την ημερομηνία παραλαβής των εμπορευμάτων μέχρι την τρέχουσα ημερομηνία. Η στήλη month_last1 υπολογίζει τον απόλυτο αριθμό μηνών, η στήλη month_last2 υπολογίζει τον αριθμό των πλήρων μηνών:

SELECT dt, DateDiff("m",dt,Date()) AS month_last1,


DateDiff("m",dt,Date())-iif(day(dt)>day(date()),1,0) AS month_last2
ΑΠΟ m_income;

SQL Query Q050.Εμφανίζεται τριμηνιαία έκθεση σχετικά με την ποσότητα και την ποσότητα των αγαθών που αγοράστηκαν για το 2011:

SELECT kvartal, SUM(outcome_sum) AS Σύνολο


FROM (ΕΠΙΛΟΓΗ ποσό*τιμή AS outcome_sum, μήνας(dt) AS m,
ΔΙΑΚΟΠΤΗΣ(m =10,4) ΩΣ kvartal
ΑΠΟ m_income WHERE έτος(dt)=2011) ΩΣ t
ΟΜΑΔΑ ΑΝΑ ΤΕΤΑΡΤΗ?

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

SELECT product_id, SUM(in_sum) AS έσοδα_sum, SUM(out_sum) AS outcome_sum


FROM (SELECT product_id, ποσό*τιμή ως in_sum, 0 ως out_sum
από m_income
ΕΝΩΣΗ ΟΛΩΝ
SELECT product_id, 0 as in_sum, ποσό*τιμή ως out_sum
από m_outcome) AS t
GROUP BY product_id
ΕΧΕΙ ΠΟΣΟ (in_sum)
Ερώτημα Q052.Η αρίθμηση των γραμμών που επιστρέφονται από ένα ερώτημα υλοποιείται με διαφορετικούς τρόπους. Για παράδειγμα, μπορείτε να επαναριθμήσετε τις γραμμές μιας αναφοράς που έχει προετοιμαστεί στο MS Access χρησιμοποιώντας την ίδια την MS Access. Μπορείτε επίσης να επαναριθμήσετε χρησιμοποιώντας γλώσσες προγραμματισμού, για παράδειγμα, VBA ή PHP. Ωστόσο, μερικές φορές αυτό πρέπει να γίνει στο ίδιο το ερώτημα SQL. Έτσι, το ακόλουθο ερώτημα θα αριθμήσει τις σειρές του πίνακα m_income σύμφωνα με την αύξουσα σειρά των τιμών του πεδίου ID:

SELECT COUNT(*) ως N, b.id, b.product_id, b.amount, b.price


ΑΠΟ m_income a INNER JOIN m_income b ON a.id GROUP BY b.id, b.product_id, b.amount, b.price;

Ερώτημα Q053.Εμφανίζονται τα πέντε κορυφαία προϊόντα μεταξύ των προϊόντων ανά ποσό πωλήσεων. Οι πρώτες πέντε εγγραφές εκτυπώνονται χρησιμοποιώντας την εντολή TOP:

ΕΠΙΛΕΞΤΕ ΚΟΡΥΦΑΙΑ 5, αναγνωριστικό_προϊόντος, άθροισμα(ποσό*τιμή) ΩΣ άθροισμα


ΑΠΟ m_outcome
GROUP BY product_id
ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ άθροισμα (ποσό*τιμή) DESC;

Ερώτημα Q054.Εμφανίζονται τα πέντε κορυφαία προϊόντα μεταξύ των προϊόντων ανά ποσό πωλήσεων και οι σειρές αριθμούνται ως αποτέλεσμα:

SELECT COUNT(*) AS N, b.product_id, b.summa


ΑΠΟ


ΑΠΟ m_outcome GROUP BY product_id) ΩΣ α
ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ
(SELECT product_id, άθροισμα(ποσό*τιμή) AS άθροισμα,
summa*10000000+product_id AS id
ΑΠΟ m_αποτέλεσμα ΟΜΑΔΑ ΚΑΤΑ product_id) ΩΣ β
ON a.id>=b.id
ΟΜΑΔΑ ΑΝΑ b.product_id, b.summa
ΕΧΟΝΤΑΣ COUNT(*) ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ COUNT(*);

Ερώτημα Q055.Το ακόλουθο ερώτημα SQL δείχνει τη χρήση των μαθηματικών συναρτήσεων COS, SIN, TAN, SQRT, ^ και ABS στο MS Access SQL:

SELECT (επιλέξτε πλήθος(*) από m_income) ως N, 3.1415926 ως pi, k,


2*pi*(k-1)/N ως x, COS(x) ως COS_, SIN(x) ως SIN_, TAN(x) ως TAN_,
SQR(x) ως SQRT_, x^3 ως "x^3", ABS(x) ως ABS_
FROM (ΕΠΙΛΟΓΗ COUNT(*) AS k
ΑΠΟ m_income AS INNER JOIN m_income AS b ON a.idGROUP BY b.id) t;

Ερώτημα SQL. Παραδείγματα στο MS Access. ΕΝΗΜΕΡΩΣΗ: 1-10

Ερώτημα U001.Το ακόλουθο ερώτημα αλλαγής SQL αυξάνει τις τιμές των αγαθών με κωδικό 3 στον πίνακα m_income κατά 10%:

ΕΝΗΜΕΡΩΣΗ m_income SET τιμή = τιμή*1.1


WHERE product_id=3;

Αίτημα U002.Το ακόλουθο ερώτημα ενημέρωσης SQL αυξάνει την ποσότητα όλων των προϊόντων στον πίνακα m_income κατά 22 μονάδες των οποίων τα ονόματα ξεκινούν με τη λέξη "Oil":

ΕΝΗΜΕΡΩΣΗ m_income SET ποσό = ποσό+22


WHERE product_id IN (SELECT id FROM m_product WHERE τίτλος LIKE "Oil*");

Αίτημα U003.Το ακόλουθο ερώτημα SQL για μια αλλαγή στον πίνακα m_outcome μειώνει τις τιμές όλων των προϊόντων που κατασκευάζονται από την Sladkoe LLC κατά 2 τοις εκατό:

ΕΝΗΜΕΡΩΣΗ m_outcome SET τιμή = τιμή*0,98


WHERE product_id IN
(ΕΠΙΛΟΓΗ a.id ΑΠΟ m_product a INNER JOIN m_supplier β
ON a.supplier_id=b.id WHERE b.title="LLC"Сладкое"");. !}

Εισαγωγή, διαγραφή, ενημέρωση εγγραφών σε βάση δεδομένων

Η μέθοδος ExecuteReader() ανακτά ένα αντικείμενο ανάγνωσης δεδομένων που σας επιτρέπει να προβάλλετε τα αποτελέσματα της πρότασης SQL Select χρησιμοποιώντας μια ροή πληροφοριών προς τα εμπρός μόνο για ανάγνωση. Ωστόσο, εάν πρέπει να εκτελέσετε εντολές SQL που τροποποιούν τον πίνακα δεδομένων, τότε πρέπει να καλέσετε τη μέθοδο ExecuteNonQuery() αυτού του αντικειμένουτης ομάδας. Αυτή η μεμονωμένη μέθοδος έχει σχεδιαστεί για να πραγματοποιεί εισαγωγές, αλλαγές και διαγραφές, ανάλογα με τη μορφή του κειμένου εντολής.

Εννοια μη ερώτημασημαίνει μια πρόταση SQL που δεν επιστρέφει ένα σύνολο αποτελεσμάτων. Ως εκ τούτου, Επιλέξτε δηλώσειςείναι ερωτήματα, αλλά οι δηλώσεις Εισαγωγή, Ενημέρωση και Διαγραφή δεν είναι. Κατά συνέπεια, η μέθοδος ExecuteNonQuery() επιστρέφει ένα int που περιέχει τον αριθμό των γραμμών που επηρεάζονται από αυτές τις δηλώσεις, αντί για ένα νέο σύνολο εγγραφών.

Για να δείξετε πώς μπορείτε να τροποποιήσετε τα περιεχόμενα μιας υπάρχουσας βάσης δεδομένων χρησιμοποιώντας μόνο το ερώτημα ExecuteNonQuery(), το επόμενο βήμα είναι να δημιουργήσετε τη δική σας βιβλιοθήκη πρόσβασης δεδομένων που ενσωματώνει τη διαδικασία βάσης δεδομένων AutoLot.

Σε ένα πραγματικό περιβάλλον παραγωγής, η λογική σας ADO.NET είναι σχεδόν βέβαιο ότι θα απομονωθεί σε ένα συγκρότημα .NET .dll για έναν απλό λόγο - την επαναχρησιμοποίηση του κώδικα! Αυτό δεν έγινε σε προηγούμενα άρθρα για να μην σας αποσπάσουν την προσοχή από τις εργασίες που έχετε. Αλλά θα ήταν χάσιμο χρόνου να αναπτύξουμε την ίδια λογική σύνδεσης, την ίδια λογική ανάγνωσης δεδομένων και την ίδια λογική εκτέλεσης εντολών για κάθε εφαρμογή που χρειάζεται να συνεργαστεί με τη βάση δεδομένων AutoLot.

Απομονώνοντας τη λογική πρόσβασης δεδομένων σε μια βιβλιοθήκη κωδικών .NET, διαφορετικές εφαρμογές με οποιοδήποτε περιβάλλον χρήστη (στυλ κονσόλας, στυλ επιφάνειας εργασίας, στυλ web, κ.λπ.) μπορούν να έχουν πρόσβαση στην υπάρχουσα βιβλιοθήκη, ακόμη και ανεξαρτήτως γλώσσας. Και αν αναπτύξετε μια βιβλιοθήκη πρόσβασης δεδομένων σε C#, τότε άλλοι προγραμματιστές .NET θα μπορούν να δημιουργήσουν τη δική τους διεπαφές χρήστησε οποιαδήποτε γλώσσα (για παράδειγμα, VB ή C++/CLI).

Η βιβλιοθήκη μας πρόσβασης δεδομένων (AutoLotDAL.dll) θα περιέχει έναν ενιαίο χώρο ονομάτων (AutoLotConnectedLayer) που θα αλληλεπιδρά με τη βάση δεδομένων AutoLot χρησιμοποιώντας τύπους συνδεδεμένων ADO.NET.

Ξεκινήστε δημιουργώντας ένα νέο έργο Βιβλιοθήκης C# Class που ονομάζεται AutoLotDAL (συντομογραφία του "AutoLot Data Access Layer") και, στη συνέχεια, αλλάξτε το αρχικό όνομα αρχείου κωδικού C# σε AutoLotConnDAL.cs.

Στη συνέχεια μετονομάστε το εύρος του χώρου ονομάτων σε AutoLotConnectedLayer και αλλάξτε το όνομα της αρχικής κλάσης σε InventoryDAL, επειδή αυτή η κλάση θα ορίσει διάφορα μέλη για αλληλεπίδραση με τον πίνακα Inventory της βάσης δεδομένων AutoLot. Τέλος, εισαγάγετε τους ακόλουθους χώρους ονομάτων .NET:

Χρήση του συστήματος. χρησιμοποιώντας System.Collections.Generic; χρησιμοποιώντας System.Text; χρησιμοποιώντας System.Data; χρησιμοποιώντας System.Data.SqlClient; namespace AutoLotConnectedLayer ( δημόσια κλάση InventoryDAL ( ) )

Προσθήκη λογικής σύνδεσης

Η πρώτη μας εργασία είναι να ορίσουμε μεθόδους που επιτρέπουν στη διαδικασία κλήσης να συνδεθεί και να αποσυνδεθεί από την πηγή δεδομένων χρησιμοποιώντας μια έγκυρη συμβολοσειρά σύνδεσης. Επειδή η συγκρότησή μας AutoLotDAL.dll θα είναι κωδικοποιημένη για χρήση τύπων κλάσεων System.Data.SqlClient, ορίστε μια ιδιωτική μεταβλητή SqlConnection που θα εκχωρηθεί όταν δημιουργηθεί το αντικείμενο InventoryDAL.

Επιπλέον, ορίστε μια μέθοδο OpenConnection() και στη συνέχεια μια άλλη CloseConnection() που θα αλληλεπιδράσει με αυτήν τη μεταβλητή:

Δημόσια κλάση InventoryDAL ( ιδιωτική SqlConnection connect = null; δημόσια κενή OpenConnection(string connectionString) (connect = new SqlConnection(connectionString); connect.Open(); ) public void CloseConnection() (connect.Close(); ) )

Για συντομία, ο τύπος InventoryDAL δεν θα ελέγξει για όλες τις πιθανές εξαιρέσεις και δεν θα δημιουργήσει προσαρμοσμένες εξαιρέσεις όταν προκύπτουν διάφορες καταστάσεις (για παράδειγμα, όταν η συμβολοσειρά σύνδεσης έχει λανθασμένη μορφή). Ωστόσο, εάν δημιουργούσατε μια βιβλιοθήκη πρόσβασης δεδομένων παραγωγής, πιθανότατα θα έπρεπε να χρησιμοποιήσετε τεχνικές χειρισμού δομημένων εξαιρέσεων για να λάβετε υπόψη τυχόν ανωμαλίες που ενδέχεται να προκύψουν κατά το χρόνο εκτέλεσης.

Προσθήκη λογικής εισαγωγής

Εισάγετε νέα καταχώρησηστον πίνακα Inventory καταλήγει στη μορφοποίηση της δήλωσης SQL Εισάγετε(ανάλογα με την είσοδο του χρήστη) και καλώντας τη μέθοδο ExecuteNonQuery() χρησιμοποιώντας το αντικείμενο εντολής. Για να το κάνετε αυτό, προσθέστε μια δημόσια μέθοδο InsertAuto() στην κλάση InventoryDAL που λαμβάνει τέσσερις παραμέτρους που αντιστοιχούν στις τέσσερις στήλες του πίνακα Inventory (CarID, Color, Make και PetName). Με βάση αυτά τα επιχειρήματα, δημιουργήστε μια γραμμή για να προσθέσετε μια νέα καταχώρηση. Τέλος, εκτελέστε την πρόταση SQL χρησιμοποιώντας το αντικείμενο SqlConnection:

Public void InsertAuto(int id, χρώμα string, string make, string petName) ( // Δήλωση SQL string sql = string.Format("Insert Into Inventory" + "(CarID, Make, Color, PetName) Τιμές(@CarId, @Make, @Color, @PetName)"); χρησιμοποιώντας (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( // Προσθήκη παραμέτρων cmd.Parameters.AddWithValue("@CarId", id); cmd.Parameters.AddWithValue("@Make", make); cmd. Parameters.AddWithValue("@Color", χρώμα); cmd.Parameters.AddWithValue("@PetName", petName); cmd.ExecuteNonQuery(); ) )

Ο καθορισμός κλάσεων που αντιπροσωπεύουν εγγραφές σε μια σχεσιακή βάση δεδομένων είναι ένας κοινός τρόπος δημιουργίας μιας βιβλιοθήκης πρόσβασης δεδομένων. Στην πραγματικότητα, το ADO.NET Entity Framework δημιουργεί αυτόματα κλάσεις με έντονη πληκτρολόγηση που σας επιτρέπουν να αλληλεπιδράτε με δεδομένα βάσης δεδομένων. Παρεμπιπτόντως, το αυτόνομο επίπεδο του ADO.NET δημιουργεί έντονα πληκτρολογημένα αντικείμενα DataSet για να αναπαραστήσει δεδομένα από έναν δεδομένο πίνακα σε μια σχεσιακή βάση δεδομένων.

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

Προσθήκη Λογικής Διαγραφής

Μετακίνηση υπάρχουσα εγγραφήδεν είναι πιο δύσκολο από την εισαγωγή ενός νέου δίσκου. Σε αντίθεση με τον κώδικα InsertAuto(), θα εμφανιστεί μια σημαντική περιοχή δοκιμής/αλίευσης που χειρίζεται την πιθανή κατάσταση όπου γίνεται προσπάθεια να αφαιρεθεί ένα αυτοκίνητο που κάποιος έχει ήδη παραγγείλει από τον πίνακα Πελάτες. Προσθέστε την ακόλουθη μέθοδο στην κλάση InventoryDAL:

Public void DeleteCar(int id) ( string sql = string.Format("Delete from Inventory where CarID = "(0)"", id); χρησιμοποιώντας (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( δοκιμάστε ( cmd.ExecuteNonQuery(); ) catch (SqlException ex) ( Exception error = new Exception ("Συγγνώμη, αυτό το μηχάνημα είναι σε παραγγελία!", ex); Σφάλμα ρίψης; ) ) )

Προσθήκη λογικής αλλαγής

Όταν πρόκειται για ενημέρωση μιας υπάρχουσας εγγραφής στον πίνακα Inventory, τίθεται αμέσως το προφανές ερώτημα: τι ακριβώς μπορεί να επιτραπεί να αλλάξει η διαδικασία κλήσης: το χρώμα του αυτοκινήτου, το φιλικό όνομα, το μοντέλο ή και τα τρία; Ένας τρόπος για να μεγιστοποιήσετε την ευελιξία είναι να ορίσετε μια μέθοδο που λαμβάνει μια παράμετρο τύπου string, η οποία μπορεί να περιέχει οποιαδήποτε πρόταση SQL, αλλά αυτό είναι τουλάχιστον επικίνδυνο.

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

Public void UpdateCarPetName(int id, string newpetName) ( string sql = string.Format("Update Inventory Set PetName = "(0)" Where CarID = "(1)"", newpetName, id); χρησιμοποιώντας (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( cmd.ExecuteNonQuery(); ) )

Προσθήκη λογικής δειγματοληψίας

Τώρα πρέπει να προσθέσουμε μια μέθοδο για την επιλογή εγγραφών. Όπως φαίνεται νωρίτερα, το αντικείμενο ανάγνωσης δεδομένων ενός συγκεκριμένου παρόχου δεδομένων σάς επιτρέπει να επιλέγετε εγγραφές χρησιμοποιώντας έναν δρομέα μόνο για ανάγνωση. Καλώντας τη μέθοδο Read(), μπορείτε να επεξεργαστείτε κάθε εγγραφή μία κάθε φορά. Όλα αυτά είναι υπέροχα, αλλά τώρα πρέπει να καταλάβουμε πώς να επιστρέψουμε αυτές τις εγγραφές στο επίπεδο εφαρμογής κλήσης.

Μια προσέγγιση θα ήταν να ανακτήσετε τα δεδομένα χρησιμοποιώντας τη μέθοδο Read() και στη συνέχεια να συμπληρώσετε και να επιστρέψετε έναν πολυδιάστατο πίνακα (ή άλλο αντικείμενο όπως η γενική λίστα ).

Ένας άλλος τρόπος είναι να επιστρέψετε ένα αντικείμενο System.Data.DataTable, το οποίο στην πραγματικότητα ανήκει στο αυτόνομο επίπεδο ADO.NET. Το DataTable είναι μια κλάση που αντιπροσωπεύει ένα μπλοκ δεδομένων σε πίνακα (όπως χαρτί ή υπολογιστικό φύλλο).

Η κλάση DataTable περιέχει δεδομένα ως συλλογή γραμμών και στηλών. Αυτές οι συλλογές μπορούν να συμπληρωθούν μέσω προγραμματισμού, αλλά ο τύπος DataTable έχει μια μέθοδο Load() που μπορεί να τις συμπληρώσει αυτόματα χρησιμοποιώντας ένα αντικείμενο ανάγνωσης δεδομένων! Ακολουθεί ένα παράδειγμα όπου τα δεδομένα από τον πίνακα Inventory επιστρέφονται ως DataTable:

Public DataTable GetAllInventoryAsDataTable() ( DataTable inv = new DataTable(); string sql = "Select * From Inventory"; χρησιμοποιώντας (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( SqlDataReader dr = cmd.ExevReader); .Load(dr); dr.Close(); ) return inv; )

Εργασία με παραμετροποιημένα αντικείμενα εντολών

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

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

Για την υποστήριξη παραμετροποιημένων ερωτημάτων, τα αντικείμενα εντολών ADO.NET διατηρούν μια συλλογή μεμονωμένων αντικειμένων παραμέτρων. Από προεπιλογή, αυτή η συλλογή είναι κενή, αλλά μπορείτε να προσθέσετε οποιοδήποτε αριθμό αντικειμένων παραμέτρων που ταιριάζουν παραμέτρους κράτησης θέσηςσε ένα ερώτημα SQL. Εάν χρειάζεται να συσχετίσετε μια παράμετρο ερωτήματος SQL με ένα μέλος της συλλογής παραμέτρων κάποιου αντικειμένου εντολών, προηγηθείτε της παραμέτρου SQL με το σύμβολο @ (τουλάχιστον όταν εργάζεστε με τη Microsoft SQL Server, αν και δεν υποστηρίζουν όλα τα DBMS αυτόν τον προσδιορισμό).

Ρύθμιση παραμέτρων χρησιμοποιώντας τον τύπο DbParameter

Πριν ξεκινήσουμε τη δημιουργία παραμετροποιημένων ερωτημάτων, ας εξοικειωθούμε με τον τύπο DbParameter (η βασική κλάση για τα αντικείμενα παραμέτρων παρόχου). Αυτή η κλάση έχει έναν αριθμό ιδιοτήτων που σας επιτρέπουν να καθορίσετε το όνομα, το μέγεθος και τον τύπο της παραμέτρου, καθώς και άλλα χαρακτηριστικά, όπως την κατεύθυνση προβολής της παραμέτρου. Μερικές σημαντικές ιδιότητες του τύπου DbParameter δίνονται παρακάτω:

DbType

Λαμβάνει ή ορίζει τον τύπο δεδομένων από μια παράμετρο, που αναπαρίσταται ως τύπος CLR

Κατεύθυνση

Επιστρέφει ή ορίζει τον τύπο της παραμέτρου: μόνο είσοδος, μόνο έξοδος, είσοδος και έξοδος ή παράμετρος για να επιστρέψει μια τιμή

IsNullable

Επιστρέφει ή ορίζει εάν μια παράμετρος μπορεί να δέχεται κενές τιμές

Όνομα παραμέτρου

Λαμβάνει ή ορίζει το όνομα DbParameter

Μέγεθος

Ζητήματα ή εγκαταστάσεις μέγιστο μέγεθοςδεδομένα για την παράμετρο (χρήσιμο μόνο για δεδομένα κειμένου)

αξία

Επιστρέφει ή ορίζει την τιμή μιας παραμέτρου

Για να δείξουμε πώς να συμπληρώσετε μια συλλογή αντικειμένων εντολών με αντικείμενα συμβατά με DBParameter, ας ξαναγράψουμε τη μέθοδο InsertAuto() έτσι ώστε να χρησιμοποιεί αντικείμενα παραμέτρων (όλες οι άλλες μέθοδοι μπορούν να ανακατασκευαστούν με παρόμοιο τρόπο, αλλά το παρόν παράδειγμα θα είναι αρκετό για εμάς):

Public void InsertAuto(int id, χρώμα string, string make, string petName) ( // SQL statement string sql = string.Format("Insert Into Inventory" + "(CarID, Make, Color, PetName) Τιμές("(0) ","(1)","(2)","(3)")", id, make, color, petName); // Παραμετροποιημένη εντολή χρησιμοποιώντας (SqlCommand cmd = νέα SqlCommand(sql, this.connect)) ( SqlParameter param = new SqlParameter(); param.ParameterName = "@CarID"; param.Value = id; param.SqlDbType = SqlDbType.Int; cmd.Parameters.Add(param); param = new SqlParameter(); ParameterName = "@Make"; param.Value = make; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Color "; param.Value = χρώμα; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@PetName"; param.Value = petName, param.SqlDbType = SqlDbType.Char, param.Size = 10, cmd.Parameters.Add(param), cmd.ExecuteNonQuery(); ) )

Σημειώστε ότι το ερώτημα SQL εδώ περιέχει επίσης τέσσερις χαρακτήρες κράτησης θέσης, κάθε ένας από τους οποίους προηγείται ένα σύμβολο @. Χρησιμοποιώντας την ιδιότητα ParameterName στον τύπο SqlParameter, μπορείτε να περιγράψετε καθένα από αυτά τα σύμβολα κράτησης θέσης και να καθορίσετε διάφορες πληροφορίες (τιμή, τύπος δεδομένων, μέγεθος κ.λπ.) με αυστηρά πληκτρολογημένο τρόπο. Αφού προετοιμαστούν όλα τα αντικείμενα παραμέτρων, προστίθενται στη συλλογή αντικειμένων εντολών χρησιμοποιώντας την κλήση Add().

Εδώ χρησιμοποιούνται διάφορες ιδιότητες για το σχεδιασμό αντικειμένων παραμέτρων. Ωστόσο, σημειώστε ότι τα αντικείμενα παραμέτρων υποστηρίζουν έναν αριθμό υπερφορτωμένων κατασκευαστών που σας επιτρέπουν να ορίσετε τις τιμές διαφόρων ιδιοτήτων (πράγμα που οδηγεί σε μια πιο συμπαγή βάση κώδικα). Σημειώστε επίσης ότι το Visual Studio 2010 διαθέτει διάφορους σχεδιαστές γραφικών που θα δημιουργήσουν αυτόματα πολύ από αυτόν τον κουραστικό κώδικα χειρισμού παραμέτρων για εσάς.

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

Κανόνες αγκύλεςσημαίνει [προαιρετικό μέρος] μιας κατασκευής. Μια κάθετη γραμμή υποδεικνύει μια επιλογή μεταξύ των επιλογών (var1|var2). Η έλλειψη σημαίνει πιθανή επανάληψη πολλές φορές - 1 φορά, 2 φορές [, …]

Δήλωση SELECT

Δίνει εντολή στον μηχανισμό βάσης δεδομένων της Microsoft Access να επιστρέψει πληροφορίες από τη βάση δεδομένων ως σύνολο εγγραφών.

Σύνταξη

ΕΠΙΛΟΓΗ [ κατηγορούμενο] { * | τραπέζι.* | [τραπέζι.]πεδίο 1

[, [τραπέζι.]πεδίο 2 [, ...]]}
ΑΠΟ table_expression [, ...]




Η πρόταση SELECT περιλαμβάνει τα ακόλουθα στοιχεία.

Στοιχείο

Περιγραφή

Κατηγορούμενο

Ένα από τα ακόλουθα κατηγορήματα: ALL, DISTINCT, DISTINCTROW ή TOP. Τα κατηγορήματα χρησιμοποιούνται για τον περιορισμό του αριθμού των εγγραφών που επιστρέφονται. Εάν δεν δίνεται κατηγόρημα, η προεπιλογή είναι ΟΛΑ.

Υποδεικνύει ότι όλα τα πεδία επιλέγονται από τον καθορισμένο πίνακα ή πίνακες

Τραπέζι

Το όνομα του πίνακα από τα πεδία του οποίου επιλέγονται οι εγγραφές

πεδίο 1, πεδίο 2

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

ψευδώνυμο 1, ψευδώνυμο 2

Ονόματα που χρησιμοποιούνται ως επικεφαλίδες στηλών αντί των αρχικών ονομάτων στηλών τραπέζια

table_expression

Ένα ή περισσότερα ονόματα πινάκων που περιέχουν τα προς ανάκτηση δεδομένα.

εξωτερική_βάση δεδομένων

Το όνομα της βάσης δεδομένων που περιέχει τους πίνακες που καθορίζονται στο στοιχείο table_expressionεάν δεν βρίσκονται στην τρέχουσα βάση δεδομένων

Σημειώσεις

Για να εκτελέσετε αυτήν τη λειτουργία, η μηχανή βάσης δεδομένων της Microsoft Access πραγματοποιεί αναζήτηση στους καθορισμένους πίνακες, ανακτά τις επιθυμητές στήλες, επιλέγει τις γραμμές που πληρούν τις καθορισμένες συνθήκες και ταξινομεί ή ομαδοποιεί τις σειρές που προκύπτουν με την καθορισμένη σειρά.

Οι δηλώσεις SELECT δεν αλλάζουν τα δεδομένα της βάσης δεδομένων.

Η πρόταση SELECT είναι συνήθως η πρώτη λέξη της πρότασης SQL (δήλωση SQL (string). Έκφραση που ορίζει Εντολή SQL, όπως ΕΠΙΛΟΓΗ, ΕΝΗΜΕΡΩΣΗ ή ΔΙΑΓΡΑΦΗ και συμπεριλαμβάνοντας ρήτρες όπως ΠΟΥ ή ΠΑΡΑΓΓΕΛΙΑ. Οι δηλώσεις/συμβολοσειρές SQL χρησιμοποιούνται συνήθως σε ερωτήματα και στατιστικές συναρτήσεις.) Οι περισσότερες εντολές SQL είναι είτε προτάσεις SELECT είτε προτάσεις SELECT...INTO.

Η ελάχιστη σύνταξη για μια πρόταση SELECT είναι η εξής:

ΕΠΙΛΕΓΩ χωράφιαΑΠΟ τραπέζι

Μπορείτε να χρησιμοποιήσετε έναν αστερίσκο (*) για να επιλέξετε όλα τα πεδία σε έναν πίνακα. Το ακόλουθο παράδειγμα επιλέγει όλα τα πεδία στον πίνακα Υπάλληλοι.

ΕΠΙΛΟΓΗ * ΑΠΟ Υπαλλήλους.

Εάν το όνομα του πεδίου περιλαμβάνεται σε πολλούς πίνακες στην πρόταση FROM, πριν από αυτό το όνομα του πίνακα και τη δήλωση «.» (τελεία). Στο παρακάτω παράδειγμα, το πεδίο "Τμήμα" υπάρχει στους πίνακες "Εργαζόμενοι" και "Επιβλέποντες". Η δήλωση SQL επιλέγει τμήματα από τον πίνακα Υπάλληλοι και ονόματα επόπτη από τον πίνακα Επόπτες.

ΕΠΙΛΕΞΤΕ Εργαζόμενους. Τμήματος, Προϊστάμενοι. Όνομα στελέχους ΑΠΟ Υπαλλήλους ΕΣΩΤΕΡΙΚΟ ΣΥΜΜΕΤΟΧΗ Στελέχη ΟΠΟΥ Εργαζόμενοι. Τμήμα = Διευθυντές. Τμήμα;

Όταν δημιουργείτε ένα αντικείμενο RecordSet, το όνομα του πεδίου πίνακα χρησιμοποιείται από τη μηχανή βάσης δεδομένων της Microsoft Access ως το όνομα του αντικειμένου "Field" στο αντικείμενο RecordSet. Εάν το όνομα του πεδίου πρέπει να αλλάξει ή δεν παρέχεται από την έκφραση που δημιουργεί το πεδίο, χρησιμοποιήστε μια δεσμευμένη λέξη (Δεσμευμένη λέξη. Μια λέξη που είναι στοιχείο μιας γλώσσας, όπως η Visual Basic. Οι δεσμευμένες λέξεις περιλαμβάνουν ονόματα δηλώσεων, ενσωματωμένες συναρτήσεις και τύποι δεδομένων, μέθοδοι, τελεστές και αντικείμενα.) AS. Το ακόλουθο παράδειγμα δείχνει πώς χρησιμοποιείται η κεφαλίδα "Ημέρα" για την ονομασία του επιστρεφόμενου αντικειμένου Πεδίοστο ληφθέν αντικείμενο RecordSet.

ΕΠΙΛΕΞΤΕ γενέθλια ΩΣ ΗΜΕΡΑ ΑΠΟ Εργαζόμενους.

Όταν εργάζεστε με συγκεντρωτικές συναρτήσεις ή ερωτήματα που επιστρέφουν διφορούμενα ή πανομοιότυπα ονόματα αντικειμένων Πεδίο, θα πρέπει να χρησιμοποιήσετε τον όρο AS για να δημιουργήσετε ένα διαφορετικό όνομα αντικειμένου Πεδίο. Στο παρακάτω παράδειγμα, το επιστρεφόμενο αντικείμενο Πεδίοστο ληφθέν αντικείμενο RecordSetδίνεται το όνομα «Απογραφή».

SELECT COUNT(EmployeeCode) AS Census FROM Employees;

Όταν εργάζεστε με μια πρόταση SELECT, μπορείτε να χρησιμοποιήσετε πρόσθετες ρήτρες για περαιτέρω περιορισμό και οργάνωση των δεδομένων που ανακτώνται. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα βοήθειας για την προσφορά που χρησιμοποιείτε.

Ρήτρα ΑΠΟ

Καθορίζει πίνακες και ερωτήματα που περιέχουν τα πεδία που αναφέρονται στη δήλωση SELECT.

Σύνταξη

ΕΠΙΛΕΓΩ field_list
ΑΠΟ table_expression

Μια δήλωση SELECT που περιέχει μια πρόταση FROM περιλαμβάνει τα ακόλουθα στοιχεία:

Στοιχείο

Περιγραφή

field_list

table_expression

Μια έκφραση που ορίζει έναν ή περισσότερους πίνακες - πηγές δεδομένων. Η έκφραση μπορεί να είναι ένα όνομα πίνακα, ένα αποθηκευμένο όνομα ερωτήματος ή μια έκφραση αποτελέσματος που έχει δημιουργηθεί χρησιμοποιώντας έναν τελεστή ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ, ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ ή ΔΕΞΙΑ ΣΥΝΔΕΣΗ

εξωτερική_βάση δεδομένων

Η πλήρης διαδρομή προς την εξωτερική βάση δεδομένων που περιέχει όλους τους πίνακες που καθορίζονται σε table_expression

Σημειώσεις


Απαιτείται η παρουσία μιας πρότασης FROM μετά από μια πρόταση SELECT.

Η σειρά με την οποία παρατίθενται οι πίνακες table_expressionδεν έχει σημασία.

Χρήση συνδεδεμένων πινάκων (Συνδεδεμένος πίνακας. Πίνακας που αποθηκεύεται σε αρχείο που δεν αποτελεί μέρος της ανοιχτής βάσης δεδομένων, αλλά είναι προσβάσιμο από τη Microsoft Access. Ο χρήστης μπορεί να προσθέσει, να διαγράψει και να αλλάξει εγγραφές στον συνδεδεμένο πίνακα, αλλά δεν μπορεί να αλλάξει τη δομή του .) αντί για την ρήτρα IN, μπορείτε να κάνετε τη διαδικασία ανάκτησης δεδομένων από μια εξωτερική βάση δεδομένων ευκολότερη και πιο αποτελεσματική.

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

ΕΠΙΛΟΓΗ Επώνυμο, Όνομα

ΑΠΟ Εργαζόμενους?

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

Σύνταξη

ΕΠΙΛΟΓΗ ]]
ΑΠΟ τραπέζι

Η πρόταση SELECT που περιέχει αυτά τα κατηγορήματα περιλαμβάνει τα ακόλουθα στοιχεία:

Συστατικό

Περιγραφή

Υπονοείται εάν δεν περιλαμβάνονται κατηγορήματα. Η μηχανή βάσης δεδομένων της Microsoft Access επιλέγει όλες τις εγγραφές που ταιριάζουν με τις συνθήκες μιας πρότασης SQL (δήλωση SQL (string). Μια έκφραση που ορίζει μια εντολή SQL, όπως SELECT, UPDATE ή DELETE, και περιλαμβάνει προτάσεις, όπως WHERE ή ORDER BY Οι δηλώσεις/συμβολοσειρές SQL χρησιμοποιούνται συνήθως σε ερωτήματα και στατιστικές συναρτήσεις). Τα ακόλουθα δύο πανομοιότυπα παραδείγματα δείχνουν πώς να επιστρέψετε όλες τις εγγραφές από τον πίνακα Υπάλληλοι.

ΑΠΟ Εργαζόμενους

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ EmployeeCode.

ΑΠΟ Εργαζόμενους

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ EmployeeCode.

Εξαιρούνται οι εγγραφές που περιέχουν διπλότυπα δεδομένα στα επιλεγμένα πεδία. Μόνο οι μοναδικές τιμές καθενός από τα πεδία που αναφέρονται στη δήλωση SELECT περιλαμβάνονται στα αποτελέσματα του ερωτήματος. Για παράδειγμα, ορισμένοι υπάλληλοι που αναφέρονται στον πίνακα Υπάλληλοι μπορεί να έχουν το ίδιο επίθετο. Εάν δύο εγγραφές περιέχουν το επώνυμο "Ivanov" στο πεδίο Επώνυμο, η ακόλουθη δήλωση SQL επιστρέφει μόνο μία εγγραφή που περιέχει το επώνυμο "Ivanov".

ΕΠΙΛΟΓΗ ΔΙΑΚΡΙΤΟΥ Επώνυμου

Εάν το στοιχείο DISTINCT παραλειφθεί, το ερώτημα επιστρέφει και τις δύο εγγραφές με το επίθετο "Ivanov".

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

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

Εξαιρεί δεδομένα από εγγραφές που επαναλαμβάνονται στο σύνολό τους αντί να περιέχουν μεμονωμένα πεδία με τα ίδια δεδομένα. Ας υποθέσουμε ότι έχει δημιουργηθεί ένα ερώτημα που συνδέει τους πίνακες «Πελάτες» και «Παραγγελίες» χρησιμοποιώντας το πεδίο «Κωδικός πελάτη». Ο πίνακας Πελάτες δεν περιέχει διπλότυπα πεδία Αναγνωριστικού πελάτη, αλλά υπάρχουν στον πίνακα Παραγγελίες επειδή κάθε πελάτης μπορεί να έχει πολλές παραγγελίες. Η ακόλουθη δήλωση SQL δείχνει τον τρόπο χρήσης του στοιχείου DISTINCTROW για τη λίστα οργανισμών που έχουν κάνει τουλάχιστον μία παραγγελία, χωρίς να αναφέρει τις λεπτομέρειες αυτών των παραγγελιών.

ΕΠΙΛΕΞΤΕ ΔΙΑΚΡΙΤΙΚΟ Τίτλο ΑΠΟ Παραγγελίες ΕΣΩΤΕΡΙΚΗΣ ΣΥΜΜΕΤΟΧΗΣ Πελατών

ON Πελάτες. CustomerId = Παραγγελίες. Κωδικός πελάτη

ΠΑΡΑΓΓΕΛΙΑ ΑΝΑ Τίτλο.

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

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

ΜΠΛΟΥΖΑ n

Επιστρέφει τον καθορισμένο αριθμό εγγραφών που είναι μεταξύ των πρώτων ή των τελευταίων εγγραφών στο εύρος που καθορίζεται από τον όρο ORDER BY. Ας υποθέσουμε ότι θέλετε να εμφανίσετε τα ονόματα των κορυφαίων 25 μαθητών από την τάξη του 1994.

Ονομα επίθετο

ΠΟΥ Έτος Αποφοίτησης = 2003

ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ Βαθμού Μέσος όρος DESC.

Εάν δεν συμπεριλάβετε τον όρο ORDER BY, το ερώτημα θα επιστρέψει ένα τυχαίο σύνολο 25 εγγραφών από τον πίνακα Students που ικανοποιεί τον όρο WHERE.

Το κατηγόρημα TOP δεν περιλαμβάνει επιλογή μεταξύ ίσων τιμών. Εάν η 25η και η 26η εγγραφή στο προηγούμενο παράδειγμα είχαν την ίδια ΣΔΣ, το ερώτημα θα επέστρεφε 26 εγγραφές.

Μπορείτε επίσης να χρησιμοποιήσετε τη δεσμευμένη λέξη PERCENT για να ανακτήσετε κάποιο ποσοστό της πρώτης ή της τελευταίας εγγραφής στο εύρος που καθορίζεται από τον όρο ORDER BY. Ας υποθέσουμε ότι αντί για τους κορυφαίους 25, θέλετε να εμφανίσετε το χαμηλότερο 10% των μαθητών στην τάξη αποφοίτησης.

ΕΠΙΛΕΞΤΕ ΚΟΡΥΦΑΙΟ 10 τοις εκατό

Ονομα επίθετο

ΠΟΥ Έτος Αποφοίτησης = 2003

ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ GradePointAverage ASC.

Το κατηγόρημα ASC καθορίζει την έξοδο των τιμών από το κάτω μέρος του εύρους. Η τιμή που ακολουθεί το κατηγόρημα TOP πρέπει να είναι ένας τύπος δεδομένων Integer. Ο βασικός τύπος δεδομένων που χρησιμοποιείται για την αποθήκευση ακέραιων τιμών. Μια μεταβλητή Integer αποθηκεύεται ως αριθμός 64 bit (8 byte) στην περιοχή -32768 έως 32767. ) χωρίς υπογραφή .

Το κατηγόρημα TOP δεν επηρεάζει εάν το ερώτημα μπορεί να ενημερωθεί.

τραπέζι

Το όνομα του πίνακα από τον οποίο ανακτώνται οι εγγραφές.

δείτε επίσης

Δήλωση SELECT

Ρήτρα ΑΠΟ

ρήτρα WHERE

Καθορίζει ποιες εγγραφές από τους πίνακες που παρατίθενται στον όρο FROM υποβάλλονται σε επεξεργασία με δηλώσεις SELECT, UPDATE ή DELETE.

Σύνταξη

ΕΠΙΛΕΓΩ field_list
ΑΠΟ table_expression
ΟΠΟΥ επιλογή_συνθήκες

Μια δήλωση SELECT που περιέχει μια πρόταση WHERE περιλαμβάνει τα ακόλουθα μέρη.

Μέρος

Περιγραφή

field_list

Το όνομα του πεδίου ή των πεδίων που ανακτώνται μαζί με τυχόν ψευδώνυμα (Ψευδώνυμο (SQL). Ένα εναλλακτικό όνομα για έναν πίνακα ή ένα πεδίο σε μια έκφραση. Τα ψευδώνυμα συνήθως χρησιμοποιούνται ως συντομότερα ονόματα πινάκων ή πεδίων για ευκολία μεταγενέστερης αναφοράς σε προγράμματα, για την αποφυγή διφορούμενων παραπομπών και για τη λήψη περισσότερων περιγραφικών ονομάτων κατά την εμφάνιση των αποτελεσμάτων ερωτημάτων.), κατηγορήματα (ALL, DISTINCT, DISTINCTROW ή TOP) ή με οποιαδήποτε άλλη παράμετρο της πρότασης SELECT.

table_expression

Το όνομα του πίνακα ή των πινάκων από τους οποίους ανακτώνται δεδομένα.

επιλογή_συνθήκες

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

Σημειώσεις

Η μηχανή βάσης δεδομένων της Microsoft Access επιλέγει εγγραφές που πληρούν τις προϋποθέσεις που αναφέρονται στον όρο WHERE. Εάν ο όρος WHERE δεν έχει καθοριστεί, το ερώτημα επιστρέφει όλες τις σειρές στον πίνακα. Εάν ένα ερώτημα καθορίζει πολλούς πίνακες αλλά δεν προσδιορίζει έναν όρο WHERE ή JOIN, το ερώτημα παράγει ένα καρτεσιανό προϊόν (καρτεσιανό προϊόν. Είναι το αποτέλεσμα της εκτέλεσης μιας πρότασης SQL SELECT που έχει έναν όρο FROM που αναφέρεται σε δύο ή περισσότερους πίνακες και όχι WHERE ή Ο όρος JOIN που καθορίζει τη μέθοδο σύνδεσης.) πίνακες.

Η ρήτρα WHERE δεν απαιτείται, αλλά εάν χρησιμοποιείται, πρέπει να ακολουθεί την ρήτρα FROM. Για παράδειγμα, μπορείτε να επιλέξετε όλους τους υπαλλήλους από το τμήμα πωλήσεων (WHERE Τμήμα = "Πωλήσεις") ή όλους τους πελάτες ηλικίας μεταξύ 18 και 30 ετών (WHERE Ηλικία μεταξύ 18 και 30).

Εάν ένας όρος JOIN δεν χρησιμοποιείται για μια λειτουργία σύνδεσης SQL σε πολλούς πίνακες, το αντικείμενο που προκύπτει Σετ ρεκόρθα είναι αδύνατη η ενημέρωση.

Η πρόταση WHERE είναι παρόμοια με την ρήτρα HAVING και καθορίζει τις επιλεγμένες εγγραφές. Αφού οι εγγραφές ομαδοποιηθούν με τον όρο GROUP BY, ο όρος HAVING καθορίζει επίσης την εγγραφή που θα εμφανιστεί.

Ο όρος WHERE χρησιμοποιείται για τον αποκλεισμό εγγραφών που δεν χρειάζεται να ομαδοποιηθούν χρησιμοποιώντας τον όρο GROUP BY.

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

ΕΠΙΛΕΞΤΕ Επώνυμο, Μισθός ΑΠΟ Εργαζόμενους ΟΠΟΥ Μισθός > 21000;

Η πρόταση WHERE μπορεί να περιέχει έως και 40 εκφράσεις που συνδέονται με λογικούς τελεστές (για παράδειγμα, ΚΑΙΚαι Ή).

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

ΕΠΙΛΟΓΗ [Το αγαπημένο εστιατόριο του πελάτη]

Προσδιορισμός ενός επιχειρήματος επιλογή_συνθήκες, κυριολεκτικά ημερομηνία (Ημερομηνία κυριολεκτικά. Οποιαδήποτε ακολουθία χαρακτήρων σε έγκυρη μορφή, περικλείεται σε αριθμητικά σύμβολα (#). Οι έγκυρες μορφές είναι η μορφή ημερομηνίας που καθορίζεται στις ρυθμίσεις Γλώσσα και Πρότυπα και η Μορφή Καθολικής ημερομηνίας.) πρέπει να αντιπροσωπεύονται σε μορφή Η.Π.Α. , ακόμα κι αν χρησιμοποιείται μορφή ημερομηνίας εκτός ΗΠΑ. έκδοση του μηχανισμού βάσης δεδομένων της Microsoft Access. Για παράδειγμα, η ημερομηνία "10 Μαΐου 1996" γράφεται ως 10/5/96 στο Ηνωμένο Βασίλειο και ως 05/10/1996 στη Ρωσία. Θυμηθείτε να εσωκλείσετε τα κυριολεκτικά της ημερομηνίας σε αριθμούς (#), όπως φαίνεται στα παρακάτω παραδείγματα.

Για να βρείτε εγγραφές για τις 10 Μαΐου 1996 στη βάση δεδομένων του Ηνωμένου Βασιλείου, χρησιμοποιήστε την ακόλουθη δήλωση SQL:

SELECT * FROM Orders WHERE Ημερομηνία αποστολής = #10.05.1996#;

Μπορείτε επίσης να χρησιμοποιήσετε τη λειτουργία DateValue, αναγνωρίζοντας διεθνείς παραμέτρους, εγκατεστημένο από τη Microsoft Windows®. Για παράδειγμα, για τη Ρωσία χρησιμοποιήστε αυτόν τον κωδικό:

SELECT * FROM Orders WHERE Ημερομηνία αποστολής = DateValue("05/10/1996");

Και ο παρακάτω κώδικας είναι για το Ηνωμένο Βασίλειο:

SELECT * FROM Orders WHERE Ημερομηνία αποστολής = DateValue("10/5/96");

Σημείωση.Εάν η στήλη που καθορίζεται στη σειρά κριτηρίων επιλογής είναι τύπου GUID (Replica ID (GUID). Ένα πεδίο 16 byte σε μια βάση δεδομένων της Microsoft Access που χρησιμοποιείται για τον μοναδικό προσδιορισμό της αναπαραγωγής. Τα GUID χρησιμοποιούνται για την αναγνώριση αντιγράφων, συνόλων αντιγράφων, πινάκων, εγγραφών και Άλλα αντικείμενα Στις βάσεις δεδομένων της Microsoft Access, οι κωδικοί GUID ονομάζονται αντίγραφοι.), οι συνθήκες επιλογής χρησιμοποιούν μια ελαφρώς διαφορετική σύνταξη.

WHERE ReplicaID = (GUID (AB-CDEF0ABCDEF))

Βεβαιωθείτε ότι οι ένθετες παρενθέσεις και οι παύλες έχουν τοποθετηθεί σωστά.

Πηγή σελίδα: http://office. /ru-ru/access/HA.aspx? pid=CH

ΟΜΑΔΑ ΑΝΑ ρήτρα

Συνδυάζει εγγραφές με τις ίδιες τιμές που βρίσκονται στην καθορισμένη λίστα πεδίων σε μία εγγραφή. Μια συνοπτική τιμή δημιουργείται για κάθε εγγραφή εάν μια συνάρτηση συγκέντρωσης SQL περιλαμβάνεται στη δήλωση SELECT, όπως π.χ. Αθροισμαή μετρώ.

Σύνταξη

ΕΠΙΛΕΓΩ field_list
ΑΠΟ τραπέζι
ΟΠΟΥ επιλογή_κατάσταση

Μια δήλωση SELECT που περιέχει μια πρόταση GROUP BY περιλαμβάνει τα ακόλουθα στοιχεία:

Στοιχείο

Περιγραφή

field_list

Τα ονόματα των πεδίων που ανακτώνται μαζί με τυχόν ψευδώνυμα (Ψευδώνυμο (SQL). Ένα εναλλακτικό όνομα για έναν πίνακα ή ένα πεδίο σε μια έκφραση. Τα ψευδώνυμα χρησιμοποιούνται συνήθως ως συντομότερα ονόματα πινάκων ή πεδίων για ευκολία μεταγενέστερης αναφοράς σε προγράμματα, για την αποφυγή διφορούμενων παραπομπών και για τη λήψη πιο ενημερωτικών ονομάτων κατά την εμφάνιση των αποτελεσμάτων ερωτημάτων.) και στατιστικά Συναρτήσεις SQL, κατηγορήματα (ALL, DISTINCT, DISTINCTROW ή TOP) ή άλλες παράμετροι της πρότασης SELECT

τραπέζι

επιλογή_συνθήκες

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

group_field_list

group_field_list

Σημειώσεις

Η ρήτρα GROUP BY είναι προαιρετική.

Εάν οι στατιστικές συναρτήσεις SQL δεν περιλαμβάνονται στη δήλωση SELECT, οι συνοπτικές τιμές δεν υπολογίζονται.

GROUP BY τιμές πεδίων που είναι Null (Null. Μια τιμή που μπορεί να εισαχθεί σε ένα πεδίο ή να χρησιμοποιηθεί σε εκφράσεις και ερωτήματα για να υποδείξει δεδομένα που λείπουν ή άγνωστα. Στη Visual Basic, η λέξη-κλειδί Null καθορίζει μια τιμή Null. Ορισμένα πεδία, όπως π.χ. ως πεδία πρωτεύοντος κλειδιού, δεν μπορεί να περιέχουν μηδενικές τιμές.), ομαδοποιούνται και δεν παραλείπονται. Ωστόσο, οι αξίες Μηδενικόδεν αξιολογούνται από καμία από τις στατιστικές συναρτήσεις SQL.

Ο όρος WHERE χρησιμοποιείται για τον αποκλεισμό σειρών που δεν χρειάζεται να ομαδοποιηθούν. Η ρήτρα HAVING χρησιμοποιείται για το φιλτράρισμα εγγραφών μετά την ομαδοποίηση.

Πεδία από τη λίστα πεδίων GROUP BY που δεν περιέχουν τύπο δεδομένων Memo (Τύπος δεδομένων πεδίου σημειώσεων. Τύπος δεδομένων πεδίου σε βάση δεδομένων της Microsoft Access. Ένα πεδίο MEMO μπορεί να περιέχει έως 65535 χαρακτήρες.) ή OLE Object (Τύπος δεδομένων πεδίου αντικείμενο OLE" Ένας τύπος δεδομένων πεδίου που χρησιμοποιείται για την αποθήκευση αντικειμένων από άλλες εφαρμογές που είναι συνδεδεμένες ή ενσωματωμένες σε μια βάση δεδομένων της Microsoft Access.) μπορεί να αναφέρεται σε οποιοδήποτε πεδίο σε οποιονδήποτε πίνακα που καθορίζεται στον όρο FROM, ακόμα κι αν το πεδίο δεν περιλαμβάνεται στην πρόταση SELECT. Για να γίνει αυτό, αρκεί να έχουμε τουλάχιστον μία στατιστική συνάρτηση SQL στη δήλωση SELECT. Η μηχανή βάσης δεδομένων της Microsoft Access δεν επιτρέπει την ομαδοποίηση κατά πεδία που περιέχουν δεδομένα πεδίου MEMO ή αντικειμένου OLE.

Όλα τα πεδία στη λίστα πεδίων SELECT πρέπει είτε να περιέχονται σε μια πρόταση GROUP BY είτε να είναι ορίσματα σε μια συνάρτηση συνάθροισης SQL.

δείτε επίσης

Δήλωση SELECT

Δήλωση SELECT...INTO

Κατηγορήματα ALL, DISTINCT, DISTINCTROW, TOP

Ρήτρα ΑΠΟ

ΕΧΕΙ προσφορά

ΔΙΑΤΑΞΗ ΚΑΤΑ ρήτρα

ρήτρα WHERE

Στατιστικές συναρτήσεις SQL

Πηγή σελίδα: http://office. /ru-ru/access/HA.aspx? pid=CH

ΕΧΕΙ προσφορά

Καθορίζει ομαδοποιημένες εγγραφές που πρέπει να εμφανίζονται σε μια πρόταση SELECT με μια πρόταση GROUP BY. Αφού ομαδοποιηθούν οι εγγραφές κατά την ρήτρα GROUP BY, η ρήτρα HAVING θα εμφανίσει αυτές που πληρούν τις προϋποθέσεις της.

Σύνταξη

ΕΠΙΛΕΓΩ field_list
ΑΠΟ τραπέζι
ΟΠΟΥ επιλογή_συνθήκες
ΟΜΑΔΑ ΑΠΟ group_field_list

Μια δήλωση SELECT που περιέχει έναν όρο HAVING περιλαμβάνει τα ακόλουθα στοιχεία:

Στοιχείο

Περιγραφή

field_list

Τα ονόματα των πεδίων που φορτώνονται μαζί με τυχόν ψευδώνυμα (Ψευδώνυμο (SQL). Ένα εναλλακτικό όνομα για έναν πίνακα ή ένα πεδίο σε μια έκφραση. Τα ψευδώνυμα χρησιμοποιούνται συνήθως ως συντομότερα ονόματα πινάκων ή πεδίων για ευκολία μεταγενέστερης αναφοράς σε προγράμματα, για την αποφυγή διφορούμενων παραπομπών και για τη λήψη πιο ενημερωτικών ονομάτων κατά την εμφάνιση των αποτελεσμάτων ερωτημάτων.) και στατιστικές συναρτήσεις SQL, κατηγορήματα (ALL, DISTINCT, DISTINCTROW ή TOP) ή με άλλες παραμέτρους της πρότασης SELECT.

τραπέζι

Όνομα του πίνακα από τον οποίο φορτώνονται οι εγγραφές

επιλογή_κατάσταση

Συνθήκη επιλογής. Εάν η δήλωση περιέχει μια ρήτρα WHERE, η μηχανή βάσης δεδομένων της Microsoft Access θα ομαδοποιήσει τις τιμές μετά την εφαρμογή της στις εγγραφές.

group_field_list

Ονόματα πεδίων (έως 10) που χρησιμοποιούνται για την ομαδοποίηση εγγραφών. Η σειρά των ονομάτων σε group_field_listκαθορίζει το επίπεδο ομαδοποίησης - από το υψηλότερο στο χαμηλότερο

group_condition

Μια έκφραση που καθορίζει τις εγγραφές που θα εμφανίζονται

Σημειώσεις

Η ρήτρα HAVING είναι προαιρετική.

Η ρήτρα HAVING είναι παρόμοια με την ρήτρα WHERE που καθορίζει την επιλογή των εγγραφών. Μετά την ομαδοποίηση των εγγραφών με τον όρο GROUP BY, ο όρος HAVING καθορίζει τις εγγραφές που θα εμφανίζονται.

SELECT TypeCode,

Άθροισμα (InStock)

ΑΠΟ Προϊόντα

GROUP BY TypeCode

ΕΧΟΝΤΑΣ Sum(InStock) > 100 Και σαν "TEL*";

Η ρήτρα HAVING μπορεί να περιέχει έως και 40 εκφράσεις που συνδέονται με λογικούς τελεστές όπως π.χ ΚαιΚαι Ή.

Πηγή σελίδα: http://office. /ru-ru/access/HA.aspx? pid=CH

ΔΙΑΤΑΞΗ ΚΑΤΑ ρήτρα

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

Σύνταξη

ΕΠΙΛΕΓΩ field_list
ΑΠΟ τραπέζι
ΟΠΟΥ επιλογή_κατάσταση
[, πεδίο 2 ][, ...]]]

Μια πρόταση SELECT που περιέχει μια πρόταση ORDER BY περιλαμβάνει τα ακόλουθα στοιχεία.

Στοιχείο

Περιγραφή

field_list

Τα ονόματα των πεδίων που ανακτώνται μαζί με τυχόν ψευδώνυμα (Ψευδώνυμο (SQL). Ένα εναλλακτικό όνομα για έναν πίνακα ή ένα πεδίο σε μια έκφραση. Τα ψευδώνυμα χρησιμοποιούνται συνήθως ως συντομότερα ονόματα πινάκων ή πεδίων για ευκολία μεταγενέστερης αναφοράς σε προγράμματα, για την αποφυγή διφορούμενων παραπομπών και για τη λήψη πιο ενημερωτικών ονομάτων κατά την εμφάνιση των αποτελεσμάτων ερωτημάτων.) και στατιστικές συναρτήσεις SQL, κατηγορήματα (ALL, DISTINCT, DISTINCTROW ή TOP) ή με άλλες παραμέτρους της πρότασης SELECT.

τραπέζι

Όνομα του πίνακα από τον οποίο ανακτώνται οι εγγραφές

επιλογή_συνθήκες

Προϋποθέσεις επιλογής. Εάν η δήλωση περιέχει μια ρήτρα WHERE, τότε αφού εφαρμοστεί στις εγγραφές, η μηχανή βάσης δεδομένων της Microsoft Access θα διατάξει τις τιμές των εγγραφών

πεδίο 1, πεδίο 2

Τα ονόματα των πεδίων με τα οποία ταξινομούνται οι εγγραφές.

Σημειώσεις

Η ρήτρα ORDER BY είναι προαιρετική. Θα πρέπει να χρησιμοποιείται όταν χρειάζεται να εμφανίσετε δεδομένα σε ταξινομημένη μορφή.

Η προεπιλεγμένη σειρά ταξινόμησης είναι (Σειρά ταξινόμησης. Ένας τρόπος ταξινόμησης δεδομένων με βάση τις τιμές και τον τύπο τους. Τα δεδομένα μπορούν να ταξινομηθούν αλφαβητικά, κατά αριθμητικές τιμές ή κατά ημερομηνία. Η σειρά ταξινόμησης μπορεί να είναι αύξουσα (0 έως 100, Α έως Ζ) ή φθίνουσα (από το 100 στο 0, από το Ω στο Α).) αύξουσα (από το Α στο Ω, από το 0 στο 9). Τα παρακάτω παραδείγματα δείχνουν την ταξινόμηση των ονομάτων εργαζομένων κατά επώνυμο.

ΕΠΙΛΟΓΗ Επώνυμο, Όνομα

ΑΠΟ Εργαζόμενους

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ Επώνυμο;

ΕΠΙΛΟΓΗ Επώνυμο, Όνομα

ΑΠΟ Εργαζόμενους

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ Επώνυμο ASC;

Για να ταξινομήσετε τα πεδία με φθίνουσα σειρά (Ζ έως Α, 9 έως 0), προσθέστε τη δεσμευμένη λέξη DESC στο όνομα κάθε πεδίου. Το ακόλουθο παράδειγμα δείχνει την ταξινόμηση με φθίνουσα σειρά με βάση τους μισθούς των εργαζομένων.

ΕΠΙΛΟΓΗ Επώνυμο, Μισθός

ΑΠΟ Εργαζόμενους

ΠΑΡΑΓΓΕΛΙΑ ΚΑΤΑ Μισθό DESC, Επώνυμο;

Εάν καθορίσετε πεδία στον όρο ORDER BY που περιέχουν δεδομένα τύπου MEMO Field (Τύπος δεδομένων πεδίου σημειώσεων. Τύπος δεδομένων πεδίου σε βάση δεδομένων της Microsoft Access. Ένα πεδίο MEMO μπορεί να περιέχει έως 65.535 χαρακτήρες.) ή OLE Object Field (OLE Object Τύπος δεδομένων πεδίου "Ένας τύπος δεδομένων πεδίου που χρησιμοποιείται για την αποθήκευση αντικειμένων από άλλες εφαρμογές συνδεδεμένες ή ενσωματωμένες σε μια βάση δεδομένων της Microsoft Access.), αυτό θα δημιουργήσει ένα σφάλμα. Η μηχανή βάσης δεδομένων της Microsoft Access δεν μπορεί να ταξινομήσει αυτούς τους τύπους πεδίων.

Ο όρος ORDER BY είναι συνήθως ο τελευταίος όρος σε μια πρόταση SQL (δήλωση SQL (string). Μια έκφραση που ορίζει μια εντολή SQL, όπως SELECT, UPDATE ή DELETE, και περιλαμβάνει προτάσεις, όπως WHERE ή ORDER BY. Προτάσεις SQL /strings χρησιμοποιούνται συνήθως σε ερωτήματα και στατιστικές συναρτήσεις.).

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

Δήλωση SELECT

Δήλωση SELECT...INTO

Κατηγορήματα ALL, DISTINCT, DISTINCTROW, TOP

Ρήτρα ΑΠΟ

ΟΜΑΔΑ ΑΝΑ ρήτρα

ΕΧΕΙ προσφορά

ρήτρα WHERE

Στατιστικές συναρτήσεις SQL

Πηγή σελίδα: http://office. /ru-ru/access/HA.aspx? pid=CH

Λειτουργία ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ

Συνδέει εγγραφές από δύο πίνακες εάν τα πεδία σύνδεσης αυτών των πινάκων περιέχουν τις ίδιες τιμές.

Σύνταξη

ΑΠΟ Τραπέζι 1ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ πίνακας 2ΕΠΙ Τραπέζι 1.πεδίο 1 σύγκριση_πίνακας χειριστή2.πεδίο 2

Η λειτουργία ΕΣΩΤΕΡΙΚΗΣ ΣΥΝΔΕΣΗΣ αποτελείται από τα ακόλουθα στοιχεία:

Στοιχείο

Περιγραφή

Τραπέζι 1, πίνακας 2

Ονόματα των πινάκων που περιέχουν τις εγγραφές που πρέπει να ενωθούν

πεδίο 1, πεδίο 2

Ονόματα των πεδίων που θα συνδεθούν. Τα μη αριθμητικά πεδία πρέπει να είναι του ίδιου τύπου δεδομένων (Τύπος δεδομένων. Χαρακτηριστικό πεδίου που καθορίζει τον τύπο δεδομένων που μπορεί να περιέχει το πεδίο. Οι τύποι δεδομένων περιλαμβάνουν: Boolean, Integer, Long, Currency, Single, Double, Date, String, και Variant (προεπιλογή).) και περιέχουν δεδομένα του ίδιου τύπου. Ωστόσο, τα ονόματα αυτών των πεδίων μπορεί να είναι διαφορετικά

σύγκριση_τελεστής

Οποιοσδήποτε τελεστής σύγκρισης: (=,<, >, <=, >= ή<>)




Μπλουζα