【保存版】MariaDBのSQL文で最小値をスマートに抽出!LEAST関数マスターガイド

2024-06-16

MariaDBにおけるLEAST関数:詳細解説

概要

構文

LEAST(value1, value2, ..., valueN)

引数

  • value1, value2, ..., valueN: 比較対象となる値。型は整数、実数、文字列など、様々です。

戻り値

  • 引数の中で最も小さい値。引数が全てNULLの場合はNULLを返します。

  • 戻り値の型は、引数の型のうち、最も一般的な型になります。
    • 例えば、整数と実数の引数を指定した場合、戻り値は実数となります。
    • 文字列と数値の引数を指定した場合、戻り値は文字列となります。

注意点

  • 引数の型が異なる場合、比較方法は以下のようになります。
    • 戻り値の型が整数型の場合、全ての引数が整数型として比較されます。
    • 戻り値の型が実数型の場合、全ての引数が実数型として比較されます。
    • いずれかの引数が文字列型の場合、全ての引数が文字列型として比較されます。
  • 大文字小文字の区別がある場合は、文字列比較となります。

-- 整数引数の例
SELECT LEAST(2, 1, 3);
+------------+
| LEAST(2,1,3) |
+------------+
| 1 |
+------------+

-- 実数引数の例
SELECT LEAST(3.14, 1.59, 2.71);
+-----------------------+
| LEAST(3.14,1.59,2.71) |
+-----------------------+
| 1.59 |
+-----------------------+

-- 文字列引数の例
SELECT LEAST('apple', 'banana', 'cherry');
+-------------------+
| LEAST('apple','banana','cherry') |
+-------------------+
| apple |
+-------------------+

-- 型変換の例
SELECT LEAST(1, 3.14, '5');
+-------------------+
| LEAST(1,3.14,'5') |
+-------------------+
| 1 |
+-------------------+

-- NULLの例
SELECT LEAST(NULL, 2, 3);
+------------+
| LEAST(NULL,2,3) |
+------------+
| NULL |
+------------+

用途

LEAST関数は、様々な場面で役立ちます。

  • 複数の値の中で最小値を取得する
  • 条件に応じて異なる値を返す
  • データの整合性を保つ
  • 顧客情報のうち、年齢が最も若い顧客のIDを取得する
SELECT customer_id
FROM customers
ORDER BY age
LIMIT 1;

上記のようなクエリは、以下のクエリで置き換えることができます。

SELECT customer_id
FROM customers
WHERE age = LEAST(age);
  • 在庫数が最も少ない商品の商品IDと在庫数を取得する
SELECT product_id, stock_quantity
FROM products
ORDER BY stock_quantity
LIMIT 1;
SELECT product_id, stock_quantity
FROM products
WHERE stock_quantity = LEAST(stock_quantity);
  • 注文金額が100ドル未満の場合は送料を無料にする
SELECT order_id, shipping_fee
FROM orders;
SELECT order_id,
    CASE WHEN order_amount < 100 THEN 0 ELSE shipping_fee END AS shipping_fee
FROM orders;


基本的な使い方

例1:複数の整数の最小値を取得する

SELECT LEAST(1, 2, 3);

このクエリは、1、2、3 の中で最小値である 1 を返します。

SELECT LEAST(3.14, 1.59, 2.71);

このクエリは、3.14、1.59、2.71 の中で最小値である 59 を返します。

SELECT LEAST('apple', 'banana', 'cherry');

このクエリは、'apple'、'banana'、'cherry' の中で最小値である **'apple'` を返します。

例4:型変換の例

SELECT LEAST(1, 3.14, '5');

このクエリは、1、3.14、'5' の中で最小値である 1 を返します。 文字列 '5' は整数に変換されて比較されます。

例5:NULLの例

SELECT LEAST(NULL, 2, 3);

用途に応じた使い方

例1:顧客情報のうち、年齢が最も若い顧客のIDを取得する

SELECT customer_id
FROM customers
WHERE age = LEAST(age);

このクエリは、customers テーブルから、age 列の値が最小である顧客の customer_id を取得します。

例2:在庫数が最も少ない商品の商品IDと在庫数を取得する

SELECT product_id, stock_quantity
FROM products
WHERE stock_quantity = LEAST(stock_quantity);

このクエリは、products テーブルから、stock_quantity 列の値が最小である商品の product_idstock_quantity を取得します。

例3:注文金額が100ドル未満の場合は送料を無料にする

SELECT order_id,
    CASE WHEN order_amount < 100 THEN 0 ELSE shipping_fee END AS shipping_fee
FROM orders;

このクエリは、orders テーブルから、order_amount 列の値が100ドル未満の場合は送料を0、それ以外の場合は shipping_fee 列の値を shipping_fee として返します。



LEAST関数の代替方法

MIN関数

MIN関数は、SELECT句で指定された列の中で最小値を取得します。LEAST関数と同様に、引数として複数の値を指定することもできます。

構文

MIN(column_name)

SELECT MIN(age)
FROM customers;

このクエリは、customers テーブルの age 列の中で最小値を取得します。

LEAST関数との違い

  • MIN関数は、SELECT句で指定された列の値のみを比較対象とすることができます。LEAST関数は、列だけでなく、リテラル値や式なども比較対象とすることができます。
  • MIN関数は、NULL値を無視して最小値を計算します。LEAST関数は、NULL値を考慮して最小値を計算します。
-- MIN関数はNULL値を無視する
SELECT MIN(age)
FROM customers;
+----+
| MIN(age) |
+----+
| 20 |
+----+

-- LEAST関数はNULL値を考慮する
SELECT LEAST(age)
FROM customers;
+----+
| LEAST(age) |
+----+
| NULL |
+----+

CASE式

CASE式は、条件に応じて異なる値を返すことができます。LEAST関数と同様に、複数の値を比較して最小値を取得することができます。

CASE
    WHEN condition1 THEN value1
    WHEN condition2 THEN value2
    ...
    ELSE valueN
END
SELECT
    customer_id,
    CASE WHEN age = LEAST(age) THEN 0 ELSE shipping_fee END AS shipping_fee
FROM orders;

このクエリは、orders テーブルから、age 列の値が最小である顧客の customer_id と、それ以外の顧客の shipping_fee を取得します。

  • CASE式は、LEAST関数よりも柔軟に条件を設定することができます。
  • CASE式は、LEAST関数よりも可読性が低くなります。

サブクエリ

サブクエリは、別のクエリの結果をSELECT句で利用することができます。LEAST関数と同様に、複数の値の中で最小値を取得することができます。

SELECT column_name
FROM table_name
WHERE column_name IN (
    SELECT MIN(column_name)
    FROM table_name
);
SELECT customer_id
FROM customers
WHERE age IN (
    SELECT MIN(age)
    FROM customers
);

このクエリは、customers テーブルから、age 列の値が最小である顧客の customer_id を取得します。

  • サブクエリは、LEAST関数よりも複雑な処理を行うことができます。
  • サブクエリは、LEAST関数よりもパフォーマンスが低下する可能性があります。