Open Source WEB

宿題

前回の宿題は、以下のSQL文が思ったように動作しなかった原因を調べることであった。

mysql> SELECT `name` `区名`, `area` `population`,
    -> ROUND(`population`/`area`) `人口密度` FROM `東京`;
+----------+------------+----------+
| 区名     | population | 人口密度 |
+----------+------------+----------+
| 千代田区 |      11.64 |     3770 |
| 世田谷区 |      58.08 |    13962 |
| 新宿区   |      18.23 |    16705 |
| 文京区   |      11.31 |     8307 |
| 足立区   |       53.2 |    12140 |
| 江東区   |      39.48 |    10872 |
+----------+------------+----------+
6 rows in set (0.00 sec)

mysql>

区名, area, population, 人口密度 の順に並ぶはずであったのが、 何故か area と population が混じったような出力になってしまったのである。

ということは、area と population の間に何か問題があるのである。 つまり、本来異なるカラムであるはずのものが、1つになってしまったので、 区切が認識されなかったことになる。

ここまで書けば想像が付く通り、カンマ(,)が無いのである。 カンマが無いために、`area`というカラムに対して `population`という エイリアスが付いて、テーブルのヘッダーにpopulationと表示されたようだ。

これは、何も上記のようにエイリアスを付けたり付けなかったときではなく、 単にカラムを並べただけの以下のような場合にも発生する。

mysql> SELECT `name` `area`, `population` from `東京` LIMIT 2;
+----------+------------+
| area     | population |
+----------+------------+
| 千代田区 |      43881 |
| 世田谷区 |     810897 |
+----------+------------+
2 rows in set (0.00 sec)
 
mysql>

カンマを忘れるとエイリアスになってしまう

なかなか恐ろしい構文である。


エイリアスのクォートは何が正しい

9.2. Database, Table, Index, Column, and Alias Names によると、エイリアスも識別子(メタデータ)とある。

ということは、エイリアスもバッククォート(`)で囲むべきであろうと思い、 ここまではそうやってきた。

エイリアスのクォート文字実験として、バッククォート(`)、 シングルクォート(')、ダブルクォート(")、クォートなし の4パターンを試してみよう。

ここでは、英数字だけからなるカラム名のクォートは全部省略した。

mysql> SELECT name AS `区名`, area AS '面積', population AS "人口",
    -> ROUND(population/area) AS 人口密度 FROM `東京`;
+----------+-------+--------+----------+
| 区名     | 面積  | 人口   | 人口密度 |
+----------+-------+--------+----------+
| 千代田区 | 11.64 |  43881 |     3770 |
| 世田谷区 | 58.08 | 810897 |    13962 |
| 新宿区   | 18.23 | 304539 |    16705 |
| 文京区   | 11.31 |  93949 |     8307 |
| 足立区   |  53.2 | 645873 |    12140 |
| 江東区   | 39.48 | 429224 |    10872 |
+----------+-------+--------+----------+
6 rows in set (0.03 sec)
 
mysql>

どれでもOKのようである。

マニュアルには、

The identifier quote character is the backtick (‘`’):

とあるので、識別子のクォートはバッククォート(バックティック)でないと いけないような気がするのだが。

う〜む、いい加減だが、こういうのはまあいいか、困らないし。

ならば、カラムの方も、4つのクォートパターンを試すとどうなるか?

mysql> SELECT `name`, 'area', "population", ROUND(population/area) FROM `東京`;
+----------+------+------------+------------------------+
| name     | area | population | ROUND(population/area) |
+----------+------+------------+------------------------+
| 千代田区 | area | population |                   3770 |
| 世田谷区 | area | population |                  13962 |
| 新宿区   | area | population |                  16705 |
| 文京区   | area | population |                   8307 |
| 足立区   | area | population |                  12140 |
| 江東区   | area | population |                  10872 |
+----------+------+------------+------------------------+
6 rows in set (0.00 sec)
 
mysql>

`area', "population" は、文字列定数として解釈されてしまったようである。 当たり前だな。


戻る:カラムにエイリアスをつける

次へ:式中の要素に漢字エイリアスを使うとどうなるか


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us