🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

SQLのAS句とは?エイリアスでテーブルや列に別名を付けてクエリを劇的に読みやすくしよう!

「計算結果の列名が `price * 1.1` みたいになってて見栄えが悪い…」
「JOINしたらテーブル名が長すぎて、クエリがごちゃごちゃして読みにくい!」

SQLを書き始めると、こんな「ちょっとしたストレス」を感じることはありませんか?クエリは動くけど、なんだか読みにくい。後から見返したときに、自分でも何をしているのか解読するのに時間がかかってしまう…。

そんな悩みを一瞬で解決してくれる魔法のキーワードが、今回ご紹介する「AS」句です。ASを使うと、テーブルや列に「エイリアス(別名)」を付けることができます。これは、長い本名をニックネームで呼ぶようなもの。ASを使いこなせば、SQLクエリは劇的に読みやすく、そして書きやすくなります!

この記事では、SQLの可読性を飛躍させるAS句の基本的な使い方から、JOINや自己結合といった応用テクニックまで、コピペで動かせるサンプルコードと共に徹底解説します。


準備:練習用のテーブル

まずは、エイリアスの便利さを体験するためのテーブルを用意しましょう。今回はシンプルな商品テーブルを使います。


-- テーブルが存在すれば削除
DROP TABLE IF EXISTS products;

-- 商品テーブルの作成
CREATE TABLE products (
    id INT PRIMARY KEY,
    product_name VARCHAR(100),
    price INT,
    category VARCHAR(50)
);

-- データ挿入
INSERT INTO products (id, product_name, price, category) VALUES
(1, '高機能オフィスチェア', 35000, '家具'),
(2, '静音ワイヤレスキーボード', 8000, '周辺機器'),
(3, '4K対応27インチモニター', 42000, '周辺機器'),
(4, '電動昇降式デスク', 65000, '家具'),
(5, 'ノイズキャンセリングヘッドホン', 28000, 'オーディオ');
    

このテーブルを使って、AS句の様々な使い方を見ていきましょう!


1. 列のエイリアス:結果の見た目を整える

列のエイリアスは、クエリの実行結果の列名(ヘッダー)を分かりやすい名前に変える機能です。元のテーブルの列名が変更されるわけではないので、安心して使ってください。主に、レポート出力時やアプリケーションで表示する際に役立ちます。

例1:列名を日本語の分かりやすい名前にする

`product_name`や`price`といった英語の列名を、そのまま表示するのではなく、日本語の「商品名」「価格」として表示したい場合に便利です。


SELECT
    product_name AS "商品名",
    price AS "価格"
FROM
    products;
    

このように、ASの後に新しい名前を指定するだけで、結果のヘッダーが変わりましたね。これで、SQLを知らない人にも分かりやすいレポートが作れます。


例2:計算結果の列に名前を付ける

計算や関数を使った結果の列に、分かりやすい名前を付けるのは、ASの最も一般的な使い方の一つです。例えば、税込み価格(価格×1.1)を計算してみましょう。


-- ASがないと、列名が計算式のままになってしまう
SELECT
    product_name,
    price * 1.1
FROM
    products;
    

これだと列名が`price * 1.1`となってしまい、不格好ですよね。そこでASの出番です。


-- ASを使って分かりやすい名前を付ける
SELECT
    product_name AS "商品名",
    price * 1.1 AS "税込価格"
FROM
    products;
    

どうでしょう?`AS "税込価格"`と付けるだけで、結果がぐっと見やすくなりました。集計関数(`COUNT`, `SUM`, `AVG`など)を使う場合も同様に、ASで名前を付けるのが基本です。

※ ちなみに、多くのSQL環境では、列のエイリアスに限りASを省略できます(例:price "価格")。しかし、コードの可読性を高めるために、ASは明示的に書くことをお勧めします。


2. テーブルのエイリアス:複雑なクエリを簡潔にする

テーブルのエイリアスは、クエリ内でテーブルに「一時的な短い名前」を付ける機能です。これは、特に複数のテーブルをJOINする際に絶大な効果を発揮します。クエリが短く、シンプルになり、どのテーブルのどの列を参照しているかが一目瞭然になります。

例1:JOIN文をスッキリさせる

ここでは「社員(employees)」と「部署(departments)」テーブルを例に見てみましょう。


-- この例用のテーブル準備
DROP TABLE IF EXISTS employees;
DROP TABLE IF EXISTS departments;
CREATE TABLE departments (id INT, department_name STRING);
INSERT INTO departments VALUES (1, '営業部'), (2, '開発部');
CREATE TABLE employees (id INT, name STRING, department_id INT);
INSERT INTO employees VALUES (1, '山田 太郎', 1), (2, '鈴木 花子', 2);
    

エイリアスを使わない場合、どのテーブルの列かを毎回`テーブル名.列名`の形式で書く必要があり、非常に冗長です。


-- エイリアスなし(冗長な例)
SELECT
    employees.name,
    departments.department_name
FROM
    employees
INNER JOIN
    departments ON employees.department_id = departments.id;
    

これをテーブルエイリアスを使って書き換えてみましょう。employeesedepartmentsdと名付けます。


-- エイリアスあり(推奨される書き方)
SELECT
    e.name,
    d.department_name
FROM
    employees AS e
INNER JOIN
    departments AS d ON e.department_id = d.id;
    

驚くほどスッキリしましたね!e.nameだけで「employeesテーブルのname列」を意味することが明確になり、クエリ全体の見通しが格段に良くなりました。


実践!ブラウザでエイリアスを試してみよう

お待たせしました!ここまで学んだエイリアスの使い方を、実際に手を動かして試せる環境です。

下のコードをまるごとコピーして、alias_practice.htmlのようなファイル名で保存し、ブラウザで開いてみてください。`INNER JOIN`のクエリにエイリアスを適用して、クエリがどれだけ読みやすくなるか体感してみてください!


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>SQLエイリアス練習場</title>
    <script src="https://cdn.jsdelivr.net/npm/alasql@4"></script>
    <style>
        body { font-family: sans-serif; padding: 2rem; background-color: #f9f9f9; }
        .container { max-width: 800px; margin: auto; background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
        h1 { color: #333; }
        textarea { width: 100%; height: 180px; font-family: monospace; font-size: 16px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; margin-bottom: 1rem; }
        button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
        button:hover { background-color: #0056b3; }
        #result-area { margin-top: 2rem; }
        table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        .error { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <div class="container">
        <h1>エイリアスを試してみよう!</h1>
        <p>下のテキストエリアにSQL文を入力して「実行」ボタンを押してください。</p>
        <textarea id="sql-input">-- この中にSQLを書いてください
SELECT
    e.name AS "社員名",
    d.department_name AS "部署名"
FROM
    employees AS e
INNER JOIN
    departments AS d ON e.department_id = d.id;</textarea>
        <button onclick="executeSQL()">SQLを実行</button>
        <div id="result-area"></div>
    </div>

    <script>
        // データベースの初期化とJOIN用のデータ準備
        const db = new alasql.Database();
        db.exec(`
            CREATE TABLE departments (id INT, department_name STRING);
            INSERT INTO departments VALUES (1, '営業部'), (2, '開発部');
            CREATE TABLE employees (id INT, name STRING, department_id INT);
            INSERT INTO employees VALUES (1, '山田 太郎', 1), (2, '鈴木 花子', 2);
        `);

        function executeSQL() {
            const sql = document.getElementById('sql-input').value;
            const resultArea = document.getElementById('result-area');
            resultArea.innerHTML = '';

            try {
                const result = db.exec(sql);
                if (result.length > 0) {
                    resultArea.appendChild(createTable(result));
                } else {
                    resultArea.innerHTML = '<p>結果は0件でした。</p>';
                }
            } catch (e) {
                resultArea.innerHTML = `<p class="error">エラー: ${e.message}</p>`;
            }
        }

        function createTable(data) {
            const table = document.createElement('table');
            const thead = table.createTHead();
            const tbody = table.createTBody();
            const headerRow = thead.insertRow();
            for (const key in data[0]) {
                const th = document.createElement('th');
                th.textContent = key;
                headerRow.appendChild(th);
            }
            data.forEach(rowData => {
                const row = tbody.insertRow();
                for (const key in rowData) {
                    const cell = row.insertCell();
                    cell.textContent = rowData[key];
                }
            });
            return table;
        }

        // 初期表示
        executeSQL();
    </script>
</body>
</html>
    

気をつけるべき点:エイリアスのスコープと順序

エイリアスは非常に便利ですが、一つだけ重要なルールがあります。それは「SQLの実行順序」に関わるものです。

WHERE句やGROUP BY句では列エイリアスを使えない

SQLの内部的な実行順序は、私たちが書く順番(SELECTFROMWHERE)とは少し異なり、大まかに以下のようになっています。

FROMWHEREGROUP BYHAVINGSELECTORDER BY

お気づきでしょうか?SELECT句はWHERE句やGROUP BY句よりもに処理されます。そのため、SELECT句で定義した列のエイリアスを、それより先に処理されるWHERE句などで使うことはできません。


-- これはエラーになる例
-- productsテーブルを使って説明します
SELECT
    product_name AS "商品名"
FROM
    products
WHERE
    "商品名" = '高機能オフィスチェア';
    

上記クエリはエラーになります。WHERE句の時点では、まだ「商品名」というエイリアスは存在しないからです。この場合は、元の列名を使う必要があります。(このエラーを試すには、上の実践コーナーのデータ準備を`products`テーブルに戻す必要があります)


-- これが正しい書き方
SELECT
    product_name AS "商品名"
FROM
    products
WHERE
    product_name = '高機能オフィスチェア';
    

一方で、SELECT句より後に処理されるORDER BY句では、列のエイリアスを使うことができます。これは非常に便利なので覚えておきましょう。


まとめ

お疲れ様でした!今回は、SQLのクエリを劇的に読みやすく、書きやすくするAS句(エイリアス)について解説しました。

ASは、SQLを書き始めたばかりの初心者から、複雑なデータを扱うプロまで、すべての人が使うべき必須のキーワードです。今日から、あなたのクエリにもぜひ「ニックネーム」を付けてあげてください。それだけで、未来のあなたやチームメイトが、きっと感謝してくれますよ!