SELECT のカラムリストには、カラムの値を使った計算式を書くことができます。
計算の実習のため、テーブル meibo に以下の2つのカラムを追加して下さい。
| 列名 | データ型 |
|---|---|
| height | float |
| weight | float |
heightとweightにはphpMyAdminを用いて以下の例のように値を設定しておきます。
| id | name | ruby | birthday | height | weight | |
|---|---|---|---|---|---|---|
| 1 | 山田太郎 | ヤマダタロウ | 1997-7-1 | yamada@example.com | 171 | 80 |
| 2 | 碇シンジ | イカリシンジ | 2003-6-6 | shinji@example.com | 157 | 45 |
| 3 | 古代進 | コダイススム | 1997-10-31 | kodai@example.com | 175 | 70 |
| 4 | 渡瀬青葉 | ワタセアオバ | 2001-9-17 | awatase@example.com | 170 | 63 |
カラムの追加等の操作方法が判らない場合は、以下のSQLを実行してください。
DROP TABLE IF EXISTS `meibo`;
CREATE TABLE `meibo` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`ruby` varchar(40) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`height` float NOT NULL,
`weight` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `meibo` (`id`, `name`, `ruby`, `birthday`, `email`, `height`, `weight`) VALUES
(1, '山田太郎', 'ヤマダタロウ', '1997-07-01', 'yamada@example.com', 171, 80),
(2, '碇シンジ', 'イカリシンジ', '2003-06-06', 'shinji@example.com', 157, 45),
(3, '古代進', 'コダイススム', '1997-10-31', 'kodai@example.com', 175, 70),
(4, '渡瀬青葉', 'ワタセアオバ', '2001-09-17', 'awatase@example.com', 170, 63);
カラムの値を使って計算する
演算子・関数
SELECT のカラムリスト内では様々な演算子や関数が使えますが、ここではよく使われる算術演算子・算術関数を挙げます。
算術演算子
| 記述 | 意味 |
|---|---|
| + | 加算 |
| – | 減算 |
| / | 除算 |
| * | 乗算 |
| % | 剰余(割り算のあまり) |
算術関数
| 記述 | 意味 |
|---|---|
| MOD(X,Y) | X%Yと同じく、剰余を求めます |
| POW(X,Y) | XYを求めます |
| ROUND(X,D) | 浮動小数点数Xwo小数点以下D桁目で丸めます(D+1桁目を四捨五入します) |
MOD(X,Y) X % Y と同じく、剰余を求めます。
POW(X,Y) XYを求めます。
ROUND(X,D) 浮動小数点数Xを小数点以下D桁目で丸めます。(D+1桁目を四捨五入します)
カラムの値を使った計算の例1
まず、1つのカラムの値を使った例を挙げます。
SELECT name, weight-10 FROM meibo;この例では、各レコードのカラム weight の値を10ずつ減らした結果を求めています。
実行結果
| name | weight-10 |
|---|---|
| 山田太郎 | 70 |
| 碇シンジ | 35 |
| 古代進 | 60 |
| 渡瀬青葉 | 53 |
カラムの値を使った計算の例2
複数のカラムの値を使った計算もできます。
例として、テーブル meibo 上の各レコードについて BMI を求めてみます。
BMI とは肥満度を表す値で、体重(kg)÷(身長(m)2 )で求められます。
(身長の単位がmであることに注意して下さい)
例えば身長が170cm、体重が65kgの場合は、60÷1.72≒22.5 となります。
ちなみにBMI=22~23が適正とされています。
これを求めるSQLは以下のようになります。
SELECT name,weight/(height/100)/(height/100) FROM meibo;heightはcm単位なのであらかじめ100で除算してm単位に換算しています。
| name | weight/(height/100)/(height/100) |
|---|---|
| 山田太郎 | 27.358845456721728 |
| 碇シンジ | 18.25631871475516 |
| 古代進 | 22.857142857142858 |
| 渡瀬青葉 | 21.79930795847751 |
※環境によって微妙に精度が違う場合があります
計算結果に別名を付ける
前の例では結果のカラム名が計算式そのままになっています。
これはAS句を使って別名を付けることができます。
SELECT name,weight/(height/100)/(height/100) AS BMI FROM meibo;実行結果
| name | BMI |
|---|---|
| 山田太郎 | 27.358845456721728 |
| 碇シンジ | 18.25631871475516 |
| 古代進 | 22.857142857142858 |
| 渡瀬青葉 | 21.79930795847751 |
関数を使う
例1
まず、(height/100) で2回除算している部分を、POW関数を用いて書き直してみましょう。
SELECT name, weight/POW((height/100),2) AS BMI FROM meibo;実行結果
| name | BMI |
|---|---|
| 山田太郎 | 27.358845456721728 |
| 碇シンジ | 18.25631871475516 |
| 古代進 | 22.857142857142858 |
| 渡瀬青葉 | 21.79930795847751 |
当然、同じ結果となります。
例2
さらに、ROUND関数を用いて小数点以下第1位までで丸めてみましょう。
SELECT name, ROUND(weight/POW((height/100),2), 1) AS BMI FROM meibo;実行結果
| name | BMI |
|---|---|
| 山田太郎 | 27.4 |
| 碇シンジ | 18.3 |
| 古代進 | 22.9 |
| 渡瀬青葉 | 21.8 |
練習問題
テーブル ex_shohin のカラム price の値を税抜き単価として、下の例のように消費税額を計算するSQLを記述しなさい。小数点以下は四捨五入しなさい。(ヒント:消費税額は税抜き価格に0.08をかけた値)
結果例
| name | price | tax |
|---|---|---|
| いちご | 200 | 16 |
| にんじん | 180 | 14 |
| サラダ菜 | 160 | 13 |
| ヨーグルト | 240 | 19 |

コメント