- MySQL
MySQL ERROR 1054 Unknown columnの直し方
ERROR 1054 (42S22): Unknown column 'username' in 'field list' は、SQL に書いた列名が、その場所から見えるテーブルに無いときのエラーです。 列名の書き間違いが一番多い原因ですが、列はあるのに出るケースも多くあります。
エラー文の in '...' が、SQL のどこで見つからなかったかを表します。ここで原因を絞り込めます。
| エラー文の場所 | SQL の場所 | よくある原因 |
|---|---|---|
'field list' |
SELECT の列・INSERT の列・UPDATE の SET | 列名の間違い、サブクエリ(派生テーブル)で選んでいない列、全角スペース |
'where clause' |
WHERE | SELECT で付けた別名、テーブルの別名を付けたのに元の名前、文字列をバッククォートで囲んだ |
'on clause' |
JOIN の ON | カンマの結合と JOIN を混ぜた |
'group statement'・'order clause'・'having clause' |
GROUP BY・ORDER BY・HAVING | 列名の間違い、HAVING に集計していない列 |
'from clause' |
JOIN の USING | 両方のテーブルに無い列を USING に書いた |
確認環境:MySQL 8.0.46(確認日 2026年10月11日)。顧客(c2u)・注文(o2)・注文明細(o2i)のテーブルで再現しました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL ERROR 1054 Unknown columnの直し方」
まず確認:その列は本当にあるか
SHOW COLUMNS FROM c2u;
Field Type
id int
user_name varchar(20)
pref varchar(10)
mysql> SELECT id, username FROM c2u;
ERROR 1054 (42S22): Unknown column 'username' in 'field list'
username ではなく user_name でした。 アプリのコード(ORM の項目名など)では userName と書き、DB の列は user_name という形は多く、名前の変換の設定がずれると、このエラーになります。MySQL の列名は大文字小文字を区別しないので、USER_NAME と書いても通ります。違うのは綴り(アンダースコアの有無など)です。
'where clause':SELECT で付けた別名を WHERE で使った
mysql> SELECT id, price * qty AS total FROM o2 WHERE total > 100;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'
WHERE は、SELECT の別名を付ける前に評価されるので、別名を使えません(公式マニュアル)。一方、HAVING・ORDER BY・GROUP BY では、別名が使えました。
| 書き方 | 結果 |
|---|---|
... WHERE total > 100 |
1054 |
... WHERE price * qty > 100 |
動く(式をもう一度書く) |
... HAVING total > 100 |
動く(MySQL では集計なしでも HAVING に別名を書ける) |
... ORDER BY total DESC |
動く |
式をもう一度書くか、サブクエリで包んで外側の WHERE で使います。
'where clause':テーブルの別名を付けたのに、元の名前で書いた
mysql> SELECT * FROM c2u u WHERE c2u.id = 1;
ERROR 1054 (42S22): Unknown column 'c2u.id' in 'where clause'
FROM c2u u と別名を付けると、そのクエリの中では u でしか参照できません。 u.id に直します。長い SQL を書き換えているときに起きやすい間違いです。
'on clause':カンマの結合と JOIN を混ぜた
mysql> SELECT * FROM c2u c, o2 o JOIN o2i i ON i.order_id = o.id AND c.id = o.customer_id;
ERROR 1054 (42S22): Unknown column 'c.id' in 'on clause'
c2u c は確かに FROM に書いてあるのに、見つからないと言われます。 MySQL では、JOIN はカンマより先に結び付くので、c2u c, (o2 o JOIN o2i i ON ...) と解釈されます。ON から見えるのは o と i だけで、c は見えません(公式マニュアルの説明と同じ)。
| 書き方 | 結果 |
|---|---|
FROM c2u c, o2 o JOIN o2i i ON ... c.id ... |
1054('on clause') |
FROM c2u c JOIN o2 o ON c.id = o.customer_id JOIN o2i i ON i.order_id = o.id |
動く(おすすめ) |
FROM (c2u c, o2 o) JOIN o2i i ON ... WHERE c.id = o.customer_id |
動く(括弧でまとめる) |
カンマで結合している SQL に、あとから JOIN を書き足したときに出やすい形です。MySQL のバグ報告にもこの質問が多く寄せられていますが、公式マニュアルに書かれた仕様どおりの動きです。カンマの結合をやめ、すべて JOIN で書くのが確実です。
'where clause':文字列をバッククォート・ダブルクォートで囲んだ
mysql> SELECT * FROM c2u WHERE user_name = `佐藤`;
ERROR 1054 (42S22): Unknown column '佐藤' in 'where clause'
バッククォート(`)は列名・テーブル名を囲む記号なので、佐藤 という列を探しました。文字列はシングルクォート('佐藤')で囲みます。
| 囲み方 | MySQL(既定) | MySQL(ANSI_QUOTES あり) |
PostgreSQL |
|---|---|---|---|
'佐藤' |
文字列 | 文字列 | 文字列 |
"佐藤" |
文字列 | 列名(1054) | 列名(エラー) |
`佐藤` |
列名(1054) | 列名(1054) | 使えない |
ダブルクォートは、既定の MySQL では文字列として動きますが、sql_mode に ANSI_QUOTES があると列名になり、1054 になりました。 PostgreSQL でもダブルクォートは列名です。文字列は常にシングルクォートにそろえておくと、設定や DB が変わっても動きます。
'field list':サブクエリで選んでいない列
mysql> SELECT d.user_name FROM (SELECT id FROM c2u) d;
ERROR 1054 (42S22): Unknown column 'd.user_name' in 'field list'
FROM の中のサブクエリ(派生テーブル)は、その SELECT で選んだ列しか持ちません。 内側の SELECT に user_name を足します。
'field list' に、別の列の名前が出るとき:全角スペース
mysql> SELECT id, user_name FROM c2u; -- user_name のあとが全角スペース
ERROR 1054 (42S22): Unknown column 'id' in 'field list'
問題は user_name のあとの全角スペースなのに、エラーは id について出ました。 全角スペースは区切りにならず、user_name FROM までが1つの名前とみなされ、FROM c2u が無い SQL になったためです。列が確かにあるのに 1054 になるときは、全角スペースを疑います。SQL の構文エラー(1064)の探し方は、関連記事の「MySQL ERROR 1064の直し方|SQL構文エラーの探し方」で扱っています。
INSERT・UPDATE・GROUP BY・USING でも出る
INSERT INTO c2u (id, username) VALUES (3, '高橋');
ERROR 1054 (42S22): Unknown column 'username' in 'field list'
UPDATE c2u SET prefecture = '京都' WHERE id = 1;
ERROR 1054 (42S22): Unknown column 'prefecture' in 'field list'
SELECT pref, COUNT(*) FROM c2u GROUP BY prefecture;
ERROR 1054 (42S22): Unknown column 'prefecture' in 'group statement'
SELECT pref FROM c2u GROUP BY pref HAVING user_name = '佐藤';
ERROR 1054 (42S22): Unknown column 'user_name' in 'having clause'
SELECT * FROM o2 JOIN o2i USING (order_id);
ERROR 1054 (42S22): Unknown column 'order_id' in 'from clause'
USING は、両方のテーブルに同じ名前の列があるときだけ使えます(公式マニュアル)。o2 には order_id が無いので、ON o2i.order_id = o2.id と書きます。HAVING に、GROUP BY していない列を書いたときも 1054 になります。行の条件なら WHERE に書きます。
トリガー・ビューでの似たエラー
(トリガーで、テーブルに無い列 total に代入)
ERROR 1054 (42S22): Unknown column 'total' in 'NEW'
(ビューが参照している列を、ALTER TABLE で削除したあと)
ERROR 1356 (HY000): View 'mig.v2' references invalid table(s) or column(s) or function(s) ...
列を削除・名前変更したあとは、ビューは 1054 ではなく 1356 になりました。 列の名前を変えるときは、それを使っているビュー・トリガー・アプリの SQL も一緒に直します。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | どこで見つからないか | エラー文の in '...' |
| 2 | 列が本当にあるか | SHOW COLUMNS FROM テーブル(綴り、アンダースコア) |
| 3 | 'where clause' |
SELECT の別名、テーブルの別名、文字列の囲み方 |
| 4 | 'on clause' |
カンマの結合と JOIN を混ぜていないか |
| 5 | 'field list' で、あるはずの列 |
派生テーブルで選んでいるか、全角スペース |
| 6 | 列を変えたあと | ビュー(1356)・トリガー・アプリの SQL |
よくある質問
Q. SQLSTATE は何ですか。
A. 42S22 です。確認環境の Java(MariaDB Connector/J)では java.sql.SQLSyntaxErrorException(errorCode=1054、SQLState=42S22)になりました。
Q. 列名を予約語にしていて出ることはありますか。
A. 予約語(rank・groups など)を囲まずに使ったときは、1054 ではなく構文エラーの 1064 になります。`rank` のようにバッククォートで囲みます。
まとめ
- その場所から見えるテーブルに、列が無いエラー。
in '...'で場所が分かる - WHERE では SELECT の別名を使えない。HAVING・ORDER BY では使える
- テーブルに別名を付けたら、元の名前では参照できない
'on clause'は、カンマの結合と JOIN の混在。すべて JOIN で書く- 文字列はシングルクォート。バッククォートは常に列名、ダブルクォートは設定で列名になる
- 列があるのに別の列の名前で出るときは、全角スペース
参考・出典
確認日はいずれも 2026年10月11日です。
- MySQL 8.0 Reference Manual「JOIN Clause」:https://dev.mysql.com/doc/refman/8.0/en/join.html
- MySQL 8.0 Reference Manual「Problems with Column Aliases」:https://dev.mysql.com/doc/refman/8.0/en/problems-with-alias.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL ERROR 1054 Unknown columnの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。