前のセクションで説明したように、サーバーに接続していることを確認します。 それだけでは操作するデータベースは選択されていませんが、それでかまいません。 この時点では、テーブルの作成、テーブルへのデータのロード、テーブルからのデータの取り出しに今すぐ進むのではなく、クエリーの発行方法を学ぶことが重要です。 このセクションでは、mysql の動作を理解するために試みることができるいくつかのクエリーを使用して、クエリーを入力する基本原則について説明します。
ここでは、サーバーにバージョン番号と現在の日付を尋ねる簡単なクエリーを示します。 mysql>
プロンプトに続けて、次に示すように入力してから Enter を押します。
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.8.0-m17 | 2015-12-21 |
+-----------+--------------+
1 row in set (0.02 sec)
mysql>
このクエリーには、mysql に関するいくつかの事項が示されています。
クエリーは通常、SQL ステートメントの後にセミコロンが続くもので構成されます。 (セミコロンを省略できる例外もいくつかあります。 前述の
QUIT
もその 1 つです。 ほかのものについてはあとで説明します。)クエリーを発行すると、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.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
これまでに示したクエリーは、比較的に短い、1 行のステートメントでした。 1 行に複数のステートメントを入力することもできます。 各ステートメントの末尾にはセミコロンを付加してください。
mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 8.0.13 |
+-----------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2018-08-24 00:56:40 |
+---------------------+
1 row in set (0.00 sec)
クエリーのすべてを単一行で指定する必要はないため、複数の行を必要とする長いクエリーでも問題になりません。mysql では、入力行の終わりを探すのではなく、終了セミコロンを探すことによって、ステートメントの終了位置が決定されます。 (つまり、mysql は自由形式の入力を受け入れます。入力行を収集しますが、セミコロンが見つかるまでは実行しません。)
次に、単純な複数行ステートメントを示します。
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2018-08-24 |
+---------------+--------------+
この例では、複数行にわたるクエリーの最初の行を入力したあと、プロンプトが mysql>
から ->
に変化することに注意してください。 これは、mysql がまだ完全なステートメントを検出しておらず、残りの入力を待機していることを示しています。 プロンプトは貴重なフィードバックを提供してくれる味方です。 そのフィードバックを使用すれば、mysql が何を待機しているのかを、常に認識することができます。
入力処理中のクエリーを実行しない場合は、\c
と入力して取り消します:
mysql> SELECT
-> USER()
-> \c
mysql>
ここでもプロンプトに注目してください。 \c
の入力後に mysql>
に戻り、mysql が新しいクエリーの準備ができたことを示すフィードバックを提供します。
次の表に、表示される各プロンプトとそれらが示す mysql の状態をまとめます。
プロンプト | 意味 |
---|---|
mysql> |
新規クエリーの準備完了 |
-> |
複数行クエリーの次の行を待機しています |
'> |
次の行を待機しており、一重引用符 (' ) で始まる文字列の完了を待機しています |
"> |
次の行を待機し、二重引用符 (" ) で始まる文字列の完了を待機しています |
`> |
次の行を待機しており、バックティック (` ) で始まる識別子の完了を待機しています |
/*> |
/* で始まったコメントが完了するまで次の行を待機しています |
複数行のステートメントは、通常、単一行に対してクエリーを発行しようとしたが、終了セミコロンを忘れた場合に発生します。 この場合、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 に無視されるように見えるからです。 これは、特に、現在のクエリーを取り消す前に終了引用符を指定する必要があることがわからない場合は、非常に混乱している可能性があります。
この時点からの複数行のステートメントは、セカンダリ (->
またはその他) プロンプトなしで記述されるため、ステートメントをコピーして自分で試すのが容易になります。