Dieser Artikel fasst die erforderlichen allgemeinen Kenntnisse zu MySQL zusammen. Teilen Sie uns die Einzelheiten zu Ihrer Information mit: Als ich kürzlich SQL organisierte, fand ich eine hervorragende Notiz. Es war die Notiz, die der ursprüngliche Autor beim Erlernen von SQL gemacht hatte. Ich möchte diese Zusammenfassung mit allen teilen. Sie kann jedem dabei helfen, eine umfassende Leckerkennung und Fehlerbehebung für SQL durchzuführen. Vielen Dank an den ursprünglichen Autor hjzCy für seine Bemühungen. Der ursprüngliche Link befindet sich am Ende des Artikels. Wenn es Fehler gibt, hoffe ich, dass jeder gemeinsam darauf hinweisen kann! An- und Abmelden beim MySQL-Server# Melden Sie sich bei MySQL an $ mysql -u root -p12345612 # MySQL-Datenbankserver beenden exit; Grundlegende Syntax--Alle Datenbanken anzeigen Datenbanken anzeigen; - Erstellen Sie eine Datenbank. CREATE DATABASE-Test; -- Test der Verwendung der Switch-Datenbank; -- Alle Tabellen in der Datenbank anzeigen. Tabellen anzeigen; -- Erstellen Sie eine Datentabelle CREATE TABLE pet ( Name VARCHAR(20), Besitzer VARCHAR(20), Art VARCHAR(20), Geschlecht CHAR(1), Geburtsdatum, Todesdatum ); -- Datentabellenstruktur anzeigen -- Haustier beschreiben; Beschreibung Haustier; -- Abfragetabelle SELECT * from pet; -- Daten einfügen INSERT INTO pet VALUES ('puffball', 'Diane', 'hamster', 'f', '1990-03-30', NULL); -- Daten ändern UPDATE pet SET name = ‚squirrel‘ where owner = ‚Diane‘; -- Daten löschen DELETE FROM pet, wobei Name = ‚Eichhörnchen‘; --Tabelle löschen DROP TABLE myorder; Einschränkungen bei der TabellenerstellungPrimärschlüsseleinschränkung-- Primärschlüsseleinschränkung -- Macht ein Feld nicht wiederholt und nicht leer, wodurch die Eindeutigkeit aller Daten in der Tabelle sichergestellt wird. CREATE TABLE-Benutzer ( ID INT Primärschlüssel, Name VARCHAR(20) ); -- Gemeinsamer Primärschlüssel -- Jedes Feld im gemeinsamen Primärschlüssel darf nicht leer sein, und die Summe der Felder darf nicht mit dem festgelegten gemeinsamen Primärschlüssel übereinstimmen. CREATE TABLE-Benutzer ( Ich würde INT, Name VARCHAR(20), Passwort VARCHAR(20), PRIMÄRSCHLÜSSEL(ID, Name) ); -- Auto-Increment-Einschränkung -- Der Primärschlüssel der Auto-Increment-Einschränkung wird automatisch vom System zugewiesen. CREATE TABLE-Benutzer ( Ich würde INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(20) ); -- Primärschlüsseleinschränkung hinzufügen -- Wenn Sie vergessen, den Primärschlüssel festzulegen, können Sie ihn auch über SQL-Anweisungen festlegen (zwei Möglichkeiten): ALTER TABLE-Benutzer ADD PRIMARY KEY(id); ALTER TABLE-Benutzer MODIFY-ID INT PRIMARY KEY; - Löschen Sie den Primärschlüssel ALTER TABLE user drop PRIMARY KEY; Eindeutiger Primärschlüssel-- Erstellen Sie beim Erstellen einer Tabelle einen eindeutigen Primärschlüssel CREATE TABLE user ( Ich würde INT, Name VARCHAR(20), EINZIGARTIG(Name) ); -- Fügen Sie einen eindeutigen Primärschlüssel hinzu -- Wenn Sie beim Erstellen der Tabelle keinen eindeutigen Schlüssel festgelegt haben, können Sie ihn auch über SQL-Anweisungen festlegen (zwei Möglichkeiten): ALTER TABLE-Benutzer ADD UNIQUE(Name); ALTER TABLE Benutzer MODIFY Name VARCHAR (20) UNIQUE; - Löschen Sie den eindeutigen Primärschlüssel ALTER TABLE user DROP INDEX name; Nicht Null-Einschränkung-- Fügen Sie beim Erstellen einer Tabelle eine Nicht-Null-Einschränkung hinzu -- beschränken Sie ein Feld darauf, nicht NULL zu sein. CREATE TABLE user ( Ich würde INT, Name VARCHAR (20) NICHT NULL ); - Entfernen Sie die Nicht-Null-Einschränkung ALTER TABLE user MODIFY name VARCHAR(20); Standardeinschränkungen-- Fügen Sie beim Erstellen einer Tabelle eine Standardeinschränkung hinzu -- Beschränken Sie den Standardwert eines Felds CREATE TABLE user2 ( Ich würde INT, Name VARCHAR(20), Alter INT DEFAULT 10 ); - Entfernen Sie die Nicht-Null-Einschränkung ALTER TABLE user MODIFY age INT; Fremdschlüsseleinschränkungen-- Klasse CREATE TABLE-Klassen ( ID INT Primärschlüssel, Name VARCHAR(20) ); -- Studententabelle CREATE TABLE students ( ID INT Primärschlüssel, Name VARCHAR(20), -- Die class_id sollte hier mit dem ID-Feld in den Klassen class_id INT verknüpft werden, -- Gibt an, dass der Wert von class_id aus dem ID-Feldwert in den Klassen FOREIGN KEY(class_id) REFERENCES classes(id) stammen muss. ); - 1. Datenwerte, die nicht in der Haupttabelle (übergeordnete Tabelle) „Klassen“ enthalten sind, können nicht in der sekundären Tabelle (untergeordnete Tabelle) „Studenten“ verwendet werden. - 2. Wenn auf die Datensätze in der Primärtabelle von der Sekundärtabelle verwiesen wird, kann die Primärtabelle nicht gelöscht werden. Drei große Datenbank-Design-Paradigmen1NFSofern der Feldwert weiter zerlegt werden kann, ist die erste Normalform nicht erfüllt. Je detaillierter das Paradigmendesign ist, desto besser kann es für bestimmte praktische Vorgänge sein, es ist jedoch nicht immer von Vorteil und muss entsprechend der tatsächlichen Situation des Projekts festgelegt werden. 2NFUnter der Voraussetzung, dass das erste Paradigma erfüllt ist, müssen andere Spalten vollständig von der Primärschlüsselspalte abhängig sein. Wenn eine unvollständige Abhängigkeit vorliegt, kann dies nur bei einem zusammengesetzten Primärschlüssel passieren: -- Auftragstabelle CREATE TABLE myorder ( Produkt-ID INT, Kunden-ID INT, Produktname VARCHAR (20), Kundenname VARCHAR(20), PRIMÄRSCHLÜSSEL (Produkt-ID, Kunden-ID) ); Tatsächlich hängt in dieser Bestelltabelle Dies erfüllt nicht die zweite Normalform: Alle anderen Spalten müssen vollständig von der Primärschlüsselspalte abhängig sein! CREATE TABLE meine Bestellung ( order_id INT Primärschlüssel, Produkt-ID INT, Kunden-ID INT ); CREATE TABLE Produkt ( ID INT Primärschlüssel, Name VARCHAR(20) ); CREATE TABLE Kunde ( ID INT Primärschlüssel, Name VARCHAR(20) ); Nach der Aufteilung sind 3NFUnter der Voraussetzung, dass das zweite Paradigma erfüllt wird, sollten keine transitiven Abhängigkeiten zwischen anderen Spalten als der Primärschlüsselspalte bestehen. CREATE TABLE meine Bestellung ( order_id INT Primärschlüssel, Produkt-ID INT, Kunden-ID INT, Kundentelefon VARCHAR(15) ); CREATE TABLE meine Bestellung ( order_id INT Primärschlüssel, Produkt-ID INT, Kunden-ID INT ); CREATE TABLE Kunde ( ID INT Primärschlüssel, Name VARCHAR(20), Telefon VARCHAR(15) ); Nach der Änderung besteht keine transitive Abhängigkeit zwischen anderen Spalten. Andere Spalten hängen nur von der Primärschlüsselspalte ab, was dem Design der dritten Normalform entspricht! AbfrageübungVorbereiten der Daten- Erstellen Sie eine Datenbank CREATE DATABASE select_test; -- Datenbank wechseln USE select_test; -- Erstellen Sie eine Studententabelle CREATE TABLE student ( kein VARCHAR(20) PRIMARY KEY, Name VARCHAR(20) NOT NULL, Geschlecht VARCHAR(10) NICHT NULL, Geburtstag DATE, -- Geburtstagsklasse VARCHAR(20) -- Klasse); -- Erstellen Sie eine Lehrertabelle CREATE TABLE teacher ( kein VARCHAR(20) PRIMARY KEY, Name VARCHAR(20) NOT NULL, Geschlecht VARCHAR(10) NICHT NULL, Geburtstagsdatum, Beruf VARCHAR(20) NOT NULL, -- Berufsbezeichnung Abteilung VARCHAR(20) NOT NULL -- Abteilung); -- Erstellen Sie eine Kurstabelle CREATE TABLE course ( kein VARCHAR(20) PRIMARY KEY, Name VARCHAR(20) NOT NULL, t_no VARCHAR(20) NOT NULL, -- Lehrernummer -- gibt an, dass tno vom Wert des Felds „no“ in der Lehrertabelle stammt FOREIGN KEY(t_no) REFERENCES teacher(no) ); - Punktetabelle CREATE TABLE score ( s_no VARCHAR(20) NOT NULL, -- Matrikelnummer c_no VARCHAR(20) NOT NULL, -- Kursnummer Grad DECIMAL, -- Note -- gibt an, dass s_no und c_no aus dem Feldwert „no“ in den Tabellen „Student“ bzw. „Course“ stammen. FOREIGN KEY(s_no) REFERENCES student(no), FOREIGN KEY(c_no) REFERENZEN Kurs(nr), -- Setze s_no, c_no als gemeinsamen Primärschlüssel PRIMARY KEY (s_no, c_no) ); -- Alle Tabellen anzeigen TABELLEN ANZEIGEN; -- Daten der Studententabelle hinzufügen INSERT INTO student VALUES('101', 'Zeng Hua', 'Männlich', '1977-09-01', '95033'); INSERT INTO student VALUES('102', 'Student', 'Student', '1975-10-02', '95031'); INSERT INTO student VALUES('103', 'Student', 'Student', '1976-01-23', '95033'); INSERT INTO student VALUES('104', 'Student', 'Student', '1976-02-20', '95033'); INSERT INTO student VALUES('105', 'Student', 'Student', '10.02.1975', '95031'); INSERT INTO student VALUES('106', 'Armee', 'Männlich', '1974-06-03', '95031'); INSERT INTO student VALUES('107', 'Studentenname', 'Student', '1976-02-20', '95033'); INSERT INTO student VALUES('108', 'Studentenname', 'Name', '1975-02-10', '95031'); INSERT INTO student VALUES('109', 'Studentenwert', 'Wert', '1974-06-03', '95031'); -- Daten der Lehrertabelle hinzufügen INSERT INTO teacher VALUES('804', 'Li Cheng', 'Männlich', '1958-12-02', 'Außerordentlicher Professor', 'Abteilung für Informatik'); INSERT INTO teacher VALUES('856', 'Lehrer', 'Schreibweise', '1969-03-12', 'Lehrer', 'Lehrer-ID'); INSERT INTO teacher VALUES('825', 'Lehrer', 'Tabelle', '1972-05-05', 'Lehrer', 'Lehrertext'); INSERT INTO teacher VALUES('831', 'Liu Bing', 'Weiblich', '1977-08-14', 'Lehrassistentin', 'Abteilung für Elektrotechnik'); -- Kursdaten hinzufügen INSERT INTO course VALUES('3-105', 'Einführung in die Informatik', '825'); INSERT INTO course VALUES('3-245', 'Betriebssystem', '804'); INSERT INTO course VALUES('6-166', 'Digitale Schaltkreise', '856'); INSERT INTO course VALUES('9-888', 'Höhere Mathematik', '831'); -- Daten der Punktetabelle hinzufügen INSERT INTO score VALUES('103', '3-105', '92'); INSERT INTO score VALUES('103', '3-245', '86'); INSERT INTO score VALUES('103', '6-166', '85'); INSERT INTO score VALUES('105', '3-105', '88'); INSERT INTO score VALUES('105', '3-245', '75'); INSERT INTO score VALUES('105', '6-166', '79'); INSERT INTO score VALUES('109', '3-105', '76'); INSERT INTO score VALUES('109', '3-245', '68'); INSERT INTO score VALUES('109', '6-166', '81'); -- Zeigen Sie die Tabellenstruktur an. SELECT * FROM course; WÄHLEN SIE * AUS Punktzahl; WÄHLEN SIE * VON Student; SELECT * FROM Lehrer; 1 bis 10-- Alle Zeilen der Studententabelle abfragen SELECT * FROM student; -- Abfrage aller Zeilen der Felder „Name“, „Geschlecht“ und „Klasse“ in der Tabelle „Student“ SELECT name, sex, class FROM student; -- Abfrage der eindeutigen Abteilungsspalte in der Lehrertabelle -- Abteilung: Deduplizierungsabfrage SELECT DISTINCT Abteilung FROM Lehrer; -- Abfrage aller Zeilen in der Punktetabelle mit Punktzahlen zwischen 60 und 80 (Intervallabfrage und Operatorabfrage) -- BETWEEN xx AND xx: Abfrageintervall, AND bedeutet „und“ SELECT * FROM score WHERE Grad ZWISCHEN 60 UND 80; SELECT * FROM Punktzahl WHERE Abschluss > 60 UND Abschluss < 80; -- Abfrage der Zeilen in der Punktetabelle mit einer Punktzahl von 85, 86 oder 88 -- IN: Abfrage mehrerer Werte in der Spezifikation SELECT * FROM score WHERE degree IN (85, 86, 88); -- Abfrage aller Zeilen in der Studententabelle, deren Klasse „95031“ oder deren Geschlecht „weiblich“ ist -- oder: zeigt eine Oder-Beziehung an SELECT * FROM student WHERE class = „95031“ or sex = „weiblich“; -- Abfrage aller Zeilen der Studententabelle in absteigender Reihenfolge der Klasse -- DESC: absteigende Reihenfolge, von hoch nach niedrig -- ASC (Standard): aufsteigende Reihenfolge, von niedrig nach hoch SELECT * FROM student ORDER BY class DESC; Wählen Sie * aus dem Studenten aus. Bestellen Sie nach Klasse ASC. -- Abfrage aller Zeilen der Punktetabelle in aufsteigender Reihenfolge der c_no und absteigender Reihenfolge des Grades. SELECT * FROM score ORDER BY c_no ASC, degree DESC; -- Abfrage der Anzahl der Schüler in der Klasse "95031" -- COUNT: Statistik SELECT COUNT(*) FROM student WHERE class = '95031'; -- Abfrage der Matrikel-ID und Kurs-ID des Studenten mit der höchsten Punktzahl in der Punktetabelle (Unterabfrage oder Sortierabfrage). - (SELECT MAX(degree) FROM score): Unterabfrage zum Berechnen der höchsten Punktzahl SELECT s_no, c_no FROM score WHERE degree = (SELECT MAX(degree) FROM score); - Sortierabfrage - LIMIT r, n: bedeutet, beginnend bei der r-ten Zeile, n Daten abzufragen SELECT s_no, c_no, degree FROM score ORDER BY degree DESC LIMIT 0, 1; Berechnen Sie die durchschnittlichen Punktzahlen nach GruppenAbfrage der Durchschnittsnote der einzelnen Kurse. - AVG: Durchschnittswert SELECT AVG(Grad) FROM Punktzahl WHERE c_no = '3-105'; Wählen Sie AVG (Grad) aus Punktzahl, wobei c_no = '3-245' ist. Wählen Sie AVG (Grad) aus Punktzahl, wobei c_no = '6-166' ist. -- GROUP BY: Gruppenabfrage SELECT c_no, AVG(degree) FROM score GROUP BY c_no; Gruppierungsbedingungen und Fuzzy-Abfragen Abfrage der Durchschnittsnoten von Kursen aus der WÄHLEN SIE * AUS Punktzahl; -- c_no Kursnummer +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-105 | 92 | | 103 | 3-245 | 86 | | 103 | 6-166 | 85 | | 105 | 3-105 | 88 | | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ Aus der Analysetabelle geht hervor, dass mindestens 2 Studierende die Lehrveranstaltungen -- Fragen Sie zuerst c_no, AVG(degree) ab, indem Sie SELECT c_no, AVG(degree) FROM score GROUP BY c_no gruppieren. +----------+----------+ | c_nr. | AVG(Grad) | +----------+----------+ | 3-105 | 85,3333 | | 3-245 | 76,3333 | | 6-166 | 81,6667 | +----------+----------+ -- Abfrage der Kurse, die von mindestens 2 Studenten belegt werden -- HAVING: gibt an, dass HAVING COUNT(c_no) >= 2 -- und der Kurs beginnt mit 3 -- LIKE zeigt eine Fuzzy-Abfrage an, „%“ ist ein Platzhalter, der mit jedem Zeichen nach „3“ übereinstimmt. UND c_no WIE ,3 %‘; -- Verketten Sie die vorherigen SQL-Anweisungen miteinander. -- Durch die Angabe eines COUNT(*) am Ende wird zusätzlich die Nummer der jeweiligen Gruppe abgefragt. WÄHLEN Sie c_no, AVG(Grad), COUNT(*) FROM Punktzahl GROUP BY c_no MIT ANZAHL(c_no) >= 2 UND c_no WIE '3%'; +-------+-------------+----------+ | c_no | AVG(Grad) | ANZAHL(*) | +-------+-------------+----------+ | 3-105 | 85,3333 | 3 | | 3-245 | 76,3333 | 3 | +-------+-------------+----------+ Abfrage mehrerer Tabellen - 1 Fragen Sie SELECT Nr., Name VON Student; +-----+-----------+ | kein | Name | +-----+-----------+ | 101 | Zeng Hua | | 102 | Kuang Ming | | 103 | Wang Li| | 104 | Li Jun | | 105 | Wang Fang| | 106 | Armee | | 107 | Wang Nima | | 108 | Zhang Quandan | | 109 | Zhao Tiezhu| +-----+-----------+ Wählen Sie s_no, c_no, Abschluss aus Punktzahl; +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-105 | 92 | | 103 | 3-245 | 86 | | 103 | 6-166 | 85 | | 105 | 3-105 | 88 | | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ Durch Analyse können wir feststellen, dass wir nur den Feldwert – FROM …: gibt eine Abfrage aus den Studenten- und Punktetabellen an. – Die WHERE-Bedingung gibt an, dass das Ergebnis nur angezeigt wird, wenn student.no und score.s_no gleich sind. SELECT Name, C_Nr., Abschluss FROM Student, Punktzahl WO student.no = score.s_no; +--------------+-------+--------+ | Name | C_Nr | Abschluss | +--------------+-------+--------+ | Wang Li | 3-105 | 92 | | Wang Li | 3-245 | 86 | | Wang Li | 6-166 | 85 | | Wang Fang | 3-105 | 88 | | Wang Fang | 3-245 | 75 | | Wang Fang | 6-166 | 79 | | Zhao Tiezhu | 3-105 | 76 | | Zhao Tiezhu | 3-245 | 68 | | Zhao Tiezhu | 6-166 | 81 | +--------------+-------+--------+ Abfrage mehrerer Tabellen - 2 Abfrage der Spalten Mit der Wählen Sie s_no, c_no, Abschluss aus Punktzahl; +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-105 | 92 | | 103 | 3-245 | 86 | | 103 | 6-166 | 85 | | 105 | 3-105 | 88 | | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ Anschließend +----------+-----------------+ | kein | Name | +----------+-----------------+ | 3-105 | Einführung in Computer | | 3-245 | Betriebssysteme | | 6-166 | Digitale Schaltungen | | 9-888 | Höhere Mathematik | +----------+-----------------+ Ersetzen Sie einfach - Fügen Sie einen Abfragefeldnamen hinzu, um die Punkte- bzw. Kurstabellen abzufragen. --as bedeutet, einen Alias für das Feld zu verwenden. SELECT s_no, Name als c_name, Abschluss FROM Punktzahl, Kurs WO score.c_no = kurs.no; +------+-----------------+--------+ | s_nr | c_name | Grad | +------+-----------------+--------+ | 103 | Einführung in Computer | 92 | | 105 | Einführung in Computer | 88 | | 109 | Einführung in Computer | 76 | | 103 | Betriebssysteme | 86 | | 105 | Betriebssysteme | 75 | | 109 | Betriebssysteme | 68 | | 103 | Digitale Schaltungen | 85 | | 105 | Digitale Schaltungen | 79 | | 109 | Digitale Schaltungen | 81 | +------+-----------------+--------+ Abfrage der Drei-Tabellen-Assoziation Abfrage Da nur die Studierenden-ID und die Klassen-ID mit WÄHLEN SIE * AUS Punktzahl; +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-105 | 92 | | 103 | 3-245 | 86 | | 103 | 6-166 | 85 | | 105 | 3-105 | 88 | | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ Ersetzen Sie einfach Ersetzen Sie zuerst SELECT Name, C_Nr., Abschluss FROM Student, Punktzahl WHERE Student.Nr. = Punktzahl.S_Nr.; +--------------+-------+--------+ | Name | C_Nr | Abschluss | +--------------+-------+--------+ | Wang Li | 3-105 | 92 | | Wang Li | 3-245 | 86 | | Wang Li | 6-166 | 85 | | Wang Fang | 3-105 | 88 | | Wang Fang | 3-245 | 75 | | Wang Fang | 6-166 | 79 | | Zhao Tiezhu | 3-105 | 76 | | Zhao Tiezhu | 3-245 | 68 | | Zhao Tiezhu | 6-166 | 81 | +--------------+-------+--------+ Ersetzen Sie dann - Kurstabelle SELECT Nr., Name FROM Kurs; +----------+-----------------+ | kein | Name | +----------+-----------------+ | 3-105 | Einführung in Computer | | 3-245 | Betriebssysteme | | 6-166 | Digitale Schaltungen | | 9-888 | Höhere Mathematik | +----------+-----------------+ -- Da die Feldnamen wiederholt werden, verwenden Sie stattdessen „Tabellenname.Feldname als Alias“. Wählen Sie student.name als s_name, course.name als c_name, degree VON Student, Punktzahl, Kurs WO student.NO = score.s_no UND score.c_no = kurs.no; Unterabfrage plus Gruppierung zur Ermittlung der Durchschnittspunktzahl Fragen Sie die Durchschnittsnote jedes Kurses für Studierende der Klasse Filtern Sie in -- IN (..): Benutze die ausgewählte Matrikelnummer als Bedingung für s_no SELECT s_no, c_no, degree FROM score WO s_no IN (SELECT no FROM student WHERE class = '95031'); +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 105 | 3-105 | 88 | | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ Zu diesem Zeitpunkt müssen wir nur Wählen Sie c_no, AVG (Grad) aus Punktzahl WHERE s_no IN (SELECT no FROM student WHERE class = '95031') GRUPPE NACH c_Nr; +----------+----------+ | c_nr. | AVG(Grad) | +----------+----------+ | 3-105 | 82,0000 | | 3-245 | 71,5000 | | 6-166 | +----------+----------+ Unterabfrage - 1 Abfrage aller Datensätze von Studenten, deren Punktzahl höher ist als die von Student Nr. Filtern Sie zunächst die Klassennummern SELECT * FROM Punktzahl WO c_no = '3-105' UND Abschluss > (WÄHLEN Sie Abschluss AUS Punktzahl, wobei s_no = ,109‘ und c_no = ,3-105‘); Unterabfrage - 2 Abfrage der Notentabellen aller Kurse -- Es gibt keine Beschränkung hinsichtlich der Kursnummer, solange die Punktzahl höher ist als die des Studenten Nr. 109 in den Kursen 3-105. SELECT * FROM Punktzahl WO Abschluss > (WÄHLEN Sie Abschluss AUS Punktzahl, WO s_no = ‚109‘ UND c_no = ‚3-105‘); YEAR-Funktion und Abfrage mit IN-Schlüsselwort Fragen Sie alle Spalten -- YEAR(..): Extrahiert das Jahr aus dem Datum. SELECT Nr., Name, Geburtstag FROM Student WHERE YEAR(Geburtstag) IN (SELECT YEAR(Geburtstag) FROM student WHERE no IN (101, 108)); Mehrstufig verschachtelte Unterabfragen Fragen Sie die Schülerbewertungstabelle des Lehrers Suchen Sie zuerst die Lehrernummer: SELECT NO FROM Lehrer WHERE NAME = 'Lehrer' Die Kursnummer des Dozenten finden Sie in Wählen Sie NEIN aus dem Kurs, wobei t_nr. = (Wählen Sie NEIN aus dem Lehrer, wobei NAME = 'Kurs' ist); Abfrage der Punktetabelle durch Auswahl der Lehrveranstaltungsnummer: Wählen Sie * aus Punktzahl, wobei c_no = ( SELECT nein FROM Kurs WHERE t_no = ( SELECT no FROM teacher WHERE NAME = 'Lehrer' ) ); Abfrage mehrerer TabellenSuchen Sie die Namen von Lehrern, bei denen mehr als 5 Schüler einen Wahlkurs belegen. Ermitteln Sie zunächst in der -- Abfrage der Lehrertabelle SELECT Nr., Name FROM Lehrer; +-----+--------+ | kein | Name | +-----+--------+ | 804 | Li Cheng| | 825 | Wang Ping| | 831 | Liu Bing| | 856 | Zhang Xu| +-----+--------+ SELECT Name FROM Lehrer WHERE nein IN ( -- die entsprechende Bedingung finden Sie hier); Sehen Sie sich die Informationen der Tabelle bezüglich der Lehrernummer an: SELECT * FROM Kurs; -- t_no: Lehrernummer+-------+-----------------+------+ | nein | Name | t_nr | +-------+-----------------+------+ | 3-105 | Einführung in Computer | 825 | | 3-245 | Betriebssysteme | 804 | | 6-166 | Digitale Schaltungen | 856 | | 9-888 | Höhere Mathematik | 831 | +-------+-----------------+------+ Wir haben festgestellt, dass sich das Feld mit der Lehrernummer in der -- Fügen Sie vorher einige Daten in die Partitur ein, um die Abfragebedingungen zu verbessern. INSERT INTO score VALUES ('101', '3-105', '90'); INSERT INTO score VALUES ('102', '3-105', '91'); INSERT INTO score VALUES ('104', '3-105', '89'); -- Abfrage der Punktetabelle SELECT * FROM score; +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 101 | 3-105 | 90 | | 102 | 3-105 | 91 | | 103 | 3-105 | 92 | | 103 | 3-245 | 86 | | 103 | 6-166 | 85 | | 104 | 3-105 | 89 | | 105 | 3-105 | 88 | | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ - Verwenden Sie c_no als Gruppe in der Punktetabelle und beschränken Sie c_no auf mindestens 5 Datenelemente. Wählen Sie c_no aus Punktzahl GROUP BY c_no HAVING COUNT(*) > 5; +----------+ | c_nr | +----------+ | 3-105 | +----------+ Finden Sie anhand der gefilterten Kursnummern die Lehrernummern mit mindestens 5 Schülern in einem Kurs: SELECT t_no FROM Kurs WHERE nein IN ( SELECT c_no FROM Punktzahl GROUP BY c_no HAVING COUNT(*) > 5 ); +------+ | t_nein | +------+ | 825 | +------+ Suchen Sie in der SELECT Name FROM Lehrer WHERE nein IN ( -- Endbedingung SELECT t_no FROM course WHERE no IN ( SELECT c_no FROM Punktzahl GROUP BY c_no HAVING COUNT(*) > 5 ) ); Unterabfrage - 3Überprüfen Sie das Transkript der Kurse der „Abteilung Informatik“. Die Idee besteht darin, zunächst die Nummern aller -- Abfrage aller Lehrernummern des Fachbereichs Informatik über die Lehrertabelle SELECT Nr., Name, Fachbereich FROM Lehrer WHERE Fachbereich = 'Fachbereich Informatik' +-----+--------+--------------+ | Nr. | Name | Abteilung | +-----+--------+--------------+ | 804 | Li Cheng | Institut für Informatik | | 825 | Wang Ping | Institut für Informatik | +-----+--------+--------------+ -- Abfrage der Kursnummer des Lehrers über die Kurstabelle SELECT no FROM course WHERE t_no IN ( SELECT no FROM teacher WHERE department = 'Abteilung für Informatik' ); +----------+ | nein | +----------+ | 3-245 | | 3-105 | +----------+ -- Abfrage der Punktetabelle basierend auf der gefilterten Kursnummer SELECT * FROM score WHERE c_no IN ( SELECT nein FROM Kurs WHERE t_no IN ( SELECT no FROM teacher WHERE department = 'Abteilung für Informatik' ) ); +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-245 | 86 | | 105 | 3-245 | 75 | | 109 | 3-245 | 68 | | 101 | 3-105 | 90 | | 102 | 3-105 | 91 | | 103 | 3-105 | 92 | | 104 | 3-105 | 89 | | 105 | 3-105 | 88 | | 109 | 3-105 | 76 | +------+-------+--------+ Verwendung von UNION und NOTIN Abfrage von Lehrenden mit unterschiedlichen Berufsbezeichnungen im -- NOT: stellt eine logische Negation dar SELECT * FROM teacher WHERE department = 'Informatik' AND profession NOT IN ( SELECT Beruf FROM Lehrer WHERE Abteilung = 'Abteilung für Elektrotechnik' ) -- Kombinieren Sie zwei Sätze UNION SELECT * FROM Lehrer WHERE Abteilung = 'Abteilung für Elektrotechnik' AND Beruf NOT IN ( SELECT Beruf FROM Lehrer WHERE Abteilung = 'Abteilung für Informatik' ); ANY bedeutet mindestens eins - DESC (absteigende Reihenfolge) Abfrage der Wählen Sie * aus Punktzahl, wobei c_no = '3-105' ist. +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 101 | 3-105 | 90 | | 102 | 3-105 | 91 | | 103 | 3-105 | 92 | | 104 | 3-105 | 89 | | 105 | 3-105 | 88 | | 109 | 3-105 | 76 | +------+-------+--------+ Wählen Sie * aus Punktzahl, wobei c_no = '3-245' ist. +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-245 | 86 | | 105 | 3-245 | 75 | | 109 | 3-245 | 68 | +------+-------+--------+ -- ANY: Erfüllt jede Bedingung in der SQL-Anweisung. – Das heißt, solange es unter den Punktzahlen von 3–105 eine gibt, die höher ist als jede beliebige ausgewählte Zeile zwischen 3–245, erfüllt diese die Bedingung. --Fragen Sie abschließend die Ergebnisse in absteigender Reihenfolge ab. SELECT * FROM Punktzahl WHERE c_no = '3-105' AND Grad > BELIEBIG( Wählen Sie Abschluss aus Punktzahl, wobei c_no = '3-245' ist. ) ORDER BY Grad DESC; +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-105 | 92 | | 102 | 3-105 | 91 | | 101 | 3-105 | 90 | | 104 | 3-105 | 89 | | 105 | 3-105 | 88 | | 109 | 3-105 | 76 | +------+-------+--------+ ALLE Abfrage der – Nur eine kleine Änderung gegenüber der vorherigen Frage. -- ALL: Erfüllt alle Bedingungen in der SQL-Anweisung. -- Das heißt, die Punktzahl in jeder Zeile von 3-105 muss höher sein als alle herausgefilterten Zeilen von 3-245, um die Bedingungen zu erfüllen. Wählen Sie * aus Punktzahl, wobei c_Nr. = '3-105' und Grad > ALLE ( Wählen Sie Abschluss aus Punktzahl, wobei c_no = '3-245' ist. ); +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 101 | 3-105 | 90 | | 102 | 3-105 | 91 | | 103 | 3-105 | 92 | | 104 | 3-105 | 89 | | 105 | 3-105 | 88 | +------+-------+--------+ Kopieren der Tabellendaten als bedingte Abfrage Fragen Sie die Punktetabelle für einen Kurs ab, dessen Punktzahl niedriger ist als die durchschnittliche -- Abfrage der durchschnittlichen Punktzahl SELECT c_no, AVG(degree) FROM score GROUP BY c_no; +----------+----------+ | c_nr. | AVG(Grad) | +----------+----------+ | 3-105 | 87,6667 | | 3-245 | 76,3333 | | 6-166 | 81,6667 | +----------+----------+ - Abfrage der Punktetabelle SELECT degree FROM score; +--------+ | Grad | +--------+ | 90 | | 91 | | 92 | | 86 | | 85 | | 89 | | 88 | | 75 | | 79 | | 76 | | 68 | | 81 | +--------+ -- Tabelle b auf Tabelle a anwenden, um Daten abzufragen -- Punktzahl a (b): die Tabelle als a (b) deklarieren, – Auf diese Weise können Sie a.c_no = b.c_no als Bedingung zum Ausführen der Abfrage verwenden. SELECT * FROM Punktzahl a WHERE Abschluss < ( (Wählen Sie AVG (Grad) aus Punktzahl b, wobei a.c_no = b.c_no) ); +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 105 | 3-245 | 75 | | 105 | 6-166 | 79 | | 109 | 3-105 | 76 | | 109 | 3-245 | 68 | | 109 | 6-166 | 81 | +------+-------+--------+ Unterabfrage - 4 Abfrage SELECT Name, Abteilung FROM Lehrer WHERE Nr. IN (SELECT t_no FROM Kurs); +--------+-----------------+ | Name | Abteilung | +--------+-----------------+ | Li Cheng | Fakultät für Informatik | | Wang Ping | Fakultät für Informatik | | Liu Bing| Fakultät für Elektrotechnik| | Zhang Xu | Fakultät für Elektrotechnik | +--------+-----------------+ Bedingte Gruppenfilterung Fragen Sie die -- Informationen zur Studententabelle anzeigen SELECT * FROM student; +-----+-----------+-----+------------+-----------+ | Nr. | Name | Geschlecht | Geburtstag | Klasse | +-----+-----------+-----+------------+-----------+ | 101 | Zeng Hua | Männlich | 01.09.1977 | 95033 | | 102 | Kuang Ming | Männlich | 02.10.1975 | 95031 | | 103 | Wang Li | Weiblich | 23.01.1976 | 95033 | | 104 | Li Jun | Männlich | 20.02.1976 | 95033 | | 105 | Wang Fang | Weiblich | 10.02.1975 | 95031 | | 106 | Armee | Männlich | 03.06.1974 | 95031 | | 107 | Wang Nima | Männlich | 20.02.1976 | 95033 | | 108 | Zhang Quandan | Männlich | 10.02.1975 | 95031 | | 109 | Zhao Tiezhu | Männlich | 03.06.1974 | 95031 | | 110 | Zhang Fei | Männlich | 03.06.1974 | 95038 | +-----+-----------+-----+------------+-----------+ -- Fragen Sie nur das Geschlecht „männlich“ ab, gruppieren Sie dann nach Klasse und begrenzen Sie die Klassenzeilen auf größer als 1. SELECT Klasse FROM Schüler WHERE Geschlecht = 'Klasse' GROUP BY Klasse HAVING COUNT(*) > 1; +----------+ | Klasse | +----------+ |95033| |95031| +----------+ NOTLIKE Fuzzy-Abfrage-Negation Abfrage der -- NICHT: Negation -- WIE: Fuzzy-Abfrage mysql> SELECT * FROM student WHERE name NOT LIKE '王%'; +-----+-----------+-----+------------+-----------+ | Nr. | Name | Geschlecht | Geburtstag | Klasse | +-----+-----------+-----+------------+-----------+ | 101 | Zeng Hua | Männlich | 01.09.1977 | 95033 | | 102 | Kuang Ming | Männlich | 02.10.1975 | 95031 | | 104 | Li Jun | Männlich | 20.02.1976 | 95033 | | 106 | Armee | Männlich | 03.06.1974 | 95031 | | 108 | Zhang Quandan | Männlich | 10.02.1975 | 95031 | | 109 | Zhao Tiezhu | Männlich | 03.06.1974 | 95031 | | 110 | Zhang Fei | Männlich | 03.06.1974 | 95038 | +-----+-----------+-----+------------+-----------+ YEAR- und NOW-Funktionen Fragen Sie den Namen und das Alter jedes Schülers in der -- Verwenden Sie die Funktion YEAR(NOW()), um das aktuelle Jahr zu berechnen und das Geburtsjahr abzuziehen, um das Alter zu ermitteln. SELECT Name, YEAR(NOW()) - YEAR(Geburtstag) als Alter FROM Student; +--------------+------+ | Name | Alter | +--------------+------+ | Zeng Hua | 42 | | Kuang Ming | 44 | | Wang Li| 43 | | Li Juni | 43 | | Wang Fang | 44 | | Armee | 45 | | Wang Nima | 43 | | Zhang Quandan | 44 | | Zhao Tiezhu | 45 | | Zhang Fei | 45 | +--------------+------+ MAX- und MIN-Funktionen Abfrage der maximalen und minimalen SELECT MAX(Geburtstag), MIN(Geburtstag) FROM Student; +---------------+---------------+ | MAX(Geburtstag) | MIN(Geburtstag) | +---------------+---------------+ | 01.09.1977 | 03.06.1974 | +---------------+---------------+ Sortierung mehrerer Segmente Abfrage der SELECT * FROM student ORDER BY class DESC, Geburtstag; +-----+-----------+-----+------------+-----------+ | Nr. | Name | Geschlecht | Geburtstag | Klasse | +-----+-----------+-----+------------+-----------+ | 110 | Zhang Fei | Männlich | 03.06.1974 | 95038 | | 103 | Wang Li | Weiblich | 23.01.1976 | 95033 | | 104 | Li Jun | Männlich | 20.02.1976 | 95033 | | 107 | Wang Nima | Männlich | 20.02.1976 | 95033 | | 101 | Zeng Hua | Männlich | 01.09.1977 | 95033 | | 106 | Armee | Männlich | 03.06.1974 | 95031 | | 109 | Zhao Tiezhu | Männlich | 03.06.1974 | 95031 | | 105 | Wang Fang | Weiblich | 10.02.1975 | 95031 | | 108 | Zhang Quandan | Männlich | 10.02.1975 | 95031 | | 102 | Kuang Ming | Männlich | 02.10.1975 | 95031 | +-----+-----------+-----+------------+-----------+ Unterabfrage - 5Fragen Sie nach „männlichen“ Lehrern und den Kursen, die sie unterrichten. Wählen Sie * aus dem Kurs, wobei t_nr. in (Wählen Sie keine aus dem Lehrer, wobei Geschlecht = '男'); +----------+--------------+------+ | nein | Name | t_nr | +----------+--------------+------+ | 3-245 | Betriebssysteme | 804 | | 6-166 | Digitale Schaltungen | 856 | +----------+--------------+------+ MAX-Funktion mit Unterabfragen Fragen Sie die -- Finde die höchste Punktzahl (diese Abfrage kann nur ein Ergebnis haben) Wählen Sie MAX(Grad) aus Punktzahl; -- Filtern Sie alle Tabellen mit der höchsten Punktzahl gemäß den oben genannten Bedingungen heraus. – Diese Abfrage kann mehrere Ergebnisse haben, vorausgesetzt, der Gradwert erfüllt die Bedingung mehrmals. Wählen Sie * aus Punktzahl, wobei Grad = (Wählen Sie MAX (Grad) aus Punktzahl); +------+-------+--------+ | S_Nr. | C_Nr. | Grad | +------+-------+--------+ | 103 | 3-105 | 92 | +------+-------+--------+ Unterabfrage - 6 Abfrage -- Nehmen Sie zunächst Li Juns Geschlecht als Bedingung: SELECT sex FROM student WHERE name = 'Li Jun'; +-----+ | Geschlecht | +-----+ | Männlich | +-----+ - Abfrage von Namen und Geschlecht basierend auf dem Gender Name wählen, Sex vom Schüler wobei Sex = ( Wählen Sie Sex vom Schüler, wobei Name = '李军' ); +-----------+-----+ | +-----------+-----+ | Zeng Hua | | | | | | | | +-----------+-----+ Unterabfrage - 7 Fragen Sie Wählen Sie Name, Sex, Klasse vom Schüler, wobei Sex = (( Wählen Sie Sex vom Schüler, wobei Name = '李军' ) Und Klasse = (( Wählen Sie die Klasse aus dem Schüler, wobei Name = '李军' ); +-----------+------+-------+ | +-----------+------+-------+ | | Li jun | | +-----------+------+-------+ Unterabfrage - 8Fragen Sie das Protokoll aller männlichen Studenten, die den Kurs "Einführung in die Informatik" belegt haben, ab. Die erforderliche "Einführung in die Informatik" und das Geschlecht "männlich" finden Sie in Wählen Sie * aus der Punktzahl, wobei c_no = (( Wählen Sie Nein aus dem Kurs, wobei Name = 'Einführung in die Informatik' ) Und s_no in ( Wählen Sie nein vom Schüler, wobei Sex = '男' ); +------+-------+--------+ | +------+-------+--------+ | | | | 109 | 3-105 | 76 | +------+-------+--------+ Suche nach Ebene Erstellen Sie eine Tischnote erstellen ( niedrige int (3), UPP INT (3), Grade Char (1) ); In die Gradewerte einfügen (90, 100, 'a'); In die Notenwerte einfügen (80, 89, 'B'); In die Gradewerte einfügen (70, 79, 'c'); In die Klassenwerte einfügen (60, 69, 'D'); In die Klassenwerte einfügen (0, 59, 'e'); Aus der Klasse auswählen; +------+------+-------+ | +------+------+-------+ | | | | | +------+------+-------+ Fragen Sie Die Idee ist, eine Intervallabfrage ( Wählen Sie S_NO, C_NO, Note aus der Punktzahl, Note Wo Grad zwischen niedrig und upp; +------+-------+---------+ | +------+-------+---------+ | | | | | | | | | | | | +------+-------+---------+ VerbindungsabfrageBereiten Sie Daten für Testen von Verbindungsabfragen vor: Datenbank testjoin erstellen; Tischperson erstellen ( Ich würde INT, Name VARCHAR(20), Cardid int ); Tischkarte erstellen ( Ich würde INT, Name VARCHAR(20) ); Einfügen in Kartenwerte (1, 'Reiskarte'), (2, 'Construction Bank Card'), (3, 'Agricultural Bank Card'), (4, „Industrie- und Gewerbekarte“), (5, "Postkarte"); Aus der Karte auswählen; +------+----------+ | Ich würde | Name | +------+----------+ | 1 | Essenskarte| | 2 | CCB-Karte| | 3 | Landwirtschaftliche Bankkarte| | 4 | Visitenkarte| | 5 | Postkarte | +------+----------+ Einfügen in Personalte (1, '张三', 1), (2, '李四', 3), (3, '王五', 6); Wählen Sie * aus der Person; +------+--------+--------+ | ID | Name | Karten-ID | +------+--------+--------+ | 1 | Zhang San | 1 | | 2 | Li Si | 3 | | 3 | Wang Wu | 6 | +------+--------+--------+ Nachdem wir die beiden Tabellen analysiert hatten, stellten wir fest, dass Innerer Join Um Daten in diesen beiden Tabellen abzufragen, können Sie - Inner-Join: Zeigt einen inneren Join an, der zwei Tabellen miteinander verbindet. - ON: Zeigt an, dass eine bestimmte Bedingung ausgeführt werden soll. Wählen Sie * von Person Inner Join Card auf Person.cardid = card.id; +------+--------+--------+------+-----------+ | ID | Name | Karten-ID | ID | Name | +------+--------+--------+------+-----------+ | 1 | Zhang San| 1 | 1 | Essenskarte| | 2 | Li Si | 3 | 3 | Landwirtschaftliche Bankkarte | +------+--------+--------+------+-----------+ - Das Ablassen des inneren Schlüsselworts erzeugt das gleiche Ergebnis. - Wählen Sie * aus der Person Join Card auf Person.cardid = card.id; Hinweis: Die gesamte Linker äußerer Join Die linke Tabelle ( - Links-Join wird auch als linke äußere Join bezeichnet. Wählen Sie * von Person Links -Join -Karte auf Person.cardid = card.id; +------+--------+--------+------+-----------+ | ID | Name | Karten-ID | ID | Name | +------+--------+--------+------+-----------+ | 1 | Zhang San| 1 | 1 | Essenskarte| | 2 | Li Si | 3 | 3 | Landwirtschaftliche Bankkarte | | 3 | Wang Wu | 6 | NULL | NULL | +------+--------+--------+------+-----------+ Rechts äußerer Link Wählen Sie * von Person Right Join Card auf Person.cardid = card.id; +------+--------+--------+------+-----------+ | ID | Name | Karten-ID | ID | Name | +------+--------+--------+------+-----------+ | 1 | Zhang San| 1 | 1 | Essenskarte| | 2 | Li Si | 3 | 3 | Landwirtschaftliche Bankkarte | | NULL | NULL | NULL | 2 | CCB-Karte | | NULL | NULL | NULL | 4 | Visitenkarte | | NULL | NULL | NULL | 5 | Postkarte | +------+--------+--------+------+-----------+ Vollständige externe LinksZeigen Sie alle Daten in den beiden Tabellen vollständig an. - MySQL unterstützt keine vollständige Außenverbindung mit dieser Syntax- SELECT * von Person Full Join Card auf Person.cardid = card.id; - Es ist ein Fehler aufgetreten: - Fehler 1054 (42S22): Unbekannte Spalte 'Person.Cardid' in 'On-Klausel' - MySQL Full Join Syntax, wobei Union zwei Tabellen zusammenführt. Wählen Sie * aus der Person links Join Card auf Person.cardid = card.id UNION Wählen Sie * von Person Right Join Card auf Person.cardid = card.id; +------+--------+--------+------+-----------+ | ID | Name | Karten-ID | ID | Name | +------+--------+--------+------+-----------+ | 1 | Zhang San| 1 | 1 | Essenskarte| | 2 | Li Si | 3 | 3 | Landwirtschaftliche Bankkarte | | 3 | Wang Wu | 6 | NULL | NULL | | NULL | NULL | NULL | 2 | CCB-Karte | | NULL | NULL | NULL | 4 | Visitenkarte | | NULL | NULL | NULL | 5 | Postkarte | +------+--------+--------+------+-----------+ TransaktionenIn MySQL ist eine Transaktion tatsächlich die kleinste unteilbare Arbeitseinheit. Transaktionen können die Integrität eines Unternehmens sicherstellen . Zum Beispiel unsere Bankübertragung: -a -> -100 UPDATE User Set Money = Money - 100 wobei Name = 'a'; -B -> +100 UPDATE User Set Money = Money + 100 wobei Name = 'B'; Wenn in einem tatsächlichen Projekt nur eine SQL -Anweisung erfolgreich ausgeführt wird und die andere fehlschlägt, treten inkonsistente Daten auf. Bei der Ausführung mehrerer verwandter SQL -Anweisungen muss daher eine Transaktion erforderlich sein, dass diese SQL -Anweisungen entweder gleichzeitig erfolgreich ausgeführt werden oder alle fehlschlagen. So kontrollieren Sie Transaktionen - Commit / RollbackIn MySQL ist der automatische Transaktionszustand standardmäßig aktiviert. - Abfragen Sie den automatischen Commit-Status der Transaktion aus @@ autocommit; +--------------+ | +--------------+ | 1 | +--------------+ Die Rolle der automatischen Einreichung : Wenn wir eine SQL -Anweisung ausführen, wird ihr Effekt sofort reflektiert und kann nicht zurückgerollt werden . Was ist Rollback? Zum Beispiel: Datenbankbank erstellen; Bank verwenden; CREATE TABLE-Benutzer ( ID INT Primärschlüssel, Name VARCHAR(20), Geld int ); In Benutzerwerte einfügen (1, 'a', 1000); Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | +----+------+-------+ Wie Sie sehen können, wirkt sich die Daten unmittelbar nach der Ausführung der Einfügeanweisung in Kraft, da die Transaktion in MySQL sie automatisch in die Datenbank anpasst . Der sogenannte Rollback bedeutet, alle SQL-Anweisungen, die ausgeführt wurden, rückgängig zu machen und sie zurück in den Zustand zu rollen, als die Daten zuletzt übermittelt wurden . Verwenden Sie - Rollen Sie zurück zum letzten Leitfadenrollback; Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | +----+------+-------+ Da alle ausgeführten SQL -Anweisungen eingereicht wurden, wurden die Daten nicht zurückgerollt. Wie können die Daten zurückgerollt werden? -- Automatisches Commit deaktivieren SET AUTOCOMMIT = 0; - Abfragen Sie den automatischen Commit-Status aus @@ AutoCommit; +--------------+ | +--------------+ | 0 | +--------------+ Nach dem Ausschalten des AutoCommit werden die Testdaten zurückgerollt: In Benutzerwerte einfügen (2, 'B', 1000); - Nach dem Ausschalten des Autokommitas werden Datenänderungen in einer virtuellen temporären Datentabelle angezeigt. - Die geänderten Daten werden nicht tatsächlich in die Datentabelle eingefügt. Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | | 2 | b | 1000 | +----+------+-------+ - Die tatsächlichen Daten in der Datentabelle sind tatsächlich: +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | +----+------+-------+ - Da die Daten nicht tatsächlich begangen wurden, können Sie Rollback verwenden. - Wählen Sie erneut * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | +----+------+-------+ Wie können Sie die virtuellen Daten tatsächlich an die Datenbank senden? Verwenden von In Benutzerwerte einfügen (2, 'B', 1000); - Manuell Daten (Persistenz), manuell einreichen, - Senden Sie die Daten in die Datenbank. BEGEHEN; - Rollback-Rollback nach dem Verhalten; - erneut abfragen (Rollback ist ungültig) Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | | 2 | b | 1000 | +----+------+-------+
Für die praktische Anwendung von Transaktionen kehren wir zum Bankübertragungsprojekt zurück: - Überweisen von UNTEREMENDEN UNSERE SETELE MONEY = Geld - 100 wobei name = 'a'; - UPPATE User Set Money = Money + 100 wobei Name = 'B'; Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | | +----+------+-------+ Wenn während der Übertragung ein Unfall auftritt, können Sie -Während des Transfers geschieht etwas Unerwartetes und muss zurückgerollt werden. ROLLBACK; Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | | 2 | b | 1000 | +----+------+-------+ Zu diesem Zeitpunkt sind wir vor dem Unfall zurück im Staat, dh die Transaktion bietet uns die Möglichkeit, es zu bereuen. Unter der Annahme, dass nichts Unerwartetes mit den Daten passiert, können Sie die Daten manuell an die Tabelle verpflichten: Starten Sie manuell eine Transaktion - Beginnen- / Starttransaktion Nachdem der Standardausschuss der Transaktion eingeschaltet wurde ( - Verwenden Sie Beginn oder Start-Transaktion, um eine Transaktion manuell zu starten- Starttransaktion; BEGINNEN; UPDATE User Set Money = Money - 100 wobei Name = 'a'; UPDATE User Set Money = Money + 100 wobei Name = 'B'; -Da die manuell geöffnete Transaktion nicht automatisch eingeschaltet ist, hat sich nicht eingeschaltet, - Die zu diesem Zeitpunkt geänderten Daten werden in einer temporären Tabelle weiterhin gespeichert. Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | | +----+------+-------+ - Rollback Rollback; Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | 1 | ein | 1000 | | 2 | b | 1000 | +----+------+-------+ BEGINNEN; UPDATE User Set Money = Money - 100 wobei Name = 'a'; UPDATE User Set Money = Money + 100 wobei Name = 'B'; Wählen Sie * vom Benutzer aus; +----+------+-------+ | ID | Name | Geld | +----+------+-------+ | | +----+------+-------+ -Submit-Datenbeschaffung; - Testen Sie Rollback (ungültig, weil die Tabellendaten begangen wurden) ROLLBACK; Säureeigenschaften und Verwendung von TransaktionenVier Merkmale von Transaktionen:
TransaktionsisolierungDie Transaktionsisolierung kann in vier Typen unterteilt werden (Leistung von niedrig bis hoch) :
Zeigen Sie die Standard -Isolationsstufe der aktuellen Datenbank an: - Für MySQL 8.x gibt Global die Systemebene an, und kein Global zeigt die Sitzungsstufe an. Wählen Sie @@ Global.transaction_isolation; Wählen Sie @@ Transaction_isolation; +--------------------------------+ |. @@ Global.transaction_isolation | +--------------------------------+ |. +--------------------------------+ - Mysql 5.x Wählen Sie @@ Global.tx_isolation; Wählen Sie @@ Tx_isolation; Um die Isolationsstufe zu ändern: - Setzen Sie die Systemisolationsstufe. Setzen Sie die globale Transaktions -Isolationsstufe, die unbekannt ist. - Abfragen Sie die Systemisolationsstufe und stellen Sie fest, dass es geändert wurde. Wählen Sie @@ Global.transaction_isolation; +--------------------------------+ |. @@ Global.transaction_isolation | +--------------------------------+ | LESEN-UNCOMMITTED | +--------------------------------+ Schmutzige LektüreTest Lesen Sie die nicht verbindliche Isolation: In Benutzerwerte einfügen (3, 'Xiaoming', 1000); In Benutzerwerte einfügen (4, 'Taobao Store', 1000); Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | +----+-----------+-------+ - Starten Sie eine Transaktion, um Daten zu betreiben- Angenommen, Xiao Ming hat in einem Taobao-Geschäft ein Paar Schuhe für 800 Yuan gekauft: TRANSAKTION STARTEN; UPDATE User Set Money = Money - 800 wobei name = 'xiao ming'; UPDATE User Set Money = Geld + 800 Wobei Name = 'Taobao Store'; -Der Taobao-Laden überprüft dann das Ergebnis auf der anderen Seite und stellt fest, dass das Geld eingegangen ist. Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | +----+-----------+-------+ Da die Übertragung von Xiao Ming bei einer neu eröffneten Transaktion durchgeführt wird und das Ergebnis der Operation durch andere Transaktionen (das Taobao -Geschäft der anderen Partei) erfolgt, ist das Abfrageergebnis des Taobao -Geschäfts korrekt und der Taobao -Geschäft bestätigt die Quittung. Aber in diesem Moment, wenn Xiao Ming den - Transaktionsrollback von Xiao Ming; - Egal wer die andere Partei ist, wenn Sie die Ergebnisse erneut durchsuchen, werden Sie feststellen: Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | +----+-----------+-------+ Dies wird als schmutziges Lesen bezeichnet, bei dem eine Transaktion Daten liest, die von einer anderen Transaktion nicht begangen wurden. Dies ist in der tatsächlichen Entwicklung nicht erlaubt. Lesen Sie CommitmentStellen Sie die Isolationsstufe auf, um festgelegt zu lesen : Setzen Sie die globale Transaktions -Isolationsstufe Lesen Sie fest; Wählen Sie @@ Global.transaction_isolation; +--------------------------------+ |. @@ Global.transaction_isolation | +--------------------------------+ | GELESEN-ENGAGIERT | +--------------------------------+ Auf diese Weise können sie, wenn neue Transaktionsverbindungen eingehen, nur die übermittelten Transaktionsdaten abfragen. Für die aktuelle Transaktion sehen sie jedoch immer noch nicht übereinstimmende Daten, beispielsweise: - Betriebsdatentransaktion (aktuelle Transaktion) TRANSAKTION STARTEN; UPDATE User Set Money = Money - 800 wobei name = 'xiao ming'; UPDATE User Set Money = Geld + 800 Wobei Name = 'Taobao Store'; - Obwohl die Isolationsstufe in der aktuellen Transaktion verpflichtet ist - Es wird immer noch die vorübergehend geänderten Daten in der Datentabelle angezeigt, nicht die tatsächlich übermittelten Daten. Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | +----+-----------+-------+ - Angenommen, zu diesem Zeitpunkt wird eine neue Transaktion aus der Ferne geöffnet und mit der Datenbank verbunden. $ mysql -u root -p12345612 - Zu diesem Zeitpunkt kann die von der Remoteverbindung abgefragte Daten nur der eingereichte Auswahl * vom Benutzer sein. +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | +----+-----------+-------+ Es gibt jedoch immer noch ein Problem damit. Zum Beispiel: - Als Xiao Zhang die Daten abfragte, stellte er fest: Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | +----+-----------+-------+ - Bevor Xiao Zhang den Durchschnittswert von Geld in der Tabelle berechnete, führte Xiao Wang eine Operation durch: TRANSAKTION STARTEN; In Benutzerwerte einfügen (5, 'C', 100); BEGEHEN; - Die tatsächlichen Daten der Tabelle zu diesem Zeitpunkt sind: Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | | +----+-----------+-------+ - Wenn Xiao Zhang den Durchschnittswert erneut berechnet, ist die Berechnung inkonsistent: Wählen Sie AVG (Geld) vom Benutzer aus; +------------+ | Avg (Geld) | +------------+ | +------------+ Obwohl Leseding es uns ermöglicht, nur Daten zu lesen, die von anderen Transaktionen verpflichtet wurden, gibt es immer noch ein Problem . Dies wird als nicht wiederholbares Lesen bezeichnet (Lesen Sie verpflichtet) . Phantom lesenStellen Sie die Isolationsstufe auf wiederholbares Lesen ein (wiederholbares Lesen) : Legen Sie die globale Transaktions -Isolationsebene wiederholbares Lesen ein; Wählen Sie @@ Global.transaction_isolation; +--------------------------------+ |. @@ Global.transaction_isolation | +--------------------------------+ | WIEDERHOLBARES LESEN | +--------------------------------+ Um wiederholbares Lesen zu testen, nehmen Sie an, dass - Xiao Zhang-Chengdu-Starttransaktion; In Benutzerwerte einfügen (6, 'D', 1000); - Xiao Wang - Peking Start -Transaktion; - Xiao Zhang-Chengdu Commit; Nachdem die aktuelle Transaktion gestartet wurde, kann sie nicht vor ihrer Verpflichtung abgefragt werden, kann jedoch nach dem Verpflichtung abgefragt werden. Wenn jedoch andere Transaktionen vor dem Commit geöffnet werden, wird die derzeit betriebene Verbindung in dieser Transaktionslinie nicht abgefragt. Es ist gleichbedeutend mit dem Öffnen eines separaten Threads. Unabhängig davon, ob Xiao Zhang Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | | +----+-----------+-------+ Dies liegt daran, dass Xiao Wang zuvor eine neue Transaktion ( Tatsache ist jedoch, dass Xiao Zhang bereits einen Datensatz in die reale Datentabelle eingefügt hat. Aber Xiao Wang wusste das zu diesem Zeitpunkt nicht und fügte auch die gleichen Daten ein. In Benutzerwerte einfügen (6, 'D', 1000); - Fehler 1062 (23000): Duplikateintrag '6' für den Schlüssel 'Primär' ' Es wurde ein Fehler gemeldet, und die Operation wurde darüber informiert, dass bereits ein Feld mit Primärschlüssel SerialisierungWie der Name schon sagt, werden alle Schreibvorgänge von Transaktionen serialisiert. Was bedeutet das? Ändern Sie die Isolationsstufe in serialisierbar : Setzen Sie globale Transaktions -Isolationsniveaus serialisierbar; Wählen Sie @@ Global.transaction_isolation; +--------------------------------+ |. @@ Global.transaction_isolation | +--------------------------------+ | SERIALISIERBAR | +--------------------------------+ Nehmen wir Xiao Zhang und Xiao Wang als Beispiele: - Xiao Zhang-Chengdu-Starttransaktion; - Xiao Wang - Peking Start -Transaktion; - Fragen Sie die Tabelle vor, bevor Sie die Transaktion starten, und bereiten Sie sich auf den Betrieb der Daten vor. Wählen Sie * vom Benutzer aus; +----+-----------+-------+ | ID | Name | Geld | +----+-----------+-------+ | | | | | | +----+-----------+-------+ - Es stellte fest, dass es keine Nr. 7 Wang Xiaohua gibt. Fügen Sie also ein Datenstück ein: In Benutzerwerte einfügen (7, '王小花', 1000); Was passiert an diesem Punkt? Da die aktuelle Isolationsstufe serialisierbar ist, bedeutet Serialisierungsmittel: Angenommen, alle Transaktionen werden in einer seriellen Warteschlange platziert, werden alle Transaktionen in einer festen Reihenfolge ausgeführt und der Schreibbetrieb der nächsten Transaktion wird nach Abschluss einer Transaktion ausgeführt ( dies bedeutet, dass nur eine Transaktionsbetriebsbetrieb im Vordergrund ausgeführt werden kann . Nach dieser Erklärung wird er, wenn Xiao Wang Daten einfügt, in einem Wartezustand sein, bis Xiao Zhang sich Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“. Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist. Das könnte Sie auch interessieren:
|
<<: So verwenden Sie CSS-Variablen in JS
>>: Detaillierte Erklärung zum Erstellen eines CDN-Servers mit Nginx (Bild und Text)
Was ist DOM? Mit JavaScript können Sie das gesamt...
In der fünften Ausgabe von Web Skills wird ausdrü...
In diesem Artikelbeispiel wird der spezifische Co...
1. MacVlan Es gibt viele Lösungen, um eine netzwe...
Ich habe viele Tutorials gelesen, aber festgestel...
Link zum Download der ZIP-Datei auf der offiziell...
Da Uniapp nicht über eine autorisierte DingTalk-A...
Inhaltsverzeichnis TypeScript-Umgebungskonstrukti...
Vor kurzem hat ein Dienst einen Alarm ausgelöst, ...
Was ist ein MIME-TYP? 1. Zunächst müssen wir verst...
Inhaltsverzeichnis 1: Kennwortfreie Anmeldekonfig...
Inhaltsverzeichnis 1. Einführung in die PID-Datei...
Dieser Artikel veranschaulicht anhand von Beispie...
1. Grundlegende Syntaxstruktur der HTML-Senden- u...
In diesem Artikelbeispiel wird der spezifische Im...