2012年8月13日月曜日

MySQLの主なSQL構文




この部分はMySQLのマニュアルの一部を重要な場合のみ行っている部分を中心に簡単にまとめたものであり、すべての内容を説明していない。実際のディストリビューションに含まれているマニュアルは、600ページ以上の膨大な分量を誇り、非常に充実して作られています。ただし、英語ですがそれほど難しくないので時間があるときに時々読んでみると多くの助けになるだろう。付録CD-ROMの/ MySQL / manualに原文マニュアルが含まれています。


4。 MySQLの主なSQL構文

▶CREATE DATABASE

文法:CREATE DATABASE db_name

指定された名前の新しいデータベースを作成します。この時、使用可能な名前は、この章の最初の部分で説明したとおりである。もし同じ名前のデータベースが既に存在する場合は、エラーが出る。 MySQLは、データベースをディレクトリにテーブルをファイルとして管理するため、データベースがちょうど作成された場合、テーブルが存在しないし、実際にCREATE DATABASEコマンドは、指定された名前の空のディレクトリを作成する役割をする。

次のようにmysqladminユーティリティを使用しても、データベースを作成することができる。
#。/ mysqladmin create school


▶DROP DATABASE

文法:DROP DATABASE [IF EXISTS] db_name

DROP DATABASEは、最初に指定されたデータベース内のすべてのテーブルを削除し、データベースを削除します。一度削除された後に再び回復させる方法がないため、使用に注意すること。このコマンドは、データベース·ディレクトリーに存在していたファイルの数を教えてくれる一般的に実際に存在するテーブル数の3倍である。これは、一つのテーブルにインデックスファイル `。ISD '、実際のデータを格納する`。ISM'ファイルとテーブルのスキーマ(構造)を格納する `。frm 'ファイルで構成されているからだ。

3.22以降のバージョンからIF EXISTSキーワードが追加されたこれは、データベースが存在しない場合は、エラーが発生するのを防ぐためである。もちろん、mysqladminユーティリティを使用しても、データベースを削除することができる。
#。/ mysqladmin drop school


▶CREATE TABLE:テーブルの作成

文法:CREATE TABLE [IF NOT EXISTS] tbl_name(create_definition、...)[table_options] [select_statement]


create_definition:
  col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
            [PRIMARY KEY] [reference_definition]
  or PRIMARY KEY(index_col_name、...)
  or KEY [index_name] KEY(index_col_name、...)
  or INDEX [index_name](index_col_name、...)
  or UNIQUE [INDEX] [index_name](index_col_name、...)
  or [CONSTRAINT symbol] FOREIGN KEY index_name(index_col_name、...)
            [reference_definition]
  or CHECK(expr)

type:
        TINYINT [(length)] [UNSIGNED] [ZEROFILL]
  or SMALLINT [(length)] [UNSIGNED] [ZEROFILL]
  or MEDIUMINT [(length)] [UNSIGNED] [ZEROFILL]
  or INT [(length)] [UNSIGNED] [ZEROFILL]
  or INTEGER [(length)] [UNSIGNED] [ZEROFILL]
  or BIGINT [(length)] [UNSIGNED] [ZEROFILL]
  or REAL [(length、decimals)] [UNSIGNED] [ZEROFILL]
  or DOUBLE [(length、decimals)] [UNSIGNED] [ZEROFILL]
  or FLOAT [(length、decimals)] [UNSIGNED] [ZEROFILL]
  or DECIMAL(length、decimals)[UNSIGNED] [ZEROFILL]
  or NUMERIC(length、decimals)[UNSIGNED] [ZEROFILL]
  or CHAR(length)[BINARY]
  or VARCHAR(length)[BINARY]
  or DATE
  or TIME
  or TIMESTAMP
  or DATETIME
  or TINYBLOB
  or BLOB
  or MEDIUMBLOB
  or LONGBLOB
  or TINYTEXT
  or TEXT
  or MEDIUMTEXT
  or LONGTEXT
  or ENUM(value1、value2、value3、...)
  or SET(value1、value2、value3、...)

index_col_name:
        col_name [(length)]

reference_definition:
        REFERENCES tbl_name [(index_col_name、...)]
                   [MATCH FULL | MATCH PARTIAL]
                   [ON DELETE reference_option]
                   [ON UPDATE reference_option]

reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
    type = [ISAM | MYISAM | HEAP]
or max_rows =#
or min_rows =#
or avg_row_length =#
or comment = "string"
or auto_increment =#

select_statement:
    [| IGNORE | REPLACE] SELECT ... (Some legal select statement)


CREATE TABLEは、現在使用中のデータベースに新しいテーブルを作成します。もしデータベースが選択されていないか、同じ名前のテーブルが存在する場合、エラーが発生します。

MySQL 3.22以降ではテーブル名をdb_name.tbl_nameのように指定することができるようになって選択されたデータベースがなくても良い。また、3.23以降では、IF NOT EXISTSキーワードを提供し、これを使用する場合、テーブルが存在しない場合にのみ生成され、既に存在により、自動的にエラーが発生しない。

それぞれのテーブルtbl_nameは、データベースのディレクトリに次の3つのファイルとして存在する。

ファイル名機能
tbl_name.frmテーブルの構造定義ファイル
tbl_name.ISDデータファイル
tbl_name.ISMインデックスファイル

もしNULLまたはNOT NULLとして定義されていないカラムは自動的にNULL列に作成されている。
BLOBとTEXTカラムはNOT NULLとして指定しても、常にNULLで定義される。整数型カラムはAUTO_INCREMENTキーワードを利用することができます。 AUTO_INCREMENTで定義されたカラムにNULLまたは0を入力する場合、その列の最大値より1だけ増加した値が入力される。 AUTO_INCREMENTカラムは1から始まります。もし最大値を持つ行が削除される場合、その値は新たに入力された行に再度使用される。一つのテーブルは1つのAUTO_INCREMENTカラムのみが使用可能であり、必ずしもインデックスに定義されなければならない。
もしDEFAULTオプションを使用していない場合は、列がNULLのカラムの場合、NULL値がNOT NULLカラムの場合は、次のいずれかの値が自動的に指定される。
AUTO_INCREMENTではなく、数値列の場合は0
TIMESTAMP型以外のナルチャヒョン列の場合、その型のゼロ値(zero value)
文字型の列は空の文字列
UNIQUE列は、各行が別の値を取得しなければならない。もし既存の値と同じ行入力すると、エラーがエラーが発生します。、
KEYは、INDEXのもう一つの名前である。
PRIMARY KEYは複数のカラムを使用することができる。ただし、カラム定義の後半では、使用することができず、PRIMARY KEY(index_col_name、...)のように別の行に書かなければならない。
もしインデックスの名前を指定してくれない場合は、最初のインデックス列に数字をつけた形で自動的に作成され、
インデックスカラムはNULLキーワードを使用することができません。そのため、NOT NULLを宣言しなければエラーが発生する
BLOB and TEXT columns cannot be indexed。
CHARまたはVARCHARカラムの一部のみをcol_name(length)と同じように、インデックスと、インデックスファイルのサイズが小さくなります。
TEXTまたはBLOBカラムにORDER BYやGROUP BYの構文を使用する場合、列の前にmax_sort_length変数に定義された長さまで使用されます。 FOREIGN KEY、CHECK、REFERENCESの構文は、他のデータベースとの互換性のためにだけ存在し、実際には何の作用もしていアンヌダ。

▶ALTER TABLE

文法:ALTER [IGNORE] TABLE tbl_name alter_spec [、alter_spec ...]


alter_spec:
        ADD [COLUMN] create_definition [FIRST | AFTER column_name]
  or ADD INDEX [index_name](index_col_name、...)
  or ADD PRIMARY KEY(index_col_name、...)
  or ADD UNIQUE [index_name](index_col_name、...)
  or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  or CHANGE [COLUMN] old_col_name create_definition
  or MODIFY [COLUMN] create_definition
  or DROP [COLUMN] col_name
  or DROP PRIMARY KEY
  or DROP INDEX key_name
  or RENAME [AS] new_tbl_name
  or table_option


ALTER TABLEコマンドは、作成されたテーブルの構造を変更することができるようにしてくれる。たとえば、列を追加または削除、変更することができ、インデックスを作成または削除することもできます

ALTER TABLEコマンドは、元のテーブルを一時テーブルにコピーして変更を適用し、新しいテーブルの名前を変更して、元のテーブルを削除することになる。これにより、テーブルの構造を変更するときに発生する更新プログラムが失敗なく行われている。新たに変更されたテーブルが用意されるまで、書き込みと更新はしばらく遅れになる。


ALTER TABLEコマンドを使用するには、テーブルのselect、insert、delete、update、create、drop権限が必要である。
IGNOREキーワードは、MySQLの拡張機能である。これにより、インデックスの列に存在するデータに応じた制御が可能である、すなわちIGNOREを使用すると、テーブルの変更に伴うインデックスの列に存在するインデックスカラムが同じすべての行が最初の行を除いて削除される。
種々のADD、ALTER、DROP、CHANGE構文を一つのALTER TABLEコマンド内で使用可能である
CHANGE col_name、DROP col_name、DROP INDEXはMySQLの拡張機能である。
MODIFYはALTER TABLEのOracleの拡張機能である。
COLUMNキーワードは省略可能である
オプションなしでALTER TABLE tbl_name RENAME AS new_name構文を使用すると、簡単にテーブルの名前を変えることができる。
CHANGE old_col_name create_definitionステートメントを使用してもカラム名を変更することができる。この際、以前のカラム名と新しいカラム名とカラムのタイプを書けば良い。たとえば、aという名前のINTEGER列をbという名前に変更するには、次のとおりとする。
mysql> ALTER TABLE t1 CHANGE a b INTEGER;

もしカラムの名前は変更せずにタイプのみを変更するには、同じ名前を二回連続して書けば良い、これは、古い名前と新しい名前が同じだという意味である。
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

MySQL 3.22.16以降ではMODIFY構文をサポートし、新しい名前を指定せずに、次のようにカラム名を変更できるようになった。
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;


もしCHANGEまたはMODIFYを使用して列の一部部だけが索引がかかったカラムの長さを小さくする場合、そのインデックスの大きさ以下には応じて変更することができません。
DROP INDEXはインデックスを削除します。これはANSI SQL92でサポートされていないMySQLの拡張機能である
もしインデックスにとらえられているカラムを削除すると、その列に作成されたインデックスも自動的にサポートされている。
DROP PRIMARY KEYは主キーのインデックスを削除します。もし主キーがない場合は、テーブルの一番前に存在するUNIQUEインデックスを削除します。
FOREIGN KEY、CHECK REFERENCESオプションには、実際に何も動作しません。これらのものは、互換性のために存在するだけだ。次のALTER TABLEの使用に関するいくつかの例がある。

一度テーブルt1を作成します。
mysql> CREATE TABLE t1(a INTEGER、b CHAR(10));

テーブルt1の名前をt2に変更する。
mysql> ALTER TABLE t1 RENAME t2;

カラムaをINTEGERからTINYINT NOT NULLカラム型だけを変えてCHAR(10)カラムbをCHAR(20)のcという名前に変えてみる。
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL、CHANGE bc CHAR(20);

dという名前の新しいTIMESTAMPカラムを追加します。
mysql> ALTER TABLE t2 ADD d TIMESTAMP;

カラムdにインデックスを作成し、カラムaを主キーにする。
mysql> ALTER TABLE t2 ADD INDEX(d)、ADD PRIMARY KEY(a);

カラムcを削除します。
mysql> ALTER TABLE t2 DROP COLUMN c;

AUTO_INCREMENTカラムcを追加します。この時、AUTO_INCREMENTカラムはNOT NULLで、索引が生成する必要がないという事実に注意しよう。
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT、ADD INDEX(c);

▶OPTIMIZE TABLE

文法:OPTIMIZE TABLE tbl_name

OPTIMZE TABLEはテーブルからの相当のデータを削除するか、VARCHAR、BLOB、TEXTなどのプロポーショナル列に多くの変化が生じた場合に使用されます。削除されたデータは、リンクされた空間に残り付いたINSERTコマンドによって再利用されるため、ストレージ容量は、不連続的になる。 OPTIMIZE TABLEコマンドは、未使用領域を返すようにする。

OPTIMIZE TABLEは元テーブルのコピーを作成し作業をすることになる。前のテーブルが使用されていない領域を整理して、新しいテーブルが作成される前のテーブルは削除され、一時テーブルの名前が削除されたテーブルのように変更されます。この方法により、すべての更新プログラムは、正常に実行され、OPTIMIZE TABLEコマンドが実行されている途中にも、元のテーブルは読み取りが可能で、更新プログラムやデータの書き込みは、新しく作成されたテーブルが準備されるまでしばらく時間がかかる。


▶DROP TABLE

文法:DROP TABLE [IF EXISTS] tbl_name [、tbl_name、...]

DROP TABLEは、複数のテーブルを削除します。テーブル内のすべてのデータとテーブルの構造の定義が瞬時に消えるので、使用に注意すること。 MySQL 3.22以降でIF EXISTSキーワードが追加され、テーブルが存在しない場合は、原因となるエラーを防ぐことができました。

▶DELETE

文法:DELETE [LOW_PRIORITY] FROM tbl_name [WHERE where_definition] [LIMIT rows]

DELETEは、指定された条件に一致する行を削除した後削除された行数を返します。

もしWHERE句を省略すると、すべての行が削除される。この場合、MySQLは最初に同じ名前の空のテーブルを新たに作るこの方法は、それぞれの行を消すよりも速いためだ。この時、削除された行数は、0を返します。

もし時間がもっとかかっても、いくつかの行が削除されていることを知りたい場合WHERE句を省略せず、次のように常に真である内容を書けば良い。
mysql> DELETE FROM tbl_name WHERE 1> 0;

この場合、当然WHERE句省略したまま消去するよりもはるかに遅くなる。
もしLOW_PRIORITYキーワードを使用すると、すべてのユーザーがそのテーブルの使用を終えるまで、DELETEの実行が遅れます。

削除されたデータ領域は、新たに追加されたデータによって不連続的にいっぱいになってされるため、OPTIMIZE TABLEコマンドとisamchkユーティリティを使用すると、速度が向上します。 OPTIMIZE TABLEは使用が容易な一方、isamchkユーティリティは速度が速い。

MySQLでのみ使用が可能なLIMITキーワードを使用して一度に削除する行の数を指定して与えることができる。これは、何のデータが削除されるか予測できない場合は、時間を節約するために使用することができる。もちろん、LIMITを繰り返し使用すると、条件を満たすすべてのデータを削除することができる。

▶SELECT

文法:SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [DISTINCT | ALL]


select_expression、...
    [INTO OUTFILE 'file_name' export_options]
    [FROM table_references
        [WHERE where_definition]
        [GROUP BY col_name、...]
        [HAVING where_definition]
        [ORDER BY {unsigned_integer | col_name} [ASC | DESC]、...]
        [LIMIT [offset、] rows]
        [PROCEDURE procedure_name]]


SELECTは、複数のテーブルからデータをインポートするときに使用される。
select_expressionは、データをインポートする列を示す。 SELECTステートメントは、テーブルの列ではなく、単純な演算や関数の結果を示す際にも使用されます。以下の例を見てみよう。


mysql> SELECT 1 + 1;
- > 2


すべてのキーワードは、上記の使い方に現れた順番に出なければならない。たとえば、HAVING節は必ずGROUP BYの後ろとORDER BYの間に出るはずです。


ASを使用してカラム名を別名(alias)で使うことができる。ニックネームはORDER BY、またはHAVING句でも使用可能である。
mysql> select concat(last_name、 '、'、first_name)AS full_name from mytable ORDER BY full_name。


FROM table_referencesは、データをインポートするテーブルを示す。もし2つ以上のテーブルを利用する場合は、結合をしなければならない。

カラム名は、col_name、tbl_name.col_name、db_name.tbl_name.col_nameと同じ方法で参照することができる。しかし、二つ以上のテーブルで共通して存在しているカラムを使用している場合を除き、省略してもかまいません。

データの並べ替えのためにORDER BY、GROUP BY節では、カラム名、カラムの別名は、列インデックス(1から始まる)を使用することができる。



mysql> select college、region、seed from tournament
           ORDER BY region、seed;
mysql> select college、region AS r、seed AS s from tournament
           ORDER BY r、s;
mysql> select college、region、seed from tournament
           ORDER BY 2、3;


降順に並べ替えするには、DESCキーワードを使用している。昇順で並べ替えするには、ASCキーワードを使用するのにデフォルトになっているので省略することができます。


HAVING句は、select_expressionに出てきた列、列の別名を参照することができる。ここでは、データを出力する直前に最後に処理されます。したがって、HAVING句内にWHEREで使用する列を使えばならない。下記の間違った例がある。
mysql> select col_name from tbl_name HAVING col_name> 0;

次のように使わなければならない。
mysql> select col_name from tbl_name WHERE col_name> 0;

MySQL 3.22.5以降のバージョンでは、次のように書くこともできる。
mysql> select user、max(salary)from users group by user HAVING max(salary)> 10;

旧バージョンの場合は、代わりに次のように書かなければならない:
mysql> select user、max(salary)AS sum from users group by user HAVING sum> 10;


LIMIT句は、SELECTステートメントによって表示されるデータの数を調整することができます。 LIMITは一つか二つの引数を持つことができます。もし2つの引数が使用される前の引数は省略行数を示す。後の引数は、最大でインポート行数である。引数が1つだけ使用の場合、最初の引数が0とみなされ、与えられた値だけの行を取得する。つまり、LIMIT nはLIMIT 0、n。と同じ意味である。

mysql> select * from table LIMIT 5,10;#6-15行まで
If one argument is given、it indicates the maximum number of ro​​ws to return。
mysql> select * from table LIMIT 5;#最初の5行


SELECT ... INTO OUTFILE 'file_name'はインポートしたデータをファイルに保存する、この時ファイルは、サーバーに作成され、同じ名前のファイルが既に存在してはならない。また、ユーザーは、必ずfile権限を持っている必要があります。

▶JOIN

MySQLは、SELECTステートメント内で次のようなJOINステートメントをサポートします。

文法:table_reference、table_reference
table_reference [CROSS] JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING(column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr}

最後のLEFT OUTER JOIN構文は、ODBC準拠のために存在している。


テーブル参照は、tbl_name AS alias_nameまたはtbl_name alias_nameのような方法で行うことができる。
mysql> select t1.name、t2.salary from employee AS t1、info AS t2 where t1.name = t2.name;


ON条件は、WHERE句で使用されている内容が来ることができる。

もしLEFT JOINによって右表の条件に合うデータがないときは、オルンピョテーブルのすべての列がNULLである仮想の行処理される。これらの特徴を利用して一つのテーブルにだけ存在するデータの数を求めることができる。

mysql> select table1。* from table1 LEFT JOIN table2 ON table1.id = table2.id where table2.id is NULL;上の例では、table1の資料の中にidの値がtable2に存在しないデータの両方を持って来る。


USING column_list節で使用するカラム名は、必ず両方のテーブルに存在しなければならない。次の例を見てみよう:

A LEFT JOIN B USING(C1、C2、C3、...)

この文は次のように書くこともできる。
A.C1 = B.C1 AND A.C2 = B.C2 AND A.C3 = B.C3、...

その他、いくつかの例を見てみると以下の通りである。
mysql> select * from table1、table2 where table1.id = table2.id;
mysql> select * from table1 LEFT JOIN table2 ON table1.id = table2.id;
mysql> select * from table1 LEFT JOIN table2 USING(id);
mysql> select * from table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;

▶INSERT

文法:INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name、...)] VALUES(expression、...)、(...)、... or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name、...)] SELECT ... or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name = expression、col_name = expression、 ...
INSERTテーブルに新しい行を挿入します。
The INSERT ... SELECT文は、他のテーブルからSELECTしたデータを入力するときに使用される。 tbl_nameは行が追加されるテーブル名です。カラム名やSET句のデータが挿入される列を指定する。


もしINSERT ... VALUESまたはINSERT ... SELECT文内で列が指定されていない場合、すべての列にそれぞれ対応するデータがVALUES()またはSELECTステートメントによって提供されなければならない。もしテーブル内の列の順序がわからない場合は、DESCRIBE tbl_nameを使用すると、簡単に知ることができる。

expressionの部分は前にVALUESリストに出てきた値を利用することができる。次の例を見てみよう。
mysql> INSERT INTO tbl_name(col1、col2)VALUES(15、col1 * 2);

ただし、以下の場合は、エラーが発生します。必ず前面に出てきた値のみを参照することができることに注意してください。
mysql> INSERT INTO tbl_name(col1、col2)VALUES(col2 * 2,15);

もしLOW_PRIORITYキーワードを使用すると、他のすべてのユーザーが使用中のテーブルで読み取り操作を終了するまでINSERTステートメントの実行が遅延されます。

IGNOREキーワードを使用すると、新しく挿入されたデータと同じキー(PRIMARYまたはUNIQUE key)の値を持つデータは無視され、次のデータが入力される。もしIGNOREを使用していない場合は、INSERTの実行が中断されてしまう。この時、mysql_info()関数を使用すると、テーブルにどのように多くの行が挿入されている知ることができる。

NOT NULLカラムにNULLが入力される場合は、無視され、デフォルト値として入力される。

数値カラムに使用範囲を超えて値を入力すると、表示可能な最も近い数に変更されて挿入される。

CHAR、VARCHAR、TEXT、BLOBカラムの最大入力桁以上のデータが入っている場合に表示可能な部分まで切り捨てられ、入力されます。

日付列に適切でない値が入力されるとゼロ値(zero value)で入力される。
DELAYEDオプションは、INSERTステートメントの実行を待つことができないユーザーがいる場合に非常に便利です。この場合、もしSELECTステートメントを使用しているユーザーがいる場合は、優先順位を与えられて最初に実行させてからINSERTステートメントの実行を処理することになる。これはANSI SQL92にはないMySQLの拡張機能である。
DELAYEDオプションのもう一つの利点は、多くのユーザーによってINSERTが行われるとき、これらにより挿入されるデータを集めて一度に書き込み操作をするということだ。この場合、それぞれのデータを挿入するときよりも処理速度が速い。

▶REPLACE

文法:REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name、...)] VALUES(expression、...)or REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name、...)] SELECT ... or REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name = expression、col_name = expression、... REPLACEコマンドはINSERTコマンドと同様に動作一つ一つの違いは、インデックス列の既存の値と同じ行が入力される場合は、既存の行を削除し、新しい行の入力が行われます。

▶LOAD DATA INFILE

文法:LOAD DATA [LOCAL] INFILE 'file_name.txt "[REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY' \ t '] [OPTIONALLY] ENCLOSED BY"] [ESCAPED BY' \ \ ']] [LINES TERMINATED BY '\ n'] [IGNORE number LINES] [(col_name、...)] LOAD DATA INFILEコマンドは、テキストフ​​ァイルからデータを読んで、非常に高速で、テーブルに入力します。LOCALキーワードを使用する場合、クライアントのホストに存在するファイルを使用して、それ以外の場合MySQLが起動しているサーバーに存在するファイルが使用されます。サーバーに存在するファイルを利用LOAD DATA INFILEコマンドを実行するためには、file権限を持っている必要があり、セキュリティ上の理由でサーバーに存在するファイルを読み取る場合、そのデータベースのディレクトリに存在するか誰でも読めるパーミッションを持っているべきである。

サーバーに存在するファイルを利用するために、以下の規則がある。

絶対パスで与えられた場合は、パス名をそのまま続く
もし相対パスが与えられた場合は、使用中のデータベースのディレクトリへの相対パスとして認識する。
パスを付けずにファイル名のみを使用すると、使用中のデータベースのディレクトリからファイルを検索する

REPLACEとIGNOREキーワードは、索引列に入力されたデータ行を制御します。もしREPLACEを使用する場合、既存の行は削除され、新しい値が入力され、IGNOREを使用しハルギョングウ新しい値は無視され、既存の値が保存される。もしキーワードがない場合は、オルガ発生する。

FIELDSキーワードを使用する場合はTERMINATED BY、[OPTIONALLY] ENCLOSED BY、ESCAPED BYオプションで、必ず一つ以上使用する必要がありますもしFIELDSキーワードを使用していない場合、デフォルトでは、次の命令を下したようだ。
FIELDS TERMINATED BY '\ t' ENCLOSED BY "ESCAPED BY '\ \'

LINESキーワードを使用していない場合、デフォルトでは、次の命令を下したようだ。
LINES TERMINATED BY '\ n'

つまり、LOAD DATA INFILEコマンドのデフォルト値は以下の通りです

それぞれの行は、戻り値(newline)で区分される。
各列はタブで区切られる。
各データは、引用符を使用していません。
行変わる場合 `\ '文字を使用する▶UPDATE

文法:UPDATE [LOW_PRIORITY] tbl_name SET col_name1 = expr1、col_name2 = expr2、... WHERE where_definition] UPDATEコマンドは、テーブル内の各カラムの値を新しい値で更新します。 SET構文は変更される列と、新しい値を指定する。もしWHERE構文が与えられる場合の条件を満たす行のみが更新され、省略すると、すべての行が更新される。

LOW_PRIORITYオプションを使用する場合、他のすべてのクライアントがテーブルの読み取り操作が完了するまでUPDATEの実行が遅れます。

SET構文でテーブルのカラム名を使用する場合、その列に格納されている値が使用される以下のage列の現在の値より1だけ増加させる例である。
mysql> UPDATE persondata SET age = age +1;

UPDATEステートメントは、それぞれの演算を左から右に実行します。以下のage列の現在の値の2倍した後、1位増加させる例である。

mysql> UPDATE persondata SET age = age * 2、age = age +1;

ちょっと!:もし現在の値と同じ値に更新する場合MySQLを無視して実行しない。

▶USE

文法:USE db_name

USEコマンドは、使用するデータベースを変更します。

mysql> USE db1;
mysql> SELECT count(*)FROM mytable;#selects from db1.mytable
mysql> USE db2;
mysql> SELECT count(*)FROM mytable;#selects from db2.mytable

USEコマンドで特定のデータベースを使用しても、データベースの名前を指定すれば、他のデータベースに存在するテーブルを使用することができる。

次の例は、データベースdb1に存在するauthorテーブルと、db2データベース内のeditorテーブルを使用していることを示す。
mysql> USE db1;
mysql> SELECT author_name、editor_name FROM author、db2.editor WHERE author.editor_id = db2.editor.editor_id、USEコマンドは、Sybaseとの互換性のために提供される。

▶FLUSH

文法:FLUSH flush_option [、flush_option]

MySQLで使用される内部のキャッシュをクリアして新たに読み込むために使用されるコマンドです。このコマンドを使用するには、reload権限を持っている必要があります。

flush_optionには、以下のようなオプションがあります。


オプションの説明
HOSTS hostテーブルを再ロードします。接続したいホストのIPが変更された新しいホストを追加した場合と、 "Host ... is blocked"エラーメッセージや表示されたらhostテーブルを再読込みしてなければならない。最大接続可能数よりも多くのホストが接続を試みると、エラー(max_connect_errors)が発生し、この時にMySQLは何かよくモトドゥェオトことと判断してhostテーブルに登録されたホストのより以上の接続を拒否することになる。これらのエラーを防止するためには、以下のように非常に大きな値を指定してデーモンを起動した時になる。
shell> mysqld-O max_connection_errors = 999999999
LOGSログ·ファイルを空にして新たに作成します。これらのログファイル名を拡張子なしで指定すれば自動的に古いログファイルの名前に1が増加したファイル名が起こる。
PRIVILEGES mysqlデータベース内の権限の管理テーブルを再ロードします。
TABLES開いているテーブルを閉じます。
STATUSすべての状態変数(status variables)を0にする

以下のようにmysqladminユーティリティを使用しても同じ作業を行うことができる。
shell> mysqladmin flush-hosts、flush-logs、reload、flush-tables

▶KILL

文法:KILL thread_id

mysqldによって、それぞれの接続は、独立したスレッドで運営される。 SHOW PROCESSLISTコマンドで動作中のスレッドを見ることができKILL thread_idコマンドでスレッドを殺すことができる。 PROCESS権限を持っている場合、すべてのスレッドを見ることができ、そうでなければ、自分のスレッドだけを見ることができる。

下記の方法でスレッドをチェックして殺すことができる。
shell> mysqladmin processlistとshell> mysqladmin kill thread_id

▶SHOW

テーブル、カラム、およびその他の情報を表示します。

文法:SHOW DATABASES [LIKE wild] or SHOW TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM db_name] or SHOW STATUS or SHOW VARIABLES [LIKE wild 】or SHOW PROCESSLIST or SHOW TABLE STATUS [FROM db_name] [LIKE wild]

SHOWコマンドはデータベース、テーブル、カラム、MySQLサーバの情報を示します。 LIKEステートメントを使用すると、 `% 'と` _'ワイルドカード文字を使用することができる

db_name.tbl_nameをtbl_name FROM db_nameと同じ形式で使用することができます。したがって、次の二つの文章は、同じ機能をする。
mysql> SHOW INDEX FROM mytable FROM mydb;
mysql> SHOW INDEX FROM mydb.mytable。

SHOW DATABASES - MySQLサーバのホスト上に存在するデータベースの一覧を表示します。シェルプロンプト上でmysqlshowコマンドも同じ働きをする。

SHOW TABLES - 選択されたデータベース内に存在するテーブルを示す。シェルプロンプト上でmysqlshow db_nameのようだ。

注意:もしテーブルに対する権限が何もない場合は、結果が表示されません。

SHOW COLUMNS表の列情報を表示します。 DESCRIBEコマンドも似たような役割を果たしている。

SHOW TABLE STATUS - 3.23のバージョンで追加された機能である。 SHOW STATUSと似たような機能が、それぞれのテーブルに関する詳細な情報を得ることができる。シェルプロンプトでmysqlshow - status db_nameコマンドを使っても同じ結果を得ることができる。

以下のような情報が見られる。

項目説明
Nameテーブル名
Typeテーブルタイプ(NISAM、MYISAM、HEAP)
Rows列の数
Avg_row_length列の平均長さ
Data_lengthデータファイルのサイズ
Max_data_lengthデータファイルの最大サイズ
Index_lengthインデックスファイルのサイズ
Data_freeデータファイルに割り当てられていの未使用領域の大きさ
Auto_increment Auto_increment列の次の値
Create_timeテーブルの作成時
Update_timeテーブルの最終更新時間
Check_timeテーブルを最後チェックし時間
Create_min_rowsテーブルの作成時に "min_rows"オプションを使用するかどうか
Create_max_rowsテーブルの作成時に "max_rows"オプションを使用するかどうか
Create_avg_row_lengthテーブルの作成時に "avg_row_length"オプションを使用するかどうか
Commentテーブル作成時に入力したコメント


SHOW FIELDS - SHOW COLUMNSまたはSHOW KEYSと同じテーブルのカラムやインデックスの情報を表示します。

SHOW INDEX - 以下のようなインデックス情報を示しています


項目説明
Tableテーブル名
Non_uniqueインデックスに同じ値が格納されない場合は0
Key_nameインデックス名
Seq_in_indexインデックス内の何番目の列である1から始まります。
Column_nameカラム名
Collat​​ionインデックスがどのように保存されますが。 A(昇順で並べ替え)、NULL(ソートなし)。
Cardinalityインデックス内に存在する唯一のデータのこと
Sub_part列の一部だけをインデックスしている場合、このサイズ。もしカラム全体が使用されるNULL


SHOW STATUS - サーバーの状態に関する情報を表示します。スェᆸプロンプトでmysqladmin extended-statusコマンドのようだ。結果は次のと似ているのだ。


+ -------------------------- + -------- +
| Variable_name | Value |
+ -------------------------- + -------- +
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Created_tmp_tables | 0 |
| Delayed_insert_threads | 0 |
| Delayed_writes | 0 |
| Delayed_errors | 0 |
| Flush_commands | 2 |
| Handler_delete | 2 |
| Handler_read_first | 0 |
| Handler_read_key | 1 |
| Handler_read_next | 0 |
| Handler_read_rnd | 35 |
| Handler_update | 0 |
| Handler_write | 2 |
| Key_blocks_used | 0 |
| Key_read_requests | 0 |
| Key_reads | 0 |
| Key_write_requests | 0 |
| Key_writes | 0 |
| Max_used_connections | 1 |
| Not_flushed_key_blocks | 0 |
| Not_flushed_delayed_rows | 0 |
| Open_tables | 1 |
| Open_files | 2 |
| Open_streams | 0 |
| Opened_tables | 11 |
| Questions | 14 |
| Running_threads | 1 |
| Slow_queries | 0 |
| Uptime | 149111 |
+ -------------------------- + -------- +


それぞれの項目は、次のような情報を示す。


Aborted_clientsクライアントが正常な停止ができず切断された接続数
Aborted_connects MySQLソボネ接続を試みたが、失敗した接続数
Created_tmp_tables SQLステートメントの実行中作成される一時テーブルの数
Delayed_insert_threads使用されている遅延INSERドア(delayed insert handler)が
Delayed_writes INSERT DELAYEDで書かれた行数。
Delayed_errors INSERT DELAYEDでエラーが発生した行数
Flush_commands FLUSHコマンドの実行回数
Handler_deleteテイブルネヘン削除コマンドが
Handler_read_firstテーブルまず、読み取りコマンドの数
Handler_read_keyインデックスベーステーブルの読み取りコマンドが
Handler_read_nextインデックスの並べ替え順序に基づいて実行され、次の行の読み取りコマンドが
Handler_read_rnd固定幅のテーブルで実行された行の読み取りコマンドが
Handler_updateテーブルUPDATEコマンドを実行することができ
Handler_writeテーブルINSERTコマンドを実行することができ
Key_blocks_usedインデックスキャッシュで使用されたブロック数
Key_read_requestsインデックスキャッシュで処理されたコマンドの数
Key_readsディスクの物理的な読み取り回数
Key_write_requestsブロック索引のキャッシュに保存されたコ​​マンドの数
Key_writesブロックが物理ディスクに保存したコマンドが
Max_used_connections処理可能な最大同時接続数
Not_flushed_key_blocksインデックスキャッシュの内容が変更されたがまだディスクに保存されていないブロックが
Not_flushed_delayed_rows INSERT DELAYによって処理遅延されている行数
Open_tables現在使用のために開かれたテーブルが
Open_filesオープンされたファイルが
Open_streamsログインのために接続された接続数
Opened_tables今まで開いているテーブルが
Questionsサーバによって要求された質問
Running_threads現在接続している接続(スレッド)が
Slow_queries long_query_timeに定義された時間よりも実行時間がタイムアウトし、要求することができ
Uptimeサーバー起動後の経過時間


SHOW VARIABLES

MySQLのシステム変数を出力します。システムプロンプトでmysqladmin variablesコマンドを使っても同じ内容を見ることができる。いくつかの変数のデフォルト値を変更するには、mysqldをコマンドラインオプションを与えて実行すればよい。

実行結果は次のようである。


+ ------------------------ + ------------------------ - +
| Variable_name | Value |
+ ------------------------ + ------------------------ - +
| back_log | 5 |
| connect_timeout | 5 |
| basedir | / my / monty / |
| datadir | / my / monty / data / |
| delayed_insert_limit | 100 |
| delayed_insert_timeout | 300 |
| delayed_queue_size | 1000 |
| join_buffer_size | 131072 |
| flush_time | 0 |
| key_buffer_size | 1048540 |
| language | / my / monty / share / english / |
| log | OFF |
| log_update | OFF |
| long_query_time | 10 |
| low_priority_updates | OFF |
| max_allowed_pa​​cket | 1048576 |
| max_connections | 100 |
| max_connect_errors | 10 |
| max_delayed_threads | 20 |
| max_heap_table_size | 16777216 |
| max_join_size | 4294967295 |
| max_sort_length | 1024 |
| max_tmp_tables | 32 |
| net_buffer_length | 16384 |
| port | 3306 |
| protocol-version | 10 |
| record_buffer | 131072 |
| skip_locking | ON |
| socket | / tmp / mysql.sock |
| sort_buffer | 2097116 |
| table_cache | 64 |
| thread_stack | 131072 |
| tmp_table_size | 1048576 |
| tmpdir | / machine / tmp / |
| version | 3.23.0-alpha-debug |
| wait_timeout | 28800 |
+ ------------------------ + ------------------------ - +


次の章MySQLの管理とチューニングで、それぞれの変数の説明とチューニングの方法です。

SHOW PROCESSLIST
現在接続中のスレッドを表示します。
shell> mysqladmin processlistコマンドを利用しても同じ情報を得ることができる。基本的に自分のスレッドだけを表示してPROCESS権限を持っている場合は、すべてのスレッドの情報を表示します。この場合、KILLコマンドを使用し、スレッドを殺すことができる。

▶LOCK TABLES / UNLOCK TABLES

文法:LOCK TABLES tbl_name [AS alias] READ | [LOW_PRIORITY] WRITE [、tbl_name READ | [LOW_PRIORITY] WRITE ...] ... UNLOCK TABLES LOCK TABLESコマンドは、現在のスレッドのためにテーブルにロック(lock)をかける。スレドゥランデータベースに接続される接続ごとに考えてください。 UNLOCK TABLESは、現在のスレッドでかかったすべてのロックを緩める。一つのスレッドによりロックがかかったすべてのテーブルは、このスレッドが別のテーブルにロックをかける場合や接続が切断される場合は、自動的にロックが解除される。

もし、あるスレッドがいくつかのテーブルに読み取り(READ)ロックかけると、そのスレッドのユーザーだけがそのテーブルを読むことができる。

また、一つのスレッドに書き込み(WRITE)ロックをかける場合、そのスレッドのユーザーだけがテーブルを読み書きできるようになる。他のスレッドは、そのテーブルにかかったロック解けるするまで待機することになる。

一般的に書き込みロックが読み取りロックよりもウンソンのランキングが高いのは可能であれば更新が早く進むようにするためである。つまり、あるスレッドがテーブルに読み取りロックをかけた状態で他のスレッドがテーブルに書き込みロックをかける前に読むロックしたスレッドは、書き込みロックが解除さになるまで待つことになる。

一般的に一つのテーブルだけを更新する場合には、ロックをかける必要はありません。なぜなら一つのスレッドでSQLステートメントが実行されている場合、他のスレッドは、このスレッドを妨害することができないからだ。露出されて時々ロックが必要な場合もある。

もし多数のテーブルから一連の連続した​​作業をする必要がある場合は、使用するテーブルをロックした場合より早くなることができる。 MySQLは、トランザクション(transaction)を提供していないため、もしSELECTとUPDATEの間に、他のスレッドが加わらないないようにするには、LOCK TABLESコマンドを使用しなければならない。

このような一連の作業を安全に処理する例を以下にあります。

mysql> LOCK TABLES trans READ、customer WRITE;
mysql> select sum(value)from trans where customer_id = some_id;
mysql> update customer set total_value = sum_from_previous_statement
where customer_id = some_id;
mysql> UNLOCK TABLES;
この場合、もしLOCK TABLESコマンドを使用していない場合は、SELECTとUPDATEコマンドの間に、他のユーザーのスレッドが割り込むことがあります。

▶GRANT / REVOKE

文法:
GRANT priv_type [(column_list)] [、priv_type [(column_list)] ...]
    ON tbl_name | * | *。* | db_name。*
    TO user_name [IDENTIFIED BY 'password']
        [、user_name [IDENTIFIED BY 'password'] ...]
    [WITH GRANT OPTION]

REVOKE priv_type [(column_list)] [、priv_type [(column_list)] ...]
    ON tbl_name | * | *。* | db_name。*
    FROM user_name [、user_name ...]
GRANTとREVOKEコマンドは、システム管理者がデータベース·ユーザーに次のような4段階の権限を付与または取り消すことができます。

commands allow system administrators to grant and revoke rights to MySQL users at four privilege levels:
Globalレベル
この権限は、サーバー上のすべてのデータベースに対する権限としてmysqlデータベースのuserテーブルに格納されます。

Databaseレベル
特定のデータベースに存在するすべてのテーブルに対する権限をmysqlデータベースのdb、hostテーブルに格納されます。

Table level
特定のテーブル内のすべてのカラムの権限でmysqlデータベースのtables_privテーブルに格納されます。

Column level
特定のテーブルに1つのカラムの権限でmysqlデータベースのcolumns _privテーブルに格納されます。

一ユーザーが自分の権限を他のユーザーに付与する(GRANT)の権限を奪うためには、次のとおりとする。

REVOKE GRANT OPTION ON priv FROM user;

テーブルで使用可能な権限はSELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT、INDEX、ALTER。などがある。

▶CREATE INDEX

インデックスを作成します。
文法:CREATE [UNIQUE] INDEX index_name ON tbl_name(col_name [(length])、...)

CREATE INDEX構文はMySQL 3.22。以前のバージョンでは、何も動作しません。 3.22以降のバージョンでは、CREATE INDEXはインデックスを作成するALTER TABLEの構文のような役割を果たしている。

一般的にすべてのインデックスは、CREATE TABLE構文を用いて、テーブル作成時に作成することができますが、CREATE INDEXステートメントを使用すると、既に存在するテーブルにインデックスを追加することができる。列のリストを括弧内に(col1、col2、...)のように列挙することにより、複数の列のインデックスを作成することができる。この時生成されるインデックス値は、両方の列の組み合わせで作られる。

カラムの一部のみをインデックスに作成CHARとVARCHARカラムでは、col_name(length)のようにlengthを指定して与えることでカラムの一部のみを使用することができる。

次の例nameカラムの前10桁のみをインデックスにすることを示す。
mysql> CREATE INDEX part_of_name ON customer(name(10));
この場合、名前全体をインデックスにするよりも検索速度は遅くなりますけど、多くのディスク領域を節約することができINSERT実行時の速度が向上します。

▶DROP INDEX

文法:DROP INDEX index_name

インデックスを削除します。 DROP INDEX構文はMySQL 3.22。以前のバージョンでは、何も動作しません。 3.22以降のバージョンでは、DROP INDEXはインデックスを削除するALTER TABLEの構文のような役割を果たしている。


0 件のコメント:

コメントを投稿