SQL文と構造を理解する:MariaDBにおける数値リテラル


数値リテラルの種類

MariaDBで扱える数値リテラルは、大きく以下の3種類に分類されます。

  1. 整数リテラル
    10進数、8進数、16進数で表される整数値です。

    • 10進数
      123, -1000, 0
    • 8進数
      0644, 012
    • 16進数
      0xCAFE, 0xF0
  2. 小数リテラル
    小数点を含む数値を表します。指数表記も可能です。

    • 12.3, -5.67, 3.14e2 (3.14 x 10^2)
  3. 特殊な数値リテラル
    特定の意味を持つ数値を表します。

    • NULL: 値が存在しないことを示します。
    • NaN: 数値ではないことを示します。
    • Infinity: 正の無限大を表します。

数値リテラルの型

数値リテラルは、格納するデータ型に応じて型が自動的に割り当てられます。

  • 小数リテラル: DECIMAL, FLOAT, DOUBLE など
  • 整数リテラル: INT, BIGINT, SMALLINT など

必要な精度や範囲に応じて適切な型を選択することが重要です。

数値リテラルは、様々なSQL文で使用できます。以下に例を示します。

  • 条件式における数値の比較
    SELECT * FROM products WHERE price < 50;
    
  • 計算式における数値の使用
    SELECT order_id, product_id, quantity * unit_price AS total_price
    FROM orders;
    
  • 列への値の代入
    INSERT INTO customers (id, name, price) VALUES (1, 'John Doe', 12.50);
    
  • 文字列リテラルの中に数値を含める場合は、数値リテラルを CAST 関数で変換する必要があります。
  • 数値リテラルは、変数や式に代入することもできます。


数値リテラルの型と使用方法

-- 整数リテラル

CREATE TABLE customers (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  age SMALLINT NOT NULL
);

INSERT INTO customers (name, age) VALUES ('John Doe', 30), ('Jane Doe', 25);

SELECT id, name, age FROM customers;
-- 小数リテラル

CREATE TABLE products (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  price DECIMAL(10,2) NOT NULL
);

INSERT INTO products (name, price) VALUES ('Laptop', 1299.99), ('Phone', 649.99);

SELECT id, name, price FROM products;
-- 特殊な数値リテラル

CREATE TABLE orders (
  id INT PRIMARY KEY AUTO_INCREMENT,
  customer_id INT NOT NULL,
  order_date DATE NOT NULL,
  total_amount DECIMAL(10,2) NOT NULL
);

INSERT INTO orders (customer_id, order_date, total_amount) VALUES (1, '2024-06-21', 234.50);

SELECT id, customer_id, order_date, total_amount FROM orders;

数値リテラルの演算

以下のコード例は、MariaDBにおける数値リテラルの演算を示しています。

SELECT 10 + 5 * 2; -- 結果: 20
SELECT 10 / 2; -- 結果: 5.0
SELECT 10 ^ 2; -- 結果: 100
SELECT -10; -- 結果: -10

数値リテラルの関数

以下のコード例は、MariaDBにおける数値リテラルの関数使用を示しています。

SELECT ABS(-10); -- 結果: 10
SELECT SQRT(16); -- 結果: 4.0
SELECT POW(2, 3); -- 結果: 8.0
SELECT ROUND(12.345, 2); -- 結果: 12.34
SELECT * FROM customers WHERE age > 25;
SELECT * FROM products WHERE price < 500;
SELECT * FROM orders WHERE total_amount IS NULL;


代替方法とその利点

  1. パラメータ化されたクエリ

    利点: * SQLインジェクション対策になる * コードの再利用性が高まる * 可読性が向上する

    例:

    -- 整数リテラル
    SELECT * FROM products WHERE price < 50;
    
    -- パラメータ化されたクエリ
    SET price_limit = 50;
    SELECT * FROM products WHERE price < :price_limit;
    
  2. 関数

    利点: * コードをモジュール化できる * 複雑な計算をカプセル化できる * 可読性が向上する

    -- 整数リテラル
    SELECT id, name, age * 2 AS double_age FROM customers;
    
    -- 関数
    CREATE FUNCTION double_age(age INT)
    RETURN age * 2;
    
    SELECT id, name, double_age(age) AS double_age FROM customers;
    
  3. 変数

    利点: * コードを簡潔に記述できる * 計算結果を再利用できる

    -- 整数リテラル
    SET age_limit = 30;
    SELECT * FROM customers WHERE age > 30;
    
    -- 変数
    SET age_limit = 30;
    SELECT * FROM customers WHERE age > age_limit;
    
  4. 算術演算子

    利点: * コードを簡潔に記述できる * 既存の列を数値として操作できる

    -- 整数リテラル
    SELECT id, name, price + 10 AS discounted_price FROM products;
    
    -- 算術演算子
    SELECT id, name, price + 0.1 * price AS discounted_price FROM products;
    

どの代替方法が適切かは、状況によって異なります。

  • 既存の列を数値として操作したい場合は、算術演算子を使用する必要があります。
  • コードを簡潔に記述したい場合は、変数を使用する必要があります。
  • コードの再利用性を高めたい場合は、関数を使用する必要があります。
  • セキュリティが重要な場合は、パラメータ化されたクエリを使用する必要があります。