SQL入門:文字操作
REPLACE
SELECT REPLACE('test', 't', 'T');
出力結果
+---------------------------+ | REPLACE('test', 't', 'T') | +---------------------------+ | TesT | +---------------------------+ 1 row in set (0.00 sec)
SUBSTRING
SELECT SUBSTRING('MySQL8', 3); SELECT SUBSTRING('MySQL8', 3, 2); SELECT SUBSTRING('MySQL8' FROM 3); SELECT SUBSTRING('MySQL8' FROM 3 FOR 2);
出力結果
+------------------------+ | SUBSTRING('MySQL8', 3) | +------------------------+ | SQL8 | +------------------------+ 1 row in set (0.00 sec) +---------------------------+ | SUBSTRING('MySQL8', 3, 2) | +---------------------------+ | SQ | +---------------------------+ 1 row in set (0.00 sec) +----------------------------+ | SUBSTRING('MySQL8' FROM 3) | +----------------------------+ | SQL8 | +----------------------------+ 1 row in set (0.00 sec) +----------------------------------+ | SUBSTRING('MySQL8' FROM 3 FOR 2) | +----------------------------------+ | SQ | +----------------------------------+ 1 row in set (0.00 sec)
CONCAT
SELECT CONCAT('My', 'SQL', 8);
出力結果
+------------------------+ | CONCAT('My', 'SQL', 8) | +------------------------+ | MySQL8 | +------------------------+ 1 row in set (0.00 sec)
SQL入門:テーブル操作
テーブルのコピー
CREATE TABLE meats_tmp SELECT * FROM meats;
NULL値を平均値に置き換える
SELECT *, COALESCE( price, (SELECT SUM(price)/COUNT(*) FROM meats_tmp) ) AS price FROM meats_tmp;
price=0ならNULLを返す
SELECT NULLIF(price, 0) FROM meats_tmp;
行の最小値
SELECT LEAST(col1, col2, col3);
行の最大値
SELECT GREATEST(col1, col2, col3);
整数へ型変換
SELECT *, COALESCE( price, CAST( (SELECT SUM(price)/COUNT(*) FROM meats_tmp) AS UNSIGNED ) ) AS price FROM meats_tmp;
104日目:データベース
データベースの講義3日目です。
【参考テキスト】
【講義内容】
- 第4章 データベースとアーキテクチャ構成-堅牢かつ高速なシステムを構築するために-
【ワンポイント】
meatsテーブル
CREATE TABLE meats ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, category VARCHAR(10) NOT NULL, price INT UNSIGNED, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT charset=utf8;
データ
INSERT INTO meats ( name, category, price ) VALUES ('むね肉', '鶏', 90), ('もも肉', '鶏', 120), ('バラ肉', '豚', 190), ('ロース', '豚', 470), ('ヒレ', '豚', 500), ('肩ロース', '牛', 450), ('リブロース', '牛', 600), ('サーロイン', '牛', 960), ('ヒレ肉', '牛', 780), ('ばら肉', '牛', 370), ('羊肉', '羊', NULL) ;
GROUP BY
SELECT category, COUNT(*) FROM meats GROUP BY category ;
出力結果
+----------+----------+ | category | COUNT(*) | +----------+----------+ | 鶏 | 2 | | 豚 | 3 | | 牛 | 5 | | 羊 | 1 | +----------+----------+ 4 rows in set (0.00 sec)
HAVING
SELECT category, AVG(price) FROM meats GROUP BY category HAVING AVG(price) > 500 ;
出力結果
+----------+------------+ | category | AVG(price) | +----------+------------+ | 牛 | 632.0000 | +----------+------------+ 1 row in set (0.00 sec)
ORDER BY
SELECT name, category, price FROM meats ORDER BY price ;
出力結果
+------------+----------+-------+ | name | category | price | +------------+----------+-------+ | 羊肉 | 羊 | NULL | | むね肉 | 鶏 | 90 | | もも肉 | 鶏 | 120 | | バラ肉 | 豚 | 190 | | ばら肉 | 牛 | 370 | | 肩ロース | 牛 | 450 | | ロース | 豚 | 470 | | ヒレ | 豚 | 500 | | リブロース | 牛 | 600 | | ヒレ肉 | 牛 | 780 | | サーロイン | 牛 | 960 | +------------+----------+-------+ 11 rows in set (0.00 sec)
LIMIT
SELECT name, category, price FROM meats ORDER BY category, price DESC LIMIT 3 ;
出力結果
+------------+----------+-------+ | name | category | price | +------------+----------+-------+ | サーロイン | 牛 | 960 | | ヒレ肉 | 牛 | 780 | | リブロース | 牛 | 600 | +------------+----------+-------+ 3 rows in set (0.00 sec)
CASE
CASE WHEN 条件式 THEN 値 ELSE デフォルト値 END AS 別名
検索CASE式
SELECT name, CASE WHEN category = 1 THEN '鶏' WHEN category = 2 THEN '豚' WHEN category = 3 THEN '牛' WHEN category = 4 THEN '羊' END AS 肉分類 FROM meats ;
単純CASE式
SELECT name, CASE category WHEN 1 THEN '鶏' WHEN 2 THEN '豚' WHEN 3 THEN '牛' WHEN 4 THEN '羊' END AS 肉分類 FROM meats ;
【今日の積み上げ】
‐ データベースの基礎