ホームページ  >  記事  >  データベース  >  MySQL でいくつかの実用的な SQL ステートメントを共有する

MySQL でいくつかの実用的な SQL ステートメントを共有する

青灯夜游
青灯夜游転載
2020-06-15 09:35:542056ブラウズ

MySQL でいくつかの実用的な SQL ステートメントを共有する

SQL を記述するときは、プログラム ロジックを大幅に簡素化するために SQL ステートメントの記述スキルを使用することがよくあります。プログラムとデータベース間のやり取りの数を減らすことは、データベースの高可用性にとって有益であり、また、あなたの SQL スキルが同僚に目立つようになります。

#実践 SQL

1. 挿入または置換

新しいものを挿入する場合は、レコード (INSERT) ですが、レコードがすでに存在する場合は、最初に元のレコードを削除してから、新しいレコードを挿入します。

シナリオ例: このテーブルには、各顧客の最新のトランザクション注文情報が保存されます。単一のユーザー データが繰り返し入力されないようにする必要があり、データベースとの対話を最小限に抑えて実行効率が最も高くなります。 、データベースの高可用性をサポートします。

現時点では、「REPLACE INTO」ステートメントを使用できるため、最初にクエリを実行してから、削除してから挿入するかどうかを決定する必要がありません。

  • 「REPLACE INTO」ステートメントは、一意のインデックスまたは主キーに基づいて一意性 (存在するかどうか) を判断します。

  • 「REPLACE INTO」ステートメントは、一意のインデックスまたは主キーに基づいて一意性 (存在するかどうか) を判断します。

  • 「REPLACE INTO」ステートメントは、一意のインデックスまたは主キーに基づいて一意性 (存在するかどうか) を判断します。

注: 次の SQL に示すように、ユーザー名フィールドに一意のインデックス (Unique) を確立する必要があり、transId 設定を増やすことができます。

-- 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', '购买盲僧至高之拳皮肤');

username='chenhaha' のレコードが存在しない場合、REPLACE ステートメントは新しいレコードを挿入します (最初の再チャージ)。それ以外の場合は、username='chenhaha' の現在のレコードが削除され、その後新しいレコードが挿入されます。

id ​​には特定の値を指定しないでください。ビジネスに特別なニーズがない限り、SQL の実行に影響します。

2. 挿入または更新

新しいレコードを挿入する (INSERT) 場合、レコードがすでに存在する場合は、この時点でレコードを更新します。 「INSERT INTO ... ON DUPLICATE KEY UPDATE ...」ステートメントを使用できます:

シナリオ例: このテーブルには、ユーザーの過去のリチャージ金額が保存されます。ユーザーが初めてリチャージする場合、新しいユーザーがリチャージする場合 過去のリチャージ金額が蓄積される場合、単一ユーザーのデータが繰り返し入力されないようにする必要があります。

現時点では、「INSERT INTO ... ON DUPLICATE KEY UPDATE ...」ステートメントを使用できます。

注: 上記と同様、「INSERT INTO ... ON DUPLICATE KEY UPDATE ...」ステートメントは、一意のインデックスまたは主キーに基づいて一意性 (存在するかどうか) を判断します。次の SQL に示すように、ユーザー名フィールドに一意のインデックス (Unique) を確立する必要があり、transId 設定を増やすことができます。

-- 用户陈哈哈充值了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 ='购买盲僧至高之拳皮肤';
username='chenhaha' のレコードが存在しない場合、INSERT ステートメントは新しいレコードを挿入します。それ以外の場合は、username='chenhaha' の現在のレコードが更新され、更新されたフィールドは UPDATE で指定されます。

3. 挿入または無視

新しいレコードを挿入 (INSERT) する場合、レコードがすでに存在する場合は、それを無視して何もしません。 、 INSERT IGNORE INTO... ステートメントを使用できます。 多くのシナリオがあるため、例は示しません。

注: 上記と同様、「INSERT IGNORE INTO...」ステートメントは、一意性 (存在するかどうか) を決定する一意のインデックスまたは主キー、および一意のインデックス (Unique) に基づいています。ユーザー名フィールドで確立する必要があります。transId 設定は単独で増加できます。

-- 用户首次添加
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');
username='chenhaha' のレコードが存在しない場合、INSERT ステートメントは新しいレコードを挿入します。存在しない場合、操作は実行されません。

4. SQL における if-else 判定ステートメント

ご存知のとおり、if-else 判定は SQL ステートメントのどこでも役に立ちます。 THEN ... ELSE ... END" ステートメントは、さまざまなタイプの追加、削除、変更、クエリ ステートメントで使用できます。

シナリオを教えてください: 女性の日の大きな特典、2020 年に登録された新規ユーザー、すべての成人女性アカウントには 10 元の赤い封筒が与えられ、その他のユーザーには 5 元の赤い封筒が与えられます。自動的に充電されます。

例は次のとおりです:

-- 送红包语句
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'

* シナリオ 2: 学生の大学入学試験のスコア表があり、成績をリストする必要があります。スコア 650 以上がキーです。大学、600 ~ 650 は本、500 - 600 のスコアは 2 冊の本を意味し、400 ~ 500 のスコアは 3 冊の本を意味し、大学のスコアが 400 未満である;

元のテスト データは次のとおりです。

MySQL でいくつかの実用的な SQL ステートメントを共有する##クエリ ステートメント:

SELECT *,case when total_score >= 650  THEN '重点大学' 
              when total_score >= 600 and total_score <650 THEN &#39;一本&#39;
              when total_score >= 500 and total_score <600 THEN &#39;二本&#39;
              when total_score >= 400 and total_score <500 THEN &#39;三本&#39;        
              else &#39;大专&#39; end as status_student 
              from student_score;

MySQL でいくつかの実用的な SQL ステートメントを共有する

5. データ スナップショットまたはバックアップを指定します

テーブルのスナップショットを取得したい場合は、コピーを作成します。現在のテーブルから新しいテーブルにデータを転送するには、CREATE TABLE と SELECT を組み合わせることができます。新しく作成されたテーブル構造は、SELECT で使用されるテーブル構造とまったく同じです。

6. クエリ結果セットを書き込む

クエリ結果セットをテーブルに書き込む必要がある場合は、INSERT と SELECT を組み合わせて結果セットを直接挿入できます。指定されたテーブルに対する SELECT ステートメントの。 たとえば、統計テーブルを作成して各クラスの平均スコアを記録します:

-- 对class_id=1(一班)的记录进行快照,并存储为新表students_of_class1:
CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;

次に、1 つのステートメントを使用して各クラスの平均スコアを書き込むことができます:

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教程

以上がMySQL でいくつかの実用的な SQL ステートメントを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。