前のセクションで説明したように、サーバーに接続していることを確認してください。サーバーに接続してもデータベースは選択されませんが、問題ありません。クエリの方法の基本を理解することは、テーブルの作成、テーブルへのデータのロード、テーブルからのデータの取得にすぐに取り組むよりも重要です。このセクションでは、コマンド入力の基本原則について説明します。いくつかのクエリを使用して、MySQL がどのように機能するかを理解することができます。
これは、サーバーにバージョン番号と現在の日付を伝えるように要求する単純なコマンドです。 mysql> プロンプトで次のコマンドを入力し、Enter キーを押します:
mysql> SELECT VERSION(), CURRENT_DATE; +-----------------+--------------+ | VERSION() | CURRENT_DATE | +-----------------+--------------+ | 5.1.2-alpha-log | 2005-10-11 | +-----------------+--------------+ 1 row in set (0.01 sec) mysql>
この質問では、mysql のいくつかの側面について説明します:
· コマンドは通常、セミコロンが後に続く SQL ステートメントで構成されます。 (セミコロンを必要としない例外もあります。前述の QUIT は一例です。他の例は後で説明します。)
· コマンドが発行されると、mysql はそれをサーバーに送信し、実行結果を表示します。 Another mysql> は、他のコマンドを受け入れる準備ができていることを示します。
· Mysql はクエリ出力をテーブル (行と列) に表示します。最初の行には列ラベルが含まれ、後続の行はクエリ結果です。通常、列ラベルはデータベース テーブルから取得した列の名前です。 (前の例のように) テーブルの列の値ではなく式を取得する場合、MySQL は列に式自体のタグを付けます。
· MySQL は返された行数とクエリにかかった時間を表示し、サーバーのパフォーマンスについての一般的なアイデアを得ることができます。これらの値は (CPU やマシン時間ではなく) クロック時間を表し、サーバーの負荷やネットワーク遅延などの要因の影響を受けるため、これらの値は不正確です。 (簡潔にするため、この章の他の例では「コレクション内の行」は表示されません。)
キーワードを大文字と小文字で入力する機能 (大文字と小文字は区別されません)。次のクエリは同等です:
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.1.2-alpha-log | +-----------------+ 1 row in set (0.00 sec) +---------------------+ | NOW() | +---------------------+ | 2005-10-11 15:15:00 | +---------------------+ 1 row in set (0.00 sec)
コマンドをすべて 1 行で指定する必要はなく、長いコマンドを複数行で入力できます。 MySQL は、入力行の終わりではなく、終了セミコロンを検索してステートメントがどこで終了するかを判断します。 (言い換えると、MySQL は自由形式の入力を受け入れます。入力行は収集されますが、セミコロンが表示されるまで実行されません。)
簡単な複数行ステートメントの例を次に示します:
mysql> SELECT -> USER() -> , -> CURRENT_DATE; +---------------+--------------+ | USER() | CURRENT_DATE | +---------------+--------------+ | jon@localhost | 2005-10-11 | +---------------+--------------+
この例では、入力後に複数行 クエリの最初の行の後で、プロンプトが 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丢掉了第二个引号。)
走到这一步,你该做什么?最简单的是取消命令。然而,在这种情况下,你不能只是输入\c,因为mysql作为它正在收集的字符串的一部分来解释它!相反,应输入关闭的引号字符(这样mysql知道你完成了字符串),然后输入\c:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30; '> '\c mysql>
提示符回到mysql>,显示mysql准备好接受一个新命令了。
`> 提示符类似于 '> 和"> 提示符,但表示你已经开始但没有结束以`> 开始的识别符。
知道'>和">提示符的含义很重要,因为如果你错误地输入一个未终止的字符串,任何后面输入的行将要被mysql忽略--包括包含QUIT的行!这可能令人相当困惑,特别是如果取消当前命令前还不知道你需要提供终止引号。