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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?