• ベストアンサー

日本語のエイリアスは" "で囲う必要があるのでしょうか

お世話になっております。 マニュアルやネットで検索を試みたのですがわからず、困っております。 できましたら、どなたかお助けいただけないでしょうか。 カラム名に付けるエイリアス(別名)は " " で囲わなくてはいけないでしょうか。 例:SELECT a AS "金額;" FROM tb; 「エイリアスに特殊記号を含む場合 " "で囲わなければいけない」という話を聞いたような気がするのですが、やってみると特殊記号の場合でも、 " " でも ' ' や` `(バッククォート)でも問題なさそうなのですが。 もし、このあたりのことで情報があったら、お教えいただけるとありがたいのですが。 申し訳ありません。どうか、よろしくお願いいたします。

  • MySQL
  • 回答数5
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

#3、#4回答者です。 特に日本語の名称の場合を、知りたかったのですよね。 もう少し、コンパクトにまとめます。 (1)表名、列名、別名などの名前に、予約語と同じキーワードを使ったり、  一部の特殊記号を使う場合は、「`」や「"」で名前を囲む必要がある。 (2)日本語の名前は、(1)に該当しないので、「`」や「"」で名前を囲む必要はない。 (3)プロジェクト等で名前を「`」や「"」で囲む規定になっている場合は、以下の点に  注意。  (a)MySQLサーバの使用モードで、使う記号が異なっている。  (b)標準SQLや他の主要なRDBMSとは、使う記号が異なっている。   MySQLの非ANSIモード(MySQLの構文)=MySQLのディフォルト環境   →「`」(バッククォート)で囲む   MySQLのANSIモード(標準SQLの構文)   →「`」または「"」(ダブルクォーテーション)で囲む   標準SQLや他の主要なRDBMS   →「"」で囲む (4)「'」(シングルクォーテーション)は、文字定数を指定する場合に使う。  MySQLを非ANSIモードで使っている場合、「"」も文字定数を指定する場合に  使うので注意が必要。 

その他の回答 (4)

回答No.4

#3回答者です。 >MySQLでは「表名、列名、別名が日本語の場合は`で、アルファベットなど半角 >英数字のときは"で囲わなくてはいけない」という意味なのでしょうか。 そういう意味ではありません。 MySQLサーバを起動するとき、「非ANSI(MySQLの構文)」モードにするか、「ANSI構文(標準SQL)」モードにするかを指定できます。「ANSI構文にする」と明示指定していなければ、非ANSI(MySQL構文)のモードになります。 標準のインストールでは、非ANSIで設定されています。 また、「"」や「`」で囲む必要があるのは、表名、列名、別名に、予約語と同じ名前を指定するか、一部の特殊記号を使う場合ですから、日本語の名前は対象にはなりません。 まとめると、以下のようになります。 (1)非ANSI(MySQL構文)の場合 select oshiete-goo  →oshieteとgooの引き算 select 'oshiete-goo'  →文字定数 select "oshiete-goo" →文字定数 select `oshiete-goo` →「oshiete-goo」という列名や列の別名 select 'from' →文字定数 select "from"     →文字定数 select `from`      →fromという列名や別名 (2)ANSIの場合 →MySQLサーバ起動時に、--ansiか--sql-mode=ANSIを指定 select oshiete-goo  →oshieteとgooの引き算 select 'oshiete-goo'  →文字定数 select "oshiete-goo" →「oshiete-goo」という列名や列の別名 select `oshiete-goo` →「oshiete-goo」という列名や列の別名 select 'from' →文字定数 select "from"     →fromという列名や別名 select `from`      →fromという列名や別名 http://dev.mysql.com/doc/refman/4.1/ja/ansi-mode.html

回答No.3

表名、列名、別名などの名前に、予約語や一部の記号(※1)を使う場合、標準SQLや主要なRDBMSでは、「"」(ダブル・クォーテーション)で名前を囲む必要があります。 MySQLでは、ANSIで使う場合は、やはり「"」を使います。 一方、MySQLを非ANSIで使う場合は、「"」でなく「`」(バッククォート)で囲みます(※2)。MySQLを非ANSIで使った場合、「"」は、「'」(アポストロフィー)と同様に、文字定数(※3)であることを示します。 日本語の名前は、使用する環境により文字化けする場合があるので、使用する場合は注意が必要です。MySQLユーザ会でも、「名前に日本語を使えるが、使用しないほうが良い」と書かれています。 ※1 例えば、「-」(ハイフォン)を名前に使う場合、殆どのRDBMSでは、「"]で囲まないと、引き算と解釈される。 (「例) "oshiete-goo"なら、「oshiete-goo」を名称と解釈される。 oshiete-gooなら、oshieteとgooの引き算と解釈される。 ※2 「`」(バッククォート」を使うRDBMSは、MySQLだけかも知れません。 他の特殊な例としては、SQL ServerやMS-ACCESSでは、「"」に加え、「[ ]」を使います。 ※ 文字定数は、「'」(アポストロフィー)で囲みます。 これに加え、MySQLを非ANSIで使う場合は、「"」で囲んだ場合、名前でなく、文字定数と解釈されるので注意が必要です。

kisoyasa
質問者

お礼

ご丁寧に、ありがとうございます。感謝しております。 知識がないため、もしできましたら、教えていただけないでしょうか。 MySQLでは「表名、列名、別名が日本語の場合は`で、アルファベットなど半角英数字のときは"で囲わなくてはいけない」という意味なのでしょうか。 申し訳ありません。 どうか、よろしくお願いいたします。

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

MySQLの場合バッククオートですよ というか日本語名はトラブルの元になりますので `kingaku`でもかまわないので半角英字にすることを強くおススメします どぉ~しても2バイト文字を使わなくてはならない理由があるのであれば、 トラブル覚悟で使ってくださいね

kisoyasa
質問者

お礼

さっそくご回答いただき感謝しております。 「エイリアスはバッククォート」ということがわかりました。 やはり、カラム名でも日本語は危険なんですね? ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

原則バッククォーテーションだと記憶していますが、出展は覚えがありません。 そもそもダブルクォーテーションをSQLで使うということは、あまり きいたことがありませんね。 値はシングルクォーテーション、テーブルやフィールドやエイリアスには バッククォーテーションという切り分けが妥当かと。 さらに根本的な話しをすると、エイリアスに日本語をつかうのはトラブルの 原因になるので賛成できません。

kisoyasa
質問者

お礼

さっそくご回答いただき感謝しております。 「値はシングルクォーテーション、テーブルやフィールドやエイリアスにはバッククォーテーション」が常識だということを知りませんでした。 また、テーブル名は問題あっても、カラム名なら日本語でもだいじょうぶだろうと、たかをくくっていました。 ありがとうございました。

関連するQ&A

  • SQL副問い合わせ内のエイリアス

    DEPARTMENTとEMPLOYEESのテーブルがあり、そこから社員のいない部署を取得しようとしているのですが、わたしの書いたSQLがうまく動きません。作動しない理由をご教授くだされば助かります。オラクル8.1.7.4.1で動作させなければならず、left outer joinが使えないところからの質問です。 データはこういう構造です(*がプライマリーキィを表す)。 DEPARTMENT: *DEPT__T, DEPT_NAME, .... EMPLOYEES: *EMPLOYEES__T, DEPT_NAME, ... これに対して、 select dept__t, (select count(*) from employee where department.dept__t = employees.dept__t) counter from department where counter = 0 というSQLで社員のいない部署を取ろうとしたのですが、ORA-00904: "COUNTER": invalid identifier.が返されてしまいます。 WHERE文にcounterというエイリアスではなくカラムそのものを書くと問合せが正常に作動するのですが、なぜでしょうか。オラクルのバージョンが古いことが原因でしょうか。

  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • 行数の取得

    mysql初心者です 行数を取得したいです 処理をすこしでも軽くしたいです このように書くとテーブルの中身は見に行かないらしいのですが SELECT COUNT(*) AS cnt FROM bbs WHEREをつけると中身を見に行きますか? SELECT COUNT(*) AS cnt FROM bbs WHERE sure_id=5 中身を見に行く場合、カラムを指定したほうが早いでしょうか? SELECT COUNT(id) AS cnt FROM bbs WHERE sure_id=5 よろしくお願いします

    • ベストアンサー
    • MySQL
  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • SQLで式で作った項目を別の式で再利用

    SQLで式で作った項目を別の式で再利用する記述が社内のAccessの中にありました。 SELECT TB1.Item1 , (TB1.Item2 * 2) as Item2x , (TB1.Item3 * 3) as Item3x , (Item2x + Item3x) as Item4 FROM TB1 ; ※実際はもっと複雑ですが Sqlserverで同じ事をするとエラーになります。 SELECT TB1.Item1 , (TB1.Item2 * 2) as Item2x , (TB1.Item3 * 3) as Item3x , ((TB1.Item2 * 2) + (TB1.Item3 * 3)) as Item4 FROM TB1 ; 何のことは無く、式をその場でもう一回書けばいいだけの話ですが、釈然としないというか、なんでそんな事すらできないのか、できない方が多分正しいのだと思うけど、なんかいい方法ありませんか?

  • oracle7 select文での列別名について

    以下のようなSQLを記載した場合に問題となる可能性はあるでしょうか? 実際にこのようなSQLを書くことはないかもしれませんが、 列別名と、テーブルの項目名を同じにしています。 select XXX as XXX from tblA

  • サブクエリ内で INNER JOIN は

    グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、 以下のサイトで知ることができましたが。 http://www.yokablo.com/20120905717.html tb_score +-------+-------+-------+ | c_name | game | c_score | +-------+-------+-------+ | 山田 | 高飛び | 90 | +-------+-------+-------+ | 山田 | 徒競走 | 85 | +-------+-------+-------+ | 山田 | 玉入れ | 90 | +-------+-------+-------+ | 鈴木 | 徒競走 | 85 | +-------+-------+-------+ | 鈴木 | 騎馬戦 | 50 | +-------+-------+-------+ | 室伏 | 綱引き | 100 | +-------+-------+-------+ | 室伏 | 玉入れ | 10 | +-------+-------+-------+ SQL文: SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE 私の場合、t_score の親テーブル名`t_company`と、 子テーブル`t_items`がありまして、 以下のようなことをやりたかったのですが、エラーとなります。 上記SQL をサブクエリにします。 select * from ( SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING ( c_name ) INNER JOIN t_company ON t_company.c_name = tb_score.c_name WHERE c_score = MAXSCORE ) as T1 , t_items where T1.id_score = t_items.id_score 結果エラーメッセージは、 #1060 - Duplicate column name 'c_name' でした。 エラー箇所が、 GROUP BY c_name か、 USING ( c_name ) か、 INNER JOIN t_company ON t_company.c_name = tb_score.c_name なのか、分かりません。 SQL の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Accessのクエリで複数カラムの最大値表示

    Accessのクエリで複数カラムの中から最大のカラムデータを表示させる方法をお教えください。 テーブル名:TBL カラムA,B,Cがあっていずれも整数です。 カラムA,B,Cの最大のデータを表示したいのです。 データの例 A B C 10 14 12 → 14 21 18 19 → 21 15 11 17 → 17 このときSQL文でいえば次のようにすればできるのでしょうが、IF関数2回使わないで一発で最大値を表示させられないでしょうか。 Select iif(A>=B,A,B) as D, iif(D>=C,D,C) as E from TBL; Select Max(A,B,C) as D from TBL; のようなのがないでしょうか?

  • count関数の値をwhere句で使用する方法について

    宜しくお願い致します。 例えば、下記の様にデータを検索します。 select column1,count(column2) as column2_num from hoge_table group by column2_num すると、検索結果にはcolumn1のそのままの値と、column2の合計数が表示されると思います。 このcolumn2の合計数に対してwhere句で絞込みを行う方法はありませんか? asで定義した値をそのままwhere句で使用できないとの事なので、 select column1,count(column2) as column2_num from hoge_table where count(column2) = '1' group by column2_num とやってみたんですが、検索出来ませんでした。 ご存知の方、ご教授の程、宜しくお願いいたします。

    • ベストアンサー
    • MySQL