SQL文字列関数入門:データ操作を豊かにする基本関数
SQLでデータを扱う際、数値や日付だけでなく、テキストデータ(文字列)も非常に重要です。名前、住所、メールアドレス、商品名など、私たちの身の回りの多くの情報は文字列としてデータベースに格納されています。
しかし、データベースに格納されている文字列は、そのままでは使いにくい場合も少なくありません。例えば、
- メールアドレスからドメイン部分だけを取り出したい
- 商品の説明文の一部だけを表示したい
- 複数の文字列を組み合わせて表示したい
- 特定の単語を別の単語に置き換えたい
- 大文字・小文字を統一したい
といったニーズは日常的に発生します。
これらの課題を解決するために、SQLには「文字列関数」と呼ばれる便利な機能が用意されています。
今回は、SQL初学者の方がまず押さえておきたい、基本的な文字列関数について、その使い方と具体例を分かりやすく解説していきます。
これらの関数を使いこなせるようになれば、データベースから取得した文字列データを、より目的に合った形に加工できるようになり、データ分析やアプリケーション開発の幅が格段に広がります。
まずは、身近な疑問から見ていきましょう。
1. 文字列の長さを調べる:LENGTH関数
「この商品名の長さはどれくらいだろう?」「メールアドレスの最大長を把握したい」
そんな時に役立つのが LENGTH 関数です。
LENGTH 関数は、指定した文字列の長さを返します。文字数ではなく、バイト数で返される場合もあるため、データベースシステムや文字コードによって挙動が異なることがある点に注意が必要です。
多くのデータベースシステム(MySQL, PostgreSQL, SQLiteなど)では、LENGTH 関数は文字数を返します。しかし、念のため、使用しているデータベースのドキュメントを確認することをおすすめします。
具体例
例えば、products テーブルに product_name という列があるとしましょう。
SELECT
product_name,
LENGTH(product_name) AS name_length
FROM
products;
このクエリは、各商品の名前とその名前の長さを表示します。
もし products テーブルに以下のようなデータがあった場合:
| product_name |
|---|
| Apple |
| Banana |
| Cherry |
実行結果は以下のようになります:
| product_name | name_length |
|---|---|
| Apple | 5 |
| Banana | 6 |
| Cherry | 6 |
このように、LENGTH 関数を使うことで、文字列の長さを数値として取得できます。これは、データ検証や、表示幅の調整などに役立ちます。
「あれ?もし空文字列だったらどうなるんだろう?」
空文字列 '' を LENGTH 関数に渡すと、結果は 0 になります。
SELECT LENGTH('');
結果:
| LENGTH('') |
|---|
| 0 |
また、NULL 値を LENGTH 関数に渡した場合、結果は NULL になります。
SELECT LENGTH(NULL);
結果:
| LENGTH(NULL) |
|---|
| NULL |
NULLの扱いは、他の文字列関数でも同様に、結果がNULLになることが多いので覚えておくと良いでしょう。
2. 文字列の一部を抜き出す:SUBSTRING関数(またはSUBSTR)
「メールアドレスの@より後のドメイン部分だけが欲しい」「商品コードの最初の3文字だけを使いたい」
このような、文字列の特定の部分だけを取り出したい場合に使うのが SUBSTRING 関数です。
SUBSTRING 関数は、指定した文字列から、指定した位置から指定した長さの文字列を抽出します。
構文はデータベースシステムによって若干異なることがありますが、一般的には以下のようになります。
SUBSTRING(文字列, 開始位置, 長さ)
文字列: 対象となる文字列。開始位置: 文字列の何文字目から抽出を開始するかを指定します。多くのシステムでは、1から始まります。長さ: 抽出したい文字列の長さ。
具体例
users テーブルに email 列があるとしましょう。
| user1@example.com |
| admin@sub.example.net |
| test@domain.org |
この email 列から、ドメイン部分(@ より後)を抽出したいとします。
まず、@ が何文字目にあるかを知る必要があります。これには POSITION 関数や INSTR 関数などが使えますが、ここでは SUBSTRING 関数だけで実現できる方法を考えましょう。
多くのSQL方言では、開始位置に負の数を指定すると、文字列の末尾からの位置を示すことができます。
例えば、SQLiteやMySQLでは、以下のように書けます。
SELECT
email,
SUBSTRING(email, INSTR(email, '@') + 1) AS domain
FROM
users;
INSTR(email, '@') は、@ が文字列の何文字目にあるかを返します。それに 1 を足すことで、@ の次の文字から抽出を開始します。
また、開始位置と長さを指定して、より細かく制御することも可能です。
例えば、最初の5文字だけを取り出す場合:
SELECT
product_name,
SUBSTRING(product_name, 1, 5) AS short_name
FROM
products;
もし products テーブルに product_name が 'Super Widget' だった場合:
| product_name | short_name |
|---|---|
| Super Widget | Super |
「開始位置に負の数を指定するとどうなるの?」
システムによりますが、例えば SUBSTRING('abcdef', -3) のように指定すると、末尾から3文字(def)を取得できる場合があります。
また、長さ を省略すると、指定した開始位置から文字列の最後までを抽出します。
SELECT SUBSTRING('abcdef', 4);
結果:
| SUBSTRING('abcdef', 4) |
|---|
| def |
SUBSTRING 関数は、データ整形において非常に強力なツールです。
3. 文字列を結合する:CONCAT関数
「姓と名をつなげてフルネームを表示したい」「商品IDと商品名をつなげて表示したい」
複数の文字列を一つにまとめたいときに使うのが CONCAT 関数です。
CONCAT 関数は、引数として渡された複数の文字列を順番に結合して、一つの新しい文字列を返します。
構文は以下の通りです。
CONCAT(文字列1, 文字列2, 文字列3, ...)
具体例
customers テーブルに first_name と last_name 列があるとしましょう。
| first_name | last_name |
|---|---|
| John | Doe |
| Jane | Smith |
これらの列を結合して、フルネームを表示したい場合:
SELECT
first_name,
last_name,
CONCAT(first_name, ' ', last_name) AS full_name
FROM
customers;
このクエリでは、first_name、スペース (' ')、last_name を連結しています。
実行結果:
| first_name | last_name | full_name | |------------|-----------| | John | Doe | John Doe | | Jane | Smith | Jane Smith |
「姓と名の間にスペースを入れたいんだけど、どうすればいい?」
このように、連結したい文字列の間に、スペースや区切り文字を CONCAT 関数の引数として渡すことで、自由に挿入できます。
また、文字列リテラルだけでなく、他の列や関数で取得した文字列を結合することも可能です。
例えば、商品IDと商品名を結合する場合:
SELECT
product_id,
product_name,
CONCAT('ID: ', product_id, ' - ', product_name) AS product_info
FROM
products;
CONCAT 関数は、レポート作成や表示用の文字列を生成する際に非常に便利です。
4. 文字列の一部を置換する:REPLACE関数
「古いドメインのメールアドレスを新しいドメインに一括で変更したい」「商品名に含まれる特定の単語を修正したい」
このような、文字列の一部を別の文字列に置き換えたい場合に使うのが REPLACE 関数です。
REPLACE 関数は、指定した文字列の中から、特定の文字列を検索し、見つかったすべてを別の文字列に置き換えた新しい文字列を返します。
構文は以下の通りです。
REPLACE(元の文字列, 検索する文字列, 置換後の文字列)
元の文字列: 対象となる文字列。検索する文字列: 置換したい文字列。置換後の文字列: 検索した文字列を置き換える新しい文字列。
具体例
contacts テーブルに website 列があり、古いURLを新しいURLに修正したいとします。
| website |
|---|
| http://old.com/page1 |
| http://old.com/page2 |
| http://new.com/page3 |
old.com を new.com に置き換えたい場合:
SELECT
website,
REPLACE(website, 'http://old.com', 'http://new.com') AS updated_website
FROM
contacts;
実行結果:
| website | updated_website |
|---|---|
| http://old.com/page1 | http://new.com/page1 |
| http://old.com/page2 | http://new.com/page2 |
| http://new.com/page3 | http://new.com/page3 |
「もし、置換したい文字列が見つからなかったらどうなる?」
検索する文字列 が 元の文字列 に存在しない場合、REPLACE 関数は元の文字列をそのまま返します。
SELECT REPLACE('abcdef', 'xyz', '123');
結果:
| REPLACE('abcdef', 'xyz', '123') |
|---|
| abcdef |
REPLACE 関数は、データのクリーニングや修正作業において非常に強力です。
5. 大文字・小文字を変換する:UPPER関数とLOWER関数
「ユーザー名の大文字・小文字を区別せずに検索したい」「商品名をすべて大文字で統一して表示したい」
このような、文字列の大文字・小文字を変換したい場合に使うのが UPPER 関数と LOWER 関数です。
UPPER関数: 文字列をすべて大文字に変換します。LOWER関数: 文字列をすべて小文字に変換します。
構文は以下の通りです。
UPPER(文字列)
LOWER(文字列)
具体例
users テーブルに username 列があるとしましょう。
| username |
|---|
| Alice |
| bob |
| Charlie |
これらのユーザー名をすべて小文字に変換したい場合:
SELECT
username,
LOWER(username) AS lowercase_username
FROM
users;
実行結果:
| username | lowercase_username |
|---|---|
| Alice | alice |
| bob | bob |
| Charlie | charlie |
逆に、すべて大文字に変換したい場合は UPPER 関数を使います。
SELECT
username,
UPPER(username) AS uppercase_username
FROM
users;
実行結果:
| username | uppercase_username |
|---|---|
| Alice | ALICE |
| bob | BOB |
| Charlie | CHARLIE |
これらの関数は、検索時の大文字・小文字の区別をなくしたい場合(例:WHERE LOWER(username) = 'alice')や、表示形式を統一したい場合に非常に役立ちます。
まとめ
今回は、SQLでよく使われる基本的な文字列関数である LENGTH, SUBSTRING, CONCAT, REPLACE, UPPER, LOWER について解説しました。
これらの関数を使いこなすことで、データベースに格納されているテキストデータを、より柔軟に、そして効果的に扱うことができるようになります。
LENGTH: 文字列の長さを取得する。SUBSTRING: 文字列の一部を抜き出す。CONCAT: 複数の文字列を結合する。REPLACE: 文字列の一部を置換する。UPPER: 文字列をすべて大文字にする。LOWER: 文字列をすべて小文字にする。
これらの関数は、データの前処理、レポート作成、検索条件の指定など、様々な場面で活躍します。
SQLの学習を進める上で、これらの文字列関数は必須の知識と言えるでしょう。
今回学んだ関数を使って、実際にデータを操作してみましょう。