Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


3.2 クエリーの入力

前のセクションで説明したように、サーバーに接続していることを確認します。それだけでは操作するデータベースは選択されていませんが、それでかまいません。この時点では、テーブルの作成、テーブルへのデータのロード、テーブルからのデータの取り出しに今すぐ進むのではなく、クエリーの発行方法を学ぶことが重要です。このセクションでは、mysql の動作に習熟するために、いくつかのクエリーを使用してコマンド入力の基本原則について説明します。

サーバーにバージョン番号と現在の日付を照会する単純なコマンドを次に示します。mysql> プロンプトに続けて、次に示すように入力してから Enter を押します。

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| VERSION()    | CURRENT_DATE |
+--------------+--------------+
| 5.6.1-m4-log | 2010-08-06   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

このクエリーには、mysql に関するいくつかの事項が示されています。

  • 通常、コマンドは SQL ステートメントとそれに続くセミコロンで構成されます。(セミコロンを省略できる例外もいくつかあります。前述の QUIT もその 1 つです。ほかのものについてはあとで説明します。)

  • コマンドを発行すると、mysql はそれをサーバーに送信して実行し、結果を表示してから、もう 1 つの mysql> プロンプトを出力して、次のコマンドの準備ができたことを示します。

  • mysql は、クエリーの出力を表形式 (行とカラム) で表示します。最初の行には、カラムのラベルが表示されます。以降の行はクエリーの結果です。通常、カラムラベルは、データベーステーブルからフェッチされるカラムの名前です。次の例のように、テーブルカラムではなく式の値を取得する場合、mysql ではカラムのラベルとして式自体が使用されます。

  • mysql では、返された行の数とクエリーの実行にかかった時間が表示されるため、サーバーの大まかなパフォーマンスがわかります。これらの値は、CPU 時間やマシン時間ではなく時計の時間で表されるため、また、サーバー負荷やネットワーク待機時間などの要因に影響されるため、正確ではありません。(簡略化のために、この章のほかの例ではrows in setの行が省略されている場合もあります。)

キーワードは大文字でも小文字でも入力できます。次のクエリーは同等です。

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

次に、別のクエリーを示します。これは、mysql を簡単な計算機として使用できることを示しています。

mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4)      | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 |      25 |
+------------------+---------+
1 row in set (0.02 sec)

これまでに示したクエリーは、比較的に短い、1 行のステートメントでした。1 行に複数のステートメントを入力することもできます。各ステートメントの末尾にはセミコロンを付加してください。

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| VERSION()    |
+--------------+
| 5.6.1-m4-log |
+--------------+
1 row in set (0.00 sec)
+---------------------+
| NOW()               |
+---------------------+
| 2010-08-06 12:17:13 |
+---------------------+
1 row in set (0.00 sec)

1 つのコマンド全体を 1 行に入力する必要はないため、複数の行を必要とする長いコマンドでも問題ありません。mysql は、入力行の末尾を探すのではなく、終端のセミコロンを探すことによってステートメントの末尾を判定します。(つまり、mysql は自由形式の入力を受け入れます。入力行を収集しますが、セミコロンが見つかるまでは実行しません。)

次に、単純な複数行ステートメントを示します。

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+---------------+--------------+
| USER()        | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2010-08-06   |
+---------------+--------------+

この例では、複数行にわたるクエリーの最初の行を入力したあと、プロンプトが mysql> から -> に変化することに注意してください。これは、mysql がまだ完全なステートメントを検出しておらず、残りの入力を待機していることを示しています。プロンプトは貴重なフィードバックを提供してくれる味方です。そのフィードバックを使用すれば、mysql が何を待機しているのかを、常に認識することができます。

入力途中のコマンドの実行を取り消すには、\c と入力します。

mysql> SELECT
    -> USER()
    -> \c
mysql>

ここでもプロンプトに注目してください。\c の入力後に mysql> に戻り、mysql が新しいコマンドに対して準備できていることを示すフィードバックが与えられます。

次の表に、表示される各プロンプトとそれらが示す mysql の状態をまとめます。

プロンプト 意味
mysql> 新しいコマンドを入力できます。
-> 複数行コマンドの次の行を待機しています。
'> 単一引用符 (') で始まった文字列が完了するまで次の行を待機しています。
"> 二重引用符 (") で始まった文字列が完了するまで次の行を待機しています。
`> 逆引用符 (`) で始まった識別子が完了するまで次の行を待機しています。
/*> /* で始まったコメントが完了するまで次の行を待機しています。

一般に、1 行のコマンドを発行しようとして終端のセミコロンを忘れると、複数行ステートメントが発生します。この場合、mysql は追加の入力を待機します。

mysql> SELECT USER()
    ->

これが起きた場合 (ステートメントを入力したのに -> プロンプトの応答が示される) は、mysql がセミコロンを待機している可能性が高くなります。プロンプトの意味に気付かなければ、何をするべきか理解するまでに時間がかかるかもしれません。セミコロンを入力してステートメントを完了すると、mysql で実行されます。

mysql> SELECT USER()
    -> ;
+---------------+
| USER()        |
+---------------+
| jon@localhost |
+---------------+

'> および "> プロンプトは、文字列の収集中に発生します (MySQL が文字列の完了を待機しているという意味です)。MySQL では、' 文字または " 文字で囲んで文字列を記述でき (たとえば、'hello'"goodbye" など)、mysql では、複数行にわたって文字列を入力することができます。'> または "> プロンプトが表示される場合、それは ' または " 引用符で始まる文字列を含む行を入力したが、その文字列を終了させる対応する引用符をまだ入力していないことを意味します。このような場合、引用符の入力を忘れていることがよくあります。例:

mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
    '>

この SELECT ステートメントを入力し、Enter を押して結果を待っても、何も起きません。このクエリーがなぜそれほど時間がかかるのかと不思議に思うのではなく、'> プロンプトで示される手がかりに注目してください。このプロンプトは、mysql が完了していない文字列の残りを待機していることを示しています。(このステートメントの間違いに気付きましたか。文字列 'Smith には、2 番目の一重引用符がありません。)

では、どうしますか。もっとも簡単なのは、コマンドを取り消すことです。ただし、この場合は単に \c と入力することはできません。なぜなら、mysql で収集中の文字列の一部とみなされるからです。代わりに、閉じる引用符を入力して (つまり、文字列が完了したことを mysql に認識させ)、次に \c と入力します。

mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
    '> '\c
mysql>

プロンプトが mysql> に戻り、mysql が新しいコマンドに対して準備できていることが示されます。

`> プロンプトは '> および "> プロンプトと同様ですが、逆引用符を開始したがまだ終了していないことを示しています。

'>">、および `> の各プロンプトが何を意味するかを理解することが重要です。なぜなら、誤って未終了の文字列を入力した場合、それ以降の入力行は QUIT を含む行も含めて、mysql に無視されるように見えるからです。特に、現在のコマンドを取り消すにはまず終端の引用符を入力する必要があることを理解していないと、これにはかなり困惑する可能性があります。


User Comments
Sign Up Login You must be logged in to post a comment.