前のセクションで説明したように、サーバに接続していることを確認します。サーバに接続していることを確認するだけでは使用するデータベースの選択は行われませんが、ここではそれで十分です。今の時点では、テーブルの作成、テーブルへのデータロード、およびテーブルからのデータ取得を実行する方法よりも、クエリを発行する方法を学ぶことが重要です。このセクションでは、mysql
が動作するメカニズムに慣れるためのさまざまなクエリを使用しながら、コマンド入力の基本的な原則について説明します。
以下のコマンドは、サーバにそのバージョン番号と現在の日付を照会する簡単なコマンドです。mysql>
プロンプトの後に以下のとおりに入力し、Enter
を押してください。
mysql>SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+ | VERSION() | CURRENT_DATE | +--------------+--------------+ | 3.22.20a-log | 1999-03-19 | +--------------+--------------+ 1 row in set (0.01 sec) mysql>
このクエリによって、mysql
についてのさまざまなことがわかります。
通常、コマンドは SQL
ステートメントの後にセミコロンを記述する形式で入力する(セミコロンが不要な場合もあり、たとえば前述の
QUIT
がそれに該当する。ほかの例外については後述する)。
コマンドを発行すると、mysql
はそれをサーバに送信して実行を依頼し、返された結果を表示する。そして、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.707107 | 25 |
+-------------+---------+
これまでの例で使用したクエリは比較的短い単一行ステートメントでしたが、単一行に複数ステートメントを入力することもできます。この場合も、各ステートメントの末尾にセミコロンを入力するだけです。
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| VERSION() |
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW() |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+
コマンドは 1
行に収める必要はなく、長いコマンドを複数行にわたって記述しても問題ありません。mysql
は、入力行の終わりではなく、セミコロンをステートメントの終わりと判断して処理します。つまり、mysql
への入力はフリーフォーマットであり、入力された行は、セミコロンが読み込まれるまで実行されません。
以下に簡単な複数行ステートメントを示します。
mysql>SELECT
->USER()
->,
->CURRENT_DATE;
+--------------------+--------------+ | USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+
この例を見ると、クエリの最初の行を入力した後に、プロンプトが
mysql>
から ->
に変わっています。mysql
は、このようにプロンプトを変えることによって、途中まで入力されたステートメントの残りの部分の入力を待っていることを示します。プロンプトには有用な情報が表示されます。この情報に注目することで、mysql
が現在何を待っているのかを知ることができます。
途中まで入力したコマンドの実行をキャンセルする場合は、\c
を入力します。
mysql>SELECT
->USER()
->\c
mysql>
この例でもプロンプトに注目してください。\c
を入力するとプロンプトは mysql>
に切り替わり、mysql
が新しいコマンドの入力を待っていることが示されます。
表示される可能性があるプロンプトと、それが意味する
mysql
の状態について、以下の表に示します。
プロンプト | 意味 |
mysql> |
新しいコマンドの入力待ち |
-> |
複数行コマンドで次の行の入力待ち |
'> |
単一引用符(‘' ’)で始まる文字列を読み込み中の次の行の入力待ち |
"> |
二重引用符(‘" ’)で始まる文字列を読み込み中の次の行の入力待ち |
`> |
バッククォート記号(‘` ’)で始まる識別子を読み込み中の次の行の入力待ち |
単一行のコマンドを発行するつもりで末尾のセミコロンの入力を忘れたために、複数行ステートメントになってしまう場合がよくあります。この場合、mysql
は入力待ちになります。
mysql>SELECT USER()
->
この場合(ステートメントの入力を完了したつもりなのに
->
プロンプトが表示されるだけ)、たいていは
mysql
はセミコロンが入力されるのを待っている状態です。表示されるプロンプトの意味に気が付かない場合、対処法がわかるまでしばらくかかるかもしれません。このステートメントを完了するには、セミコロンを入力します。それによって
mysql
が入力されたステートメントを実行します。
mysql>SELECT USER()
->;
+--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
'>
および ">
の 2
つのプロンプトは、文字列の入力中に表示されます。MySQL
では、文字列を ‘'
’ または
‘"
’
で囲んで表記することができます('hello'
、"goodbye"
など)。また、mysql
では、複数行にわたる文字列を入力できます。表示されるプロンプトが
'>
または ">
の場合、‘'
’ または
‘"
’
のどちらかの引用符で始まった文字列を含む行を入力している途中であり、その文字列の終わりを示す引用符がまだ入力されていないことを意味します。この動作は、実際に複数行にわたる文字列を入力している場合は問題になりませんが、実際にそういうケースは多いのでしょうか。いいえ、それほど多くはありません。むしろ、'>
および ">
のプロンプトが表示されることで、うっかり引用符を入力し忘れたことに気付かされる場合がほとんどです。例を示します。
mysql>SELECT * FROM my_table WHERE name = "Smith AND age < 30;
">
このような SELECT
ステートメントを入力してから Enter
を押して、結果が表示されるのを待っていても、何も表示されません。この場合、このクエリになぜこんなに時間がかかるのかを不思議に思う前に、">
プロンプトの意味に気付く必要があります。このプロンプトは、mysql
が入力途中の文字列の残りの部分が入力されるのを待っていることを示します(このステートメントには、"Smith
で始まる文字列の終わりを示す引用符がないというエラーがあります)。
この場合、何をすればよいでしょうか。最も簡単な方法はコマンドをキャンセルすることです。ただし、この場合は
\c
を入力するだけではキャンセルできません。その入力は、現在途中まで入力されている文字列の一部として
mysql
に解釈されるためです。代わりに、まず文字列の終わりを示す引用符を入力し(これによって
mysql
が文字列の終わりを認識する)、それから
\c
を入力します。
mysql>SELECT * FROM my_table WHERE name = "Smith AND age < 30;
">"\c
mysql>
プロンプトが mysql>
に戻り、mysql
が新しいコマンドの入力を待っていることが示されます。
`>
プロンプトは、'>
および
">
の 2
つのプロンプトに似ていますが、バッククォートで囲まれた識別子の入力が完了していないことを示します。
'>
、">
、および
`>
の各プロンプトの意味を知ることは重要です。これに気付かないと、文字列の終わりの入力を忘れた場合に、その後入力した内容が、QUIT
も含めて、すべて mysql
に無視されます。このような状態になると、特に現在のコマンドをキャンセルする前に文字列の終わりを示す引用符を入力する必要があることを知らない場合は、非常に混乱します。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.