データベース技術調査ブログ

LinuxやPostgreSQL、Oracleデータベース、AWSの知識をアウトプットしていきます

【SQL基礎】SELECT文の基礎

 

SELECT文はSQLの中で一番重要で奥が深い構文です。今回はSELECT文の基本を整理したいと思います。(基本的な内容なので新しい発見はないかもです笑)

 

 

SELECT文でできることとは?

SELECT文でできることは「データを取り出すこと」です。

取り出し方を大まかに分類すると以下の3つになります。

 

  • 「射影」 ... 列 (Column) を取り出す
  • 「選択」 ... 行 (Rowまたはレコード) を取り出す
  • 「結合」 ... 複数の票を関連づけて取り出す

 

それぞれがどういう操作で実現できるか見ていきましょう。

 

 

射影(Projection)

SELECT <列名> [, <列名>, ...]

FROM <表名>

;

 

SELECT deptno, dname

FROM departments

;

 

基本的なSQLの構文です。SEなら誰でも知ってるよというレベルかと思いますが、実は「射影」しているんですね。(射影なんて言葉知らなくても生きていきます)

 

一応説明すると以下のような結果を指定しています。

  1. department表から
  2. deptnoとdenameという名前の列(column)を取り出す

 

 

選択(Selection)

SELECT <列名> [, <列名>, ...]

FROM <表名>

WHERE 条件

;

 

SELECT * 

FROM departments

WHERE deptno = 10

;

 

これも基本的な構文です。選択しているんですね(何当たり前のこと言っているんだろう)。WHEREからは奥が深くなりますね(今回はそこへは足を踏み入れません)。(ちなみに * は全ての列を射影する際に使います)

 

一応説明すると以下のような結果を指定しています。

  1. departments表から
  2. deptnoが10であるレコードのみを選択して
  3. 全ての列を取り出す

 

 

結合(Join)

SELECT [<表名>.]<列名> [, <列名>, ...]

FROM <表名1> JOIN <表名2>

ON [<表名1>.]<列名> = [<表名2>.]<列名>

;

 

SELECT empno, ename, dname

FROM employees JOIN departments

  ON employees.deptno = departments.deptno

;

 

詳しくは割愛しますが、内部結合をしています。同じ値の列を結合しています。(結合もいろいろ奥が深いです。別の記事でまとめられればと思います。)

 

一応説明すると以下のような結果を指定しています。

  1. employees表の各行のdeptnoと一致するdeptnoを持つdepartments表の行を探して結合した表から
  2. empnoとenameとdnameという名前の列を取り出す

 

ちなみにJOINは他の書き方が多くあります。上記の例だと以下のうようにも書けます。

SELECT empno, ename, dname

FROM employees, departments

WHERE employees.deptno = departments.deptno

;

 

両方知っておくといいと思います。個人的にはON句を使用している方が処理の意味が分かりやすくて好きです。因みに情報処理技術者試験では両方出てきた記憶があります。(標準SQLではどっちが推奨なのか暇な時に調べてみようかな)

 

 

最後に

SQLはやりたい操作を指定するだけで内部の処理は意識しなくていい点が最大の特徴です。とはいえ内部の処理をイメージすると速いSELECT文とそうでないSELECT文の違いが見えてくるかも知れません。処理方法に着眼したSQLの書き方についてはまたの機会に調査したいと思います。

 

以上、SELECT文の基礎でした。

基礎って言葉が正しいのかわからないけど(/ω\)