MySQL学習ノート:一千行の重要コマンドと概念
サーバーへの接続と切断
mysql -h ホスト名 -P ポート番号 -u ユーザー名 -p パスワード
SHOW PROCESSLIST -- 実行中のスレッドを表示
SHOW VARIABLES -- システム変数情報を表示
データベース操作
-- 現在のデータベースを確認
SELECT DATABASE();
-- 現在の時刻、ユーザー名、データベースバージョンを表示
SELECT now(), user(), version();
-- データベースを作成
CREATE DATABASE[ IF NOT EXISTS] データベース名 データベースオプション
データベースオプション:
CHARACTER SET 文字セット名
COLLATE 照合順序名
-- 既存のデータベースを確認
SHOW DATABASES[ LIKE 'パターン']
-- 現在のデータベース情報を確認
SHOW CREATE DATABASE データベース名
-- データベースのオプション情報を変更
ALTER DATABASE データベース名 オプション情報
-- データベースを削除
DROP DATABASE[ IF EXISTS] データベース名
同時にデータベース関連のディレクトリとその内容も削除
テーブル操作
-- テーブルを作成
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [データベース名.]テーブル名 ( テーブルの構造定義 )[ テーブルオプション]
各フィールドにはデータ型が必要
最後のフィールドの後にはカンマを付けない
TEMPORARY は一時テーブルで、セッション終了時に自動的に削除
フィールドの定義:
フィールド名 データ型 [NOT NULL | NULL] [DEFAULT デフォルト値] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT '文字列']
-- テーブルオプション
-- 文字セット
CHARSET = 文字セット名
テーブルが設定されていない場合、データベースの文字セットを使用
-- ストレージエンジン
ENGINE = エンジン名
データ管理時に使用する異なるデータ構造。構造が異なるため、処理方法や提供される機能操作などが異なる
主なエンジン:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
異なるエンジンはテーブルの構造とデータを保存する方法が異なる
MyISAMテーブルファイルの意味:.frmはテーブル定義、.MYDはテーブルデータ、.MYIはテーブルインデックス
InnoDBテーブルファイルの意味:.frmはテーブル定義、テーブルスペースデータとログファイル
SHOW ENGINES -- ストレージエンジンの状態情報を表示
SHOW ENGINE エンジン名 {LOGS|STATUS} -- ストレージエンジンのログまたは状態情報を表示
-- 自動増分開始数
AUTO_INCREMENT = 行数
-- データファイルディレクトリ
DATA DIRECTORY = 'ディレクトリ'
-- インデックスファイルディレクトリ
INDEX DIRECTORY = 'ディレクトリ'
-- テーブルコメント
COMMENT = '文字列'
-- パーティショニングオプション
PARTITION BY ... (詳細はマニュアルを参照)
-- すべてのテーブルを表示
SHOW TABLES[ LIKE 'パターン']
SHOW TABLES FROM テーブル名
-- テーブル構造を表示
SHOW CREATE TABLE テーブル名 (より詳細な情報)
DESC テーブル名 / DESCRIBE テーブル名 / EXPLAIN テーブル名 / SHOW COLUMNS FROM テーブル名 [LIKE 'パターン']
SHOW TABLE STATUS [FROM db_name] [LIKE 'パターン']
-- テーブルを変更
-- テーブル自体のオプションを変更
ALTER TABLE テーブル名 テーブルのオプション
例:ALTER TABLE テーブル名 ENGINE=MYISAM;
-- テーブル名を変更
RENAME TABLE 元のテーブル名 TO 新しいテーブル名
RENAME TABLE 元のテーブル名 TO データベース名.テーブル名 (テーブルを別のデータベースに移動可能)
-- RENAMEを使用して2つのテーブル名を交換可能
-- テーブルのフィールド構造を変更(13.1.2. ALTER TABLE構文)
ALTER TABLE テーブル名 操作名
-- 操作名
ADD[ COLUMN] フィールド定義 -- フィールドを追加
AFTER フィールド名 -- 指定されたフィールド名の後に追加
FIRST -- 最初に追加
ADD PRIMARY KEY(フィールド名) -- 主キーを作成
ADD UNIQUE [インデックス名] (フィールド名)-- 一意インデックスを作成
ADD INDEX [インデックス名] (フィールド名) -- 普通のインデックスを作成
DROP[ COLUMN] フィールド名 -- フィールドを削除
MODIFY[ COLUMN] フィールド名 フィールド属性 -- フィールド属性を変更(フィールド名は変更不可、すべての既存属性を記述する必要あり)
CHANGE[ COLUMN] 元のフィールド名 新しいフィールド名 フィールド属性 -- フィールド名を変更可能
DROP PRIMARY KEY -- 主キーを削除(主キーを削除する前にAUTO_INCREMENT属性を削除する必要あり)
DROP INDEX インデックス名 -- インデックスを削除
DROP FOREIGN KEY 外部キー -- 外部キーを削除
-- テーブルを削除
DROP TABLE[ IF EXISTS] テーブル名 ...
-- テーブルデータをクリア
TRUNCATE [TABLE] テーブル名
-- テーブル構造をコピー
CREATE TABLE テーブル名 LIKE コピー元のテーブル名
-- テーブル構造とデータをコピー
CREATE TABLE テーブル名 [AS] SELECT * FROM コピー元のテーブル名
-- テーブルにエラーがないかチェック
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
-- テーブルを最適化
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
-- テーブルを修復
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
-- テーブルを分析
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
データ操作
-- 挿入
INSERT [INTO] テーブル名 [(フィールドリスト)] VALUES (値リスト)[, (値リスト), ...]
-- 挿入する値リストにすべてのフィールドが含まれ、順序が一致する場合は、フィールドリストを省略可能。
-- 同時に複数のデータレコードを挿入可能!
REPLACE は INSERT と完全に同じで、交換可能。
INSERT [INTO] テーブル名 SET フィールド名=値[, フィールド名=値, ...]
-- 検索
SELECT フィールドリスト FROM テーブル名[ その他の句]
-- 複数のテーブルの複数のフィールドから取得可能
-- その他の句は使用しない場合もある
-- フィールドリストは*で置き換え可能で、すべてのフィールドを意味する
-- 削除
DELETE FROM テーブル名[ 削除条件句]
条件句がない場合、すべて削除
-- 更新
UPDATE テーブル名 SET フィールド名=新しい値[, フィールド名=新しい値] [更新条件]
文字セットエンコーディング
-- MySQL、データベース、テーブル、フィールドそれぞれにエンコーディングを設定可能
-- データエンコーディングとクライアントエンコーディングは一致する必要なし
SHOW VARIABLES LIKE 'character_set_%' -- すべての文字セットエンコーディング項目を表示
character_set_client クライアントがサーバーにデータを送信する際に使用するエンコーディング
character_set_results サーバーがクライアントに結果を返す際に使用するエンコーディング
character_set_connection 接続レイヤーのエンコーディング
SET 変数名 = 変数値
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;
SET NAMES GBK; -- 上記3つの設定と同等
-- 照合順序
照合順序は並べ替えに使用
SHOW CHARACTER SET [LIKE 'パターン']/SHOW CHARSET [LIKE 'パターン'] すべての文字セットを表示
SHOW COLLATION [LIKE 'パターン'] すべての照合順序を表示
CHARSET 文字セットエンコーディング 文字セットエンコーディングを設定
COLLATE 照合順序エンコーディング 照合順序エンコーディングを設定
データ型(列タイプ)
1. 数値型
-- a. 整数型 ----------
型 バイト 範囲(符号あり)
tinyint 1バイト -128 ~ 127 符号なし:0 ~ 255
smallint 2バイト -32768 ~ 32767
mediumint 3バイト -8388608 ~ 8388607
int 4バイト
bigint 8バイト
int(M) Mは総ビット数
- デフォルトで符号あり、unsigned 属性で変更
- 表示幅、特定の数がフィールド定義で設定されたビット数に満たない場合、先頭を0で埋める、zerofill 属性で変更
例:int(5) 数値'123'を挿入すると、'00123'となる
- 条件を満たす限り、小さい方が良い。
- 1はbool値真、0はbool値偽を意味。MySQLにはブール型がないため、整数の0と1で表現。tinyint(1)でブール型を表すことが一般的。
-- b. 浮動小数点型 ----------
型 バイト 範囲
float(単精度) 4バイト
double(倍精度) 8バイト
浮動小数点型は符号なし属性 unsigned と表示幅属性 zerofill をサポート。
整数型とは異なり、前後に0が埋め込まれる。
浮動小数点型を定義する際、総ビット数と小数ビット数を指定する必要がある。
float(M, D) double(M, D)
Mは総ビット数、Dは小数ビット数。
MとDのサイズは浮動小数点数の範囲を決定する。整数型の固定範囲とは異なる。
Mは総ビット数(小数点と符号を含まない)を意味し、表示幅(すべての表示記号を含む)も意味する。
科学表記法をサポート。
浮動小数点数は近似値を表す。
-- c. 固定小数点型 ----------
decimal -- 可変長
decimal(M, D) Mも総ビット数、Dは小数ビット数。
精確な数値を保存し、データの変更は発生しない。浮動小数点型の四捨五入とは異なる。
浮動小数点数を文字列に変換して保存し、9桁ごとに4バイトで保存。
2. 文字列型
-- a. char, varchar ----------
char 固定長文字列、高速だがスペースを無駄にする
varchar 可変長文字列、低速だがスペースを節約
Mは保存可能な最大長を意味し、これは文字数であり、バイト数ではない。
異なるエンコーディングでは占有するスペースが異なる。
char, 最大255文字、エンコーディングに関係なし。
varchar, 最大65535文字、エンコーディングに関係あり。
有効なレコードは最大65535バイトを超えない。
utf8 最大21844文字、gbk 最大32766文字、latin1 最大65532文字
varchar は可変長であるため、varcharの長さを保存するためにストレージスペースを使用する必要がある。データが255バイト未満の場合、長さを保存するために1バイトを使用し、それ以外の場合は2バイトを使用する。
varcharの最大有効長は最大行サイズと使用される文字セットによって決定される。
最大有効長は65532バイトであり、varcharに文字列を保存する際、最初のバイトは空でデータが存在せず、文字列の長さを保存するために2バイトが必要なため、有効長は64432-1-2=65532バイトとなる。
例:テーブルが CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; と定義されている場合、Nの最大値は?答え:(65535-1-2-4-30*3)/3
-- b. blob, text ----------
blob バイナリ文字列(バイト文字列)
tinyblob, blob, mediumblob, longblob
text 非バイナリ文字列(文字文字列)
tinytext, text, mediumtext, longtext
text は定義時に長さを定義する必要がなく、総長も計算されない。
text 型は定義時にdefault値を設定できない
-- c. binary, varbinary ----------
charとvarcharに似ており、バイナリ文字列を保存するために使用される。つまり、文字文字列ではなくバイト文字列を保存する。
char, varchar, text は binary, varbinary, blob に対応。
3. 日付時刻型
一般的にタイムスタンプを整数型で保存し、PHPでタイムスタンプを簡単にフォーマットできる。
datetime 8バイト 日付と時刻 1000-01-01 00:00:00 から 9999-12-31 23:59:59
date 3バイト 日付 1000-01-01 から 9999-12-31
timestamp 4バイト タイムスタンプ 19700101000000 から 2038-01-19 03:14:07
time 3バイト 時間 -838:59:59 から 838:59:59
year 1バイト 年 1901 - 2155
datetime YYYY-MM-DD hh:mm:ss
timestamp YY-MM-DD hh:mm:ss
YYYYMMDDhhmmss
YYMMDDhhmmss
YYYYMMDDhhmmss
YYMMDDhhmmss
date YYYY-MM-DD
YY-MM-DD
YYYYMMDD
YYMMDD
YYYYMMDD
YYMMDD
time hh:mm:ss
hhmmss
hhmmss
year YYYY
YY
YYYY
YY
4. 列挙型とセット
-- 列挙型(enum) ----------
enum(値1, 値2, 値3...)
既知の値の中から単一選択。最大65535個。
列挙値は保存時に2バイトの整数型(smallint)で保存。各列挙値は保存位置の順序に従い、1から順に増加。
文字列型のように見えるが、保存は整数型。
NULL値のインデックスはNULL。
空文字列エラー値のインデックス値は0。
-- セット(set) ----------
set(値1, 値2, 値3...)
create table tab ( gender set('男', '女', '無') );
insert into tab values ('男, 女');
最大64個の異なるメンバーを持つことができる。bigintで保存され、合計8バイト。ビット演算の形式を取る。
テーブル作成時、SETメンバー値の末尾の空白は自動的に削除される。
型の選択
-- PHPの観点から
1. 機能を満たす
2. ストレージスペースをできるだけ小さくし、処理効率を高める
3. 互換性の問題を考慮
-- IP保存 ----------
1. 保存のみが必要な場合は文字列を使用
2. 計算、検索などが必要な場合は4バイトの符号なしint、つまりunsignedとして保存
1) PHP関数変換
ip2longは整数型に変換できるが、符号を伴う問題が発生する。符号なしの整数としてフォーマットする必要がある。
sprintf関数を使用して文字列をフォーマット
sprintf("%u", ip2long('192.168.3.134'));
その後、long2ipを使用して整数型をIP文字列に戻す
2) MySQL関数変換(符号なし整数、UNSIGNED)
INET_ATON('127.0.0.1') IPを整数型に変換
INET_NTOA(2130706433) 整数型をIPに変換
列属性(列制約)
1. PRIMARY 主キー
- レコードを一意に識別できるフィールドは主キーとして使用できる。
- テーブルには1つの主キーしか存在できない。
- 主キーは一意性を持つ。
- フィールドを宣言する際、primary key で識別。
フィールドリストの後で宣言することも可能
例:create table tab ( id int, stu varchar(10), primary key (id));
- 主キーフィールドの値はnullにできない。
- 主キーは複数のフィールドで構成可能。この場合はフィールドリストの後で宣言する方法を使用。
例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));
2. UNIQUE 一意インデックス(一意制約)
特定のフィールドの値も重複できないようにする。
3. NULL 制約
nullはデータ型ではなく、列の属性。
現在の列がnullになるかどうかを示す。何もないことを意味する。
null, nullを許可。デフォルト。
not null, nullを許可しない。
insert into tab values (null, 'val');
-- 最初のフィールドの値をnullに設定することを意味し、そのフィールドがnullを許可するかどうかによって決まる
4. DEFAULT デフォルト値属性
現在のフィールドのデフォルト値。
insert into tab values (default, 'val'); -- ここではデフォルト値を強制的に使用することを意味する。
create table tab ( add_time timestamp default current_timestamp );
-- 現在の時刻のタイムスタンプをデフォルト値として設定。
current_date, current_time
5. AUTO_INCREMENT 自動増分制約
自動増分はインデックス(主キーまたはunique)でなければならない
1つのフィールドのみが自動増分として存在可能。
デフォルトは1から自動増分開始。テーブル属性 auto_increment = x または alter table tbl auto_increment = x; で設定可能。
6. COMMENT コメント
例:create table tab ( id int ) comment 'コメント内容';
7. FOREIGN KEY 外部キー制約
主テーブルと従テーブルのデータ整合性を制限するために使用。
alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);
-- テーブルt1のt1_id外部キーをテーブルt2のidフィールドに関連付ける。
-- 各外部キーには名前があり、constraintで指定可能
外部キーを持つテーブルは従テーブル(子テーブル)と呼ばれ、外部キーが指すテーブルは主テーブル(親テーブル)と呼ばれる。
作用:データの一貫性、完全性を維持し、主な目的は外部キーテーブル(従テーブル)に保存されたデータを制御すること。
MySQLでは、InnoDBエンジンに対して外部キー制約を使用できる:
構文:
foreign key (外部キーフィールド) references 主テーブル名 (関連フィールド) [主テーブルレコード削除時の動作] [主テーブルレコード更新時の動作]
この場合、従テーブルの外部キーが主テーブルの既存の値を制約する必要があることを検出する必要がある。外部キーが関連付けられていない場合、nullに設定できる。前提は、その外部キーフィールドにnot null属性がないこと。
主テーブルのレコード変更または更新時の動作を指定しない場合、主テーブルの操作は拒否される。
on update または on delete を指定した場合、削除または更新時に、以下の操作から選択可能:
1. cascade、連鎖操作。主テーブルデータが更新され(主キー値が更新され)、従テーブルも更新される(外部キー値が更新される)。主テーブルレコードが削除されると、関連する従テーブルレコードも削除される。
2. set null、nullに設定。主テーブルデータが更新され(主キー値が更新され)、従テーブルの外部キーがnullに設定される。主テーブルレコードが削除されると、関連する従テーブルレコードの外部キーがnullに設定される。ただし、その外部キーフィールドにnot null属性がないことが必要。
3. restrict、親テーブルの削除と更新を拒否。
注意:外部キーはInnoDBストレージエンジンのみがサポート。他のエンジンはサポートしない。
テーブル設計規範
-- Normal Format, NF
- 各テーブルは1つのエンティティ情報を保存
- 各テーブルにはIDフィールドを主キーとして持つ
- ID主キー + 原子テーブル
-- 1NF, 第一正規形
フィールドはさらに分割できない場合、第一正規形を満たす。
-- 2NF, 第二正規形
第一正規形を満たす前提下、部分依存が存在しない。
複合主キーを排除することで部分依存を回避。単一列キーを追加。
-- 3NF, 第三正規形
第二正規形を満たす前提下、推移依存が存在しない。
特定のフィールドが主キーに依存し、他のフィールドがそのフィールドに依存する。これが推移依存。
1つのエンティティ情報のデータを1つのテーブル内に配置。
SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [集計関数] -> HAVING -> ORDER BY -> LIMIT
a. select_expr
-- * ですべてのフィールドを表現可能。
select * from tb;
-- 式を使用可能(計算式、関数呼び出し、フィールドも式)。
select stu, 29+25, now() from tb;
-- 各列にエイリアスを使用可能。列識別子を簡素化し、複数の列識別子の重複を避けるのに適している。
- asキーワードを使用、省略も可能。
select stu+10 as add10 from tb;
b. FROM 句
クエリソースを識別するために使用。
-- テーブルにエイリアスを付けることが可能。asキーワードを使用。
SELECT * FROM tb1 AS tt, tb2 AS bb;
-- from句の後、複数のテーブルが同時に現れる可能性がある。
-- 複数のテーブルは横に重ねられ、データはデカルト積を形成する。
SELECT * FROM tb1, tb2;
-- インデックスの選択方法に関するヒントを最適化子に提供
USE INDEX、IGNORE INDEX、FORCE INDEX
SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;
SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;
c. WHERE 句
-- fromから取得したデータソースをフィルタリング。
-- 整数1は真、0は偽を意味。
-- 式は演算子と演算数で構成。
-- 演算数:変数(フィールド)、値、関数戻り値
-- 演算子:
=, <=>, <>, !=, <=, <, >=, >, !, &&, ||,
in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
is/is not にture/false/unknownを加え、特定の値の真偽を検証
<=>は<>と同じ機能、null比較に使用可能
d. GROUP BY 句, グループ化句
GROUP BY フィールド/エイリアス [ソート方法]
グループ化後、ソートが行われる。昇順:ASC、降順:DESC
以下[集計関数]はGROUP BYと併用する必要がある:
count 異なる非NULL値の数を返す count(*)、count(フィールド)
sum 合計を求める
max 最大値を求める
min 最小値を求める
avg 平均値を求める
group_concat グループからの連結された非NULL値の文字列結果を返す。グループ内の文字列連結。
e. HAVING 句, 条件句
WHEREと機能、使用法は同じだが、実行タイミングが異なる。
whereは開始時にデータを検出し、元のデータをフィルタリング。
havingはフィルタリングされた結果を再度フィルタリング。
havingフィールドはクエリされたものでなければならず、whereフィールドはテーブルに存在するものでなければならない。
whereはフィールドのエイリアスを使用できないが、havingは使用可能。なぜならWHEREコードを実行する時、列値が確定していない可能性があるため。
whereは集計関数を使用できない。通常、集計関数を使用する場合にhavingを使用する。
SQL標準ではHAVINGはGROUP BY句の列または集計関数で使用される列を参照する必要がある。
f. ORDER BY 句, ソート句
order by ソートフィールド/エイリアス ソート方法 [,ソートフィールド/エイリアス ソート方法]...
昇順:ASC、降順:DESC
複数フィールドのソートをサポート。
g. LIMIT 句, 結果数制限句
処理済みの結果に対してのみ数量制限。処理済みの結果を集合と見なし、レコードの出現順序に従い、インデックスは0から開始。
limit 開始位置, 取得数
最初のパラメータを省略すると、インデックス0から開始。limit 取得数
h. DISTINCT, ALL オプション
distinct 重複レコードを削除
デフォルトはall、すべてのレコード
UNION
複数のselectクエリの結果を1つの結果セットに結合。
SELECT ... UNION [ALL|DISTINCT] SELECT ...
デフォルトはDISTINCT方式、つまりすべての返される行は一意。
各selectクエリに括弧で囲むことを推奨。
ORDER BY ソート時、LIMITと組み合わせる必要がある。
各selectクエリのフィールド数が同じである必要がある。
各selectクエリのフィールドリスト(数、型)は一致する必要があり、なぜなら結果のフィールド名は最初のselectステートメントに基づくため。
サブクエリ
- サブクエリは括弧で囲む必要がある。
-- from型
fromの後はテーブルである必要があり、サブクエリ結果にエイリアスを付ける必要がある。
- 各クエリ内の条件を簡素化。
- from型は結果を一時テーブルに生成し、元テーブルのロック解放に使用可能。
- サブクエリはテーブルを返す、テーブル型サブクエリ。
select * from (select * from tb where id>0) as subfrom where id>1;
-- where型
- サブクエリは値を返す、スカラー型サブクエリ。
- サブクエリにエイリアスを付ける必要はない。
- whereサブクエリ内のテーブルは直接更新に使用できない。
select * from tb where money = (select max(money) from tb);
-- 列サブクエリ
サブクエリ結果が1列を返す場合。
inまたはnot inを使用してクエリを実行
existsとnot exists条件
サブクエリがデータを返す場合、1または0を返す。条件判断に使用されることが多い。
select column1 from t1 where exists (select * from t2);
-- 行サブクエリ
クエリ条件が行である。
select * from t1 where (id, gender) in (select id, gender from t2);
行コンストラクタ:(col1, col2, ...) または ROW(col1, col2, ...)
行コンストラクタは通常、2つ以上の列を返すサブクエリと比較するために使用される。
-- 特殊演算子
!= all() not inと同等
= some() inと同等。anyはsomeのエイリアス
!= some() not inと同等ではなく、どれか一つと等しくない。
all, someは他の演算子と組み合わせて使用可能。
結合クエリ(join)
複数テーブルのフィールドを結合し、結合条件を指定可能。
-- 内部結合(inner join)
- デフォルトは内部結合、innerは省略可能。
- データが存在する場合のみ結合が送信される。つまり、結合結果に空行が現れない。
onは結合条件を示す。その条件式はwhereと似ている。条件を省略することも可能(条件が常に真であることを意味)。
whereを使用して結合条件を示すことも可能。
またusingを使用可能だが、フィールド名が同じである必要がある。using(フィールド名)
-- 交差結合 cross join
つまり、条件なしの内部結合。
select * from tb1 cross join tb2;
-- 外部結合(outer join)
- データが存在しない場合でも、結合結果に現れる。
-- 左外部結合 left join
データが存在しない場合、左テーブルのレコードが現れ、右テーブルはnullで埋められる
-- 右外部結合 right join
データが存在しない場合、右テーブルのレコードが現れ、左テーブルはnullで埋められる
-- 自然結合(natural join)
自動的に結合条件を判断して結合。
usingを省略したのと同等で、同じフィールド名を自動的に検索。
natural join
natural left join
natural right join
select info.id, info.name, info.stu_num, extra_info.hobby, extra_info.sex from info, extra_info where info.stu_num = extra_info.stu_id;
エクスポート
select * into outfile ファイルパス [フォーマット制御] from テーブル名; -- テーブルデータをエクスポート
load data [local] infile ファイルパス [replace|ignore] into table テーブル名 [フォーマット制御]; -- データをインポート
生成されたデータのデフォルトの区切り文字はタブ文字
localが指定されていない場合、データファイルはサーバー上に存在する必要がある
replaceとignoreキーワードは既存のユニークキーレコードの重複処理を制御
-- フォーマット制御
fields フィールドフォーマットを制御
デフォルト:fields terminated by ' ' enclosed by '' escaped by '\'
terminated by '文字列' -- 終端
enclosed by '文字' -- 包囲
escaped by '文字' -- エスケープ
-- 例:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ''
FROM test_table;
lines 行フォーマットを制御
デフォルト:lines terminated by ''
terminated by '文字列' -- 終端
INSERT
selectステートメントで取得したデータはinsertで挿入可能。
列の指定を省略可能で、values ()括弧内に列の順序で現れるすべてのフィールドの値を提供する必要がある。
またはset構文を使用。
INSERT INTO tbl_name SET field=value,...;
複数の値を一度に使用可能で、(), ()の形式を使用。
INSERT INTO tbl_name VALUES (), (), ();
列値指定時に式を使用可能。
INSERT INTO tbl_name VALUES (field_value, 10+10, now());
クエリの結果を値として挿入可能。
INSERT INTO tbl_name SELECT ...;
挿入する値に主キー(またはユニークインデックス)の競合が発生した場合、他の非主キー列の情報を更新可能。
INSERT INTO tbl_name VALUES/SET/SELECT ON DUPLICATE KEY UPDATE フィールド=値, …;
DELETE
DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
条件に基づいて削除。where
削除する最大レコード数を指定。limit
ソート条件で削除可能。order by + limit
複数テーブルの削除をサポートし、結合構文に似た構文を使用。
delete from 削除するデータ多表1, 表2 using 表結合操作 条件。
TRUNCATE
TRUNCATE [TABLE] tbl_name
データをクリア
テーブルを削除して再作成
違い:
1、truncateはテーブルを削除して再作成、deleteはレコードを1つずつ削除
2、truncateはauto_incrementの値をリセット。deleteはしない
3、truncateは削除されたレコード数を知らないが、deleteは知る。
4、パーティション付きテーブルに使用された場合、truncateはパーティションを保持
バックアップとリストア
バックアップ、データの構造とテーブル内データを保存。
mysqldumpコマンドを使用して完了。
-- エクスポート
mysqldump [オプション] db_name [テーブル]
mysqldump [オプション] ---database DB1 [DB2 DB3...]
mysqldump [オプション] --all--database
1. 1つのテーブルをエクスポート
mysqldump -uユーザー名 -pパスワード データベース名 テーブル名 > ファイル名(D:/a.sql)
2. 複数のテーブルをエクスポート
mysqldump -uユーザー名 -pパスワード データベース名 テーブル1 テーブル2 テーブル3 > ファイル名(D:/a.sql)
3. すべてのテーブルをエクスポート
mysqldump -uユーザー名 -pパスワード データベース名 > ファイル名(D:/a.sql)
4. 1つのデータベースをエクスポート
mysqldump -uユーザー名 -pパスワード --lock-all-tables --database データベース名 > ファイル名(D:/a.sql)
-wでWHERE条件を付けることが可能
-- インポート
1. MySQLにログインした状態:
source バックアップファイル
2. ログインしない場合
mysql -uユーザー名 -pパスワード データベース名 < バックアップファイル
ビュー
ビューとは:
ビューは仮想テーブルで、その内容はクエリによって定義される。実際のテーブルと同様に、ビューには名前付きの列と行データのシーケンスが含まれる。しかし、ビューはデータ値セットとしてデータベースに保存されない。行と列のデータは、ビューを定義するクエリが参照するテーブルから取得され、ビューが参照されるときに動的に生成される。
ビューにはテーブル構造ファイルがあるが、データファイルはない。
参照される基礎テーブルに対して、ビューの役割はフィルタリングに似ている。ビューの定義は現在または他のデータベースの1つまたは複数のテーブル、または他のビューから来る。ビューを通じてクエリを実行するには制限がないが、データ変更時の制限は少ない。
ビューはデータベースに保存されたクエリのSQLステートメントで、主に2つの理由から:セキュリティ上の理由、ビューは一部のデータを隠すことができ、例えば:社会保険基金テーブルでは、名前と住所のみを表示し、社会保険番号や給与数などを表示しない。もう1つの理由は、複雑なクエリを理解しやすく使用しやすくすること。
-- ビューを作成
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW ビュー名 [(列リスト)] AS selectステートメント
- ビュー名は一意でなければならず、テーブル名と重複してはならない。
- ビューはselectステートメントでクエリされた列名を使用でき、独自の列名を指定することも可能。
- ビューの実行アルゴリズムを指定可能。ALGORITHMで指定。
- column_listが存在する場合、列数はSELECTステートメントで取得された列数と等しくなければならない
-- 構造を表示
SHOW CREATE VIEW ビュー名
-- ビューを削除
- ビューを削除後、データは依然として存在する。
- 複数のビューを同時に削除可能。
DROP VIEW [IF EXISTS] ビュー名 ...
-- ビュー構造を変更
- 一般的にビューを変更しない。なぜなら、すべてのビュー更新がテーブルにマッピングされるとは限らないから。
ALTER VIEW ビュー名 [(列リスト)] AS selectステートメント
-- ビューの役割
1. ビジネスロジックを簡素化
2. クライアントに実際のテーブル構造を隠す
-- ビューアルゴリズム(ALGORITHM)
MERGE マージ
ビューのクエリステートメントを外部クエリとマージしてから実行!
TEMPTABLE 一時テーブル
ビューを実行後、一時テーブルを形成し、外層クエリを実行!
UNDEFINED 未定義(デフォルト)、MySQLが対応するアルゴリズムを選択することを意味する。
トランザクション(transaction)
トランザクションは論理的に一連の操作で、この一連の操作の各単位は、すべて成功するかすべて失敗するかのいずれか。
- 連続したSQLの集団的成功または集団的失敗をサポート。
- トランザクションはデータベースがデータの後処理面で提供する機能。
- InnoDBまたはBDBストレージエンジンを利用し、自動コミットの特性サポートを完了する必要がある。
- InnoDBはトランザクションセキュリティエンジンと呼ばれる。
-- トランザクション開始
START TRANSACTION; または BEGIN;
トランザクション開始後、実行されるすべてのSQLステートメントは現在のトランザクション内のSQLステートメントと見なされる。
-- トランザクションコミット
COMMIT;
-- トランザクションロールバック
ROLLBACK;
一部の操作に問題が発生した場合、トランザクション開始前の状態に戻る。
-- トランザクションの特性
1. 原子性(Atomicity)
トランザクションは分割できない作業単位で、トランザクション内の操作はすべて発生するか、または発生しない。
2. 一貫性(Consistency)
トランザクション前後のデータの整合性は保持されなければならない。
- トランザクション開始時と終了時、外部データは一貫している
- トランザクション全体のプロセスで操作は連続的
3. 分離性(Isolation)
複数のユーザーがデータベースに同時アクセスする場合、1つのユーザーのトランザクションが他のユーザーのトランザクションによって干渉されないようにし、複数の同時トランザクション間のデータは相互に分離される必要がある。
4. 永続性(Durability)
トランザクションがコミットされると、データベース内のデータ変更は永続的になる。
-- トランザクションの実装
1. トランザクションをサポートするテーブルタイプが必要
2. 関連する操作のセットを実行する前にトランザクションを開始
3. 操作セットが完了後、すべて成功すればコミット;失敗があれば、ロールバックを選択し、トランザクション開始時のバックアップポイントに戻る。
-- トランザクションの原理
InnoDBの自動コミット(autocommit)特性を利用して完了。
普通のMySQLステートメント実行後、現在のデータコミット操作は他のクライアントから見える。
トランザクションは「自動コミット」メカニズムを一時的に無効にし、commitでデータ操作を永続化する必要がある。
-- 注意
1. データ定義言語(DDL)ステートメントはロールバックできない。例えば、データベースの作成または削除ステートメント、およびテーブルまたは保存されたサブプログラムの作成、削除、または変更ステートメント。
2. トランザクションはネストできない
-- 保存ポイント
SAVEPOINT 保存ポイント名 -- トランザクション保存ポイントを設定
ROLLBACK TO SAVEPOINT 保存ポイント名 -- 保存ポイントにロールバック
RELEASE SAVEPOINT 保存ポイント名 -- 保存ポイントを削除
-- InnoDB自動コミット特性設定
SET autocommit = 0|1; 0は自動コミットを無効、1は有効を意味する。
- 自動コミットを無効にすると、通常の操作の結果は他のクライアントからも見えなくなり、commitでデータ操作を永続化する必要がある。
- 自動コミットを無効にしてトランザクションを開始することも可能。しかしSTART TRANSACTIONとは異なり、
SET autocommitはサーバーの設定を永続的に変更し、次回設定変更まで有効。(現在の接続に対して)
トランザクションを開始する前に現在の状態を記録し、トランザクションがコミットまたはロールバックされると、再度トランザクションを開始する必要がある。(現在のトランザクションに対して)
テーブルロック
テーブルロックは他のクライアントによる不正な読み取りと書き込みを防止するためにのみ使用
MyISAMはテーブルロックをサポート、InnoDBは行ロックをサポート
-- ロック
LOCK TABLES tbl_name [AS エイリアス]
-- アンロック
UNLOCK TABLES
トリガー
トリガーはテーブルに関連する名前付きデータベースオブジェクトで、テーブルに特定のイベントが発生した場合、オブジェクトがアクティブ化される
監視:レコードの追加、変更、削除。
-- トリガーを作成
CREATE TRIGGER トリガー名 trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
パラメータ:
trigger_timeはトリガーのアクション時間。beforeまたはafterを指定し、トリガーがアクティブ化されるステートメントの前または後にトリガーされることを示す。
trigger_eventはトリガーをアクティブ化するステートメントのタイプを指定
INSERT:新しい行をテーブルに挿入したときにトリガーをアクティブ化
UPDATE:行を変更したときにトリガーをアクティブ化
DELETE:テーブルから行を削除したときにトリガーをアクティブ化
tbl_name:監視するテーブル。永続的なテーブルでなければならず、TEMPORARYテーブルまたはビューに関連付けることはできない。
trigger_stmt:トリガーがアクティブ化されたときに実行されるステートメント。複数のステートメントを実行する場合、BEGIN...END複合ステートメント構造を使用可能
-- 削除
DROP TRIGGER [schema_name.]trigger_name
oldとnewを使用して古いデータと新しいデータを置き換え可能
更新操作、更新前はold、更新後はnew.
削除操作、oldのみ.
増加操作、newのみ.
-- 注意
1. 同じトリガーアクション時間とイベントを持つテーブルに対して、2つのトリガーを持つことはできない。
-- 文字列連結関数
concat(str1,str2,...])
concat_ws(区切り文字,str1,str2,...)
-- 分岐ステートメント
if 条件 then
実行ステートメント
elseif 条件 then
実行ステートメント
else
実行ステートメント
end if;
-- 最外層ステートメントの終了記号を変更
delimiter カスタム終了記号
SQLステートメント
カスタム終了記号
delimiter ; -- 元のセミコロンに戻す
-- ステートメントブロックの囲み
begin
ステートメントブロック
end
-- 特殊な実行
1. レコードを追加するたびにトリガーがアクティブ化される。
2. Insert into on duplicate key update 構文はトリガー:
重複レコードがない場合、before insert, after insertがトリガーされる。
重複レコードがあり更新が発生した場合、before insert, before update, after updateがトリガーされる。
重複レコードがあるが更新が発生しない場合、before insert, before updateがトリガーされる。
3. Replace 構文 重複レコードがある場合、before insert, before delete, after delete, after insertがトリガーされる
SQLプログラミング
--// ローカル変数 ----------
-- 変数宣言
declare var_name[,...] type [default 値]
このステートメントはローカル変数を宣言するために使用。デフォルト値を提供するには、default句を含める。値は式として指定可能で、定数である必要はない。default句がない場合、初期値はnull。
-- 代入
setとselect intoステートメントを使用して変数に値を代入。
- 注意:関数内ではグローバル変数(ユーザー定義変数)を使用可能
--// グローバル変数 ----------
-- 定義、代入
set ステートメントは変数を定義し、値を代入可能。
set @var = 値;
select intoステートメントを使用して変数を初期化し、値を代入も可能。selectステートメントが1行しか返さない必要があるが、複数のフィールドを持つことができるため、複数の変数に同時に代入可能。変数の数はクエリの列数と一致する必要がある。
また、代入ステートメントを式として見なし、selectを実行して完了することも可能。この場合、=が関係演算子として見なされるのを避けるために、:=を使用する。(setステートメントは=と:=の両方を使用可能)。
select @var:=20;
select @v1:=id, @v2=name from t1 limit 1;
select * from tbl_name where @var:=30;
select intoはテーブルからクエリされたデータを変数に代入可能。
-| select max(height) into @max_height from tb;
-- カスタム変数名
ユーザー定義変数がシステム識別子(通常はフィールド名)と競合するのを避けるために、ユーザー定義変数は変数名の前に@を使用。
@var=10;
- 変数が定義されると、セッション全体で有効(ログインからログアウトまで)
--// 制御構造 ----------
-- ifステートメント
if search_condition then
statement_list
[elseif search_condition then
statement_list]
...
[else
statement_list]
end if;
-- caseステートメント
CASE 値 WHEN [比較値] THEN 結果
[WHEN [比較値] THEN 結果 ...]
[ELSE 結果]
END
-- whileループ
[begin_label:] while search_condition do
statement_list
end while [end_label];
- ループ内でwhileループを早期に終了する必要がある場合、ラベルを使用する必要がある;ラベルは対で現れる必要がある。
-- ループから退出
ループ全体から退出 leave
現在のループから退出 iterate
退出するラベルによってどのループから退出するかが決まる
--// 組み込み関数 ----------
-- 数値関数
abs(x) -- 絶対値 abs(-10.9) = 10
format(x, d) -- 千分位フォーマット format(1234567.456, 2) = 1,234,567.46
ceil(x) -- 切り上げ ceil(10.1) = 11
floor(x) -- 切り捨て floor (10.1) = 10
round(x) -- 四捨五入
mod(m, n) -- m%n m mod n 剰余 10%3=1
pi() -- 円周率を取得
pow(m, n) -- mのn乗
sqrt(x) -- 算術平方根
rand() -- 乱数
truncate(x, d) -- d桁の小数を切り捨て
-- 日付時刻関数
now(), current_timestamp(); -- 現在の日時
current_date(); -- 現在の日付
current_time(); -- 現在の時刻
date('yyyy-mm-dd hh:ii:ss'); -- 日付部分を取得
time('yyyy-mm-dd hh:ii:ss'); -- 時間部分を取得
date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 時間をフォーマット
unix_timestamp(); -- Unixタイムスタンプを取得
from_unixtime(); -- タイムスタンプから時間を取得
-- 文字列関数
length(string) -- stringの長さ、バイト
char_length(string) -- stringの文字数
substring(str, position [,length]) -- strのpositionからlength文字を取得
replace(str ,search_str ,replace_str) -- str内のsearch_strをreplace_strで置換
instr(string ,substring) -- substringがstring内に最初に出現する位置を返す
concat(string [,...]) -- 文字列を連結
charset(str) -- 文字列の文字セットを返す
lcase(string) -- 小文字に変換
left(string, length) -- stringの左からlength文字を取得
load_file(file_name) -- ファイルから内容を読み込む
locate(substring, string [,start_position]) -- instrと同じだが、開始位置を指定可能
lpad(string, length, pad) -- padをstringの先頭に繰り返し追加し、文字列長がlengthになるまで
ltrim(string) -- 前端の空白を削除
repeat(string, count) -- count回繰り返す
rpad(string, length, pad) -- strの後ろにpadを追加し、長さがlengthになるまで
rtrim(string) -- 後端の空白を削除
strcmp(string1 ,string2) -- 2つの文字列を文字ごとに比較
-- フロー関数
case when [条件] then 結果 [when [条件] then 結果 ...] [else 結果] end 多分岐
if(expr1,expr2,expr3) 2分岐。
-- 集約関数
count()
sum();
max();
min();
avg();
group_concat()
-- その他の一般的な関数
md5();
default();
--// ストアド関数、カスタム関数 ----------
-- 新規作成
CREATE FUNCTION 関数名 (パラメータリスト) RETURNS 戻り値型
関数本体
- 関数名は有効な識別子でなければならず、既存のキーワードと競合してはならない。
- 関数はデータベースに属する必要があり、db_name.funciton_nameの形式で現在の関数が属するデータベースを実行可能、それ以外は現在のデータベース。
- パラメータ部分は「パラメータ名」と「パラメータ型」で構成。複数のパラメータはカンマで区切る。
- 関数本体は複数の有効なMySQLステートメント、フロー制御、変数宣言などのステートメントで構成。
- 複数のステートメントはbegin...endステートメントブロックで囲む必要がある。
- 必ずreturn戻り値ステートメントが必要。
-- 削除
DROP FUNCTION [IF EXISTS] 関数名;
-- 表示
SHOW FUNCTION STATUS LIKE 'パターン'
SHOW CREATE FUNCTION 関数名;
-- 変更
ALTER FUNCTION 関数名 関数オプション
--// ストアドプロシージャ、カスタム機能 ----------
-- 定義
ストアドプロシージャはSQLで構成された実行可能なコードの集合。関数に比べてビジネスロジックにより偏っている。
呼び出し:CALL プロシージャ名
-- 注意
- 戻り値がない。
- 単独で呼び出すのみ、他のステートメントに混在して呼び出すことはできない
-- パラメータ
IN、OUT、INOUT パラメータ名 データ型
IN 入力:呼び出しプロセス中、プロシージャ本体内部にデータを入力
OUT 出力:呼び出しプロセス中、プロシージャ本体処理後の結果をクライアントに返す
INOUT 入力出力:入力も出力も可能
注意、戻り値がない。
/* ストアドプロシージャ */ ------------------
ストアドプロシージャは実行可能なコードの集合。関数に比べてビジネスロジックにより偏っている。
呼び出し:CALL プロシージャ名
-- 注意
- 戻り値がない。
- 単独で呼び出すのみ、他のステートメントに混在して呼び出すことはできない
-- パラメータ
IN|OUT|INOUT パラメータ名 データ型
IN 入力:呼び出しプロセス中、プロシージャ本体内部にデータを入力
OUT 出力:呼び出しプロセス中、プロシージャ本体処理後の結果をクライアントに返す
INOUT 入力出力:入力も出力も可能
-- 構文
CREATE PROCEDURE プロシージャ名 (パラメータリスト)
BEGIN
プロシージャ本体
END
ユーザーと権限管理
-- rootパスワードリセット
1. MySQLサービスを停止
2. [Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables &
[Windows] mysqld --skip-grant-tables
3. use mysql;
4. UPDATE `user` SET PASSWORD=PASSWORD("パスワード") WHERE `user` = "root";
5. FLUSH PRIVILEGES;
ユーザー情報テーブル:mysql.user
-- 権限をリフレッシュ
FLUSH PRIVILEGES;
-- ユーザーを追加
CREATE USER ユーザー名 IDENTIFIED BY [PASSWORD] パスワード(文字列)
- mysqlデータベースのグローバルCREATE USER権限を持つか、INSERT権限を持っている必要がある。
- ユーザーを作成するのみ、権限を付与できない。
- ユーザー名、注意:引用符:例 'user_name'@'192.168.1.1'
- パスワードも引用符が必要、純数値パスワードでも引用符を付ける
- 純テキストでパスワードを指定する場合、PASSWORDキーワードを無視する。PASSWORD()関数によって返される混在値としてパスワードを指定するには、PASSWORDキーワードを含める必要がある
-- ユーザー名を変更
RENAME USER old_user TO new_user
-- パスワードを設定
SET PASSWORD = PASSWORD('パスワード') -- 現在のユーザーにパスワードを設定
SET PASSWORD FOR ユーザー名 = PASSWORD('パスワード') -- 指定されたユーザーにパスワードを設定
-- ユーザーを削除
DROP USER ユーザー名
-- 権限を付与/ユーザーを追加
GRANT 権限リスト ON テーブル名 TO ユーザー名 [IDENTIFIED BY [PASSWORD] 'password']
- all privileges はすべての権限を意味
- *.* はすべてのデータベースのすべてのテーブルを意味
- データベース名.テーブル名 は特定のデータベースの特定のテーブルを意味
GRANT ALL PRIVILEGES ON `pms`.* TO 'pms'@'%' IDENTIFIED BY 'pms0817';
-- 権限を表示
SHOW GRANTS FOR ユーザー名
-- 現在のユーザーの権限を表示
SHOW GRANTS; または SHOW GRANTS FOR CURRENT_USER; または SHOW GRANTS FOR CURRENT_USER();
-- 権限を取り消す
REVOKE 権限リスト ON テーブル名 FROM ユーザー名
REVOKE ALL PRIVILEGES, GRANT OPTION FROM ユーザー名 -- すべての権限を取り消す
-- 権限レベル
-- GRANTまたはREVOKEを使用するには、GRANT OPTION権限を持っている必要があり、付与または取り消す権限を持っている必要がある。
グローバルレベル:グローバル権限は特定のサーバー内のすべてのデータベースに適用され、mysql.user
GRANT ALL ON *.*とREVOKE ALL ON *.*はグローバル権限のみを付与および取り消す。
データベースレベル:データベース権限は特定のデータベース内のすべての対象に適用され、mysql.db, mysql.host
GRANT ALL ON db_name.*とREVOKE ALL ON db_name.*はデータベース権限のみを付与および取り消す。
テーブルレベル:テーブル権限は特定のテーブル内のすべての列に適用され、mysql.talbes_priv
GRANT ALL ON db_name.tbl_nameとREVOKE ALL ON db_name.tbl_nameはテーブル権限のみを付与および取り消す。
列レベル:列権限は特定のテーブル内の単一列に適用され、mysql.columns_priv
REVOKEを使用する場合、付与された列と同じ列を指定する必要がある。
-- 権限リスト
ALL [PRIVILEGES] -- GRANT OPTIONを除くすべての単純権限を設定
ALTER -- ALTER TABLEの使用を許可
ALTER ROUTINE -- 保存されたサブプログラムの変更または削除を許可
CREATE -- CREATE TABLEの使用を許可
CREATE ROUTINE -- 保存されたサブプログラムの作成を許可
CREATE TEMPORARY TABLES -- CREATE TEMPORARY TABLEの使用を許可
CREATE USER -- CREATE USER, DROP USER, RENAME USER, REVOKE ALL PRIVILEGESの使用を許可。
CREATE VIEW -- CREATE VIEWの使用を許可
DELETE -- DELETEの使用を許可
DROP -- DROP TABLEの使用を許可
EXECUTE -- 保存されたサブプログラムの実行を許可
FILE -- SELECT...INTO OUTFILEとLOAD DATA INFILEの使用を許可
INDEX -- CREATE INDEXとDROP INDEXの使用を許可
INSERT -- INSERTの使用を許可
LOCK TABLES -- SELECT権限を持つテーブルに対してLOCK TABLESの使用を許可
PROCESS -- SHOW FULL PROCESSLISTの使用を許可
REFERENCES -- 実装されていない
RELOAD -- FLUSHの使用を許可
REPLICATION CLIENT -- レプリカサーバーまたはマスターサーバーのアドレスを問い合わせることを許可
REPLICATION SLAVE -- レプリカ型スレーブサーバー(マスターサーバーからバイナリログイベントを読み取る)用
SELECT -- SELECTの使用を許可
SHOW DATABASES -- すべてのデータベースを表示
SHOW VIEW -- SHOW CREATE VIEWの使用を許可
SHUTDOWN -- mysqladmin shutdownの使用を許可
SUPER -- CHANGE MASTER, KILL, PURGE MASTER LOGS, SET GLOBALステートメントの使用を許可、mysqladmin debugコマンド;max_connectionsに達しても接続可能(1回のみ)。
UPDATE -- UPDATEの使用を許可
USAGE -- 「権限なし」の同義語
GRANT OPTION -- 権限を付与する権限
テーブルメンテナンス
-- テーブルのキーワード分布を分析および保存
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE テーブル名 ...
-- 1つまたは複数のテーブルにエラーがないかチェック
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- データファイルの断片化を整理
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
その他
1. バッククォート(`)を使用して識別子(データベース名、テーブル名、フィールド名、インデックス、エイリアス)を囲むことができ、キーワードと重複を避ける!中国語も識別子として使用可能!
2. 各データベースディレクトリには、現在のデータベースのオプションファイルdb.optが存在する。
3. コメント:
単一行コメント # コメント内容
複数行コメント /* コメント内容 */
単一行コメント -- コメント内容 (標準SQLコメントスタイル、二重ハイフンの後ろにスペース(スペース、TAB、改行など)が必要)
4. パターンワイルドカード:
_ 任意の単一文字
% 任意の複数文字、ゼロ文字を含む
シングルクォートはエスケープが必要 '
5. CMDコマンドライン内のステートメント終了記号は ";", "G", "g" で、表示結果にのみ影響。他の場所ではセミコロンで終了。delimiterは現在のセッションのステートメント終了記号を変更可能。
6. SQLは大文字小文字を区別しない
7. 既存のステートメントをクリア:c