Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
宿題
前回の宿題は、以下の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" は、文字列定数として解釈されてしまったようである。 当たり前だな。
フィードバック:
There is no comment.