【MySQL】データベースの基礎③

 前章: 【MySQL】データベースの基礎②                                                                                                  

✍一時テーブル

例証します:

MySQL 一時テーブルは、一時データを保存する必要がある場合に非常に役立ちます。一時テーブルは現在の接続でのみ表示されます。接続が閉じられると、Mysql は自動的にテーブルを削除し、すべての領域を解放します。

一時テーブルは MySQL 3.23 で追加されます。MySQL バージョンが 3.23 より前の場合は、MySQL 一時テーブルを使用できません。

別の MySQL クライアント プログラムを使用して MySQL データベース サーバーに接続し、一時テーブルを作成する場合、一時テーブルはクライアント プログラムが閉じられたときにのみ破棄されます。もちろん、手動で破棄することもできます。

1. 一時テーブルを作成する

  • 一時テーブルを作成する
 CREATE TEMPORARY TABLE product_temporary (
    product_name VARCHAR(50) NOT NULL,
    total_sales DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    sold_total INT UNSIGNED NOT NULL DEFAULT 0
);
  • Pro にデータを追加する 
INSERT INTO product_temporary (product_name, total_sales, price, sold_total) VALUES ('手机', 100.25, 90, 2);
  • 一時テーブルのデータを表示する 
select * from product_temporary;

 

SHOW TABLES コマンドを使用してデータ テーブルのリストを表示する場合、product_temporary テーブルは表示されません。

現在の MySQL セッションを終了し、SELECT コマンドを使用して前に作成した一時テーブルのデータを読み取ると、終了時に一時テーブルが破棄されているため、そのテーブルがデータベースに存在しないことがわかります。

2. 一時テーブルを削除します。

例証します:

デフォルトでは、データベースから切断すると、一時テーブルは自動的に破棄されます。もちろん、現在の MySQL セッションで DROP TABLE コマンドを使用して一時テーブルを手動で削除することもできます。

  • 一時テーブルを手動で削除する

 DROP TABLE product_temporary;

✍テーブルのコピー

例証します:

テーブル構造、インデックス、デフォルト値などを含む MySQL データ テーブルを完全にコピーする必要がある場合。これは、 CREATE TABLE ... SELECT コマンドだけでは不可能です。

MySQL データテーブルを完全にコピーする方法の手順は次のとおりです。

  • SHOW CREATE TABLEコマンドを使用して、 元のデータ テーブルの構造、インデックスなどを含む データ テーブル作成ステートメント ( CREATE TABLE ) を取得します。
  • 以下のコマンドで表示されたSQL文をコピーし、データテーブル名を変更してSQL文を実行すると、データテーブルの構造が完全にコピーされます。
  • テーブルの内容をコピーしたい場合は、 INSERT INTO ... SELECT ステートメントを使用して実現できます。

1.ステップ1

  • テーブル text_table のコピーを示します。
SHOW CREATE TABLE text_table \G;
  • データテーブルの完全な構造を取得します。 
*************************** 1. row ***************************
       Table: text_table
Create Table: CREATE TABLE `text_table` (
  `text_id` int unsigned NOT NULL AUTO_INCREMENT,
  `text_title` varchar(100) NOT NULL,
  `text_author` varchar(40) NOT NULL,
  `submission_date` date DEFAULT NULL,
  PRIMARY KEY (`text_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)

2.ステップ2

  • SQL文のデータテーブル名を変更してSQL文を実行します。
CREATE TABLE `text_copy` (
  `text_id` int unsigned NOT NULL AUTO_INCREMENT,
  `text_title` varchar(100) NOT NULL,
  `text_author` varchar(40) NOT NULL,
  `submission_date` date DEFAULT NULL,
  PRIMARY KEY (`text_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3;

3.ステップ 3

  • 2 番目のステップを実行した後、データベースに新しいクローン テーブル text_copy を作成します。データテーブルのデータをコピーしたい場合は、 INSERT INTO... SELECT ステートメントを使用してそれを実現できます。
INSERT INTO text_copy (text_id,text_title,text_author,submission_date)
SELECT text_id,text_title,text_author,submission_date FROM text_table;

上記の手順を実行すると、テーブル構造とテーブル データを含むテーブルの内容が完全にコピーされます。

  •  複製された text_copy テーブルを表示する
mysql> select * from  text_copy;
+---------+----------------+--------------+-----------------+
| text_id | text_title     | text_author  | submission_date |
+---------+----------------+--------------+-----------------+
|       1 | 安徒生童话     | 臭弟弟       | 2023-06-16      |
|       2 | 小天鹅与丑小鸭 | 你才是臭弟弟 | 2023-06-16      |
|       3 | 西游记         | 我不是臭弟弟 | 2023-06-16      |
|       5 | csdn           | 作者         | 2023-06-19      |
|       6 | 测试           | text         | 2023-06-19      |
+---------+----------------+--------------+-----------------+
5 rows in set (0.29 sec)

✍メタデータ

例証します:

MySQL メタデータ (Metadata) とは、データベース、テーブル、カラム、インデックス、その他の情報など、MySQL データベース内のデータ構造に関する情報を指します。MySQL では、通常、メタデータはデータ ディクショナリの形式でシステム データベースに保存され、データ ディクショナリをクエリすることでメタデータ情報を取得できます。

1. 一般的に使用されるメタデータ クエリ ステートメント

  • すべてのデータベースをクエリする
SHOW DATABASES;
  • 指定されたデータベース内のすべてのテーブルをクエリします
SHOW TABLES;
  •  指定したテーブルの列情報を問い合わせます
DESCRIBE table_name;
  • 指定したテーブルのインデックス情報を問い合わせます
SHOW INDEX FROM table_name;
  • 指定されたテーブルのテーブルスペース情報をクエリします。
SHOW TABLE STATUS LIKE 'table_name';
  • すべてのユーザーの権限を問い合わせる
SELECT user, host, grant_priv, super_priv FROM mysql.user;
  • 現在ログインしているユーザーの権限を問い合わせます
SELECT * FROM information_schema.USER_PRIVILEGES;
  • すべてのデータベースのテーブルスペースの使用状況をクエリします。
SHOW TABLE STATUS;

2. サーバーのメタデータを取得する

注文 説明
バージョンを選択() サーバーのバージョン情報
データベースを選択() 現在のデータベース名 (または空を返す)
ユーザーを選択() 現在のユーザー名
ステータスを表示 サーバーのステータス
変数を表示 サーバー構成変数


✍重複データの処理

例証します:

データ テーブルに重複レコードが存在する場合があります。場合によっては、重複データの存在を許可しますが、場合によっては、これらの重複データを削除する必要があることもあります。

データテーブルの重複データを防ぐ方法と、データテーブルの重複データを削除する方法を中心に紹介します。

1. テーブル内の重複データを防止する

  • MySQL データ テーブル内の指定したフィールドを PRIMARY KEY (主キー) または UNIQUE (一意の) インデックスとして設定して、データの一意性を確保できます。

例: 次のテーブルにはインデックスと主キーがないため、このテーブルでは複数の重複レコードが許可されます。

CREATE TABLE person_table
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);
  •  テーブルの first_name フィールドと last_name フィールドを設定する場合、データを繰り返すことはできません。デュアル主キー モードを設定してデータの一意性を設定できます。デュアル主キーを設定した場合は、そのデフォルト値が設定されます。 key を NULL にすることはできません。NOT NULL に設定できます。

次のように:

CREATE TABLE person_table
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

 補充:

もちろん、以下に示すように、視覚化ツールを使用する方が便利で効率的です。 

  • 一意のインデックスを設定すると、重複データを挿入するときに SQL ステートメントが正常に実行されず、エラーがスローされます。
  • INSERT IGNORE INTO と INSERT INTO の違いは、INSERT IGNORE INTO はデータベース内の既存のデータを無視することです。データベースにデータがない場合は新しいデータが挿入され、データがある場合はそのデータはスキップされます。このようにして、データベース内の既存のデータを保持して、ギャップにデータを挿入する目的を達成できます。

次の例では INSERT IGNORE INTO を使用しています。実行後にエラーは発生せず、データ テーブルに重複データは挿入されません。

mysql> INSERT IGNORE INTO person_table (last_name, first_name)VALUES( 'mr.xiao', 'csdn');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> INSERT IGNORE INTO person_table (last_name, first_name)VALUES( 'mr.xiao', 'csdn');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from person_table;
+------------+-----------+------+
| first_name | last_name | sex  |
+------------+-----------+------+
| Thomas     | Jay       | NULL |
| csdn       | mr.xiao   | NULL |
+------------+-----------+------+
2 rows in set (0.00 sec)
  • INSERT IGNORE INTO データを挿入するときに、レコードの一意性を設定した後、重複したデータが挿入された場合、エラーは返されず、警告のみが返されます。REPLACE INTO の場合、同じプライマリまたはユニークのレコードがある場合は、最初にそれを削除します。次に、新しいレコードを挿入します。

データの一意性を設定するもう 1 つの方法は、次のように UNIQUE インデックスを追加することです。

CREATE TABLE person_table
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   UNIQUE (last_name, first_name)
);

2. 統計的重複データ

  • person_table テーブル内の first_name と last_name の重複レコードの数をカウントします。
SELECT
	COUNT(*) AS repetitions,
	last_name,
	first_name 
FROM
	person_table 
GROUP BY
	last_name,
	first_name 
HAVING
	repetitions > 1;

    上記の SQL クエリには、person_table テーブル内の last_name と first_name の組み合わせに重複した値があります。各組み合わせ (繰り返し) の合計数と、組み合わせ内の last_name と first_name を返します。

具体的には、このクエリは次のようになります。

  • COUNT(*) 関数は、各組み合わせの行数 (つまり、繰り返しの数) をカウントするために使用され、繰り返しと呼ばれます。
  • GROUP BY 句は、同じ last_name と first_name を持つ行をグループ化するために使用されます。
  • HAVING 句は、1 より大きい繰り返しを含む組み合わせを除外するために使用されます。

結果は last_name と first_name で並べ替えられ、重複した値を含む行が返されます。

3. 重複データをフィルタリングする

  • 重複しないデータを読み取る必要がある場合は、SELECT ステートメントで DISTINCT キーワードを使用して重複データをフィルタリングできます。
SELECT DISTINCT
	last_name,
	first_name 
FROM
	person_table;
  •  GROUP BY を使用して、データ テーブル内の重複していないデータを読み取ることもできます。
SELECT
	last_name,
	first_name 
FROM
	person_table 
GROUP BY
	last_name,
	first_name;

4. 重複データを削除する

  • DISTINCT キーワードと UNION 演算子を使用する
SELECT DISTINCT * FROM (  
  SELECT column_name1, column_name2, ... FROM table_name  
  UNION  
  SELECT column_name1, column_name2, ... FROM table_name  
) AS tmp;

 このメソッドは、テーブル内のすべての行を一時テーブルにコピーし、DISTINCT キーワードを使用して重複する行を削除します。

  • GROUP BY 句と HAVING 句の使用
DELETE table_name  
FROM table_name  
WHERE column_name IN (  
  SELECT column_name  
  FROM table_name  
  GROUP BY column_name  
  HAVING COUNT(*) > 1  
);

この方法では、サブクエリを使用して重複した値を持つ列を検索し、メインテーブル内のそれらの行を削除します。

  • NOT IN または LEFT JOIN を使用する
DELETE table_name  
FROM table_name  
WHERE id NOT IN (  
  SELECT MIN(id)  
  FROM table_name  
  GROUP BY column_name  
);

 または左結合を使用します

DELETE t1  
FROM table_name t1  
LEFT JOIN (  
  SELECT MIN(id) AS id  
  FROM table_name  
  GROUP BY column_name  
) t2 ON t1.id = t2.id  
WHERE t2.id IS NULL;

 どちらの方法でもテーブルから重複値は削除されますが、重複値を含む列内のすべての行が削除されるわけではありません。代わりに、重複する値の 1 行だけが削除されます。

✍SQLインジェクション

SQL インジェクション攻撃を防ぐ方法:

  1. プリペアド ステートメントの使用: プリペアド ステートメントは、SQL クエリを実行する前に SQL ステートメントをプリコンパイルする方法です。このアプローチにより、SQL クエリがデータから分離され、攻撃者が SQL インジェクション攻撃を悪用できなくなります。
  2. パラメータ化されたクエリを使用する (パラメータ化されたクエリ): パラメータ化されたクエリは、SQL クエリとデータを分離する方法です。これは、クエリ文字列を変数パラメータから分離することで実現され、SQL インジェクション攻撃を回避します。
  3. 特殊文字をフィルタリングする: SQL クエリを作成するときに、特殊文字をフィルタリングする方法を使用して、SQL インジェクション攻撃を防ぐことができます。たとえば、正規表現を使用して、入力内の特殊文字をフィルタリングして除外できます。
  4. 最小限の権限を使用する: アプリケーションで使用される MySQL ユーザーが最小限の権限を持っていることを確認します。これは、アプリケーションがそのタスクを実行するために必要な権限のみを使用する必要があり、追加の権限は必要ないことを意味します。
  5. 安全な接続ライブラリを使用する: MySQL の接続ライブラリを使用する場合は、必ず最新バージョンの接続ライブラリを使用してください。これらのライブラリには、多くの場合、セキュリティと SQL インジェクション攻撃に対する保護のための改善が含まれています。
  6. 入力の検証とフィルタリング: ユーザー入力を受け入れる前に、入力を検証してフィルタリングし、期待される形式とタイプに準拠していることを確認します。これにより、悪意のある入力による SQL インジェクション攻撃が防止されます。
  7. アプリケーション ファイアウォールまたは WAF を使用する: アプリケーション ファイアウォールまたは WAF をアプリケーション レベルで使用して、SQL インジェクション攻撃を検出およびブロックします。これらのファイアウォールには通常、ルールベースの検出機能とブロック機能があり、アプリケーションを SQL インジェクション攻撃から効果的に保護できます。

                                                                                              

おすすめ

転載: blog.csdn.net/weixin_50002038/article/details/131283216