Eingebaute MySQL-Funktionen. Gespeicherte Prozeduren und Trigger


Senden Sie Ihre gute Arbeit in die Wissensdatenbank ist einfach. Verwenden Sie das untenstehende Formular

Studierende, Doktoranden, Nachwuchswissenschaftler, die die Wissensbasis in Studium und Beruf nutzen, werden Ihnen sehr dankbar sein.

Veröffentlicht am http://www.allbest.ru/

Praktische Arbeit

Funktionen in MySQL

Aufgabe 1. Eingebaute Funktionen

Programmierung von mathematischen Funktionen

Funktionen sind Operationen, mit denen Sie Daten manipulieren können. Es gibt mehrere Gruppen integrierter Funktionen in MySQL:

String-Funktionen... Wird verwendet, um Textzeichenfolgen zu bearbeiten, z. B. zum Trimmen oder Füllen von Werten.

Numerische Funktionen... Wird verwendet, um mathematische Operationen mit numerischen Daten durchzuführen. Numerische Funktionen umfassen Funktionen, die Absolutwerte, Sinus und Kosinus von Winkeln, Quadratwurzel einer Zahl usw. zurückgeben. Sie werden nur für algebraische, trigonometrische und geometrische Berechnungen verwendet. Im Allgemeinen werden sie selten verwendet, daher werden wir sie nicht berücksichtigen. Sie sollten sich jedoch bewusst sein, dass sie existieren, und bei Bedarf die MySQL-Dokumentation zu Rate ziehen.

Zusammenfassungsfunktionen... Sie werden verwendet, um zusammenfassende Daten für Tabellen zu erhalten, beispielsweise wenn es erforderlich ist, einige Daten zusammenzufassen, ohne sie zu stichproben.

Datums- und Uhrzeitfunktionen... Wird verwendet, um Datums- und Uhrzeitwerte zu bearbeiten, beispielsweise um die Differenz zwischen Datumsangaben zurückzugeben.

Systemfunktionen... Gibt die Dienstinformationen des DBMS zurück.

Um die wichtigsten integrierten Funktionen zu betrachten, müssen wir eine neue Datenbank erstellen, die numerische und Datumswerte enthält.

Nehmen wir als Beispiel einen Online-Shop.

Konzeptmodell:

Beziehungsmodell:

Schauen wir uns also das letzte Diagramm an und erstellen eine Datenbank - Shop.

Datenbankshop erstellen;

Wir wählen es für die Arbeit:

Und wir erstellen darin 8 Tabellen, wie im Schema: Kunden, Lieferanten, Einkäufe (Verkauf), Lieferungen (eingehend), Einkaufsjournal (magazine_sales), Angebotsjournal (magazine_incoming), Produkte (Produkte), Preise ( Preise). Eine Nuance, unser Geschäft wird Bücher verkaufen, daher werden wir der Tabelle Produkte eine weitere Spalte hinzufügen - Autor, im Prinzip ist dies nicht notwendig, aber es ist irgendwie bekannter.

Beachten Sie, dass die Primärschlüssel in den Tabellen "Einkaufsjournal", "Lieferjournal" und "Preise" zusammengesetzt sind, d. h. ihre eindeutigen Werte bestehen aus Wertepaaren (in einer Tabelle kann es nicht zwei Zeilen mit den gleichen Wertepaaren geben). Die Spaltennamen dieser Wertepaare werden durch Kommas nach dem Schlüsselwort PRIMARY KEY angegeben.

In einem echten Online-Shop werden die Daten in diesen Tabellen durch Skripte in einer beliebigen Sprache (z. B. PHP) eingegeben, aber vorerst müssen wir sie manuell eingeben. Sie können beliebige Daten eingeben, denken Sie jedoch daran, dass die Werte in den gleichnamigen Spalten in verwandten Tabellen übereinstimmen müssen. Oder kopieren Sie die folgenden Daten:

In unserem Geschäft gibt es also 24 Artikel in drei Lieferungen von drei Lieferanten und absolut drei Verkäufe. Alles ist bereit, wir können mit dem Erlernen der eingebauten Funktionen von MySQL beginnen.

Aufgabe 2... Zusammenfassungsfunktionen, berechnete Spalten und Ansichten

Zusammenfassungsfunktionen werden auch als statistische, Aggregat- oder zusammenfassende Funktionen bezeichnet. Diese Funktionen verarbeiten eine Reihe von Zeilen, um einen einzelnen Wert zu zählen und zurückzugeben. Es gibt nur fünf solcher Funktionen:

AVG() Funktion gibt den Durchschnittswert einer Spalte zurück.

COUNT () Die Funktion gibt die Anzahl der Zeilen in einer Spalte zurück.

MAX () Funktion gibt den größten Wert in der Spalte zurück.

MIN () Funktion gibt den kleinsten Wert in einer Spalte zurück.

SUM() Funktion gibt die Summe der Spaltenwerte zurück.

Wir haben bereits einen von ihnen getroffen - COUNT () - http://www.site-do.ru/db/sql8.php. Jetzt lernen wir den Rest kennen. Angenommen, wir möchten die Mindest-, Höchst- und Durchschnittspreise für Bücher in unserem Geschäft wissen. Dann müssen aus der Tabelle Preise (Preise) die Mindest-, Höchst- und Durchschnittswerte für die Preisspalte entnommen werden. Die Anfrage ist einfach:

SELECT MIN (Preis), MAX (Preis), AVG (Preis) VON Preisen;

Nun wollen wir herausfinden, wie viel uns der Lieferant "Druckerei" die Ware (id = 2) gebracht hat. Es ist nicht so einfach, einen solchen Antrag zu stellen. Denken wir darüber nach, wie man es komponiert:

Wählen Sie zunächst aus der Tabelle Lieferungen (eingehend) die Kennungen (id_incoming) derjenigen Lieferungen aus, die vom Lieferanten "Druckerei" (id = 2) getätigt wurden:

Nun müssen Sie aus der Tabelle Magazin der Lieferungen (magazine_incoming) die Waren (id_product) und deren Mengen (Menge) auswählen, die in den in Schritt 1 gefundenen Lieferungen ausgeführt wurden. Das heißt, die Anfrage aus Absatz 1 wird verschachtelt:

Jetzt müssen wir die Preise für die gefundenen Produkte zur resultierenden Tabelle hinzufügen, die in der Preistabelle gespeichert werden. Das heißt, wir müssen die Tabellen Magazine_incoming und Prices durch die Spalte id_product verbinden:

In der resultierenden Tabelle fehlt eindeutig die Summenspalte, dh die berechnete Spalte. Die Möglichkeit, solche Spalten zu erstellen, wird in MySQL bereitgestellt. Dazu müssen Sie in der Abfrage nur den Namen der berechneten Spalte angeben und was sie berechnen soll. In unserem Beispiel heißt eine solche Spalte summa und berechnet das Produkt der Mengen- und Preisspalten. Der neue Spaltenname wird durch das Wort AS getrennt:

Super, wir müssen nur noch die Summenspalte zusammenfassen und endlich herausfinden, wie viel uns der Lieferant "Druckerei" die Ware gebracht hat. Die Syntax für die Verwendung der SUM()-Funktion lautet wie folgt:

SELECT SUM (Spaltenname) FROM Tabellenname;

Wir kennen den Namen der Spalte - summa, aber den Namen der Tabelle haben wir nicht, da er das Ergebnis der Abfrage ist. Was ist zu tun? Für solche Fälle bietet MySQL Views. Eine Ansicht ist eine Auswahlabfrage, der ein eindeutiger Name zugewiesen wird und die zur späteren Verwendung in einer Datenbank gespeichert werden kann.

Die Syntax zum Erstellen einer Ansicht lautet wie folgt:

CREATE VIEW view_name AS-Abfrage;

Speichern wir unsere Anfrage als View namens report_vendor:

ANSICHT ERSTELLEN report_vendor AS

SELECT magazine_incoming.id_product, magazine_incoming.quantity,prices.price,

magazine_incoming.quantity *prices.price AS summa

FROM Magazin_incoming, Preise

WO magazine_incoming.id_product =prices.id_product AND id_incoming =

Jetzt können Sie die finale SUM()-Funktion verwenden:

Damit haben wir das Ergebnis erreicht, obwohl wir dafür verschachtelte Abfragen, Joins, berechnete Spalten und Views verwenden mussten. Ja, manchmal muss man nachdenken, um das Ergebnis zu erhalten, ohne es irgendwo zu haben. Aber wir haben zwei sehr wichtige Themen angesprochen - berechnete Spalten und Ansichten. Lassen Sie uns genauer darüber sprechen.

Berechnete Felder (Spalten)

Zum Beispiel haben wir uns ein mathematisch berechnetes Feld angesehen. Hier möchte ich hinzufügen, dass Sie nicht nur die Operation der Multiplikation (*) verwenden können, sondern auch die Subtraktion (-) und die Addition (+) und die Division (/). Die Syntax lautet wie folgt:

SELECT Spalte_1_Name, Spalte_2_Name, Spalte_1_Name * Spalte_2_Name AS berechneter_Spalten_Name

FROM Tabellenname;

Die zweite Nuance ist das Schlüsselwort AS, mit dem wir den Namen der berechneten Spalte festgelegt haben. Tatsächlich wird dieses Schlüsselwort verwendet, um Aliase für beliebige Spalten festzulegen. Warum wird das benötigt? Für kürzeren und besser lesbaren Code. Unsere Ansicht könnte zum Beispiel so aussehen:

ANSICHT ERSTELLEN report_vendor AS

SELECT A.id_product, A.quantity, B.price, A.quantity * B.price AS summa

FROM magazine_incoming AS A, Preise AS B

WO A.id_product = B.id_product AND id_incoming =

(SELECT id_incoming FROM eingehend, WO id_vendor = 2);

Stimmen Sie zu, dass dies viel kürzer und klarer ist.

Darstellung

Die Syntax zum Erstellen von Ansichten haben wir bereits behandelt. Nach dem Erstellen von Ansichten können diese wie Tabellen verwendet werden. Das heißt, führen Sie Abfragen darauf aus, filtern und sortieren Sie Daten, kombinieren Sie einige Ansichten mit anderen. Dies ist einerseits eine sehr komfortable Möglichkeit, häufig verwendete komplexe Abfragen (wie in unserem Beispiel) zu hinterlegen.

Beachten Sie jedoch, dass Views keine Tabellen sind, dh sie speichern keine Daten, sondern rufen sie nur aus anderen Tabellen ab. Wenn sich also die Daten in den Tabellen ändern, ändern sich zum einen auch die Ergebnisse der Präsentation. Und zweitens werden bei einer Abfrage an eine Ansicht die erforderlichen Daten durchsucht, d. h. die Leistung des DBMS nimmt ab. Daher sollten sie nicht missbraucht werden.

SQL-String-Funktionen

Mit dieser Funktionsgruppe können Sie Text bearbeiten. Es gibt viele String-Funktionen, wir werden die gebräuchlichsten betrachten.

KONKAT (str1, str2 ...)

Gibt einen String zurück, der durch Verketten der Argumente erstellt wurde (Argumente werden in Klammern angegeben - str1, str2 ...). Unsere Lieferantentabelle hat beispielsweise eine Stadtspalte und eine Adressspalte. Angenommen, wir möchten, dass Adresse und Ort in der resultierenden Tabelle in derselben Spalte erscheinen, d. h. wir möchten Daten aus zwei Spalten zu einer kombinieren. Dazu verwenden wir die String-Funktion CONCAT() und geben als Argumente die Namen der kombinierten Spalten an - Stadt und Adresse:

Beachten Sie, dass die Zusammenführung ohne Trennung erfolgte, was nicht sehr gut lesbar ist. Passen wir unsere Abfrage so an, dass zwischen den zusammengeführten Spalten ein Leerzeichen vorhanden ist:

Wie Sie sehen, gilt das Leerzeichen auch als Argument und wird durch Kommas getrennt. Wenn mehr Spalten zu verbinden wären, wäre es irrational, jedes Mal Leerzeichen anzugeben. In diesem Fall könnte man die String-Funktion CONCAT_WS (delimiter, str1, str2 ...) verwenden, die ein Trennzeichen zwischen die verketteten Strings setzt (delimiter wird als erstes Argument angegeben). Unsere Anfrage würde dann so aussehen:

SELECT CONCAT_WS ("", Ort, Adresse) FROM Lieferanten;

Das Ergebnis änderte sich äußerlich nicht, aber wenn wir 3 oder 4 Spalten verketten würden, dann würde der Code erheblich reduziert.

EINFÜGEN (str, pos, len, new_str)

Gibt den String str zurück, in dem der Teilstring ab Position pos und Länge len Zeichen durch den Teilstring new_str ersetzt wurde. Angenommen, wir entscheiden uns, die ersten 3 Zeichen in der Adressspalte nicht anzuzeigen (Abkürzungen st., etc. usw.), dann ersetzen wir sie durch Leerzeichen:

Das heißt, drei Zeichen, beginnend mit dem ersten, werden durch drei Leerzeichen ersetzt.

LPAD (str, len, dop_str) Gibt den String str zurück, der mit dop_str links aufgefüllt wird, um die Länge len zu erreichen. Angenommen, wir möchten, dass die Lieferantenstädte bei der Anzeige von Lieferantenstädten rechts liegen und füllen den leeren Raum mit Punkten:

RPAD (str, len, dop_str)

Gibt die Zeichenfolge str zurück, die mit dop_str rechts aufgefüllt wurde, um die Länge len zu erreichen. Angenommen, wir möchten, dass sich die Lieferantenstädte auf der linken Seite befinden und den leeren Raum bei der Anzeige von Lieferantenstädten mit Punkten füllen:

Beachten Sie, dass len die Anzahl der anzuzeigenden Zeichen begrenzt, d.h. Wenn der Städtename länger als 15 Zeichen ist, wird er abgeschnitten.

Gibt die Zeichenfolge str zurück, wobei alle führenden Leerzeichen entfernt wurden. Diese Zeichenfolgenfunktion ist praktisch, um Informationen korrekt anzuzeigen, wenn bei der Dateneingabe zufällige Leerzeichen zulässig sind:

WÄHLEN SIE LTRIM (Stadt) VON Anbietern aus;

Gibt die Zeichenfolge str zurück, wobei alle abschließenden Leerzeichen entfernt wurden:

SELECT RTRIM (Stadt) VON Anbietern;

In unserem Fall gab es keine zusätzlichen Leerzeichen, daher werden wir das Ergebnis äußerlich nicht sehen.

Gibt die Zeichenfolge str zurück, wobei alle führenden und abschließenden Leerzeichen entfernt wurden:

AUSWAHL TRIM (Stadt) VON Anbietern;

Gibt die Zeichenfolge str zurück, wobei alle Zeichen in Kleinbuchstaben umgewandelt wurden. Es funktioniert nicht richtig mit russischen Buchstaben, daher ist es besser, es nicht zu verwenden. Wenden wir diese Funktion beispielsweise auf die Stadtspalte an:

Sie sehen, was für ein Kauderwelsch dabei herausgekommen ist. Aber mit dem lateinischen Alphabet ist alles in Ordnung:

Gibt die Zeichenfolge str zurück, wobei alle Zeichen in Großbuchstaben umgewandelt wurden. Es ist auch besser, es nicht mit russischen Buchstaben zu verwenden. Aber mit dem lateinischen Alphabet ist alles in Ordnung:

Gibt die Länge des Strings str zurück. Lassen Sie uns zum Beispiel herausfinden, wie viele Zeichen unsere Lieferantenadressen haben:

Gibt len ​​linkshändige Zeichen von str zurück. Angenommen, in Lieferantenstädten werden nur die ersten drei Zeichen angezeigt:

Gibt len ​​rechtshändigen Zeichen von str zurück. Angenommen, in Lieferantenstädten werden nur die letzten drei Zeichen angezeigt:

Gibt String str n-mal zurück. Zum Beispiel:

ERSETZEN (str, pod_str1, pod_str2)

Gibt den String str zurück, in dem alle Teilstrings von pod_str1 durch Teilstrings von pod_str2 ersetzt wurden. Angenommen, wir möchten, dass in den Städten der Lieferanten anstelle des langen „St. Petersburg“ das kurze „SPb“ angezeigt wird:

Gibt den String str in umgekehrter Reihenfolge zurück:

LOAD_FILE (Dateiname)

Diese Funktion liest die Datei file_name und gibt ihren Inhalt als String zurück. Erstellen Sie zum Beispiel eine Datei proverka.txt, schreiben Sie etwas Text hinein (besser in Latein, damit es keine Probleme mit Kodierungen gibt), speichern Sie sie auf dem Laufwerk C und stellen Sie die folgende Anfrage:

Bitte beachten Sie, dass Sie den absoluten Pfad zur Datei angeben müssen.

Wie bereits erwähnt, gibt es noch viele weitere String-Funktionen, aber selbst einige der hier betrachteten werden nur selten verwendet. An dieser Stelle werden wir unsere Überprüfung beenden und zu den häufiger verwendeten Datums- und Uhrzeitfunktionen übergehen.

Aufgabe 3... Datums- und Uhrzeitfunktionen

Diese Funktionen wurden für die Arbeit mit Kalenderdatentypen entwickelt. Betrachten wir die am besten geeigneten.

CURDATE (), CURTIME () und JETZT ()

Die erste Funktion gibt das aktuelle Datum zurück, die zweite die aktuelle Uhrzeit und die dritte das aktuelle Datum und die aktuelle Uhrzeit. Vergleichen:

Die Funktionen CURDATE () und NOW () sind nützlich, um Datensätze mit der aktuellen Uhrzeit zur Datenbank hinzuzufügen. In unserem Geschäft verwenden alle Sendungen und Verkäufe die aktuelle Uhrzeit. Daher ist es praktisch, die CURDATE()-Funktion zu verwenden, um Datensätze zu Lieferungen und Verkäufen hinzuzufügen. Angenommen, ein Produkt ist in unserem Geschäft angekommen, fügen wir der Tabelle Lieferung (eingehend) Informationen dazu hinzu:

Würden wir das Lieferdatum mit dem Typ datatime hinterlegen, dann wäre die Funktion JETZT() für uns besser geeignet.

ADDDATE (Datum, INTERVAL-Wert) Die Funktion gibt das Datum Datum zurück, zu dem der Wert addiert wird. Der Wert kann negativ sein, dann verringert sich das Enddatum. Mal sehen, wann unsere Lieferanten die Waren geliefert haben:

Angenommen, wir haben bei der Eingabe des Datums für den ersten Lieferanten einen Fehler gemacht, verringern wir das Datum um einen Tag:

Der Wert kann nicht nur Tage, sondern auch Wochen (WEEK), Monate (MONTH), Quartale (QUARTER) und Jahre (YEAR) sein. Verkürzen wir zum Beispiel den Liefertermin für den zweiten Lieferanten um 1 Woche:

In unserer Tabelle Lieferungen (eingehend) haben wir den Datumstyp für die Spalte Lieferdatum (date_incoming) verwendet. Dieser Datentyp ist darauf ausgelegt, nur Datumsangaben zu speichern. Wenn wir jedoch den Typ datatime verwenden würden, würden wir nicht nur das Datum, sondern auch die Uhrzeit anzeigen. Dann könnten wir auch die ADDDATE-Funktion für die Zeit verwenden. In diesem Fall kann der Wert von value Sekunden (SECOND), Minuten (MINUTE), Stunden (HOUR) und deren Kombinationen sein:

Minuten und Sekunden (MINUTE_SECOND),

Stunden, Minuten und Sekunden (HOUR_SECOND),

Stunden und Minuten (HOUR_MINUTE),

Tage, Stunden, Minuten und Sekunden (DAY_SECOND),

Tage, Stunden und Minuten (DAY_MINUTE),

Tage und Stunden (DAY_HOUR),

Jahre und Monate (YEAR_MONTH).

SUBDATE (Datum, INTERVAL-Wert)

Die Funktion ist identisch mit der vorherigen, führt jedoch die Operation der Subtraktion und nicht der Addition durch.

PERIOD_ADD (Periode, n)

die Funktion fügt dem Datumswertzeitraum n Monate hinzu. Eine Nuance: Der Datumswert muss das Format JJJJMM haben. Fügen wir dem Februar 2011 (201102) 2 Monate hinzu:

TIMESTAMPADD (Intervall, n, Datum)

die Funktion fügt dem Datum Datum ein Zeitintervall n hinzu, dessen Werte durch den Intervallparameter festgelegt werden. Mögliche Werte für den Intervallparameter:

FRAC_SECOND - Mikrosekunden

ZWEITE - Sekunden

MINUTE - Minuten

WOCHE - Wochen

MONAT - Monate

QUARTAL - Viertel

TIMEDIFF (Datum1, Datum2)

berechnet die Differenz in Stunden, Minuten und Sekunden zwischen zwei Datumsangaben.

DATEDIFF (Datum1, Datum2)

berechnet die Differenz in Tagen zwischen zwei Daten. Wir wollen zum Beispiel wissen, wie lange der Lieferant "Williams" (id = 1) uns mit der Ware beliefert hat:

PERIOD_DIFF (Periode1, Periode2)

Die Funktion berechnet die Differenz in Monaten zwischen zwei Datumsangaben im Format JJJJMM. Lassen Sie uns den Unterschied zwischen Januar 2010 und August 2011 herausfinden:

TIMESTAMPDIFF (Intervall, Datum1, Datum2)

Die Funktion berechnet die Differenz zwischen Datum2 und Datum1 in den Einheiten, die im Parameter Intervall angegeben sind. Mögliche Werte für den Intervallparameter:

FRAC_SECOND - Mikrosekunden

ZWEITE - Sekunden

MINUTE - Minuten

WOCHE - Wochen

MONAT - Monate

QUARTAL - Viertel

SUBTIME (Datum, Uhrzeit)

die Funktion subtrahiert die Uhrzeit vom Datum Uhrzeit:

gibt das Datum zurück und schneidet die Zeit ab. Zum Beispiel:

gibt die Uhrzeit durch Abschneiden des Datums zurück. Zum Beispiel:

die Funktion nimmt das Datum und gibt die Vollversion mit der Uhrzeit zurück. Zum Beispiel:

DAY (Datum) und DAYOFMONTH (Datum)

Funktions-Synonyme, geben vom Datum die Ordnungszahl des Tages des Monats zurück:

DAYNAME (Datum), DAYOFWEEK (Datum) und WEEKDAY (Datum)

Funktionen geben den Wochentag zurück, die erste - ihren Namen, die zweite - die Nummer des Wochentages (Zählung von 1 - Sonntag bis 7 - Samstag), die dritte - die Nummer des Wochentages (Zählung von 0 - Montag bis 6 - Sonntag:

WOCHE (Datum), WOCHEFJAHR (DatumUhrzeit)

beide Funktionen geben die Wochennummer des Jahres zurück, die erste für den Datumstyp und die zweite für den Datums-/Uhrzeittyp, die erste Woche beginnt am Sonntag, die zweite - ab Montag:

MONAT (Datum) und MONATSNAME (Datum)

beide Funktionen geben Monatswerte zurück. Der erste ist sein numerischer Wert (von 1 bis 12), der zweite ist der Name des Monats:

die Funktion gibt den Wert des Quartals des Jahres (von 1 bis 4) zurück:

Die Funktion JAHR (Datum) gibt den Wert des Jahres (1000 bis 9999) zurück:

gibt die Ordnungszahl des Tages im Jahr (von 1 bis 366) zurück:

gibt die Stunde für die Uhrzeit zurück (0 bis 23):

MINUTE (Datum/Uhrzeit)

gibt die Minuten für die Zeit zurück (0 bis 59):

ZWEITE (Datum/Uhrzeit)

gibt den Sekundenwert für die Zeit zurück (0 bis 59):

AUSZUG (Typ FROM Datum)

gibt den vom type-Parameter angegebenen Datumsteil zurück:

TO_DAYS (Datum) und FROM_DAYS (n)

wechselseitige Funktionen. Die erste konvertiert das Datum in die Anzahl der Tage seit dem Jahr Null. Die zweite nimmt umgekehrt die Anzahl der Tage seit dem Jahr Null und wandelt sie in ein Datum um:

UNIX_TIMESTAMP (Datum) und FROM_UNIXTIME (n)

wechselseitige Funktionen. Die erste wandelt das Datum in die Anzahl der Sekunden seit dem 1. Januar 1970 um. Die zweite nimmt umgekehrt die Anzahl der Sekunden seit dem 1. Januar 1970 und wandelt sie in ein Datum um:

TIME_TO_SEC (Zeit) und SEC_TO_TIME (n)

wechselseitige Funktionen. Der erste wandelt die Zeit in die Anzahl der Sekunden um, die seit Beginn des Tages verstrichen sind. Die Sekunde hingegen nimmt die Anzahl der Sekunden seit Beginn des Tages und wandelt sie in die Uhrzeit um:

HERSTELLUNGSDATUM (Jahr, n)

die Funktion nimmt das Jahr und die Zahl des Tages im Jahr und wandelt sie in ein Datum um:

Aufgabe 4. FFormatierungsfunktionen für Datum und Uhrzeit

Diese Funktionen sind auch für die Arbeit mit Kalenderdatentypen ausgelegt. Betrachten wir sie genauer.

DATE_FORMAT (Datum, Format)

formatiert das Datum entsprechend dem ausgewählten Format. Diese Funktion wird sehr oft verwendet. In MySQL hat das Datum beispielsweise das Format JJJJ-MM-TT (Jahr-Monat-Tag), während uns das Format TT-MM-JJJJ (Tag-Monat-Jahr) vertrauter ist. Um das gewohnte Datum anzuzeigen, muss es daher neu formatiert werden. Lassen Sie uns zuerst die Anfrage stellen und dann herausfinden, wie das Format festgelegt wird:

Jetzt kommt uns das Datum bekannt vor. Um das Datumsformat einzustellen, werden spezielle Qualifier verwendet. Der Einfachheit halber listen wir sie in der Tabelle auf.

Beschreibung

Der abgekürzte Name des Wochentages (Mo - Montag, Di - Dienstag, Mi - Mittwoch, Do - Donnerstag, Fr ​​- Freitag, Sa - Samstag, So - Sonntag).

Abgekürzte Monatsnamen (Jan - Januar, Feb - Februar, März - März, Apr - April, Mai - Mai, Juni - Juni, Jul - Juli, Aug - August, Sep - September, Okt - Oktober, Nov - November, Dez - Dezember).

Monat in numerischer Form (1 - 12).

Der Tag des Monats in numerischer Form mit einer Null (01 - 31).

Tag des Monats in Englisch (1., 2. ...).

Tag des Monats in numerischer Form ohne Null (1 - 31).

Stunden mit führenden Nullen von 00 bis 23.

Stunden mit führenden Nullen von 00 bis 12.

Minuten von 00 bis 59.

Tag des Jahres von 001 bis 366.

Stunden mit führenden Nullen von 0 bis 23.

Stunden ohne führende Null von 1 bis 12.

Monatsname ohne Abkürzung.

Monat in numerischer Form mit führender Null (01 - 12).

AM oder PM für das 12-Stunden-Format.

Uhrzeit im 12-Stunden-Format.

Sekunden von 00 bis 59.

Uhrzeit im 24-Stunden-Format.

Woche (00 - 52), wobei Montag als erster Tag der Woche gilt.

Woche (00 - 52) mit Sonntag als erster Tag der Woche.

Der Name des Wochentags ohne Abkürzung.

Wochentagnummer (0 - Sonntag, 6 - Samstag).

Jahr, 4 Kategorien.

Jahr, 2 Kategorien.

STR_TO_DATE (Datum, Format)

Die Funktion ist das Gegenteil der vorherigen, sie akzeptiert ein Datum im Format und gibt ein Datum im MySQL-Format zurück.

.

TIME_FORMAT (Zeit, Format)

Die Funktion ähnelt der Funktion DATE_FORMAT(), wird jedoch nur für die Zeit verwendet:

GET_FORMAT (Datum, Format)

die Funktion gibt eine Formatzeichenfolge zurück, die einem von fünf Zeitformaten entspricht:

EUR - Europäischer Standard

USA - Amerikanischer Standard

JIS - Japanischer Industriestandard

ISO - ISO-Norm (internationale Normenorganisation)

INTERN - internationaler Standard

Diese Funktion ist gut in Verbindung mit der vorherigen zu verwenden -

Sehen wir uns ein Beispiel an:

Wie Sie sehen, gibt die Funktion GET_FORMAT() selbst das Präsentationsformat zurück und zusammen mit der Funktion DATE_FORMAT() das Datum im gewünschten Format. Stellen Sie Ihre eigenen Abfragen mit allen fünf Standards und sehen Sie den Unterschied.

Nun, jetzt wissen Sie fast alles über die Arbeit mit Datums- und Uhrzeitangaben in MySQL. Dies ist für Sie bei der Entwicklung verschiedener Webanwendungen sehr nützlich. Wenn ein Benutzer beispielsweise ein Datum in einem Formular auf einer Website in dem von ihm gewohnten Format eingibt, wird es für Sie nicht schwierig sein, die erforderliche Funktion anzuwenden, damit das Datum in der Datenbank im erforderlichen Format erscheint.

Aufgabe 5. Gespeicherte Prozeduren

In der Regel verwenden wir bei der Arbeit mit einer Datenbank dieselben Abfragen oder eine Reihe von sequentiellen Abfragen. Gespeicherte Prozeduren ermöglichen es Ihnen, eine Folge von Anfragen zu kombinieren und auf dem Server zu speichern. Dies ist ein sehr praktisches Werkzeug, und jetzt werden Sie es selbst sehen. Beginnen wir mit der Syntax:

VERFAHREN ERSTELLEN

sp_name (Parameter)

Betreiber

Parameter sind die Daten, die wir an die Prozedur übergeben, wenn sie aufgerufen wird, und Operatoren sind die eigentlichen Anforderungen. Lassen Sie uns unser erstes Verfahren schreiben und sehen, wie bequem es ist. Als wir der Shop-Datenbank neue Datensätze hinzugefügt haben, haben wir eine Standard-Add-Abfrage des Formulars verwendet:

INSERT INTO Kunden (Name, E-Mail) WERT ("Ivanov Sergey", "ser [E-Mail geschützt]");

Weil Wir werden eine solche Anfrage jedes Mal verwenden, wenn wir einen neuen Kunden hinzufügen müssen, dann ist es durchaus angebracht, sie in Form eines Verfahrens auszustellen:

CREATE PROCEDURE ins_cust (n CHAR (50), e CHAR (50))

in Kunden einfügen (Name, E-Mail) Wert (n, e);

Achten Sie darauf, wie die Parameter eingestellt sind: Sie müssen dem Parameter einen Namen geben und seinen Typ angeben, und im Hauptteil der Prozedur verwenden wir bereits die Namen der Parameter. Ein Vorbehalt. Wie Sie sich erinnern, markiert das Semikolon das Ende der Anfrage und sendet sie zur Ausführung, was in diesem Fall nicht akzeptabel ist. Daher müssen Sie vor dem Schreiben der Prozedur das Trennzeichen mit überschreiben; auf "//", damit die Anfrage nicht vorzeitig gesendet wird. Dies geschieht mit der DELIMITER //-Anweisung:

Somit haben wir dem DBMS mitgeteilt, dass die Befehle nun nach // ausgeführt werden sollen. Es sollte daran erinnert werden, dass die Neudefinition des Trennzeichens nur für eine Arbeitssitzung durchgeführt wird, d.h. Beim nächsten Arbeiten mit MySql wird das Trennzeichen wieder zu einem Semikolon und muss ggf. neu definiert werden. Jetzt können wir das Verfahren platzieren:

Das Verfahren ist also erstellt. Wenn wir jetzt einen neuen Kunden eingeben müssen, müssen wir ihn nur mit den erforderlichen Parametern aufrufen. Eine CALL-Anweisung wird verwendet, um eine gespeicherte Prozedur aufzurufen, gefolgt vom Namen der Prozedur und ihren Parametern. Fügen wir unserer Kundentabelle einen neuen Kunden hinzu:

Stimmen Sie zu, dass dies viel einfacher ist, als jedes Mal eine vollständige Anfrage zu schreiben. Lassen Sie uns überprüfen, ob das Verfahren funktioniert, indem wir nachsehen, ob ein neuer Kunde in der Kundentabelle aufgetaucht ist:

Anscheinend funktioniert die Prozedur und wird immer funktionieren, bis wir sie mit der DROP PROCEDURE-Anweisung procedure_name löschen.

Wie zu Beginn der Aufgabe erwähnt, können Sie mit Prozeduren eine Folge von Anforderungen kombinieren. Mal sehen, wie das geht. Versuchen wir herauszufinden, wie viel uns der Lieferant "Druckerei" die Ware gebracht hat? Zuvor mussten wir dafür verschachtelte Abfragen, Verknüpfungen, berechnete Spalten und Ansichten verwenden. Und wenn wir wissen wollen, wie viel uns der andere Lieferant die Ware gebracht hat? Sie müssen neue Abfragen, Verknüpfungen usw. erstellen. Es ist einfacher, einmal eine Stored Procedure für diese Aktion zu schreiben.

Es scheint, dass der einfachste Weg darin besteht, die bereits geschriebene Ansicht und eine Anfrage dazu zu verwenden, sie zu einer gespeicherten Prozedur zu kombinieren und die Herstellerkennung (id_vendor) wie folgt zu einem Eingabeparameter zu machen:

Aber das Verfahren wird so nicht funktionieren. Die Sache ist, dass in Ansichten keine Parameter verwendet werden können. Daher müssen wir die Reihenfolge der Anfragen etwas ändern. Zuerst erstellen wir eine Ansicht, die die Vendor-ID (id_vendor), die Produkt-ID (id_product), die Menge (prices) ausgibt:

Und dann erstellen wir eine Anfrage, die die Liefermengen des für uns interessanten Lieferanten aufsummiert, zum Beispiel mit id_vendor = 2:

SELECT SUM (summa) FROM report_vendor WHERE id_vendor = 2;

Jetzt können wir diese beiden Anfragen zu einer gespeicherten Prozedur kombinieren, wobei der Eingabeparameter die Anbieterkennung (id_vendor) ist, die in der zweiten Anfrage, aber nicht in der Ansicht, ersetzt wird:

Lassen Sie uns die Funktionsweise der Prozedur mit verschiedenen Eingabeparametern überprüfen:

Wie Sie sehen, wird die Prozedur einmal ausgelöst und gibt dann einen Fehler aus, der uns mitteilt, dass sich die report_vendor-Ansicht bereits in der Datenbank befindet. Dies liegt daran, dass beim ersten Aufruf einer Prozedur eine Ansicht erstellt wird. Bei einem zweiten Zugriff versucht es erneut, eine Ansicht zu erstellen, die jedoch bereits vorhanden ist, weshalb ein Fehler angezeigt wird. Um dies zu vermeiden, gibt es zwei Möglichkeiten.

Die erste besteht darin, den Blick aus dem Verfahren zu nehmen. Das heißt, wir erstellen eine Ansicht einmal, und die Prozedur bezieht sich nur darauf, erstellt sie jedoch nicht. Er wird nicht vergessen, die bereits erstellte Prozedur zu löschen und vorab anzuzeigen:

Überprüfung der Arbeit:

call sum_vendor (1) //

call sum_vendor (2) //

call sum_vendor (3) //

Die zweite Möglichkeit besteht darin, ein Befehlsrecht in der Prozedur hinzuzufügen, das die Ansicht löscht, falls sie vorhanden ist:

Denken Sie daran, die Prozedur sum_vendor zu entfernen, bevor Sie diese Option verwenden, und testen Sie sie dann:

Wie Sie sehen, ist es wirklich einfacher, komplexe Abfragen oder ihre Abfolge einmal in eine gespeicherte Prozedur zu formen und dann einfach darauf zu verweisen und die erforderlichen Parameter anzugeben. Dies reduziert den Code erheblich und macht das Arbeiten mit Abfragen logischer.

Aufgabe 6. Gespeicherte Prozeduren

Lassen Sie uns nun herausfinden, wie Sie sehen können, welche gespeicherten Prozeduren wir auf dem Server haben und wie sie aussehen. Machen wir uns dazu mit zwei Operatoren vertraut:

SHOW PROCEDURE STATUS - ermöglicht Ihnen, eine Liste der verfügbaren gespeicherten Prozeduren anzuzeigen. Es ist wahr, dass das Anzeigen dieser Liste nicht sehr praktisch ist, da für jedes Verfahren werden Informationen über den Namen der Datenbank, zu der das Verfahren gehört, deren Typ, das Konto, in dem das Verfahren erstellt wurde, das Datum der Erstellung und Änderung des Verfahrens usw. angezeigt. Wenn Sie jedoch wissen möchten, welche Verfahren Sie haben, sollten Sie diesen Operator verwenden.

SHOW CREATE PROCEDURE procedure_name - ermöglicht es Ihnen, Informationen zu einer bestimmten Prozedur zu erhalten, insbesondere den Code anzuzeigen. Die Ansicht zum Anzeigen ist auch nicht sehr praktisch, aber Sie können es herausfinden.

Probieren Sie beide Operatoren in Aktion aus, um zu sehen, wie es aussieht. Betrachten wir nun eine bequemere Option, um solche Informationen zu erhalten. Die MySQL-Systemdatenbank verfügt über eine proc-Tabelle, in der Informationen zu Prozeduren gespeichert werden. Hier können wir also eine SELECT-Abfrage an diese Tabelle senden. Außerdem, wenn wir eine bekannte Anfrage erstellen:

SELECT * FROM mysql.proc //

Dann bekommen wir etwas so Unlesbares wie bei der Verwendung von SHOW-Operatoren. Daher erstellen wir bedingte Abfragen. Wenn wir beispielsweise eine Anfrage wie diese erstellen:

SELECT-Namen FROM mysql.proc //

Dann erhalten wir die Namen aller Prozeduren aller auf dem Server verfügbaren Datenbanken. Zum Beispiel interessieren uns derzeit nur die Shop-Datenbank-Prozeduren, also ändern wir die Abfrage:

SELECT name FROM mysql.proc WHERE db = "shop" //

Jetzt haben wir bekommen, was wir wollten:

Wenn wir nur den Hauptteil einer bestimmten Prozedur sehen möchten (d. h. von Anfang bis Ende), dann schreiben wir eine Anfrage wie diese:

SELECT body FROM mysql.proc WHERE name = "sum_vendor" //

Und wir werden eine vollständig lesbare Version sehen:

Um die benötigten Informationen aus der proc-Tabelle zu extrahieren, müssen Sie im Allgemeinen nur wissen, welche Spalten sie enthält. Dazu können Sie den bekannten Operator describe table_name verwenden, in unserem Fall describe mysql.proc. Ihre Ansicht ist zwar auch nicht sehr lesbar, daher sind hier die Namen der beliebtesten Spalten:

db ist der Name der Datenbank, in der die Prozedur gespeichert ist.

name ist der Name der Prozedur.

param_list - Liste der Prozedurparameter.

body - der Körper des Verfahrens.

Kommentar - ein Kommentar zur gespeicherten Prozedur.

Wir haben bereits die Spalten db, name und body verwendet. Schreiben Sie selbst eine Abfrage, die die Parameter der Prozedur sum_vendor abruft. Aber jetzt werden wir ausführlicher über Kommentare zu gespeicherten Prozeduren sprechen.

Kommentare sind äußerst wichtig, da wir nach einiger Zeit möglicherweise vergessen, was ein bestimmtes Verfahren tut. Natürlich kann unser Gedächtnis durch seinen Code wiederhergestellt werden, aber warum? Es ist viel einfacher, beim Erstellen einer Prozedur sofort anzugeben, was sie tut, und wir werden uns dann auch nach längerer Zeit anhand der Kommentare sofort daran erinnern, warum diese Prozedur erstellt wurde.

Kommentare können ganz einfach erstellt werden. Geben Sie dazu direkt nach der Parameterliste, aber noch vor dem Beginn des Hauptteils der Stored Procedure das COMMENT-Schlüsselwort "comment here" an. Entfernen wir unsere sum_vendor-Routine und erstellen eine neue mit einem Kommentar:

Lassen Sie uns nun den Verfahrenskommentar anfordern:

Tatsächlich mussten Sie das alte Verfahren nicht löschen, um einen Kommentar hinzuzufügen. Sie können eine vorhandene gespeicherte Prozedur mit der Anweisung ALTER PROCEDURE bearbeiten. Sehen wir uns dies anhand der Prozedur ins_cust aus dem vorherigen Job als Beispiel an. Dieses Verfahren gibt Informationen zu einem neuen Kunden in die Kundentabelle ein. Fügen wir diesem Verfahren einen Kommentar hinzu:

ÄNDERUNGSVERFAHREN ins_cust KOMMENTAR

Fügt Informationen über einen neuen Kunden in die Kundentabelle ein. "//

Und fordern wir einen Kommentar zur Überprüfung an:

SELECT Kommentar FROM mysql.proc WHERE name = "ins_cust" //

Es gibt nur zwei Verfahren in unserer Datenbank und Kommentare dazu erscheinen überflüssig. Seien Sie nicht faul, schreiben Sie unbedingt Kommentare. Stellen Sie sich vor, wir haben Dutzende oder Hunderte von Verfahren in unserer Datenbank. Nachdem Sie die erforderliche Anfrage gestellt haben, können Sie leicht herausfinden, was Verfahren sind und was sie bewirken, und Sie werden verstehen, dass Kommentare keine Exzesse sind, sondern Ihnen in Zukunft Zeit sparen. Hier ist übrigens die Abfrage selbst:

Nun, jetzt sind wir in der Lage, alle Informationen über unsere Verfahren zu extrahieren, die es uns ermöglichen, nichts zu vergessen und nicht verwirrt zu werden.

Aufgabe 7. Gespeicherte Prozeduren

Gespeicherte Prozeduren sind nicht nur ein Container für Gruppen von Anfragen, wie es scheinen mag. Gespeicherte Prozeduren können bei ihrer Arbeit Verzweigungsoperatoren verwenden. Solche Operatoren können nicht außerhalb von gespeicherten Prozeduren verwendet werden.

Beginnen wir mit den IF ... THEN ... ELSE-Anweisungen. Wenn Sie mit einer Programmiersprache vertraut sind, ist Ihnen diese Konstruktion bekannt. Denken Sie daran, dass Sie mit der bedingten IF-Anweisung Programmverzweigungen organisieren können. Bei Stored Procedures können Sie mit diesem Operator je nach Eingabeparameter unterschiedliche Abfragen ausführen. Ein Beispiel wird wie immer klarer sein. Aber zuerst ist die Syntax:

Die Arbeitslogik ist einfach: Wenn die Bedingung wahr ist, wird Abfrage 1 ausgeführt, ansonsten - Abfrage 2.

Angenommen, wir haben jeden Tag Happy Hours in unserem Laden, d.h. Wir gewähren in der letzten Stunde des Ladens 10% Rabatt auf alle Bücher. Um den Preis eines Buches auswählen zu können, müssen wir zwei Optionen haben - mit und ohne Rabatt. Dazu müssen wir eine gespeicherte Prozedur mit einem Verzweigungsoperator erstellen. Da wir nur zwei Preisoptionen haben, ist es bequemer, einen booleschen Wert als Eingabeparameter zu verwenden, der, wie Sie sich erinnern, entweder 0 - false oder 1 - true annehmen kann. Der Prozedurcode kann so aussehen:

Jene. am Eingang haben wir einen Parameter, der entweder 1 (wenn es einen Rabatt gibt) oder 0 (wenn es keinen Rabatt gibt) sein kann. Im ersten Fall wird die erste Anfrage ausgeführt, im zweiten - die zweite. Sehen wir uns an, wie unser Verfahren in beiden Fällen funktioniert:

Anrufrabatt (1) //

Anrufrabatt (0) //

Mit der IF-Anweisung können Sie mehr Optionen für Abfragen auswählen. In diesem Fall wird die folgende Syntax verwendet:

CREATE PROCEDURE sp_name (Parameter)

WENN (Bedingung) DANN

ELSEIF (Bedingung) DANN

Außerdem können mehrere ELSEIF-Blöcke vorhanden sein. Angenommen, wir haben uns entschieden, unseren Kunden Rabatte in Abhängigkeit vom Einkaufsbetrag zu gewähren, es gibt keinen Rabatt bis zu 1000 Rubel, von 1000 bis 2000 Rubel - 10 % Rabatt, mehr als 2000 Rubel - 20 % Rabatt. Der Eingabeparameter für ein solches Verfahren sollte der Einkaufsbetrag sein. Daher müssen wir zuerst eine Prozedur schreiben, die es berechnet. Wir werden dies in Analogie zu der in Lektion 15 erstellten Prozedur sum_vendor tun, die die Menge des Produkts anhand der Vendor-ID berechnet hat.

Die von uns benötigten Daten werden in zwei Tabellen gespeichert – Einkaufsmagazin (magazine_sales) und Preise (Preise).

CREATE PROCEDURE sum_sale (IN i INT)

KOMMENTAR "Gibt den Kaufbetrag anhand seiner ID zurück."

DROP VIEW WENN EXISTS sum_sale;

CREATE VIEW sum_sale AS SELECT magazine_sales.id_sale,

magazine_sales.id_product, magazine_sales.quantity,

price.price, magazine_sales.quantity *prices.price AS summa

FROM Zeitschrift_Verkauf, Preise

WHERE magazine_sales.id_product = price.id_product;

SELECT SUM (summa) FROM sum_sale WHERE id_sale = i;

Hier haben wir vor dem Parameter ein neues IN-Schlüsselwort. Tatsache ist, dass wir sowohl Daten an eine Prozedur als auch Daten von einer Prozedur übertragen können. Standardmäßig, d.h. Wenn Sie das Wort IN weglassen, gelten die Parameter als Eingabe (deshalb haben wir dieses Wort bisher nicht verwendet). Hier haben wir explizit darauf hingewiesen, dass der i-Parameter ein Eingabeparameter ist. Wenn wir einige Daten aus einer gespeicherten Prozedur extrahieren müssen, verwenden wir das Schlüsselwort OUT, aber dazu später mehr.

Wir haben also eine Prozedur geschrieben, die eine Ansicht erstellt, indem sie eine Kauf-ID, eine Produkt-ID, eine Menge und einen Preis auswählt und den Betrag für alle Zeilen der resultierenden Tabelle berechnet. Anschließend erfolgt eine Abfrage zu dieser Ansicht, in der der Gesamtbetrag dieses Einkaufs anhand des Eingabeparameters der Einkaufs-ID berechnet wird.

Jetzt müssen wir ein Verfahren schreiben, das den Gesamtbetrag unter Berücksichtigung des gewährten Rabatts neu berechnet. Hier brauchen wir den Verzweigungsoperator:

Jene. Wir übergeben der Prozedur zwei Eingabeparameter, den Betrag (sm) und die Kaufkennung (i), und je nachdem, um welchen Betrag es sich handelt, wird eine Anfrage an die Summe_Sale-Ansicht gestellt, um den Gesamtkaufbetrag multipliziert mit dem gewünschten Koeffizienten zu berechnen.

Es bleibt nur sicherzustellen, dass der Kaufbetrag automatisch in dieses Verfahren überwiesen wird. Dazu wäre es schön, die Prozedur sum_discount direkt aus der Prozedur sum_sale heraus aufzurufen. Es wird ungefähr so ​​aussehen:

Beim Aufruf der Prozedur sum_discount wird das Fragezeichen gestellt, weil es ist nicht klar, wie das Ergebnis der vorherigen Anfrage (d. h. die Gesamtsumme) an die Prozedur sum_discount übertragen werden soll. Außerdem ist nicht klar, wie die Prozedur sum_discount das Ergebnis ihrer Arbeit zurückgibt. Sie haben wahrscheinlich schon erraten, dass wir zur Lösung der zweiten Frage nur einen Parameter mit dem Schlüsselwort OUT benötigen, d.h. Parameter, der Daten von der Prozedur zurückgibt. Lassen Sie uns einen solchen Parameter ss einführen, und da die Summe eine Bruchzahl sein kann, setzen wir ihn auf den Typ DOUBLE:

Daher haben wir in beiden Prozeduren den Ausgabeparameter ss eingeführt. Nun der Aufruf der Prozedur CALL sum_discount (?, i, ss); bedeutet, dass wir durch die Übergabe der ersten beiden Parameter darauf warten, dass der dritte Parameter zur Prozedur sum_sale zurückkehrt. Es bleibt nur zu verstehen, wie diesem Parameter innerhalb der sum_discount-Prozedur selbst ein Wert zugewiesen wird. Wir müssen das Ergebnis einer der Anfragen an diesen Parameter übergeben. Und natürlich bietet MySQL eine solche Option, dafür wird das Schlüsselwort INTO verwendet:

Mit dem Schlüsselwort INTO haben wir angegeben, dass das Abfrageergebnis an den Parameter ss übergeben werden soll.

Befassen wir uns nun mit dem Fragezeichen bzw. lernen Sie, wie Sie das Ergebnis der vorherigen Abfragen an die Prozedur sum_discount übergeben. Dazu machen wir uns mit einem solchen Konzept als Variable vertraut.

Mithilfe von Variablen können Sie das Ergebnis der aktuellen Abfrage zur Verwendung in zukünftigen Abfragen speichern. Eine Variablendeklaration beginnt mit dem @-Symbol gefolgt vom Variablennamen. Sie werden mit der SET-Anweisung deklariert. Lassen Sie uns zum Beispiel eine Variable z deklarieren und ihr den Anfangswert 20 geben.

Eine Variable mit einem solchen Wert befindet sich jetzt in unserer Datenbank, Sie können sie überprüfen, indem Sie die entsprechende Anfrage stellen:

Variablen sind nur innerhalb einer Sitzung der Verbindung mit dem MySQL-Server gültig. Das heißt, nach dem Trennen der Verbindung wird die Variable nicht mehr existieren.

Um Variablen in Prozeduren zu verwenden, wird die DECLARE-Anweisung verwendet, die die folgende Syntax hat:

DECLARE Variablenname Typ DEFAULT default_value_if_is

Lassen Sie uns in unserer Prozedur also eine Variable s deklarieren, in der wir den Wert des Kaufbetrags mit dem Schlüsselwort INTO speichern:

Diese Variable ist der erste Eingabeparameter für die Prozedur sum_discount. Die endgültige Version unserer Verfahren sieht also wie folgt aus:

Falls Sie verwirrt sind, sehen wir uns an, wie unser sum_sale-Verfahren funktioniert:

Wir rufen die Prozedur sum_sale auf und geben die Kennung des Kaufs, an dem wir interessiert sind, als Eingabeparameter an, zum Beispiel id = 1, und geben an, dass der zweite Parameter eine Ausgabevariable ist, die das Ergebnis der Prozedur sum_discount ist:

ruf sum_sale (1, @sum_discount) //

Die Prozedur sum_sale erstellt eine Ansicht, die Daten zu allen Käufen, Produkten, deren Menge, Preis und Betrag für jede Zeile sammelt.

In dieser Ansicht wird dann die Einkaufssumme mit der gewünschten ID abgefragt und das Ergebnis in die Variable s geschrieben.

Nun wird die Prozedur sum_discount aufgerufen, bei der als erster Parameter die Variable s (Einkaufsbetrag), als zweiter die Einkaufskennung i und als dritter Parameter der ss-Parameter angegeben wird, der als Ausgang, d.h. das Ergebnis der Aktion der Prozedur sum_discount wird an sie zurückgegeben.

Die Prozedur sum_discount prüft, welche Bedingung die Eingabesumme erfüllt, und führt die entsprechende Abfrage aus, das Ergebnis wird in den Ausgabeparameter ss geschrieben, der an die Prozedur sum_sale zurückgegeben wird.

Um das Ergebnis des sum_sale-Verfahrens zu sehen, müssen Sie eine Anfrage stellen:

wähle @ sum_discount //

Lassen Sie uns sicherstellen, dass unser Verfahren funktioniert:

Die Summe unserer beiden Einkäufe beträgt weniger als 1000 Rubel, daher gibt es keinen Rabatt. Sie können Einkäufe mit unterschiedlichen Beträgen selbstständig eingeben und sehen, wie unser Verfahren funktioniert.

Vielleicht erschien Ihnen diese Lektion schwierig oder verwirrend genug. Sei nicht verärgert. Erstens kommt alles mit Erfahrung, und zweitens muss ich fairerweise sagen, dass sowohl Variablen als auch Verzweigungsoperatoren in MySQL äußerst selten verwendet werden. Bevorzugt werden Sprachen wie PHP, Perl etc., mit deren Hilfe Verzweigungen organisiert und einfache Prozeduren an die Datenbank selbst gesendet werden.

Aufgabe 8. Gespeicherte Prozeduren

Heute lernen wir, wie man mit Schleifen arbeitet, d.h. führen Sie dieselbe Abfrage mehrmals aus. MySQL verwendet WHILE-, REPEAT- und LOOP-Anweisungen, um mit Schleifen zu arbeiten.

WHILE-Schleifenoperator

Die Syntax lautet zunächst:

WHILE DO Bedingung

Die Anfrage wird ausgeführt, solange die Bedingung wahr ist. Sehen wir uns ein Beispiel an, wie dies funktioniert. Angenommen, wir möchten die Titel, Autoren und die Anzahl der Bücher wissen, die in verschiedenen Lieferungen angekommen sind. Die für uns interessanten Informationen werden in zwei Tabellen gespeichert - Magazin der Lieferungen (magazine_incoming) und Produkt (Produkte). Schreiben wir die Abfrage, die uns interessiert:

Was aber, wenn das Ergebnis nicht in einer Tabelle, sondern für jede Lieferung separat angezeigt werden soll? Natürlich können Sie 3 verschiedene Abfragen schreiben und zu jeder eine weitere Bedingung hinzufügen:

Aber es geht viel kürzer mit einer WHILE-Schleife:

Jene. Wir haben die Variable i eingeführt, standardmäßig gleich 3, der Server wird die Anfrage mit der Liefer-ID gleich 3 ausführen, dann i um eins dekrementieren (SET i = i-1), sicherstellen, dass der neue Wert der Variablen i positiv ist (i> 0) und die Anfrage erneut ausführen, jedoch bereits mit dem neuen Wert der Liefer-ID gleich 2. Dies wird so lange fortgesetzt, bis die Variable i den Wert 0 erhält, die Bedingung falsch wird und die Schleife ihre Arbeit beendet .

Um sicherzustellen, dass die Schleife funktioniert, erstellen wir die gespeicherte Prozedur für Bücher und fügen eine Schleife ein:

Rufen wir nun die Prozedur auf:

Wir haben jetzt 3 separate Tabellen (für jede Sendung). Stimmen Sie zu, dass der Code mit einer Schleife viel kürzer ist als drei separate Anforderungen. Es gibt jedoch eine Unannehmlichkeit in unserem Verfahren, wir haben die Anzahl der Ausgabetabellen als Standardwert (DEFAULT 3) angegeben und müssen diesen Wert bei jeder neuen Lieferung ändern, dh den Prozedurcode. Es ist viel bequemer, diese Zahl zu einem Eingabeparameter zu machen. Lassen Sie uns unsere Prozedur neu schreiben, indem wir einen Eingabeparameter num hinzufügen und vorausgesetzt, dass er nicht 0 sein sollte:

Stellen Sie sicher, dass wir bei unterschiedlichen Parametern weiterhin Tabellen für jede Sendung erhalten. Unsere Schleife hat einen weiteren Nachteil - wenn wir versehentlich einen zu großen Eingabewert setzen, erhalten wir eine pseudo-unendliche Schleife, die den Server mit nutzloser Arbeit belastet. Solche Situationen werden vermieden, indem die Schleife mit Tags versehen wird und die LEAVE-Anweisung verwendet wird, um ein vorzeitiges Verlassen der Schleife anzuzeigen.

Also haben wir unsere Schleife am Anfang (wet :) und am Ende mit dem Label wet versehen und noch eine weitere Bedingung hinzugefügt - wenn der Eingabeparameter größer als 10 ist (die Zahl 10 wird willkürlich genommen), dann die Schleife mit das Etikett sollte nass enden (WENN (i> 10) DANN nass LASSEN). Wenn wir also versehentlich eine Prozedur mit einem großen Zahlenwert aufrufen, bricht unsere Schleife nach 10 Iterationen ab (Iteration ist ein Schleifendurchlauf).

Schleifen in MySQL werden wie Verzweigungsanweisungen in der Praxis in Webanwendungen fast nie verwendet. Daher geben wir für die anderen beiden Schleifentypen nur die Syntax und die Unterschiede an. Es ist unwahrscheinlich, dass Sie sie verwenden, aber Sie müssen trotzdem über ihre Existenz Bescheid wissen.

REPEAT-Schleifenanweisung

Die Schleifenbedingung wird nicht wie bei der WHILE-Schleife am Anfang geprüft, sondern am Ende, d.h. mindestens einmal, aber die Schleife läuft. Die Schleife selbst wird ausgeführt, während die Bedingung falsch ist. Die Syntax lautet wie folgt:

BIS-Bedingung

LOOP-Schleifenoperator

Diese Schleife hat überhaupt keine Bedingungen, daher muss sie eine LEAVE-Anweisung haben. Die Syntax lautet wie folgt:

Damit ist unsere SQL-Studie abgeschlossen. Natürlich haben wir nicht alle Möglichkeiten dieser Abfragesprache berücksichtigt, aber im wirklichen Leben werden Sie sich wahrscheinlich nicht einmal mit dem auseinandersetzen müssen, was Sie bereits kennen.

Gepostet auf Allbest.ru

...

Ähnliche Dokumente

    Verwenden der integrierten Funktionen von MS Excel zur Lösung spezifischer Probleme. Funktionen zum Sortieren von Spalten und Zeilen, Liste von Funktionen und Formeln. Einschränkungen von Formeln und Möglichkeiten zur Überwindung von Schwierigkeiten. Absolvieren praktischer Übungen zur Verwendung von Funktionen.

    Laborarbeit, hinzugefügt am 16.11.2008

    Funktionen zur Verwendung der integrierten Funktionen von Microsoft Excel. Erstellen von Tabellen, deren Befüllung mit Daten, Diagrammerstellung. Wenden Sie mithilfe von Anwendungspaketen mathematische Formeln auf Abfragen an. Technische Anforderungen an den Computer.

    Hausarbeit, hinzugefügt am 25.04.2013

    Der Zweck und die Bestandteile von Formeln, die Regeln zum Schreiben und Kopieren. Verwendung mathematischer, statistischer und logischer Funktionen, Datums- und Zeitfunktionen in MS Excel. Arten und Aufzeichnung von Links eines Tabellenkalkulationsprozessors, die Technologie ihrer Eingabe und ihres Kopierens.

    Präsentation hinzugefügt am 12.12.2012

    Berücksichtigung der Besonderheiten der Deklaration von Funktionen in der Sprache C. Definition der Konzepte von Funktionsargumenten und deren Variablen (lokal, Register, extern, statisch). Problemlösung durch die Programmmethode: Erstellen eines Flussdiagramms, das die Haupt- und sqr-Funktionen beschreibt.

    Präsentation hinzugefügt am 26.07.2013

    Die Regeln zum Erstellen und der Algorithmus zum Anwenden einer benutzerdefinierten Benutzerfunktion in einem Standard-VBA-Editormodul. Untersuchen der Struktur des Funktionscodes. Eine Liste der integrierten mathematischen Funktionen im Visual Basic-Editor. Bestimmen des Gültigkeitsbereichs einer Variablen.

    praktische Arbeit, hinzugefügt am 07.10.2010

    Erstellung einer Anwendung, die Funktionsgraphen für einen gegebenen mathematischen Ausdruck generiert. Entwicklung des Programms "Generator mathematischer Funktionen". Erstellung eines Funktionsassistenten zum Eingeben eines mathematischen Ausdrucks, Testen.

    Diplomarbeit, hinzugefügt am 16.02.2016

    Analyse der Dynamik des Bruttoregionalprodukts und Berechnung seiner Punktprognose mit integrierten Excel-Funktionen. Anwendung von Korrelations- und Regressionsanalysen zur Bestimmung des Verhältnisses zwischen Anlagevermögen und GFK-Volumen.

    Zusammenfassung, hinzugefügt am 20.05.2010

    Funktionen, die es Ihnen ermöglichen, mit einer MySQL-Datenbank mit PHP zu arbeiten. Serververbindung und -trennung. Datenbankerstellung und -auswahl. Zugriff auf ein separates Feld des Datensatzes. Komplexe Nutzung von Informationsfunktionen. An den MySQL-Server gesendete Anfragen.

    Vortrag, hinzugefügt am 27.04.2009

    Entwicklung einer Anwendung, die die Funktionen zur Anzeige der genauen Uhrzeit und des Datums übernimmt. Ermittlung zusätzlicher Funktionen der entwickelten Anwendung. Berücksichtigung der wichtigsten Phasen der Erstellung eines Softwareprodukts. Ergebnisse der Anwendungstests.

    Hausarbeit, hinzugefügt am 14.04.2019

    Programmierte Berechnung anhand von Formeln, Bestimmen der Fläche eines regelmäßigen Polygons für alle möglichen Eingabedaten mithilfe von E / A-Streams. Verwendung von Operatoren bei der Berechnung mathematischer Funktionen, Algorithmen zum Akkumulieren des Betrags.

In diesem Teil des Artikels werden wir die im vorherigen Artikel gestartete gespeicherte Prozedur hinzufügen und lernen, wie man gespeicherte . erstellt MySQL-Funktionen.

Es bleibt uns also übrig, den Wert für die letzte Variable PostID anzugeben. Als Wert wird ihm das Ergebnis zugewiesen, das von der GetPostID-Funktion zurückgegeben wird, die wir jetzt erstellen.

Erstellen Sie eine Funktion

Schließen Sie zunächst das aktuelle Formular zum Anlegen einer Prozedur, indem Sie auf die Schaltfläche Los klicken. Klicken Sie dann im selben Fenster erneut auf Routineinschrift hinzufügen, ein bekanntes Formular wird angezeigt, füllen Sie es aus.

Name - GetPostID-Typ - Funktionsparameter - ComID BIGINT (20) UNSIGNED Rückgabetyp (Rückgabetyp) - BIGINT Rückgabelänge / Werte - 20 Rückgabeoptionen - UNSIGNED Definition: BEGIN RETURN (SELECT comment_post_ID FROM wp_comments WHERE comment_ID = ComID); ENDE;

Sie können auch zusätzliche Parameter angeben:

Ist deterministisch - eine deterministische Funktion gibt immer das gleiche Ergebnis mit den gleichen Eingabeparametern zurück, andernfalls ist sie nicht deterministisch. Aktivieren Sie in unserem Fall das Kontrollkästchen.

Definierer und Sicherheitsstufe Sicherheitsparameter, in diesem Beispiel werden wir sie unverändert lassen.

Der SQL-Datenzugriff hat mehrere Bedeutungen:

NO SQL - enthält kein SQL.

Enthält SQL - enthält integrierte SQL-Funktionen oder Operatoren, die keine Daten in der Datenbank lesen, schreiben oder ändern. Zum Beispiel den Wert einer Variablen setzen: SET name = value;

LESEN SQL-DATEN - schreibgeschützte Daten, ohne Datenänderung, angegeben für eine SELECT-Abfrage.

ÄNDERT SQL-DATEN - Das Ändern oder Eingeben von Daten in die Datenbank wird für Abfragen angezeigt: INSERT, UPDATE, aber die SELECT-Abfrage sollte nicht vorhanden sein.

Unsere Funktion verwendet eine SELECT-Abfrage, wir geben LESEN SQL-DATEN an.

Kommentar ein Kommentar.

Nachdem alle Felder ausgefüllt sind, klicken Sie auf die Schaltfläche Los.

Gehen Sie zurück zur Registerkarte Routinen und bearbeiten Sie unser Verfahren, indem Sie auf die Schaltfläche Bearbeiten klicken.

Weisen wir der PostID-Variablen als Ergebnis das Ergebnis zu, das die GetPostID-Funktion zurückgibt.

SET postID = GetPostID (ComID);

Als Ergebnis wird der letzte Teil des Verfahrens so aussehen

BEGIN DECLARE Autor tinytext DEFAULT "admin"; DECLARE UserID bigint (20) DEFAULT 1; DECLARE E-Mail varchar (100); Datum DATETIME DEFAULT JETZT ERKLÄREN (); DECLARE ParentCom varchar (20); ERKLÄREN Zugelassener Varchar (20); PostID BIGINT ERKLÄREN (20); WENN Autor = "admin" DANN SET Genehmigt = 1; ELSE SET Genehmigt = 0; ENDE WENN; SET ParentCom = ComID; SET E-Mail = " [E-Mail geschützt]"; SET PostID = GetPostID (ComID); INSERT INTO wp_comments (comment_author, comment_author_email, comment_content, comment_date, comment_date_gmt, comment_post_id, comment_parent, comment_approved, user_id) VALUES (Autor, E-Mail, Inhalt, Eltern, Datum, PostID); ENDE;

Lassen Sie die restlichen Formularfelder unverändert, klicken Sie auf die Schaltfläche Los. Das Verfahren wurde erstellt.

Sie können auch als Ergebnis einer Abfrage Werte für eine oder mehrere Variablen setzen. Beispielsweise werden die Felder: Autor, Mail und Benutzer-ID in der Tabelle wp_users gespeichert.

In diesem Wissen können Sie Werte für diese Variablen wie folgt festlegen:

BEGIN - Variablen deklarieren DECLARE Autor tinytext DEFAULT "admin"; DECLARE UserID bigint (20) DEFAULT 1; DECLARE E-Mail varchar (100); - Ausführen einer Abfrage und Setzen von Werten für die Variablen SELECT user_login, user_email, ID INTO Author, Email, UserID FROM wp_users WHERE user_login LIKE "adm%"; ENDE;

Gespeicherter Prozeduraufruf

Es bleibt das erstellte Verfahren zu testen. Fügen Sie zunächst einen Kommentar zu einem Artikel hinzu, genehmigen Sie ihn und überprüfen Sie, ob er auf der Seite angezeigt wird.

Dann finden wir die ID des hinzugefügten Kommentars heraus

Kehren Sie zur Registerkarte Routinen zurück und klicken Sie auf das Label Execute

Es erscheint ein Formular

Wir geben die Werte der übertragenen Parameter an: den Antworttext und die Kommentar-ID, danach klicken wir auf die Schaltfläche mit der Aufschrift Go.

Beachtung! Diese Arbeit basiert auf der Übersetzung des Abschnitts „17.1. Gespeicherte Routinen und die Grant-Tabellen "für MySQL 5.0.19", Referenzhandbuch. Es dokumentiert MySQL 5.0 bis 5.0.19. Dokument erstellt am: 2006-01-23 (Revision: 995) "
"Zuerst alles lesen, dann Beispiele ausprobieren."

Gespeicherte Prozeduren sind eine Sammlung von SQL-Befehlen, die kompiliert und auf dem Server gespeichert werden können. Anstatt eine häufig verwendete Abfrage zu speichern, können Clients daher auf die entsprechende gespeicherte Prozedur verweisen. Dies bietet eine bessere Leistung, da eine bestimmte Anfrage nur einmal analysiert werden muss und weniger Server-Client-Verkehr anfällt. Sie können Ihr konzeptionelles Niveau auch erhöhen, indem Sie eine Funktionsbibliothek auf dem Server erstellen.

Ein Trigger ist eine gespeicherte Prozedur, die aufgerufen wird, wenn ein bestimmtes Ereignis eintritt. Sie können beispielsweise eine gespeicherte Prozedur definieren, die jedes Mal ausgelöst wird, wenn ein Datensatz aus einer Transaktionstabelle gelöscht wird, wodurch sichergestellt wird, dass der entsprechende Kunde automatisch aus der Kundentabelle entfernt wird, wenn alle seine Transaktionen gelöscht werden.

Gespeicherte Programme (Prozeduren und Funktionen) werden in MySQL 5.0 unterstützt. Gespeicherte Prozeduren sind eine Sammlung von SQL-Anweisungen, die auf dem Server gespeichert werden können. Sobald dies erledigt ist, muss der Client die Anforderung nicht erneut übertragen, er muss nur das gespeicherte Programm aufrufen.

Dies kann nützlich sein, wenn:

  • zahlreiche Clientanwendungen sind in verschiedenen Sprachen geschrieben oder laufen auf verschiedenen Plattformen, müssen aber dieselbe Operationsdatenbank verwenden
  • Sicherheit an erster Stelle

Gespeicherte Prozeduren und Funktionen (Routinen) können eine bessere Leistung bieten, da weniger Informationen für die Übertragung zwischen Client und Server erforderlich sind. Die Wahl erhöht die Belastung des Datenbankservers, reduziert jedoch die Kosten auf der Clientseite. Verwenden Sie dies, wenn viele Client-Rechner (z. B. Webserver) von einer oder mehreren Datenbanken bedient werden.

Gespeicherte Routinen ermöglichen Ihnen auch die Verwendung von Funktionsbibliotheken, die in der Serverdatenbank gespeichert sind. Diese Funktion wird für viele moderne Programmiersprachen bereitgestellt, mit denen Sie diese direkt aufrufen können (z. B. mithilfe von Klassen).

MySQL folgt SQL: 2003-Syntax für gespeicherte Prozeduren, die bereits von IBMs DB2 verwendet wird.

Von Worten zu Taten...

Beim Erstellen, Ändern und Löschen gespeicherter Routinen manipuliert der Server die Tabelle mysql.proc

Ab MySQL 5.0.3 sind die folgenden Berechtigungen erforderlich:

ROUTINE ERSTELLEN um gespeicherte Prozeduren zu erstellen

ÄNDERUNGSROUTINE sind erforderlich, um Verfahren zu ändern oder zu löschen. Dieses Privileg wird automatisch dem Ersteller der Prozedur (Funktion) zugewiesen.

AUSFÜHREN die Berechtigung ist erforderlich, um das Unterprogramm auszuführen. Sie wird jedoch automatisch dem Ersteller der Prozedur (Funktion) zugeordnet. Außerdem standardmäßig der SQL SECURITY-Parameter für die DEFINER-Routine, der es Benutzern mit Zugriff auf die Datenbank ermöglicht, die dieser Datenbank zugeordneten Routinen aufzurufen.

Syntax für gespeicherte Prozeduren und Funktionen

Eine gespeicherte Unterroutine ist eine Prozedur oder Funktion. Gespeicherte Routinen werden mit den Ausdrücken CREATE PROCEDURE oder CREATE FUNCTION erstellt. Die gespeicherte Routine wird mit einem CALL-Ausdruck aufgerufen, wobei nur die Rückgabevariablen als Ausgaben verwendet werden. Eine Funktion kann wie jede andere Funktion aufgerufen werden und kann einen Skalar zurückgeben. Gespeicherte Routinen können andere gespeicherte Routinen aufrufen.

Ab MySQL 5.0.1 ist eine geladene Prozedur oder Funktion einer bestimmten Datenbank zugeordnet. Dies hat mehrere Bedeutungen:

  • Wenn eine Unterroutine aufgerufen wird, muss USE db_name aufgerufen werden (und die Verwendung der Basis abgebrochen werden, wenn die Unterroutine beendet ist und die Basis nicht mehr benötigt wird).
  • Sie können allgemeine Namen mit dem Datenbanknamen qualifizieren. Dies kann verwendet werden, um auf ein Unterprogramm zu verweisen, das sich nicht in der aktuellen Datenbank befindet. Um beispielsweise eine gespeicherte Prozedur p oder eine Funktion f auszuführen, die sich auf den Datenbanktest bezieht, können Sie der Shell mitteilen, test.p() oder test.f() aufzurufen.
  • Beim Löschen einer Datenbank werden auch alle damit verbundenen geladenen Routinen gelöscht. In MySQL 5.0.0 sind die geladenen Routinen global und nicht mit der Datenbank verknüpft. Sie erben standardmäßig die Datenbank vom Aufrufer. Wenn USE db_name innerhalb des Unterprogramms ausgeführt wird, wird der ursprüngliche aktuelle DB nach dem Beenden des Unterprogramms wiederhergestellt (z.

MySQL unterstützt vollständig Erweiterungen, die die Verwendung normaler SELECT-Ausdrücke (ohne Cursor oder lokale Variablen) innerhalb gespeicherter Prozeduren ermöglichen. Die von der Anfrage zurückgegebene Ergebnismenge wird einfach direkt an den Client gesendet. Mehrere SELECT-Abfragen generieren mehrere Resultsets, sodass der Client eine Bibliothek verwenden muss, die mehrere Resultsets unterstützt.

VERFAHREN ERSTELLEN- Erstellen Sie eine gespeicherte Prozedur.

FUNKTION ERSTELLEN- Erstellen Sie eine gespeicherte Funktion.

Syntax:

VERFAHREN ERSTELLEN sp_name ([sp_parameter [, ...]])
[Feature ...] Routine-Körper

FUNKTION ERSTELLEN Funktionsname ([Funktionsparameter [, ...]])
KEHRT ZURÜCK Art der
[charakteristisch ...] Routine-Körper

Verfahrensparameter:
[ IN | AUS | INOUT] Parametername Typ
Funktionsparameter:
Parametername Typ

Art der:
Beliebiger MySQL-Datentyp

charakteristisch:
SPRACHE SQL
| DETERMINISTISCH
| (ENTHÄLT SQL | KEINE SQL | LESEN SQL-DATEN | ÄNDERT SQL-DATEN)
| SQL-SICHERHEIT (DEFINER | INVOKER)
| KOMMENTAR "Zeichenfolge"

Routine-Körper:
Richtige SQL-Anweisung.

Betrachten wir alles in der Praxis.

Lassen Sie uns zunächst eine gespeicherte Prozedur mit der folgenden Abfrage erstellen:

CREATE PROCEDURE `my_proc` (OUT t INTEGER (11))
NICHT DETERMINISTISCH
SQL SECURITY INVOKER
KOMMENTAR ""
START
wähle val1 + val2 in "t" aus "mein" LIMIT 0,1;
ENDE;

Die Verwendung der LIMIT-Klausel in dieser Abfrage erfolgt, weil nicht jeder Client in der Lage ist, eine mehrzeilige Ergebnismenge zu akzeptieren.

Danach nennen wir es:

CALL my_proc (@a);
SELECT @a;

Um die interne Anforderung von der externen zu trennen, wird immer ein anderes als das übliche Trennzeichen verwendet (zum Setzen verwenden Sie den Befehl DELIMITER <строка/символ>)

Hier ist ein weiteres Beispiel mit allen Anforderungen im Hinterkopf.

MySQL> Trennzeichen //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGINNEN
-> WÄHLE ZÄHLER (*) IN param1 VON t;
-> ENDE;
-> //

mysql> Trennzeichen;
mysql> CALL simpleproc (@a);
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 Reihe im Set (0,00 Sek.)

Der gesamte Vorgang ist in der folgenden Abbildung zu sehen:

Löst aus

Trigger-Unterstützung wurde in MySQL seit Version 5.0.2 eingeführt.

Abzug- ein benanntes DB-Objekt, das einer Tabelle zugeordnet ist und aktiviert wird, wenn ein bestimmtes Ereignis eintritt, ein dieser Tabelle zugeordnetes Ereignis.

Der folgende Code erstellt beispielsweise eine Tabelle und einen INSERT-Trigger. Der Trigger fasst die Werte zusammen, die in eine der Tabellenspalten eingefügt werden.

Mysql> CREATE TABLE-Konto (acct_num INT, Betrag DECIMAL (10,2));
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FÜR JEDEN REIHENSATZ @sum = @sum + NEW.amount;
Abfrage OK, 0 Zeilen betroffen (0,06 Sek.)

Deklarieren wir die Variable Summe und weisen ihr den Wert 1 zu. Danach mit jedem Einfügen in die Tabelle Konto der Wert dieser Variablen wird entsprechend dem eingefügten Teil erhöht.

Kommentar... Wenn der Wert der Variablen nicht initialisiert ist, funktioniert der Trigger nicht!

Trigger-Syntax

SCHAFFEN

ABZUG trigger_name trigger_time trigger_ event
ON table_name FOR EACH ROW expression_executed when_trigger_fired

Wenn mit Triggername und Benutzername auf einmal alles klar ist, dann werden wir über "Triggerzeit" und "Ereignis" getrennt sprechen.

trigger_time

Bestimmt den Zeitpunkt der Triggeraktion. BEFORE bedeutet, dass der Trigger vor dem Ende des Triggerereignisses ausgeführt wird, und AFTER bedeutet danach. Beim Einfügen von Datensätzen (siehe Beispiel oben) wurde beispielsweise unser Trigger ausgelöst, bevor ein Datensatz tatsächlich eingefügt wurde, und der Betrag berechnet. Diese Option ist geeignet, wenn Sie einige zusätzliche Felder in einer Tabelle vorberechnen oder parallel in eine andere Tabelle einfügen möchten.

auslösendes Ereignis

Hier ist alles einfacher. Es wird deutlich angezeigt, bei welchem ​​Ereignis der Trigger ausgeführt wird.

  • EINFÜGEN: d.h. auf Einfügungen oder ähnlichen Ausdrücken (INSERT, LOAD DATA und REPLACE)
  • UPDATE: wenn eine Entität (Zeile) aktualisiert wird
  • DELETE: wenn ein Datensatz gelöscht wird (Abfragen mit DELETE- und / oder REPLACE-Anweisungen)

Programmierung von mathematischen Funktionen

Funktionen sind Operationen, mit denen Sie Daten manipulieren können. Es gibt mehrere Gruppen integrierter Funktionen in MySQL:

String-Funktionen... Wird verwendet, um Textzeichenfolgen zu bearbeiten, z. B. zum Trimmen oder Füllen von Werten.

Numerische Funktionen... Wird verwendet, um mathematische Operationen mit numerischen Daten durchzuführen. Numerische Funktionen umfassen Funktionen, die Absolutwerte, Sinus und Kosinus von Winkeln, Quadratwurzel einer Zahl usw. zurückgeben. Sie werden nur für algebraische, trigonometrische und geometrische Berechnungen verwendet. Im Allgemeinen werden sie selten verwendet, daher werden wir sie nicht berücksichtigen. Sie sollten sich jedoch bewusst sein, dass sie existieren, und bei Bedarf die MySQL-Dokumentation zu Rate ziehen.

Zusammenfassungsfunktionen... Sie werden verwendet, um zusammenfassende Daten für Tabellen zu erhalten, beispielsweise wenn es erforderlich ist, einige Daten zusammenzufassen, ohne sie zu stichproben.

Datums- und Uhrzeitfunktionen... Wird verwendet, um Datums- und Uhrzeitwerte zu bearbeiten, beispielsweise um die Differenz zwischen Datumsangaben zurückzugeben.

Systemfunktionen... Gibt die Dienstinformationen des DBMS zurück.

Um die wichtigsten integrierten Funktionen zu betrachten, müssen wir eine neue Datenbank erstellen, die numerische und Datumswerte enthält.

Nehmen wir als Beispiel einen Online-Shop.

Konzeptmodell:

Beziehungsmodell:


Schauen wir uns also das letzte Diagramm an und erstellen eine Datenbank - Shop.

Datenbankshop erstellen;

Wir wählen es für die Arbeit:

Und wir erstellen darin 8 Tabellen, wie im Schema: Kunden, Lieferanten, Einkäufe (Verkauf), Lieferungen (eingehend), Einkaufsjournal (magazine_sales), Angebotsjournal (magazine_incoming), Produkte (Produkte), Preise ( Preise). Eine Nuance, unser Geschäft wird Bücher verkaufen, daher werden wir der Tabelle Produkte eine weitere Spalte hinzufügen - Autor, im Prinzip ist dies nicht notwendig, aber es ist irgendwie bekannter.

Beachten Sie, dass die Primärschlüssel in den Tabellen "Einkaufsjournal", "Lieferjournal" und "Preise" zusammengesetzt sind, d. h. ihre eindeutigen Werte bestehen aus Wertepaaren (in einer Tabelle kann es nicht zwei Zeilen mit den gleichen Wertepaaren geben). Die Spaltennamen dieser Wertepaare werden durch Kommas nach dem Schlüsselwort PRIMARY KEY angegeben.

In einem echten Online-Shop werden die Daten in diesen Tabellen durch Skripte in einer beliebigen Sprache (z. B. PHP) eingegeben, aber vorerst müssen wir sie manuell eingeben. Sie können beliebige Daten eingeben, denken Sie jedoch daran, dass die Werte in den gleichnamigen Spalten in verwandten Tabellen übereinstimmen müssen. Oder kopieren Sie die Daten unten.

SQL-Lektion 10. Eingebaute Funktionen

Funktionen sind Operationen, mit denen Sie Daten manipulieren können. Es gibt mehrere Gruppen integrierter Funktionen in MySQL:
  • String-Funktionen. Wird verwendet, um Textzeichenfolgen zu bearbeiten, z. B. zum Trimmen oder Füllen von Werten.

  • Numerische Funktionen. Wird verwendet, um mathematische Operationen mit numerischen Daten durchzuführen. Numerische Funktionen umfassen Funktionen, die Absolutwerte, Sinus und Kosinus von Winkeln, Quadratwurzel einer Zahl usw. zurückgeben. Sie werden nur für algebraische, trigonometrische und geometrische Berechnungen verwendet. Im Allgemeinen werden sie selten verwendet, daher werden wir sie nicht berücksichtigen. Sie sollten sich jedoch bewusst sein, dass sie existieren, und bei Bedarf die MySQL-Dokumentation zu Rate ziehen.

  • Zusammenfassungsfunktionen. Sie werden verwendet, um zusammenfassende Daten für Tabellen zu erhalten, beispielsweise wenn es erforderlich ist, einige Daten zusammenzufassen, ohne sie zu stichproben.

  • Datums- und Zeitfunktionen. Wird verwendet, um Datums- und Uhrzeitwerte zu bearbeiten, beispielsweise um die Differenz zwischen Datumsangaben zurückzugeben.

  • Systemfunktionen. Gibt die Dienstinformationen des DBMS zurück.

Um die wichtigsten integrierten Funktionen zu betrachten, müssen wir eine neue Datenbank erstellen, die numerische und Datumswerte enthält. In Lektion 5 Datenbankgrundlagen haben wir ein relationales Datenbankmodell für einen Online-Shop erstellt. Es ist an der Zeit, es in MySQL zu implementieren, gleichzeitig werden wir die Vergangenheit konsolidieren.

Also schauen wir uns das letzte Diagramm von Lektion 5 zur Datenbank an und erstellen einen Datenbank-Shop.

Datenbankshop erstellen;

Wir wählen es für die Arbeit:

Und wir erstellen darin 8 Tabellen, wie im Schema: Kunden, Lieferanten, Einkäufe (Verkauf), Lieferungen (eingehend), Einkaufsjournal (magazine_sales), Angebotsjournal (magazine_incoming), Produkte (Produkte), Preise ( Preise). Eine Nuance, unser Geschäft wird Bücher verkaufen, daher werden wir der Tabelle Produkte eine weitere Spalte hinzufügen - Autor, im Prinzip ist dies nicht notwendig, aber es ist irgendwie bekannter.

Tabellenkunden erstellen (id_customer int NOT NULL AUTO_INCREMENT, name char (50) NOT NULL, email char (50) NOT NULL, PRIMARY KEY (id_customer)); Tabellenanbieter erstellen (id_vendor int NOT NULL AUTO_INCREMENT, name char (50) NOT NULL, city char (30) NOT NULL, address char (100) NOT NULL, PRIMARY KEY (id_vendor)); Tabelle Verkauf erstellen (id_sale int NOT NULL AUTO_INCREMENT, id_customer int NOT NULL, date_sale Datum NOT NULL, PRIMARY KEY (id_sale), FOREIGN KEY (id_customer) REFERENCES Kunden (id_customer)); Tabelle eingehend erstellen (id_incoming int NOT NULL AUTO_INCREMENT, id_vendor int NOT NULL, date_incoming Datum NOT NULL, PRIMARY KEY (id_incoming), FOREIGN KEY (id_vendor) REFERENCES Vendoren (id_vendor)); Tabellenprodukte erstellen (id_product int NOT NULL AUTO_INCREMENT, name char (100) NOT NULL, author char (50) NOT NULL, PRIMARY KEY (id_product)); Tabellenpreise erstellen (id_product int NOT NULL, date_price_changes date NOT NULL, price double NOT NULL, PRIMARY KEY (id_product, date_price_changes), FOREIGN KEY (id_product) REFERENCES products (id_product)); Tabelle erstellen magazine_sales (id_sale int NOT NULL, id_product int NOT NULL, Menge int NOT NULL, PRIMARY KEY (id_sale, id_product), FOREIGN KEY (id_sale) REFERENCES sale (id_sale), FOREIGN KEY (id_product) REFER_product) products (id) Tabelle erstellen magazine_incoming (id_incoming int NOT NULL, id_product int NOT NULL, Menge int NOT NULL, PRIMARY KEY (id_incoming, id_product), FOREIGN KEY (id_incoming) REFERENCES eingehend (id_incoming), FOREIGN KEY (id_product) REFERPENCES) Produkte (id_product) REFERPENCES ) Produkte (id_product)

Beachten Sie, dass die Primärschlüssel in den Tabellen "Einkaufsjournal", "Lieferjournal" und "Preise" zusammengesetzt sind, d. h. ihre eindeutigen Werte bestehen aus Wertepaaren (in einer Tabelle kann es nicht zwei Zeilen mit den gleichen Wertepaaren geben). Die Spaltennamen dieser Wertepaare werden durch Kommas nach dem Schlüsselwort PRIMARY KEY angegeben. Den Rest kennst du schon.

In einem echten Online-Shop werden die Daten in diesen Tabellen durch Skripte in einer beliebigen Sprache (z. B. PHP) eingegeben, aber vorerst müssen wir sie manuell eingeben. Sie können beliebige Daten eingeben, denken Sie jedoch daran, dass die Werte in den gleichnamigen Spalten in verwandten Tabellen übereinstimmen müssen. Oder kopieren Sie die folgenden Daten:

INTO Verkäufer (Name, Ort, Adresse) WERTE ("Williams", "Moskau", "Lesnaya Str., 43"), ("Haus der Presse", "Minsk", "F. Skorina ave., D. 18 "), (" BHV-Petersburg "," St. Petersburg "," Esenina-Straße, 5 "); INSERT INTO Kunden (Name, E-Mail) WERTE ("Ivanov Sergey", " [E-Mail geschützt]"), (" Lenskaya Katya "," [E-Mail geschützt]"), (" Demidov Oleg "," [E-Mail geschützt]"), ("Afanasiev Victor "," [E-Mail geschützt]"), ("Pazhskaya Vera "," [E-Mail geschützt] "); EINFÜGEN IN Produkte (Name, Autor) WERTE (" Gedichte über die Liebe "," Andrei Voznesensky "), (" Gesammelte Werke, Band 2 "," Andrei Voznesensky "), (" Gesammelte Werke, Band 3 "," Andrey Voznesensky “), („Russische Poesie“, „Nikolai Zabolotsky“), („Maschenka“, „Wladimir Nabokow“), („Doktor Schiwago“, „Boris Pasternak“), („Unsere“, „Sergej Dowlatow“) , ("Einladung zur Hinrichtung", "Vladimir Nabokov"), ("Lolita", "Vladimir Nabokov"), ("Dunkle Gassen", "Ivan Bunin"), ("Geschenk", "Vladimir Nabokov"), (" Der Sohn des Anführers "," Julia Voznesenskaya "), (" Emigrants "," Alexey Tolstoy "), (" Wehe dem Wit "," Alexander Griboyedov "), (" Anna Karenina "," Leo Tolstoy "), ( „Geschichten und Geschichten“, „Nikolai Leskov“), („Antonov Äpfel“, „Iwan Bunin“), („Tote Seelen“, „Nikolai Gogol“), („Drei Schwestern“, „Anton Tschechow“), („ Ausreißer ", "Vladimir Dal"), ("Der Idiot", "Fjodor Dostojewski"), ("Die Brüder Karamazov", "Fjodor Dostojewski"), ("Der Generalinspekteur", "Nikolai Gogol"), ("Garnet Armband", "Alexander Kuprin"); INSERT INTO eingehend (id _Lieferant, Datum_incoming) WERTE ("1", "2011-04-10"), ("2", "2011-04-11"), ("3", "2011-04-12"); INSERT INTO magazine_incoming (id_incoming, id_product, menge) WERTE ("1", "1", "10"), ("1", "2", "5"), ("1", "3", "7 "), (" 1 "," 4 "," 10 "), (" 1 "," 5 "," 10 "), (" 1 "," 6 "," 8 "), (" 1 ", „18“, „8“), („1“, „19“, „8“), („1“, „20“, „8“), („2“, „7“, „10“) , ("2", "8", "10"), ("2", "9", "6"), ("2", "10", "10"), ("2", "11 "," 10 "), (" 2 "," 21 "," 10 "), (" 2 "," 22 "," 10 "), (" 2 "," 23 "," 10 "), ( „2“, „24“, „10“), („3“, „12“, „10“), („3“, „13“, „10“), („3“, „14“, „10“), („3“, „15“, „10“), („3“, „16“, „10“), („3“, „17“, „10“); INSERT INTO Preise (id_product, date_price_changes, price) WERTE ("1", "2011-04-10", "100"), ("2", "2011-04-10", "130"), ("3 "," 10.04.2011 "," 90 "), (" 4 "," 10.04.2011 "," 100 "), (" 5 "," 10.04.2011 "," 110 ") , ("6", "2011-04-10", "85"), ("7", "2011-04-11", "95"), ("8", "2011-04-11", "100"), ("9", "2011-04-11", "79"), ("10", "2011-04-11", "49"), ("11", "2011-04 -11 "," 105 "), (" 12 "," 2011-04-12 "," 85 "), (" 13 "," 2011-04-12 "," 135 "), (" 14 ", "2011-04-12", "100"), ("15", "2011-04-12", "90"), ("16", "2011-04-12", "75"), ( "17", "2011-04-12", "90"), ("18", "2011-04-10", "150"), ("19", "2011-04-10", "140 "), (" 20 "," 2011-04-10 "," 85 "), (" 21 "," 2011-04-11 "," 105 "), (" 22 "," 2011-04-11 "," 70 "), (" 23 "," 2011-04-11 "," 65 "), (" 24 "," 2011-04-11 "," 130 "); INSERT INTO Verkauf (id_customer, date_sale) WERTE ("2", "2011-04-11"), ("3", "2011-04-11"), ("5", "2011-04-11") ; INSERT INTO magazine_sales (id_sale, id_product, Menge) WERTE ("1", "1", "1"), ("1", "5", "1"), ("1", "7", "1 "), (" 2 "," 2 "," 1 "), (" 3 "," 1 "," 1 "), (" 3 "," 7 "," 1 ");

In unserem Geschäft gibt es also 24 Artikel in drei Lieferungen von drei Lieferanten und absolut drei Verkäufe. Alles ist fertig, wir können mit dem Erlernen der eingebauten Funktionen von MySQL beginnen, was wir in der nächsten Lektion tun werden.

Die Wahl des Herausgebers
Wie versende ich E-Mails? Das Versenden von Briefen ist ein ziemlich wichtiger Bestandteil jedes Blogs, da die Betreuung Ihrer Leser ...

Ich werde meine Argumentation teilen und meine fünf Cent einfügen. Der Artikel enthält nicht viele Zahlen oder Grafiken (irgendwelche Google Trends), nur ...

Das einzige Kriterium für die Analyse der Ergebnisse Ihrer Site-Optimierung für Suchmaschinen sind TCI, PR und Platzierung in Suchmaschinen ...

Standardmäßig werden die neuesten Beiträge in WordPress auf der Startseite angezeigt, während ältere Beiträge über die ...
Möchten Sie alle Ihre WordPress-Beiträge auf einer Seite anzeigen? Kürzlich interessierte sich einer unserer Leser dafür, wie man eine Seite erstellt ...
Kryptowährung ist eine digitale Währung, die durch kryptografische Technologien geschützt ist. Diese Geldeinheiten haben kein physisches Analogon ...
Im Mai 2009, als der Scrypt-Algorithmus veröffentlicht wurde, war eine "Epidemie" des Auftauchens von Kryptowährungen schwer vorstellbar. Aber schon durch...
Beim Abrufen von Daten kann es wichtig sein, diese in einer bestimmten geordneten Form zu erhalten. Die Sortierung kann nach jedem Feld mit beliebigen ...
Senden Sie Ihre gute Arbeit in die Wissensdatenbank ist einfach. Verwenden Sie das untenstehende Formular Studenten, Doktoranden, junge Wissenschaftler, ...