MySQL-Tabellenübergreifende Abfrage und Tabellenübergreifende Aktualisierung

MySQL-Tabellenübergreifende Abfrage und Tabellenübergreifende Aktualisierung

Freunde, die über Grundkenntnisse in SQL verfügen, haben sicherlich schon von „Cross-Table-Abfragen“ gehört, aber was ist eine Cross-Table-Aktualisierung?

Hintergrund

Das Projekt hat einen neuen Stapel Personaldaten importiert. Die Abteilungsnamen einiger dieser Personen haben sich geändert, und einige ihrer Kontaktinformationen haben sich geändert. Nennen wir diese Tabelle

t_dept_members , es gibt eine weitere Tabelle t_user_info im System, in der Personalinformationen aufgezeichnet werden. Es ist erforderlich, die geänderten Informationen in t_dept_members in t_user zu aktualisieren. Diese Anforderung wird als „tabellenübergreifende Aktualisierung“ bezeichnet.

Silly SQL wird sofort beendet

Ohne nachzudenken schrieb ich das folgende SQL

Als ich sah, dass DBA Xiao Duan hinter mir übte, dachte ich daran, ihn zu bitten, mir beim Polieren zu helfen 😜, also schickte ich es ihm und dann kam es so zurück:

Ich war fassungslos, als ich diese SQL-Anweisung sah. Wie konnte sie so geschrieben werden? Unter dem gnadenlosen Spott fiel ich mit einem „KO“ zu Boden. Du musst wissentlich sterben. Wir müssen herausfinden, was los ist.

Mysql Update Join

Wir verwenden join häufig, um Zeilen aus einer Tabelle abzufragen, die übereinstimmende Zeilen in einer anderen Tabelle haben (im Fall INNER JOIN ) oder nicht haben (im Fall LEFT JOIN ).

In ähnlicher Weise können wir in MySQL auch die JOIN-Klausel in der UPDATE-Anweisung verwenden, um tabellenübergreifende Aktualisierungen durchzuführen. Die Syntax lautet wie folgt:

AKTUALISIERUNG T1, T2,
[INNER JOIN | LEFT JOIN] T1 AUF T1.C1 = T2.C1
SETZE T1.C2 = T2.C2,
  T2.C3 = Ausdruck
WHERE-Bedingung

Lassen Sie uns die obige Syntax im Detail erklären:

Geben Sie zunächst nach der UPDATE-Klausel die Primärtabelle (T1) und die Tabelle (T2) an, mit der die Primärtabelle verknüpft werden soll. Beachten Sie, dass Sie nach der UPDATE-Klausel mindestens eine Tabelle angeben müssen. Geben Sie als Nächstes den gewünschten Join-Typ (INNER JOIN oder LEFT JOIN) und das Join-Prädikat an. Die JOIN-Klausel muss nach der UPDATE-Klausel stehen (das weiß jeder). Weisen Sie dann den zu aktualisierenden Spalten in der Tabelle T1 oder T2 neue Werte zu. Geben Sie abschließend in der WHERE-Klausel eine Bedingung an, um die Zeilen auf die zu aktualisierenden zu beschränken.

Wenn Sie der Update-Syntax folgen, werden Sie feststellen, dass es eine andere Syntax gibt, mit der auch tabellenübergreifende Updates durchgeführt werden können

AKTUALISIERUNG T1, T2
SETZE T1.c2 = T2.c2,
   T2.c3 = Ausdruck
WO T1.c1 = T2.c1 UND Bedingung

Die obige Syntax verwendet tatsächlich implizit das Schlüsselwort „inner join“, was genau dem Folgenden entspricht:

AKTUALISIERUNG T1, T2
INNER JOIN T2 AUF T1.C1 = T2.C1
SETZE T1.C2 = T2.C2,
   T2.C3 = Ausdruck
WHERE-Bedingung

Mein persönlicher Vorschlag ist, das Schlüsselwort inner join hinzuzufügen, wodurch der Code lesbarer und flüssiger wird. Was meinen Sie?

Ich habe das hier beim Scherzen gesehen und ich glaube, es ist eine Seelenübersetzung

Reden ist billig, zeig mir den Code

Update-Join-Beispiel

Das Jahresende ist da und es ist Zeit, die Leistung zu bewerten, das sogenannte KPI (haben Sie das?). Ich habe gehört, dass Gehälter auf der Grundlage des KPI angepasst werden. Es gibt zwei Tische

Die erste Tabelle ist "Mitarbeiter"

Die Anweisung zur Tabellenerstellung lautet wie folgt:

Tabelle „Mitarbeiter“ erstellen
(
  employee_id bigint auto_increment Kommentar 'Mitarbeiter-ID, Primärschlüssel',
  employee_name varchar(50) null Kommentar 'Mitarbeitername',
  performance int(4) null Kommentar 'Leistungsbewertung 1, 2, 3, 4, 5',
  Gehalt Float Null Kommentar 'Mitarbeitergehalt',
  Einschränkung Mitarbeiter_pk
    Primärschlüssel (employee_id)
)
Kommentar 'Mitarbeitertabelle';

Die zweite Tabelle ist die „Verdienst-Leistungs-Wörterbuchtabelle“.

Die Anweisung zur Tabellenerstellung lautet wie folgt:

Tabelle erstellen Verdienste
(
  Leistung int(4) null,
  Prozentsatz Float Null
)
Kommentar „Leistungswörterbuchtabelle“;

Generieren Sie zunächst einige simulierte Daten

- Initialisieren Sie die Leistungswörterbuchdaten INSERT INTO merits(performance, percentage)
WERTE (1, 0),
    (2, 0,01),
    (3, 0,03),
    (4, 0,05),
    (5, 0,08);


-- Initialisieren Sie die Daten in der Mitarbeitertabelle INSERT INTO employee(employee_name, performance, salary)
WERTE ('Gong Ge', 1, 1000),
    ('Xiao Duanzong', 3, 20000),
    ('Erwachsene', 4, 18000),
    ('Kommandant', 5, 28000),
    ('Alte Sechs', 2, 10000),
    ('Romon', 3, 20000);

Regeln zur Gehaltsanpassung:

Ursprüngliches Gehalt + (ursprüngliches Gehalt * Prozentsatz der Gehaltserhöhung entsprechend der aktuellen Leistung)

Verfassen Sie Aktualisierungsbescheide nach den Regeln zur Gehaltsanpassung:

UPDATE Mitarbeiter
  Innerer Join
  Verdienste EIN Mitarbeiter.Leistung = Verdienste.Leistung
SET-Gehalt = Gehalt + Gehalt * Prozentsatz;

Gong Ges Leistung war nicht gut, deshalb bekam er keine Gehaltserhöhung …

Drei horizontale Linien, eine vertikale Linie und ein Kuckuck, vier kleine Schweinchen kommen, um Zha zu essen, Kuckuck, Kuckuck, zwei weitere kommen

Gegen Ende des Jahres kamen zwei neue Kollegen in das Unternehmen, aber die jährliche Leistungsbeurteilung des Unternehmens wurde bereits abgeschlossen, sodass die Leistung der neuen Mitarbeiter NULL ist.

INSERT INTO Mitarbeiter (Mitarbeitername, Leistung, Gehalt)
VALUES ('Wert', NULL, 8000),
    ('Zurück', NULL, 5000);

Bei guter Leistung soll der neue Mitarbeiter zudem eine Gehaltserhöhung 1.5% erhalten. Wenn wir immer noch UPDATE INNER JOIN verwenden, ist es unmöglich, die obige Update-Anweisung abzuschließen, da die bedingte Gleichheit nicht gilt. In diesem Fall müssen wir UPDATE LEFT JOIN verwenden.

UPDATE Mitarbeiter
  LINKS VERBINDEN
  Verdienste EIN Mitarbeiter.Leistung = Verdienste.Leistung
SET Gehalt = Gehalt + Gehalt * 0,015
Wobei merits.percentage NULL ist;

Zu diesem Zeitpunkt war auch die Gehaltserhöhung für neue Mitarbeiter abgeschlossen. Gong Ge ging beschämt nach Hause, um das neue Jahr zu feiern, weil er die Wissenspunkte nicht gründlich verstanden hatte.

Das könnte Sie auch interessieren:
  • Datenbankübergreifende Assoziationsabfragemethode in MySQL
  • Beispiel für eine MySQL-Datenbank-übergreifende Transaktions-XA-Operation
  • Detaillierte Erläuterung der MySql-Methode zur Implementierung tabellenübergreifender Abfragen
  • Yii2 implementiert den Sortierfunktionscode für MySQL-Datenbankassoziationsabfragen
  • Beispiele für MySQL-Tabellenübergreifende Abfragen, Aktualisierungen und Löschungen
  • Beispiel einer datenbankübergreifenden Abfrage in MySQL

<<:  Vue implementiert Benutzeranmeldung und Token-Verifizierung

>>:  Nexus verwendet Nginx-Proxy zur Unterstützung des HTTPS-Protokolls

Artikel empfehlen

Beispielanalyse für MySQL-Jointabelle und automatische ID-Inkrementierung

Wie schreibt man „join“? Wenn Sie „Left Join“ ver...

JavaScript implementiert eine bidirektionale verknüpfte Listenprozessanalyse

Inhaltsverzeichnis 1. Was ist eine doppelt verknü...

Details zur Verwendung des Vue-Slots

Inhaltsverzeichnis 1. Warum Slots verwenden? 1.1 ...

Zusammenfassung des Speicherorts und Tipps für Docker-Konfigurationscontainer

Tipps zur Verwendung von Docker 1. Bereinigen Sie...

Verstehen Sie die Prinzipien und Anwendungen von JSONP in einem Artikel

Inhaltsverzeichnis Was ist JSONP JSONP-Prinzip JS...

Tutorial zur Verarbeitung statischer Ressourcen in Tomcat

Vorwort Alle Anfragen in Tomcat werden von Servle...

Centos7-Startvorgang und Nginx-Startkonfiguration in Systemd

Centos7-Startvorgang: 1.post (Selbsttest beim Ein...

HTML-Tipps, um Ihren Code semantisch zu gestalten

HTML-Semantik scheint ein alltägliches Problem zu...