【SQL初心者でも安心】SQLiteでシンプルSELECTをマスター! データベース操作のはじめの一歩
SELECT 句の構文
SELECT 列名1, 列名2, ...
FROM テーブル名
[WHERE 条件式]
[ORDER BY ソート列名];
例
SELECT 氏名, 年齢, 住所
FROM 顧客情報
WHERE 性別 = '男性';
各要素の説明
- ORDER BY
結果をソートする列を指定します。 - WHERE
特定の条件に合致するレコードのみを取得するための条件式を指定します。 - FROM
データを取得するテーブル名を指定します。 - 列名
カンマ区切りで複数の列を指定できます。 - SELECT
取得したい列を指定します。
データ型と演算子
SQLite では、数値、文字列、日付など様々なデータ型を扱うことができます。また、条件式やソート処理において、比較演算子(=、<、>など)、論理演算子(AND、OR、NOTなど)、算術演算子(+、-、*、/など)などを利用できます。
例
SELECT 氏名, 年齢
FROM 顧客情報
WHERE 年齢 >= 20 AND 年齢 <= 30
ORDER BY 氏名 ASC;
ワイルドカードの使用
ワイルドカードを用いることで、あいまい検索を実行できます。
- _
1文字にマッチします。 - %
任意の文字列にマッチします。
例
SELECT *
FROM 商品情報
WHERE 商品名 LIKE '%シャツ%';
結果の取得方法
SELECT プログラミングを実行すると、結果セットと呼ばれるデータ構造が返されます。この結果セットを様々な方法で処理できます。
- 集計処理
COUNT
、SUM
、AVG
などの集計関数を使用して、結果セットの統計情報を得ることができます。 - 条件分岐
結果セットの値に基づいて、処理を分岐できます。 - ループ処理
FOR
ループを用いて、結果セットの各レコードを順に処理できます。
import sqlite3
# データベースへの接続
conn = sqlite3.connect('顧客情報.db')
cursor = conn.cursor()
# 全レコードを取得
cursor.execute('SELECT * FROM 顧客情報')
results = cursor.fetchall()
# 取得結果の処理
for row in results:
print(f"氏名: {row[0]}、年齢: {row[1]}、住所: {row[2]}")
# データベースのクローズ
conn.close()
import java.sql.*;
public class SelectExample {
public static void main(String[] args) {
try {
// データベースへの接続
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:顧客情報.db");
Statement stmt = conn.createStatement();
// 全レコードを取得
ResultSet rs = stmt.executeQuery("SELECT * FROM 顧客情報");
while (rs.next()) {
System.out.println("氏名: " + rs.getString("氏名") +
", 年齢: " + rs.getInt("年齢") +
", 住所: " + rs.getString("住所"));
}
// データベースのクローズ
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
using System.Data.SQLite;
namespace SelectExample {
class Program {
static void Main(string[] args) {
try {
// データベースへの接続
using (var conn = new SQLiteConnection("顧客情報.db")) {
conn.Open();
using (var cmd = new SQLiteCommand(conn)) {
cmd.CommandText = "SELECT * FROM 顧客情報";
// 結果セットの取得
using (var reader = cmd.ExecuteReader()) {
while (reader.Read()) {
Console.WriteLine("氏名: {0}, 年齢: {1}, 住所: {2}",
reader.GetString(0), reader.GetInt32(1), reader.GetString(2));
}
}
}
}
} catch (Exception e) {
Console.WriteLine(e.Message);
}
}
}
}
説明
上記のコードは、それぞれ Python、Java、C# で記述された、SQLite の SELECT プログラミングの例です。
- データベースのクローズ
- 取得結果の処理
- 全レコードの取得
- データベースへの接続
といった基本的な操作を、それぞれの言語でどのように実装するかを示しています。
- より複雑なクエリを実行するには、WHERE 句や ORDER BY 句などのオプションを使用できます。
- エラー処理や接続プーリングなどの機能を追加することもできます。
- 上記のコードはあくまで一例であり、状況に合わせて変更する必要があります。
頻繁に使用する複雑な SELECT クエリを、ビューとして定義することで、シンプルな SELECT ステートメントで置き換えることができます。
例
CREATE VIEW 顧客情報_詳細 AS
SELECT 氏名, 年齢, 住所, 電話番号, メールアドレス
FROM 顧客情報;
SELECT * FROM 顧客情報_詳細;
サブクエリ
部分的な集計や条件絞り込みを必要とする場合、サブクエリを利用することで、シンプルな SELECT ステートメント内に複雑な処理を記述できます。
例
SELECT 氏名, 年齢, AVG(注文金額) AS 平均注文金額
FROM 顧客情報
JOIN 注文情報 ON 顧客情報.顧客ID = 注文情報.顧客ID
GROUP BY 氏名, 年齢;
COMMON TABLE EXPRESSION (CTE)
複数のサブクエリを組み合わせる必要がある場合、CTE を利用することで、可読性とメンテナンス性を向上させることができます。
例
WITH 顧客情報_詳細 AS (
SELECT 氏名, 年齢, 住所, 電話番号, メールアドレス
FROM 顧客情報
)
SELECT c.氏名, c.年齢, c.住所, o.注文日, o.商品名
FROM 顧客情報_詳細 AS c
JOIN 注文情報 AS o ON c.顧客ID = o.顧客ID;
マテリアライズドビュー
頻繁にアクセスされる集計結果などを、あらかじめデータベースに格納しておくことで、パフォーマンスを向上させることができます。
例
CREATE MATERIALIZED VIEW 顧客情報_集計 AS
SELECT 氏名, 年齢, COUNT(*) AS 注文件数
FROM 顧客情報
JOIN 注文情報 ON 顧客情報.顧客ID = 注文情報.顧客ID
GROUP BY 氏名, 年齢;
導出列
テーブル定義に導出列を追加することで、計算結果を列として格納することができます。
例
ALTER TABLE 顧客情報
ADD COLUMN 平均注文金額 AS (
SELECT AVG(注文金額)
FROM 注文情報
WHERE 顧客情報.顧客ID = 注文情報.顧客ID
GROUP BY 顧客情報.顧客ID
);
ウィンドウ関数
分析処理において、前後のレコードを参照するような集計やランキングなどを、ウィンドウ関数を利用することで実現できます。
例
SELECT 氏名, 年齢, RANK() OVER (ORDER BY 注文金額 DESC) AS 順位
FROM 顧客情報
JOIN 注文情報 ON 顧客情報.顧客ID = 注文情報.顧客ID;
仮想テーブル
外部データソースや複雑なクエリ結果を、一時的なテーブルとして扱うことで、シンプルな SELECT ステートメントで処理することができます。
例
CREATE TEMPORARY TABLE 顧客情報_絞り込み AS
SELECT *
FROM 顧客情報
WHERE 年齢 >= 20 AND 年齢 <= 30;
SELECT * FROM 顧客情報_絞り込み;
それぞれの方法の選択
上記の代替方法はそれぞれ、異なる利点と欠点があります。状況に合わせて適切な方法を選択することが重要です。
- 仮想テーブル
外部データソースや複雑なクエリ結果を一時的に扱うことができる。 - ウィンドウ関数
分析処理において柔軟な集計やランキングを実現できる。 - 導出列
計算結果を列として永続的に保持できる。 - マテリアライズドビュー
集計結果を格納することでパフォーマンスを向上できる。 - CTE
複数のサブクエリを組み合わせた処理を可読性高く記述できる。 - サブクエリ
部分的な集計や条件絞り込みを柔軟に行える。 - ビュー
頻繁に使用する複雑なクエリを簡潔に記述できる。