Menu

SQLite SELECT文の使い方|カラム指定・式・別名(AS)

SQLiteのSELECT文を基礎から整理。カラムの指定、式の計算、ASによる別名付け、そしてすべてのクエリの土台になる考え方をまとめました。

このページのコードはエディタで実行できます — 編集してすぐに結果を確認できます。

SELECT文でテーブルからデータを取り出す

SQLiteに何かを尋ねるときは、必ずSELECTから始まります。意味としては、このテーブルから、この条件に合う行の、この列だけちょうだい という指示ですね。今回扱うのは前半の2つ、つまり「どの列を」「どのテーブルから」の部分です。条件で絞り込む話は次のドキュメントで取り上げます。

まずは一番シンプルなクエリから見てみましょう。

SELECT * は「全カラム」という意味で、FROM products で対象のテーブルを指定します。結果として、4 つのカラムすべてを含むレコードが 1 行ずつ返ってきます。文末のセミコロンで SQL 文を終了します。

形としてはこれだけです: SELECT <カラム> FROM <テーブル>;

カラムを指定して取得する

* はテーブルの中身をざっと確認したいときには便利です。ただ、実際のコードでは、本当に必要なカラムだけを明示的に書くのが基本です。

結果は、指定したとおりの順序で2つのカラムが返ってきます。SELECT リストに書いた順番がそのまま結果の並び順になるので、テーブル本来のカラム順と一致している必要はありません。

では、なぜ SELECT * よりもカラムを明示するほうがよいのでしょうか。理由は2つあります。1つ目は、ネットワーク越し(あるいはファイルからの読み込み)で扱うデータ量が減ること。横に長いテーブルになるほど効果が大きくなります。2つ目は、来月誰かがテーブルにカラムを追加しても、クエリの挙動が変わらないこと。SELECT * だと知らないうちに返ってくるカラムが増えてしまい、行を位置で取り出しているアプリケーション側のコードが壊れることがあります。

SELECT は取り出すだけでなく、計算もできる

SELECT のカラム指定には、生のカラム名以外の式も書けます。算術演算、関数呼び出し、文字列連結、定数など、どんな式でも構いません。SQLite はそれを各行ごとに評価してくれます。

4列目はテーブル上には存在しません。SQLite が行ごとに計算して作り出した値です。同じことが文字列関数や日付、条件式など、ありとあらゆる式でできます。SELECT句は単にデータを取り出すだけの場所ではなく、データを加工するための場所でもあるのです。

ちなみにFROM句を省いてSELECTだけ書くこともでき、SQLite を電卓のように使うことも可能です。

1行3カラム。実際のクエリに組み込む前に、式の挙動を確かめるのにちょうどいい使い方です。

AS で列に別名をつける

計算結果の列を返すと、SQLite はデフォルトで適当な名前をつけます。多くの場合、price * stock のように式そのものがそのまま列名になります。これでは見た目も悪く、後から扱いづらいので、AS を使ってきちんと別名を指定しましょう。

エイリアスは、結果セットにおける列の名前になります。出力を目で追うときの読みやすさはもちろん、アプリ側のコードで列名から値を取り出す場合にも効いてきます(row[1] ではなく row["inventory_value"] と書けるわけです)。

AS キーワードは省略可能で、price * stock inventory_value と書いても同じ意味になります。とはいえ、きちんと AS を書くのがおすすめです。意図がはっきりしますし、カンマの書き忘れを別名と勘違いする、といった読み違いも防げます。

テーブルにも別名を付ける

列だけでなく、テーブル自体にも短い別名を付けられます。テーブルが1つだけならあまり恩恵はありませんが、JOIN を書き始めた瞬間からこの習慣が効いてきます。

pproducts の別名として機能します。p.name のようにドット記法で書くと、その列がどのテーブルのものかが明示されます。テーブルが1つだけなら冗長に感じますが、3つのテーブルをJOINするようなクエリでは、これが可読性を保つ唯一の手段になります。

結果に定数やリテラルを混ぜる

実際のカラムと一緒に、定数値を結果に混ぜることもできます。行にタグを付けたり、プレースホルダーを差し込みたいときに便利です。

どの行も 'USD'1 が同じ値になります。このパターンは、UNION で複数クエリの結果をくっつけるときに、どの結果がどのクエリ由来なのかを示す「目印」のカラムが欲しいときによく使います。

NULL についてひとこと

カラムによっては値が入っていないこともあります。INSERT 時に値が指定されなかったり、そもそもデフォルト値が設定されていないケースですね。SQLite では「値がない」状態を NULL で表現します。SELECT の結果に出てくる NULL は、使っているツールによって空欄として表示されたり、そのまま NULL という文字列で表示されたりします。

2行目に注目してください。priceNULL なので、price * 2NULL になっています。NULL を含む算術演算は、何をやっても結果は NULL です。SQL の結果が「あれ?」となる原因として一番よくあるパターンで、これについては別ページで詳しく扱います。今のところは、NULL は式の中で“伝染する”とだけ覚えておけば十分です。

この章のまとめ

  • クエリの基本形は SELECT <カラム> FROM <テーブル>;
  • 実際のコードではカラムを明示的に並べる。SELECT * は調査・確認用と割り切る。
  • SELECT のリストにはカラム名だけでなく、任意の式を書ける。
  • AS を使えば、計算結果のカラムやテーブルにきちんとした別名を付けられる。
  • 算術演算では NULL が伝播する。結果がおかしいときはまずここを疑う。

次回:WHERE で絞り込む

ここまでのクエリは、テーブルの全行をそのまま返していました。これを絞り込むのが WHERE 句です。価格、名前、日付など、true / false で判定できる式なら何でも条件に使えます。続きは次のページで見ていきましょう。

よくある質問

SQLiteのSELECT文の基本的な構文は?

基本形は SELECT <カラム> FROM <テーブル>; です。カラム部分には、SELECT name, email FROM users のようにカンマ区切りで列を並べたり、すべての列を取る * を使ったり、price * quantity のような式を書くこともできます。FROM で読み出すテーブルを指定し、最後はセミコロンで文を閉じます。

SQLiteで SELECT * を使ってもいい?

CLIでテーブルの中身をざっと確認したいときには便利です。ただしアプリのコードでは、必要なカラムだけを明示的に書きましょう。SELECT * はそのときのスキーマに密結合してしまうので、後からカラムを追加すると、すべてのクエリが黙って多めの結果を返すようになります。位置でタプルを展開しているコードだと、これだけで普通に壊れます。

SELECTの結果のカラム名を変えるには?

AS を使ってカラムや式に別名を付けます。例えば SELECT price * quantity AS total FROM orders のように書くと、結果セットでは total という列名になります。読みやすさはもちろん、結果をカラム名で取り出すコードを書くときにも重要です。AS 自体は省略できますが、可読性のために残しておくのがおすすめです。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める