Mysqlシリーズ第14回
需要背景
eコマース会社のリーダーは、次のように述べています。月ごとの注文の合計数、注文数、男性と女性の注文の比率などの統計を教えてください。非常に複雑なSQLを大量に書き込んでから、リーダーに送信しました。
このような大きなSQLをリーダーに送信することに満足していますか?
リーダーがデータの1つだけを見たい場合は、送信したSQLを変更する必要があります。リーダーが将来他の統計指標を追加する場合は、大量のSQLをリーダーに送信します。リーダーの場合、このSQLは非常に複雑に見えます。 、維持するのが難しい。
実際、リーダーはどのようにそれを達成するかを気にせず、これらのインジケーターのみを気にし、表示とクエリは簡単ですが、複雑な実装をリーダーに送信します。
では、これらの詳細を隠して簡潔な結果のみを公開するにはどうすればよいでしょうか。
データベースはそれについて私たちが考えるのを助けました:この問題を解決するためにビューを使用してください。
ビューとは
概念
ビューはmysql5の後に表示されました。これは仮想テーブルです。行と列のデータは、ビューの定義時に使用されるいくつかのテーブルから取得されます。ビューのデータは、ビューの使用時に動的に生成されます。ビューは、sqlのロジックのみを保存します、クエリの結果を保存しません。
使用するシーン
同じクエリ結果が複数の場所で使用され、クエリ結果がより複雑な場合、ビューを使用して複雑な実装の詳細を非表示にすることができます。
ビューとテーブルの違い
文法 | 実際に物理的なスペースを占めるかどうか | 使用する | |
---|---|---|---|
見る | ビューを作成する | SQLのロジックを保存するだけ | 追加、削除、変更、チェック、実際にはクエリのみを使用します |
テーブル | テーブルを作成する | 保存したデータ | 追加、削除、変更 |
ビューの利点
-
実装の詳細を知らなくても、複雑なSQL操作を簡素化
-
元のテーブルを分離します。これにより、ビューを使用しているユーザーが元のテーブルに触れないようにして、元のデータを保護し、セキュリティを向上させることができます。
テストデータを準備する
個人ブログに載せたテストデータがたくさんあります。
ブラウザでリンクを開きます:http://www.itsoku.com/article/209
mysqlでjavacode2018_employeesライブラリパーツのスクリプトを実行します。
次のように、javacode2018_employeesライブラリと5つのテーブルが正常に作成されました。
テーブル名 | 解説 |
---|---|
部署 | 部門テーブル |
従業員 | 従業員情報フォーム |
仕事 | 求人情報フォーム |
場所 | 場所テーブル(部門テーブルで使用されます) |
job_grades | 給与スケール |
ビューを作成
文法
create view 视图名
as
查询语句;
ビューを使用する手順
-
ビューを作成
-
ビューでクエリ操作を実行する
事例1
従業員の名前、部門、および名前に文字を含む勤務情報の種類を照会する
/*案例1:查询姓名中包含a字符的员工名、部门、工种信息*/
/*①创建视图myv1*/
CREATE VIEW myv1
AS
SELECT
t1.last_name,
t2.department_name,
t3.job_title
FROM employees t1, departments t2, jobs t3
WHERE t1.department_id = t2.department_id
AND t1.job_id = t3.job_id;
/*②使用视图*/
SELECT * FROM myv1 a where a.last_name like 'a%';
効果は次のとおりです。
mysql> SELECT * FROM myv1 a where a.last_name like 'a%';
+-----------+-----------------+----------------------+
| last_name | department_name | job_title |
+-----------+-----------------+----------------------+
| Austin | IT | Programmer |
| Atkinson | Shi | Stock Clerk |
| Ande | Sal | Sales Representative |
| Abel | Sal | Sales Representative |
+-----------+-----------------+----------------------+
4 rows in set (0.00 sec)
上記のビューmyv1を作成しました。従業員の名前、部門、仕事の種類の情報を確認する必要がある場合、ビューがどのように見えるかを気にする必要はありません。ビューをクエリするだけで済みます。SQLははるかに単純です。
事例2
ケース2:各部門の平均給与レベルを照会する
/*案例2:查询各部门的平均工资级别*/
/*①创建视图myv1*/
CREATE VIEW myv2
AS
SELECT
t1.department_id 部门id,
t1.ag 平均工资,
t2.grade_level 工资级别
FROM (SELECT
department_id,
AVG(salary) ag
FROM employees
GROUP BY department_id)
t1, job_grades t2
WHERE t1.ag BETWEEN t2.lowest_sal AND t2.highest_sal;
/*②使用视图*/
SELECT * FROM myv2;
効果:
mysql> SELECT * FROM myv2;
+----------+--------------+--------------+
| 部门id | 平均工资 | 工资级别 |
+----------+--------------+--------------+
| NULL | 7000.000000 | C |
| 10 | 4400.000000 | B |
| 20 | 9500.000000 | C |
| 30 | 4150.000000 | B |
| 40 | 6500.000000 | C |
| 50 | 3475.555556 | B |
| 60 | 5760.000000 | B |
| 70 | 10000.000000 | D |
| 80 | 8955.882353 | C |
| 90 | 19333.333333 | E |
| 100 | 8600.000000 | C |
| 110 | 10150.000000 | D |
+----------+--------------+--------------+
12 rows in set (0.00 sec)
ビューを変更
方法1
ビューが存在する場合は変更し、存在しない場合は新しいビューを作成します。
create or replace view 视图名
as
查询语句;
例
CREATE OR REPLACE VIEW myv3
AS
SELECT
job_id,
AVG(salary) javg
FROM employees
GROUP BY job_id;
方法2
alter view 视图名
as
查询语句;
例
ALTER VIEW myv3
AS
SELECT *
FROM employees;
ビューを削除
文法
drop view 视图名1 [,视图名2] [,视图名n];
複数のビューを同時に削除でき、複数のビュー名はコンマで区切られます。
例
mysql> drop view myv1,myv2,myv3;
Query OK, 0 rows affected (0.00 sec)
クエリビューの構造
/*方式1*/
desc 视图名称;
/*方式2*/
show create view 视图名称;
といった:
mysql> desc myv1;
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| last_name | varchar(25) | YES | | NULL | |
| department_name | varchar(3) | YES | | NULL | |
| job_title | varchar(35) | YES | | NULL | |
+-----------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> show create view myv1;
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| myv1 | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `myv1` AS select `t1`.`last_name` AS `last_name`,`t2`.`department_name` AS `department_name`,`t3`.`job_title` AS `job_title` from ((`employees` `t1` join `departments` `t2`) join `jobs` `t3`) where ((`t1`.`department_id` = `t2`.`department_id`) and (`t1`.`job_id` = `t3`.`job_id`)) | utf8 | utf8_general_ci |
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
show create viewは、ビュー作成ステートメントを示します。
ビューの更新[基本的には使用されません]
ビューの更新は、ビューのデータを変更することであり、ビューのSQLロジックを変更することではありません。
ビューが更新されると、元のテーブルのデータも更新されます。
元のテーブルのデータが更新されないようにするために、ビューに読み取り専用権限を追加して、ビューのみの読み取りを許可し、ビューの更新は許可しないようにすることができます。
通常の状況では、ビューが更新されることはほとんどありません。
例
CREATE OR REPLACE VIEW myv4
AS
SELECT last_name,email
from employees;
/*插入*/
insert into myv4 VALUES ('路人甲Java','[email protected]');
SELECT * from myv4 where email like 'javacode2018%';
/*修改*/
UPDATE myv4 SET last_name = '刘德华' WHERE last_name = '路人甲Java';
SELECT * from myv4 where email like 'javacode2018%';
/*删除*/
DELETE FROM myv4 where last_name = '刘德华';
SELECT * from myv4 where email like 'javacode2018%';
注:通常、ビューの更新は使用しません。理解してください。