Mysql の高度なステートメント (ビュー テーブル、ストアド プロシージャ、条件ステートメント、ループ ステートメント)

1. ビューの作成(ビュー)

1.1. ビューテーブルの概要

 可以被当作是虚拟表或存储查询
  • ビューとテーブルの違いは、テーブルは実際にデータを格納するのに対し、ビューはテーブル上に構築された構造であり、実際にはデータ自体を格納しないことです。

  • ユーザーが終了するかデータベースとの接続が切断されると、一時テーブルは自動的に消えますが、ビューは消えません。

  • ビューにはデータは含まれず、その定義のみが保存されます。その目的は通常、複雑なクエリを簡素化することです。たとえば、複数のテーブルを接続してクエリを実行し、統計的な並べ替えなどの操作を実行したい場合、SQL ステートメントを記述するのは非常に面倒ですが、ビューを使用して複数のテーブルを接続し、そのビューに対してクエリを実行することは同じです。テーブルのクエリと同じで、非常に便利です。

1.2. ビューテーブルは変更できますか? (インタビューの質問)

视图表保存的是select语句的定义,视图表的表数据能否修改,视情况而定。
如果 select 语句查询的字段是没有被处理过的源表字段,则可以通过视图表修改源表数据;
如果select 语句查询的字段是被 group by语句或 函数 处理过的字段,则不可以直接修改视图表的数据。
#例子

create view v_store_info as select store_name,sales from laozi;

update laozi set sales=1000 where store_name='Houston';

ここに画像の説明を挿入します

create view v_sales as select store_name,sum(sales) from laozi group by store_name having sum(sales)>1000;

update v_sales set store_name='xxxx' where store_name='Los Angeles';

ここに画像の説明を挿入します

1.3. 基本的な構文

1.3.1. 作成

语法
create view "视图表名" as "select 语句";
#例子

create view v_region_sales as select a.region region,sum(b.sales) sales from location a 
inner join store_info b on a.store_name = b.store_name group by region;

ここに画像の説明を挿入します

1.3.2. 表示

语法
select * from 视图表名;
#例子
select * from v_region_sales;

ここに画像の説明を挿入します

1.3.3. 削除

语法
drop view 视图表名;
#例子
drop view v_region_sales;

ここに画像の説明を挿入します

1.4. ビューテーブルを通じて非交差値を見つける

2 つのテーブル内の特定のフィールドの一意の値をマージします。これらの値は 1 回だけ (カウント =1) 出現します。つまり、交差はありません。

create view 视图表名 as select distinct 字段 from 左表 union all select distinct 字段 from 右表;

select 字段 from 视图表名 group by 字段 having count(字段)=1;
#先建立视图表
create viem v_union as select distinct store_name from location union all select distinct store_name from store_info;

ここに画像の説明を挿入します

#再通过视图表求无交集
select store_name from v_union group by store_name having count(*)=1;

ここに画像の説明を挿入します

2. ケースステートメント

  • MySQLでは、与えられた条件に基づいてデータの条件判定や分岐選択を行うためにCASE文を使用します。

  • SELECT、UPDATE、DELETE ステートメントで使用できるほか、式でも使用できます。

语法
select case ("字段名")
  when "条件1" then "结果1"
  when "条件2" then "结果2"
  ...
  [else "结果n"]
  end
from "表名";

# "条件" 可以是一个数值或是公式。 else 子句则并不是必须的。

#举个例子
select store_name, case store_name 
  when 'los angeles' then sales * 2 
  when 'boston' then 2000
  else sales 
  end 
'new sales',date 
from store_info;

#将'sales的值作为new sales的值返回

ここに画像の説明を挿入します

3. ナル値(null)と値なし(' ')の違い

  • NULL 値の長さは 0 でスペースを占有しません。NULL 値の長さは NULL でスペースを占有します。

  • is null または is not null は、フィールドが null か非 null かを判断するために使用されます。

  • 値なしの判定は =' ' または <>' ' で処理されます。<> と != は等しくないことを表します。

  • count() を使用してフィールドの行数を指定する場合、NULL 値は自動的に無視され、計算のためにレコードに値は追加されません。

4. 正規表現

4.1. 基本的な構文と一致パターン

一致パターンでは大文字と小文字が区別されません

一致パターン 説明する
^ テキストの開始文字と一致します '^bd' は bd で始まる文字と一致します
$ テキストの末尾の文字と一致します 「qn$」は qn で終わる文字列と一致します
任意の 1 文字と一致します 「s.t」は、s と t の間に 1 文字を含む任意の文字列と一致します。
* 先行する 0 個以上の文字と一致します 'fo*t' は、任意の数の o が先行する t と一致します。
+ 前の文字と 1 回以上一致します 「hom+」は、ho で始まり、その後に少なくとも 1 つの m が続く文字列と一致します。
指定された文字列と一致します 「clo」は clo を含む文字列と一致します
p1p2 p1 または p2 'bg に一致 fg' は bg または fg に一致します
[…] 文字セット内の任意の文字と一致します '[abc]' は a、b、または c に一致します
[^…] 括弧で囲まれていない任意の文字と一致します [^ ab] は、a または b を含まない文字列と一致します。
{n} 前の文字列と n 回一致します 'g{2}' は 2 つの g を含む文字列と一致します
{n,m} 前の文字列と少なくとも n 回、最大で m 回一致します 'f{1,3}' は f に少なくとも 1 回、最大 3 回一致します

4.2. 例

select * from store_info where store_name regexp '^[a-g]';

ここに画像の説明を挿入します

select * from store_info where store_name regexp 'Hou+';

ここに画像の説明を挿入します

select * from store_info where store_name regexp 'os';

ここに画像の説明を挿入します

select * from store_info where store_name regexp 'ho|bo';

select * from store_info where store_name regexp 'Ho|Bo';

ここに画像の説明を挿入します

select * from store_info where store_name regexp 'b{1}';

ここに画像の説明を挿入します

5. ストアド プロシージャ

ストアド プロシージャはデータベース スクリプト (MySQL スクリプト、SQL スクリプト) とも呼ばれます。

5.1. はじめに

  • ストアド プロシージャは、特定の機能を実行するために設計された一連の SQL ステートメントです。

  • ストアドプロシージャを使用する場合、一般的な作業や複雑な作業を事前にSQL文で記述し、指定した名前で保存し、そのプロセスをコンパイルおよび最適化してデータベースサーバーに保存します。このストアド プロシージャを使用する必要がある場合は、それを呼び出すだけです。ストアド プロシージャは、従来の SQL よりも高速かつ効率的に実行されます。

5.2. ストアドプロシージャの利点

1. 生成されたバイナリコードは一度実行するとバッファに常駐するため、実行効率が向上します
2. SQL文と制御文の集合体で柔軟性が高い
3. サーバ側に格納され、呼び出し時のネットワーク負荷が軽減されます4.クライアント呼び出しに
影響を与えることなく、複数回呼び出すことができ、いつでも変更できます
5. すべてのデータベース操作を完了でき、データベースの情報アクセス権も制御できます

5.3. ストアドプロシージャを作成する手順

1) SQL ステートメントのターミネータ (;——>$$、## などのカスタム記号) を一時的に変更します。

2) ストアド プロシージャを作成します。

3) SQL ステートメントの終了文字を;; に戻します。

4) ストアド プロシージャを呼び出します。

5.4. 関連コマンド

5.4.1. 作成

delimiter $$							
#将语句的结束符号从分号;临时改为两个$$(可以是自定义)
create procedure proc()					
#创建存储过程,过程名为proc,不带参数
-> begin								
#过程体以关键字 begin 开始
-> select * from store_info;			
#过程体语句
-> end $$								
#过程体以关键字 end 结束
delimiter ;								
#将语句的结束符号恢复为分号

delimiter $$							
create procedure proc()					
-> begin
->.....(要执行的命令)
-> select * from store_info;			
-> end $$								
delimiter ;								

#举个例子

delimiter $$ 
use nba
create procedure proc1()
begin
create table xxxx (id int,name varchar(10),pid int,age int);
insert into xxxx values (1,'xx',11,111);
insert into yyyy values (2,'yy',22,222);
insert into zzzz values (3,'zz',33,333);
select * from xxxx;
end $$
delimiter ;

ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.4.2. 電話をかける

call 存储过程名;

ここに画像の説明を挿入します

5.4.3. 表示

show create procedure [数据库.]存储过程名;		
#查看某个存储过程的具体信息

show create procedure 存储过程名\G;

show procedure status [like '%存储过程名%'] \G;

ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.4.4. 削除

  • ストアド プロシージャの内容を変更するには、元のストアド プロシージャを削除し、同じ名前で新しいストアド プロシージャを作成します。

  • ストアド プロシージャの名前を変更する場合は、まず元のストアド プロシージャを削除してから、別の名前で新しいストアド プロシージャを作成します。

基本语法
drop procedure if exists 存储过程名;		
#仅当存在时删除
#不添加 if exists 时,如果指定的过程不存在,则报错

ここに画像の説明を挿入します

5.5. ストアドプロシージャのパラメータ

パラメータ 関数
入力パラメータ
出力パラメータ
inout 入力および出力パラメータ これは、呼び出し元がプロセスに値を渡すことを意味し、プロセスが呼び出し元に値を渡すことも意味します (値は変数のみにすることができ、受信値と送信値は同じデータ型である必要があります)
  in
delimiter $$				
create procedure proc1(in inname char(16))		
-> begin					
-> select * from store_info where store_name = inname;
-> end $$					
delimiter ;					

call proc1('boston');

#inname为自定义变量名

ここに画像の説明を挿入します

out
基本格式

delimiter $$
create procedure 存储过程名(in 传入参数名 传入参数数据类型,out 传出参数名 传出参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=传入参数名;
end $$
delimiter ;

call 存储过程名(参数值,@变量名)
#传出参数的值只能用变量获取

#举个例子

delimiter $$
mysql> create procedure proc1(in myname char(10), out outname int)
    -> begin
    -> select sales into outname from store_info where store_name = myname
    -> end $$
delimiter ;
#建一个名为 proc1 的存储过程
#存储过程接收一个字符参数 myname,并将与其匹配的 store_info 表中的 sales 值存储到一个整数参数 outname 中

call proc1('Houston', @xxx);
select @xxx;

ここに画像の説明を挿入します

inout
基本格式

delimiter $$
create procedure 存储过程名(into 参数名 参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=参数名;
end $$
delimiter ;

set @变量名 传入值
#变量赋值,传入值
call 存储过程名(@变量名)
#传入传出参数的值只能用变量
select @变量名
#此时变量内容应该为传出值

delimiter $$
create procedure proc4(inout insales int)
-> begin
-> select count(sales) into insales from store_info where sales < insales;
-> end $$
delimiter ;
set @inout_sales=1000;
call proc4(@inout_sales);
select @inout_sales;

#创建了一个名为 proc4 的存储过程
#存储过程接受一个输入输出参数 insales,并通过查询 store_info 表获取 sales 值小于 insales 的记录数量,并将结果存储到参数 insales 中。
#通过 call 语句调用该存储过程,并使用 select 语句查看存储在变量 @inout_sales 中的值。

ここに画像の説明を挿入します

5.6. ストアドプロシージャの制御文

create table t (id int(10));
insert into t values(10);

5.6.1. 条件文 if-then-else ・・・ end if

5.6.1 条件语句if-then-else ···· end if
delimiter $$  
create procedure proc3(in pro int)  
-> begin 
-> declare var int;  
-> set var=pro*2;   
-> if var>=10 then 
-> update t set id=id+1;  
-> else 
-> update t set id=id-1;  
-> end if;  
-> end $$

delimiter ;

call proc3(6);
#pro=6

ここに画像の説明を挿入します

5.6.2. ループ文 while ・・・ end while

while 条件表达式
do
  SQL语句序列
  set 条件迭代表达式;
end while;

delimiter $$  
create procedure proc3()
-> begin 
-> declare var int(10);  
-> set var=0;  
-> while var<6 do  
-> insert into t values(var);  
-> set var=var+1;  
-> end while;  
-> end $$  

delimiter ;

call proc3;

例子
创建一张表

id name

1 student1

…

一万行数据
delimiter $$  
create procedure proc4()
begin 
declare i int;
set i=1;
create table xx(id int ,name varchar(20))
while i<=10000 do  
insert into xx values(i,concat('student',i));  
set i=i+1;  
end while;  
end $$  

delimiter ;

call proc4;

ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/fyb012811/article/details/133317170