Beim Schreiben von SQL verwenden Sie häufig einige Techniken zum Schreiben von SQL-Anweisungen, um die Programmlogik erheblich zu vereinfachen. Die Reduzierung der Anzahl der Interaktionen zwischen dem Programm und der Datenbank wirkt sich positiv auf die hohe Verfügbarkeit der Datenbank aus. Außerdem werden Ihre SQL-Kenntnisse von Ihren Kollegen hervorgehoben.
Praktisches SQL
1. Einfügen oder Ersetzen
Wenn wir ein neues einfügen möchten Datensatz (INSERT). Wenn der Datensatz jedoch bereits vorhanden ist, löschen Sie zuerst den ursprünglichen Datensatz und fügen Sie dann den neuen Datensatz ein.
Szenariobeispiel: In dieser Tabelle werden die neuesten Transaktionsauftragsinformationen jedes Kunden gespeichert. Es muss sichergestellt werden, dass einzelne Benutzerdaten nicht wiederholt eingegeben werden und die Ausführungseffizienz bei geringster Interaktion mit der Datenbank am höchsten ist und unterstützt die hohe Verfügbarkeit der Datenbank.
Zu diesem Zeitpunkt können Sie die Anweisung „REPLACE INTO“ verwenden, sodass Sie nicht zuerst eine Abfrage durchführen und dann entscheiden müssen, ob Sie zuerst löschen und dann einfügen möchten.
Die „REPLACE INTO“-Anweisung basiert auf einem eindeutigen Index oder Primärschlüssel, um die Eindeutigkeit zu bestimmen (ob vorhanden).
Die „REPLACE INTO“-Anweisung basiert auf einem eindeutigen Index oder Primärschlüssel, um die Eindeutigkeit zu bestimmen (ob vorhanden).
Die „REPLACE INTO“-Anweisung basiert auf einem eindeutigen Index oder Primärschlüssel, um die Eindeutigkeit zu bestimmen (ob vorhanden).
Hinweis: Wie in der folgenden SQL gezeigt, muss ein eindeutiger Index (Unique) für das Benutzernamenfeld eingerichtet werden und die transId-Einstellung kann erhöht werden.
-- 20点充值 REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '会员充值'); -- 21点买皮肤 REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, 'chenhaha', 100, '2020-06-11 21:00:00', '购买盲僧至高之拳皮肤');
Wenn der Datensatz von username='chenhaha' nicht existiert, fügt die REPLACE-Anweisung einen neuen Datensatz ein (erste Aufladung), andernfalls wird der aktuelle Datensatz von username='chenhaha' gelöscht und dann ein neuer Datensatz wird eingefügt.
Geben Sie keinen spezifischen Wert für id an, da dies sonst Auswirkungen auf die SQL-Ausführung hat, es sei denn, das Unternehmen hat besondere Anforderungen.
2. Einfügen oder Aktualisieren
Wenn wir einen neuen Datensatz einfügen möchten (INSERT), der Datensatz jedoch bereits vorhanden ist, aktualisieren Sie den Datensatz zu diesem Zeitpunkt. Wir können die Anweisung „INSERT INTO ... ON DUPLICATE KEY UPDATE ...“ verwenden:
Szenariobeispiel: In dieser Tabelle wird der historische Aufladebetrag des Benutzers gespeichert. Wenn der Benutzer zum ersten Mal auflädt, werden neue Daten angezeigt Wenn der Benutzer auflädt, muss sichergestellt werden, dass die Daten eines einzelnen Benutzers nicht wiederholt eingegeben werden.
Zu diesem Zeitpunkt können Sie die Anweisung „INSERT INTO ... ON DUPLICATE KEY UPDATE ...“ verwenden.
Hinweis: Wie oben basiert die Anweisung „INSERT INTO ... ON DUPLICATE KEY UPDATE ...“ auf einem eindeutigen Index oder Primärschlüssel, um die Eindeutigkeit zu bestimmen (ob vorhanden). Wie in der folgenden SQL gezeigt, muss ein eindeutiger Index (Unique) für das Benutzernamenfeld eingerichtet werden und die transId-Einstellung kann erhöht werden.
-- 用户陈哈哈充值了30元买会员 INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '充会员') ON DUPLICATE KEY UPDATE total_amount=total_amount + 30, last_transTime='2020-06-11 20:00:20', last_remark ='充会员'; -- 用户陈哈哈充值了100元买瞎子至高之拳皮肤 INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, 'chenhaha', 100, '2020-06-11 20:00:20', '购买盲僧至高之拳皮肤') ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='2020-06-11 21:00:00', last_remark ='购买盲僧至高之拳皮肤';
Wenn der Datensatz mit Benutzername='chenhaha' nicht existiert, fügt die INSERT-Anweisung einen neuen Datensatz ein. Andernfalls wird der aktuelle Datensatz mit Benutzername='chenhaha' aktualisiert Felder werden durch UPDATE spezifiziert.
3. Einfügen oder ignorieren
Wenn wir einen neuen Datensatz einfügen möchten, der Datensatz jedoch bereits vorhanden ist, ignorieren Sie ihn einfach und unternehmen Sie nichts können Sie die Anweisung INSERT IGNORE INTO... verwenden: Es gibt viele Szenarien, daher werde ich keine Beispiele nennen.
Hinweis: Wie oben basiert die „INSERT IGNORE INTO...“-Anweisung auf einem eindeutigen Index oder Primärschlüssel, um die Eindeutigkeit zu bestimmen (ob vorhanden), und einem eindeutigen Index (Unique). muss im Feld „Benutzername“ festgelegt werden. Die transId-Einstellung kann selbst erhöht werden.
-- 用户首次添加 INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, 'chenhaha', '男', 12, 0, '2020-06-11 20:00:20'); -- 二次添加,直接忽略 INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, 'chenhaha', '男', 12, 0, '2020-06-11 21:00:20');
Wenn der Datensatz mit Benutzername='chenhaha' nicht existiert, fügt die INSERT-Anweisung einen neuen Datensatz ein, andernfalls wird keine Operation ausgeführt.
4. if-else-Beurteilungsanweisung in SQL
Wie wir alle wissen, ist if-else-Beurteilung überall in SQL-Anweisungen nützlich: „CASE WHEN...“ „THEN ... ELSE ... END“-Anweisungen können in verschiedenen Arten von Add-, Delete-, Modify- und Query-Anweisungen verwendet werden.
Geben Sie mir ein Szenario: Große Belohnung zum Frauentag, neue Benutzer werden im Jahr 2020 registriert, alle Konten erwachsener Frauen erhalten einen roten Umschlag im Wert von 10 Yuan und andere Benutzer erhalten einen roten Umschlag im Wert von 5 Yuan, der automatisch aufgeladen wird .
Beispielsätze lauten wie folgt:
-- 送红包语句 UPDATE users_info u SET u.balance = CASE WHEN u.sex ='女' and u.age > 18 THEN u.balance + 10 ELSE u.balance + 5 end WHERE u.create_time >= '2020-01-01'
* Szenario 2: Es gibt eine Punktetabelle für die Hochschulaufnahmeprüfung und die Noten müssen aufgeführt werden. Eine Punktzahl von 650 oder mehr ist ein Schlüssel Universität, 600-650 ist ein Buch, 500- Eine Punktzahl von 600 bedeutet zwei Bücher, eine Punktzahl von 400-500 bedeutet drei Bücher und eine College-Punktzahl unter 400. Die ursprünglichen Testdaten lauten wie folgt:
Abfrageanweisung:
SELECT *,case when total_score >= 650 THEN '重点大学' when total_score >= 600 and total_score <650 THEN '一本' when total_score >= 500 and total_score <600 THEN '二本' when total_score >= 400 and total_score <500 THEN '三本' else '大专' end as status_student from student_score;
5. Geben Sie einen Daten-Snapshot oder ein Backup an
Wenn Sie einen Schnappschuss einer Tabelle machen möchten, erstellen Sie eine Kopie. Um Daten von der aktuellen Tabelle in eine neue Tabelle zu übertragen, können Sie CREATE TABLE und SELECT kombinieren:
-- 对class_id=1(一班)的记录进行快照,并存储为新表students_of_class1: CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;
Die neu erstellte Tabellenstruktur entspricht genau der von SELECT verwendeten Tabellenstruktur.
6. Abfrageergebnissatz schreibenWenn der Abfrageergebnissatz in die Tabelle geschrieben werden muss, können Sie INSERT und SELECT kombinieren, um den Ergebnissatz von direkt einzufügen die SELECT-Anweisung für die angegebene Tabelle.
Erstellen Sie beispielsweise eine Statistiktabelle, um die durchschnittliche Punktzahl jeder Klasse aufzuzeichnen:
CREATE TABLE statistics ( id BIGINT NOT NULL AUTO_INCREMENT, class_id BIGINT NOT NULL, average DOUBLE NOT NULL, PRIMARY KEY (id) );
Dann können wir eine Anweisung verwenden, um die durchschnittliche Punktzahl jeder Klasse zu schreiben:
INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;
确保INSERT语句的列和SELECT语句的列能一一对应,就可以在statistics表中直接保存查询的结果:
SELECT * FROM statistics;
+----+----------+--------------+ | id | class_id | average | +----+----------+--------------+ | 1 | 1 | 475.5 | | 2 | 2 | 473.33333333 | | 3 | 3 | 488.66666666 | +----+----------+--------------+ 3 rows in set (0.00 sec)
7.强制使用指定索引
在查询的时候,数据库系统会自动分析查询语句,并选择一个最合适的索引。但是很多时候,数据库系统的查询优化器并不一定总是能使用最优索引。如果我们知道如何选择索引,可以使用FORCE INDEX强制查询使用指定的索引。例如:
SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;
指定索引的前提是索引idx_class_id必须存在。
心得体会:
MySQL路漫漫,其修远兮。永远不要眼高手低,一起加油,希望本文能对你有所帮助。
推荐教程: 《mysql教程》
Das obige ist der detaillierte Inhalt vonTeilen Sie mehrere praktische SQL-Anweisungen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!