データベース操作の基礎#
1 - データベースの操作#
1.1 データベースの表示#
show databases;
1.2 データベースの作成#
create database [if not exists] `データベース名` [文字コード];
注意:
- 作成したデータベースが既に存在する場合はエラーが発生するため、データベースを作成する際には存在を確認する必要があります;
- データベース名がキーワードや特殊文字の場合はエラーが発生するため、特殊文字やキーワードの行にバッククォートを付ける必要があります;
1.3 データベースの削除#
drop database [if exists] データベース名;
1.4 データベース作成の SQL 文を表示#
show create database データベース名;
1.5 データベースの変更#
データベースの文字コードを変更:
alter database データベース名 charset=文字コード;
1.6 データベースの選択#
use データベース名;
2 - テーブルの操作#
2.1 すべてのテーブルを表示#
show tables;
2.2 テーブルの作成#
create table [if not exists] テーブル名(
カラム名 データ型 [null|not null] [auto_increment] [primary key] [comment]
カラム名 データ型 [default]
)engine=ストレージエンジン
単語 | 意味 | |
---|---|---|
null | not null | 空|非空 |
default | デフォルト値 | |
auto_increment | 自動増分 | |
primary key | 主キー | |
comment | コメント | |
engine | エンジン(innodb, myisam, memory) |
簡単なテーブルを作成:
create table stu(
id int,
name varchar(30)
);
複雑なテーブルを作成:
# 中国語を含む場合
set names gbk;
# 複雑なテーブルを作成
create table if not exists teacher(
id int auto_increment primary key comment '主キー',
name varchar(20) not null comment '名前',
phone varchar(20) comment '電話番号',
address varchar(100) default '住所不詳' comment '住所'
)engine=innodb;
ヒント: データベース名.テーブル名
を使用すると、他のデータベースにテーブルを作成できます。
2.3 テーブル作成の文を表示#
show create table テーブル名 [\G];
2.4 テーブル構造の確認#
desc[ribe] テーブル名;
2.5 テーブルの削除#
drop table [if exists] テーブル1,テーブル2,...;
2.6 テーブルの変更#
alter table テーブル名
- カラムの追加
alter table テーブル名 add [column] カラム名 データ型 [位置];
位置:
first
:最初に追加after
:xx カラムの後に追加
- カラムの削除
alter table テーブル名 drop [column] カラム名;
- カラムの変更(名前と型)
alter table テーブル名 change カラム名 新カラム名 データ型...
- カラムの変更(名前を変更しない)
alter table テーブル名 modify カラム名 カラム属性...
- エンジンの変更
alter table テーブル名 engine=エンジン名;
- テーブル名の変更
alter table テーブル名 rename to 新テーブル名;
2.7 テーブルのコピー#
create table テーブル名 select カラム from 旧テーブル
特徴:親テーブルの主キーをコピーできず、親テーブルのデータのみをコピーします。
create table 新テーブル like 旧テーブル
特徴:テーブル構造のみをコピーし、テーブルデータはコピーできません。
3 - データ操作#
3.1 データの挿入#
単一データの挿入
insert into テーブル名 (カラム1,カラム2,...) values (値1,値2,...);
- 一部のカラムを挿入できますが、非空カラムは必ず挿入する必要があります。
- 自動増分カラムは挿入する必要がなく、データベースが自動的に増分された数字を挿入します。
- 自動増分カラムの値には null を挿入すればよいです。
- 挿入する値の順序と数はテーブルカラムの順序と数と一致し、挿入するカラムは省略可能です。
- default を使用してデフォルト値を挿入できます。
複数データの挿入
insert into テーブル名 values (値1,値2,...),(値1,値2,...),...;
3.2 データの更新#
update テーブル名 set カラム=値 [where 条件]
3.3 データの削除#
delete from テーブル名 [where 条件]
3.4 テーブルのクリア#
truncate table テーブル名
**delete from テーブル**
と**truncate table テーブル**
の違い:
delete from テーブル
:テーブルのレコードを一つずつ削除します;
truncate table テーブル
:元のテーブルを破壊し、同じ構造の新しいテーブルを作成するため、テーブルをクリアする際にはこの方法が効率的です;
3.5 クエリ文(単一テーブルのクエリ)#
構文:select [オプション] カラム名 [from テーブル名] [where 条件] [order by ソート] [group by グループ] [having 条件][limit 制限]
3.5.1 カラム式#
as
を使用してエイリアスを取得できます(as は省略可能です)。
3.5.2 from 文#
from
の後にデータソースが続き、データソースは複数指定でき、デカルト積を返します。
3.5.3 dual テーブル#
dual テーブルは擬似テーブルです。特定の状況では、具体的なテーブルが参加しない場合でも、select 文の完全性を保証するためにテーブル名が必要な場合に擬似テーブルを使用します。
3.5.4 where 句#
MySQL がサポートする演算子:>, <, >=, <=, =, !=, and, or, not
Where の後には条件文が続き、条件が真のレコードを返します。
3.5.5 in|not in#
複数条件のクエリは in 文を使用して実現できます:
select * from stu where stuadress in ('北京','上海');
3.5.6 between...and|not between...and#
特定の範囲のレコードを検索:
select * from stu where stuage between 18 and 20;
3.5.7 is null|is not null#
空であるかどうかを判断:
select * from stu where ch is null;
3.5.8 集約関数#
sum()
:合計avg()
:平均max()
:最大値min()
:最小値count()
:レコード数
3.5.9 ワイルドカード#
- _ [アンダースコア] は任意の1 つの文字を示します。
- % は任意の文字を示します。
3.5.10 あいまい検索(like)#
学生テーブルから姓が張の学生を検索:
select * from stu where stuname like '張_'
3.5.11 order by ソート#
- ASC:昇順【デフォルト】
- DESC:降順
- 複数列のソート:
# 年齢昇順、成績降順
select *,(ch+math) as '総合点' from stu order by stuage asc,(ch+math) desc;
3.5.12 group by [グループクエリ]#
クエリ結果をグループ化し、グループクエリの目的はデータを集計することです。
# 性別でグループ化し、各グループの平均年齢を表示
select avg(stuage) as '平均年齢',stusex from stu group by stusex;
注意:
- グループクエリの場合、クエリフィールドはグループフィールドと集約関数でなければなりません;
- クエリフィールドは通常のフィールドであり、グループの最初の値のみを取得します;
group_concat()
関数を使用して同じグループの値を連結して表示できます。- グループ化後の構造はデフォルトで昇順に並べられ、desc を使用して降順に並べることができます(直接 desc を追加)。
複数列のグループ化:
# 性別と地域でグループ化し、各グループの平均年齢を表示
select stuaddress,stusex,avg(stuage) as '平均年齢'
3.5.13 having 条件#
where と having の違い:
where は元のデータをフィルタリングし、having は結果セットをフィルタリングします。
3.5.14 limit#
構文:limit 開始位置,表示長さ
注意:
- 開始位置は省略可能で、デフォルトは 0 から始まります。
- limit は update と delete 文でも使用できます。
3.5.15 クエリ文のオプション#
クエリ文のオプションは 2 つあります:
all
:すべてのデータを表示【デフォルト】distinct
:結果セット内の重複データを除去します。
3.6 クエリ文(複数テーブルのクエリ)#
3.6.1 内部結合【inner join】#
# 構文1:
select カラム名 from テーブル1 inner join テーブル2 on テーブル1.共通フィールド=テーブル2.共通フィールド;
# 構文2:
select カラム名 from テーブル1,テーブル2 where テーブル1.共通フィールド=テーブル2.共通フィールド;
注意:共通フィールドを表示する場合は、必ずテーブル名を指定する必要があります。
3.6.2 左外部結合 【left join】#
左側のテーブルを基準とし、右側のテーブルに対応するレコードがない場合は null で結果を埋めます。
select カラム名 from テーブル1 left join テーブル2 on テーブル1.共通フィールド=テーブル2.共通フィールド;
3.6.3 右外部結合 【right join】#
右側のテーブルを基準とし、左側のテーブルに対応するレコードがない場合は null で結果を埋めます。
select カラム名 from テーブル1 right join テーブル2 on テーブル1.共通フィールド=テーブル2.共通フィールド;
3.6.4 クロス結合 【cross join】#
- 結合式がない場合はデカルト積を返します。
- 結合式がある場合は内部結合と同等です。
3.6.5 自然結合 【natural】#
自動的に結合条件を判断し、同名フィールドを使用して判断します。
自然結合には以下があります:
- 自然内部結合:
natural join
- 自然左外部結合:
natural left join
- 自然右外部結合:
natural right join
自然結合の結論:
- テーブルは同名のフィールドを使用して結合します。
- 同名のフィールドがない場合はデカルト積を返します。
- 結果を整理し、整理のルールは以下の通りです。
- 結合フィールドは 1 つ保持します。
- 結合フィールドは最前面に配置します。
3.6.6 using()#
- 結合フィールドを指定するために使用します。
using()
も結合フィールドを整理し、整理ルールは自然結合と同じです。
3.7 サブクエリ#
3.7.1 1 つの戻り値のみ#
構文:
select 文 where 条件 (select ... from テーブル)
- 外側のクエリは親クエリと呼ばれ、括弧内のクエリはサブクエリと呼ばれます。
- サブクエリは親クエリにクエリ条件を提供します。
=
はサブクエリが 1 つの値を返す場合にのみ適用されます。
3.7.2 in|not in サブクエリ#
サブクエリが複数の値を返す場合に使用します。
3.7.3 exists|not exists#
# 学生の筆記試験の成績が80を超える場合、すべての学生を表示
select * from stuinfo where exists(select * from stumarks where writtenexam>=80);
3.7.4 サブクエリの分類#
- スカラーサブクエリ:サブクエリが返す結果は 1 つです。
- 列サブクエリ:サブクエリが返す結果はリストです。
- 行サブクエリ:サブクエリが返す結果は 1 行です。
- 例題:成績が最も高い男の子と女の子を検索
select stuname,stusex,ch from stu where (stusex,ch) in (select stusex,max(ch) from stu group by stusex);
- テーブルサブクエリ:サブクエリが返す結果をテーブルとして扱います。
- 注意:サブクエリをテーブルとして扱う場合、必ずエイリアスを付ける必要があります。
3.8 union#
3.8.1 union の使用#
目的:複数の select 文の結果セットを縦に結合します。
select 文 union [オプション] select 文 union [オプション] select 文
3.8.2 union のオプション#
- all:すべてのデータを表示
- distinct:重複データを除去します【デフォルト】。
3.8.3 union の注意事項#
- union の両側の select 文のカラム数は一致する必要があります。
- union の両側の select 文のカラム名は一致しなくてもよく、最終的には最初の select 文のカラム名が使用されます。
- union の両側の select 文のデータ型は一致しなくてもよいです。
4 - SQL の分類#
DDL(データ定義言語)データベース定義言語 CREATE、ALTER、DROP
DML(データ操作言語)データ操作言語 SELECT、UPDATE、INSERT、DELETE
DCL(データ制御言語)データベース制御言語で、データベースユーザーまたはロールの権限を設定または変更するための文です。
5 - データテーブルのファイル紹介#
- 1 つのデータベースは 1 つのフォルダに対応します。
- 1 つのテーブルは 1 つ以上のファイルに対応します。
- myisam:1 つのテーブルは 3 つのファイルに対応します(テーブル構造、テーブルデータ、テーブルインデックス)。
- innodb:1 つのテーブルは 1 つのテーブル構造ファイルに対応します。
6 - 文字セット#
文字セット:文字が保存および転送される際に対応するバイナリコーディングの集合です。
set names 文字セットコーディング
列属性とデータの完全性#
1 - データ型#
1.1 データ型 —— 値型#
1.1.1 整数型
タイプ | バイト | 範囲 |
---|---|---|
tinyint | 1 | -128~127 |
smallint | 2 | -32768~32767 |
mediumint | 3 | -8388608~8388607 |
int | 4 | -231~231-1 |
bigint | 8 | -263~263-1 |
注意:
- 符号なし整数(unsigned)は負の数がなく、整数部分は符号付きの 2 倍です。
- 整数型は表示幅(最小表示桁数)をサポートしており、例えば
int(5)
の場合、数値の桁数が 5 桁未満であれば、前に先頭の 0 を追加します(zerofill
と組み合わせて効果を発揮します)。
1.1.2 浮動小数点型(近似値小数を保存)
タイプ | バイト | 範囲 |
---|---|---|
float | 4 | -3.4E+38~3.4E+38 |
double | 8 | -1.8E+308~1.8E+308 |
注意:
- 浮動小数点数の宣言:
float(M,D) double(M,D)
- M:総桁数
- D:小数桁数
- 浮動小数点の精度は失われる可能性があります。
1.1.3 固定小数点数
構文:decimal(M, D)
注意:
- 固定小数点数は可変長で、大体 9 桁ごとに 4 バイトを使用して保存されます。固定小数点数が正確な小数を保存できるのは、整数と小数が別々に保存されるためで、リソースの使用量は浮動小数点数よりも多くなります。
- 固定小数点数と浮動小数点数は表示幅と符号なし数をサポートしています。
1.2 データ型 —— 文字型#
データ型 | バイト | 長さ |
---|---|---|
char (長さ) | 固定長 | 最大 255 |
varchar (長さ) | 可変長 | 最大 65535 |
tinytext | 大段テキスト | 255 |
text | 大段テキスト | 65535 |
mediumtext | 大段テキスト | 224-1 |
longtext | 大段テキスト | 232-1 |
注意:
-
char(10)
とvarchar(10)
の違い?共通点:それらは最大 10 文字を保存できます;
相違点:char は余分な文字を回収せず、varchar は余分な文字を回収します;char は効率が高く、スペースを浪費し、varchar はスペースを節約し、効率は char よりも低いです。 -
char の最大長は 255 です。
-
varchar の理論的長さは 65535 です。
1.3 データ型 —— 列挙型(enum)#
特徴:
- MySQL の列挙型は整数で管理され、最初の値は 1、次の値は 2 というように続きます;
- 列挙型には直接数字を挿入できます。
利点:
- 実行速度が速い(数字は文字列よりも計算が速い)。
- データを制限し、データの完全性を保証します。
- スペースを節約します。
1.4 データ型 —— 集合型(set)#
- 集合に挿入する順序は異なりますが、表示の順序は常に同じです。
- 集合に存在しないデータを挿入することはできません。
- 集合の各要素には固定の数字が割り当てられ、左から右に 20, 21, 22... と並びます。
1.5 データ型 —— 日付時間型#
データ型 | バイト |
---|---|
datetime | 日付時間、8 バイトを占有 |
date | 日付、3 バイトを占有 |
time | 時間、3 バイトを占有 |
timestamp | タイムスタンプ、4 バイトを占有 |
year | 年、1 バイトを占有 |
1.6 データ型 ——boolean#
true と false はデータベース内でそれぞれ 1 と 0 に対応します。
データベース設計#
1 - データベースの基本概念#
- 関係:2 つのテーブルの共通フィールド
- 行:レコードとも呼ばれ、エンティティとも呼ばれます。
- 列:フィールドとも呼ばれ、属性とも呼ばれます。
- データ冗長性:同じデータが異なる場所に保存されること。
- データの完全性:正確性 + 正確性 = データの完全性
- 正確性:データ型が正しいこと。
- 正確性:データ範囲が正確であること。
2 - エンティティとエンティティ間の関係#
2.1 一対一#
- 主テーブルの 1 つのレコードが従テーブルの 1 つのレコードに対応します。
- 実現方法:主キーと主キーの関係を確立します。
- 問題:一対一の 2 つのテーブルは完全に 1 つのテーブルで実現できますが、なぜ 2 つのテーブルに分ける必要があるのでしょうか?
- フィールド数が多い場合、毎回のクエリで大量のデータを検索する必要があり、効率が低下します。したがって、すべてのフィールドを「一般的なフィールド」と「あまり使用されないフィールド」に分けることができ、これにより大部分のクエリ者にとって効率が向上します【テーブルの垂直分割】。
2.2 一対多#
- 主テーブルの 1 つのレコードが従テーブルの複数のレコードに対応します。
- 実現方法:主キーと非主キーの関係を確立します。
2.3 多対多#
- 主テーブルの 1 つのレコードが従テーブルの複数のレコードに対応し、従テーブルの 1 つのレコードが主テーブルの複数のレコードに対応します。
- 実現方法:関係を保存するために第 3 のテーブルを作成します。
3 - データベース設計のステップ#
3.1 データベース設計の具体的なステップ#
- 情報収集:システムに関連する人々と交流し、データベースが達成すべきタスクを十分に理解します。
- オブジェクト(エンティティ - Entity)を特定し、データベースが管理すべき重要なオブジェクトまたはエンティティを特定します。
- 各エンティティの属性(Attribute)を特定します。
- オブジェクト間の関係(Relationship)を特定します。
- モデルをデータベースに変換します。
- 正規化します。
3.2 E-R 図(エンティティ関係図)の作成#
E-R 図の構文
符号 | 意味 |
---|---|
矩形 | エンティティ、一般的に名詞 |
楕円形 | 属性、一般的に名詞 |
菱形 | 関係、一般的に動詞 |
3.3 E-R 図をテーブルに変換#
4 - データの正規化#
実践的に、3 つの正規形が最もコストパフォーマンスが高いことが証明されています。
4.1 第一正規形:各列の原子性を確保#
各列が分割できない最小データ単位(最小の原子単位とも呼ばれる)であれば、第一正規形を満たします。
注意:住所に省、市、県、地域が含まれている場合、分割する必要がありますか?
- 住所の役割だけで、統計を取る必要がない場合は分割する必要はありません;地域別に統計を取る機能がある場合は、分割する必要があります。
- 実際のプロジェクトでは、分割することをお勧めします。
4.2 第二正規形:非キーのフィールドはキーのフィールドに依存する必要があります#
ある関係が第一正規形を満たし、主キー以外の他の列がすべてその主キーに依存している場合、第二正規形を満たします。
注意:第二正規形は各テーブルが 1 つの事柄を説明することを要求します。
4.3 第三正規形:伝播依存を排除#
ある関係が第二正規形を満たし、主キー以外の他の列が主キー列に伝播依存しない場合、第三正規形を満たします。
注意:伝播依存は非キーのフィールドには存在できません。
ビュー#
- ビューは仮想テーブルであり、テーブルの一部または複数のテーブルの統合構造を表します。
- ビューはテーブル構造のみであり、テーブルデータはありません。ビューの構造とデータはテーブルに基づいて構築されます。
1 ビューの作成#
構文:
create [or replace] view ビュー名 as select文
注意:ビューはテーブル構造であるため、ビューを作成すると、データベースフォルダ内にビュー名の frm ファイルが作成されます。
2 ビューの構造を確認#
desc ビュー名;
3 ビュー作成の構文を確認#
show create view ビュー名\G;
4 すべてのビューを表示#
show tables;
select table_name from information_schema.views;
show table status where comment='view'\G;
5 ビューの変更#
alter view ビュー名 as select文;
6 ビューの削除#
drop view [if exists] ビュー1,ビュー2...;
7 ビューの役割#
- データをフィルタリングし、許可されていないアクセスから敏感なデータを保護します。
- テーブル構造を隠します。
- SQL 文の複雑さを軽減します。
8 ビューのアルゴリズム#
シナリオ:国語の成績が最も高い男の子と女の子を見つける
select * from (select * from stu order by ch desc)as t group by stusex;
サブクエリをビューにカプセル化できます:
create view vw_stu as select * from stu order by ch desc;
ビューを通じてクエリを実行:
select * from vm_stu group by stusex;
しかし、結果は上記の直接クエリの結果とは異なります。これはビューのアルゴリズムによるものです:
merge
:マージアルゴリズム、ビューの文と外側の文をマージしてから実行します。temptable
:一時テーブルアルゴリズム、ビューを生成して一時テーブルを作成し、外側の文を実行します。undefined
:未定義、MySQL がどのアルゴリズムを使用するかは MySQL によって決定され、一般的にビューは自動的にマージアルゴリズムを使用します。これは効率が高いためです。
解決策:ビューを作成する際にアルゴリズムを指定します。
create algorithm=temptable view ビュー名 as select文;
トランザクション【transaction】#
- トランザクションは分割できない実行単位です。
- トランザクションは全体として一緒に実行されるか、または一緒にロールバックされます。
1 トランザクション操作#
# トランザクションを開始
start transaction または begin [work]
# トランザクションをコミット
commit
# トランザクションをロールバック
rollback
例:銀行の振込
start transaction
update bank set money=money-100 where cardid='1001'
update bank set money=money+100 where cardid='1002';
# エラーが発生した場合:
rollback;
# 成功した場合:
commit;
注意:
- トランザクションは開始時に生成され、トランザクションをコミットまたはロールバックすると終了します;
- innodb と BDB のみがトランザクションをサポートし、myisam はトランザクションをサポートしていません;
2 トランザクションのロールバックポイントを設定#
構文:
# ロールバックポイントを設定
savepoint ロールバックポイント名
# ロールバックポイントにロールバック
rollback to ロールバックポイント
2.3 トランザクションの特性(ACID)#
- 原子性(Atomicity):トランザクションは全体であり、分割できず、一緒に実行されるか、一緒に実行されないかです;
- 一貫性(Consistency):トランザクションが完了したとき、データは一貫した状態でなければなりません;
- 隔離性(Isolation):各トランザクションは相互に隔離されています;
- 永続性(Durability):トランザクションが完了した後、データの変更は永続的です;
インデックス#
利点:クエリ速度が速い
欠点:
- データ操作文の効率が低下します。
- スペースを占有します。
1 インデックスの種類#
- 通常のインデックス
- ユニークインデックス(ユニークキー)
- 主キーインデックス:主キーを作成すると自動的に主キーインデックスが作成され、手動で作成する必要はありません。
- フルテキストインデックス、検索エンジンが使用し、MySQL は中国語のフルテキストインデックスをサポートしていません。sphinx を使用して中国語のフルテキストインデックスを解決します。
2 通常のインデックスの作成#
# インデックス作成方法1
create index インデックス名 on テーブル名(カラム名);
# インデックス作成方法2
alter table テーブル名 add index [インデックス名](カラム名);
# テーブル作成時にインデックスを追加
create table emp(
id int,
name varchar(10),
index ix_name(name) # インデックスを作成
);
3 ユニークインデックスの作成#
構文 1:create unique index インデックス名 on テーブル名(カラム名);
構文 2:alter table テーブル名 add unique [index] [インデックス名](カラム名);
構文 3:テーブル作成時にユニークインデックスを追加するのは、ユニークキーを作成するのと同じです。
4 インデックスの削除#
drop index インデックス名 on テーブル名;
5 インデックス作成の指針#
- 頻繁に検索されるカラム;
- ソートに使用されるカラム;
- 共通フィールドにはインデックスを作成する;
- テーブル内のデータが非常に少ない場合、インデックスを作成する必要はありません。MySQL はインデックスを検索する時間が、データを逐次検索する時間よりも長くなります;
- あるフィールドのデータが 1 つの異なる値しかない場合、そのフィールドはインデックスに適していません。例えば性別など;
組み込み関数#
1 数字関連#
# ランダム数を生成
select rand();
select * from stu order by rand() limit 2; # ランダムに2人の学生を抽出
# 整数化(四捨五入、切り上げ、切り捨て)
select round(数字);
select ceil(数字);
select floor(数字);
# 数字を切り取る
select truncate(数字,切り取る小数桁数);
2 文字列関連#
# 大文字/小文字に変換
select ucase/lcase(文字列);
# 文字列を切り取る
select left/right(文字列,桁数);
select substring(文字列,開始桁数【1から開始】,桁数);
# 文字列を結合
select concat(文字列...);
# 文字列を置換
coalesce(フィールド1,フィールド2); # フィールドが空でない場合はフィールド1を表示し、そうでない場合はフィールド2を表示
select stuname,coalesce(writtenexam.'欠席') from stuinfo natural left join stumarks; # 筆記試験の成績が空であれば「欠席」と表示
# 文字列の長さ
select length(文字列); # バイト長
select char_length(文字列); # 文字数
3 時間関連#
# 現在のタイムスタンプを取得
select unix_timestamp();
# タイムスタンプを時間形式に変換
select from_unixtime(unix_timestamp());
# 現在の時間を取得
select now();
# 日付の差を計算
select datediff(now(),'2008-8-8') # 現在の日付から2008-08-08までの日数
# 形式を変換
select cast(now() as time)
select convert(now(),time)
4 暗号化関数#
select md5(文字列);
select sha(文字列);
5 判定関数#
select stuname,if(ch>=60 && math>=60,'合格','不合格') '合格判定' from stu;
プリプロセス#
プリコンパイルを 1 回行い、複数回実行できます。これは、1 つの SQL 文が頻繁に実行される問題を解決するために使用されます。
# プリプロセス文
prepare プリプロセス名 from プリプロセス文;
# プリプロセスを実行
execute プリプロセス名 [using 変数];
# MySQL で変数を宣言
set @id=値
ストアドプロシージャ【procedure】#
1 ストアドプロシージャの利点#
- ストアドプロシージャはネットワークトラフィックを削減できます。
- モジュール化設計を許可します。
- トランザクションをサポートします。
2 ストアドプロシージャの作成#
create procedure ストアドプロシージャ名(パラメータ)
begin
sql...
end;
3 ストアドプロシージャの呼び出し#
call ストアドプロシージャ名
4 ストアドプロシージャの削除#
drop procedure [if exists] ストアドプロシージャ名
5 ストアドプロシージャの情報を確認#
show create procedure ストアドプロシージャ名\G
6 すべてのストアドプロシージャを表示#
show procedure status\G
7 ストアドプロシージャのパラメータ#
ストアドプロシージャのパラメータは次のように分けられます:入力パラメータ(in)【デフォルト】、出力パラメータ(out)、入力出力パラメータ(inout)。
ストアドプロシージャは return を使用して値を返すことはできず、値を返すには「出力パラメータ」を使用して外部に値を渡す必要があります。
例 1:入力パラメータ
create procedure proc(in param varchar(10))
select * from stuinfo where stuno=param;
call proc('s25301');
例 2:同じ席を探す
create procedure proc(in name varchar(10))
begin
declare seat tinyint
select stuseat into seat from stuinfo where stuname=name
select * from stuinfo where stuseat=seat+1 or stuseat=seat-1
end;
まとめ:
- declare キーワードを使用してローカル変数を宣言します;グローバル変数は @ で始まります。
- 変数に値を設定する方法は 2 つあります。
方法 1:set 変数名 = 値
方法 2:select フィールド into 変数 from テーブル where 条件 - 宣言した変数は列名と同名にすることはできません。
例 3:出力パラメータ
create procedure proc(num int, out result int)
begin
set result=num*num
end;
call proc(10,@result);
select @result;
例 4:入力出力パラメータ
create procedure proc(inout num int)
begin
set num=num*num
end;
set @num=10
call proc(@num);
select @num;