この記事の出所:GitHubにはこちらをクリック・ || GitEEは・こちらをクリック
まず、ストアドプロシージャ
1、概念の紹介
ストアドプロシージャの名前を呼び出すことができ、ユーザによって実行されるSQL文、保存された作成され、コンパイルされたデータベースに保存されている、の組み合わせは、サーバプログラムに格納されます。核となるアイデアは、ストアドプロシージャやSQLデータベース言語の再利用性のレベルをパッケージ化することです。ストアドプロシージャを使用すると、以下の業務アプリケーションシステムの複雑することができますが、データベース・サーバ・システムの負荷が増加します、我々は、統合サービスを使用するときに考慮する必要があります。
2、基本的な構文
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
- ケースI:消費者向け割引の計算
-- 创建存储过程
DROP PROCEDURE IF EXISTS p01_discount ;
CREATE PROCEDURE p01_discount(IN consume NUMERIC(5,2),OUT payfee NUMERIC(5,2))
BEGIN
-- 判断收费方式
IF(consume>100.00 AND consume<=300.00) THEN
SET payfee=consume*0.8;
ELSEIF (consume>300.00) THEN
SET payfee=consume*0.6;
ELSE
SET payfee = consume;
END IF;
SELECT payfee AS result;
END ;
-- 调用存储过程
CALL p01_discount(100.0,@discount);
- ケースII:While..Doの書き込みデータ
提供一张数据表
CREATE TABLE `t03_proced` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`temp_name` varchar(20) DEFAULT NULL COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='触发器写数据';
存储程序
渡されたパラメータは、t03_procedテーブル書き込まれたデータの数を決定します。
DROP PROCEDURE IF EXISTS p02_batch_add ;
CREATE PROCEDURE p02_batch_add(IN count INT(11))
BEGIN
DECLARE temp int default 0;
WHILE temp < count DO
INSERT INTO t03_proced(temp_name) VALUES ('pro_name');
SET temp = temp+1 ;
END WHILE;
END ;
-- 测试:写入10条数据
call p02_batch_add(10);
3ノート
- ビジネスシーン
実際の開発でのストアドプロシージャのアプリケーションは、非常に大規模な多くの場合、複雑なビジネス・シナリオは、アプリケーションレベルで開発されていない、あなたはより良いメンテナンスと最適化を管理することができます。
- 実行速度
単純なシナリオでは、単一のデータテーブルが書き込まれている場合、書き込みに基づくアプリケーション、またはクライアントデータベース接続を書き込み、メモリ書き込み処理の速度と比較してはるかに遅くなり、記憶処理は、主に、通信ネットワークはありませんオーバーヘッド、オーバーヘッドの解析、オーバーヘッドと他のオプティマイザ。
二、MySQLのビュー
1、基本的な考え方
ビュー自体は、仮想テーブルで、任意のデータを格納しません。ビューにアクセスするためのSQL文を使用する場合は、MySQLのデータへのアクセスは、同じ名前空間内の他のテーブル、ビュー、およびテーブルから生成されます。ビューのクエリデータが構造に応じて、比較的安全であり、データの一部を非表示にすることができますので、ユーザーは権利の範囲内のデータのみを参照することを、理解して使用することが簡単に複雑なクエリを作ります。
2、ビューの使い方
ユーザーと注文管理プレゼンテーションビューに基づいて今の基本的な使い方。
- 基礎となるテーブル構造
CREATE TABLE v01_user (
id INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
user_name VARCHAR(20) DEFAULT NULL COMMENT '用户名',
phone VARCHAR(20) DEFAULT NULL COMMENT '手机号',
pass_word VARCHAR(64) DEFAULT NULL COMMENT '密码',
card_id VARCHAR(18) DEFAULT NULL COMMENT '身份证ID',
pay_card VARCHAR(25) DEFAULT NULL COMMENT '卡号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户表';
CREATE TABLE v02_order (
id INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
user_id INT(11) NOT NULL COMMENT '用户ID',
order_no VARCHAR(32) DEFAULT NULL COMMENT '订单编号',
good_name VARCHAR(60) DEFAULT NULL COMMENT '商品名称',
good_id INT(11) DEFAULT NULL COMMENT '商品ID',
num INT(11) DEFAULT NULL COMMENT '购买数量',
total_price DECIMAL(10,2) DEFAULT NULL COMMENT '总价格',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '订单表';
- 基本的な構文
CREATE OR REPLACE VIEW view_name
AS select_statement
注意:データベースのテーブルとビューは、したがって、同じ名前空間を共有し、同じ名前のデータベーステーブルとビューを含めることはできません。
- ビューの顧客の注文
CREATE OR REPLACE
VIEW user_order_view AS SELECT
t1.id,t1.user_name,t2.order_no,t2.good_id,
t2.good_name,t2.num,t2.total_price
FROM v01_user t1
LEFT JOIN v02_order t2 ON t2.user_id = t1.id;
- ビューの呼び出し
ここではとMySQLのクエリテーブルを使用すると、検索条件の様々なを使用することができ、基本的に同じです。
SELECT * FROM user_order_view WHERE user_name='Cicada';
- ビュービュー
SHOW CREATE VIEW user_order_view ;
- 変更ビュー
ALTER VIEW view_name AS select_statement ;
- [削除]を表示
DROP VIEW [IF EXISTS] view_name ;
3、ビューの更新
指定された条件が許す場合には、ビューの更新に操作することにより、削除、さらには書き込みデータ、及びその後関与する関連テーブルのビューが更新されます。
UPDATE user_order_view SET user_name='smile' WHERE id='1';
更新操作を行うことにより、ビューをここで、[更新v01_user
テーブルデータを。集約関数は定義、グループ化、およびその他の特殊な操作を表示した場合、それを更新することはできません。MySQLはビュー上のトリガの作成をサポートしていません。
4、ビューの実現
- 一時テーブルアルゴリズム
SQLサーバは、構造およびテーブルの一時的なフィールド構造と一貫性のあるビューを一時テーブルに保存されたクエリデータを表示しますが、これは操作のほとんどタブーのSQLクエリの最適化で、データの量が少し大きすぎる、それは真剣にパフォーマンスに影響を及ぼします。ビューは、テーブルと元の間に1つのマッピングを生成することができない場合、それは、それもビューは非常に単純ではないことを示し、でも非常に複雑な機能を一時テーブルを生成します。
- マージアルゴリズム
最終的に合併がクライアントに返された後、サーバーベースのテーブルビューは、クエリ、クエリ構造を実行するために使用されます。
- 差分法
次のクエリを実行し、性能パラメータを行うことができます分析します。
EXPLAIN SELECT * FROM user_order_view ;
クエリ結果がで観察されたselect_type
ことがある場合、フィールドDERIVED
、一時テーブルを使用します。再説明部分の最適化分析を行うためにここにSQL構文バック。
5ノート
- パフォーマンスの問題
MySQLは、クエリのパフォーマンスは、多くの問題を引き起こす可能性がある場合は、ビューを使用し、ビューにインデックスの作成をサポートしていない、慎重に、マルチアングルを見て、テストする時間を使用することをお勧めします。
- 特別な使い方
ビューベースのクエリは、あなたがテーブル構造の一部を変更することができ、視野で使用されていない場合、それは、クエリビューには影響しません。
第三に、送信元アドレス
GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base