見出し画像

SQLにおける算術演算

今日は、『実践Pythonによるデータベース入門』の第3章 "SQL―基本的な問い合わせ―" で学んだことをアプトプッとします。

算術演算

数値属性の列に対して、算術演算を含む問い合わせを行うことができます。下記のように演算結果の列にASを使って、「新しい列名」を付けて値を表示することができます。

SELECT 列の演算式 AS 新しい列名 FROM 表名 WHERE 条件式;

【例題3.5】以下の要求を実現し、それをMySQL上で実行し、動作確認せよ。
仕様要求
(1)以下の売上表を用いて、売上データベースを作成する。ただし、データベース名:salesbase、テーブル名:saleslistとする。

画像1

(2)品目別の売上金額を表示する。
(3)売上金額の合計を表示する。

(1)以下の売上表を用いて、売上データベースを作成する。ただし、データベース名:salesbase、テーブル名:saleslistとする。

mysql> CREATE DATABASE salesbase;
Query OK, 1 row affected (0.47 sec)

mysql> USE salesbase;
Database changed
mysql> CREATE TABLE saleslist(sid CHAR(10), goods CHAR(30), price INT, quantity INT);
Query OK, 0 rows affected (1.89 sec)

本書の解説では、sidを主キーを設定していました。
主キーの設定の書式については、本書ではこれまで説明がなく、唐突に登場してきた感が否めません。

本書に習い、主キーを設定することにします。

mysql> DROP TABLE saleslist;
Query OK, 0 rows affected (0.90 sec)

mysql> CREATE TABLE saleslist(sid CHAR(10), goods CHAR(30), price INT, quantity INT, PRIMARY KEY (sid));
Query OK, 0 rows affected (1.53 sec)

mysql> SHOW fields FROM saleslist;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| sid      | char(10) | NO   | PRI | NULL    |       |
| goods    | char(30) | YES  |     | NULL    |       |
| price    | int      | YES  |     | NULL    |       |
| quantity | int      | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
4 rows in set (0.07 sec)

続いて、INSERT文でテーブルsaleslistにデータを挿入していきます

mysql> INSERT INTO saleslist VALUES ('T01', 'テレビ', 198000, 1);
Query OK, 1 row affected (0.13 sec)

mysql> INSERT INTO saleslist VALUES ('T02', '冷蔵庫', 125000, 2);
Query OK, 1 row affected (0.14 sec)

mysql> INSERT INTO saleslist VALUES ('T03', '洗濯機', 104000, 2);
Query OK, 1 row affected (0.10 sec)

mysql> INSERT INTO saleslist VALUES ('T04', '掃除機', 125000, 1);
Query OK, 1 row affected (0.18 sec)

mysql> INSERT INTO saleslist VALUES ('T05', 'パソコン', 179800, 4);
Query OK, 1 row affected (0.09 sec)

mysql> INSERT INTO saleslist VALUES ('T06', 'カメラ', 59800, 3);
Query OK, 1 row affected (0.28 sec)

mysql> SELECT * FROM saleslist;
+-----+--------------+--------+----------+
| sid | goods        | price  | quantity |
+-----+--------------+--------+----------+
| T01 | テレビ       | 198000 |        1 |
| T02 | 冷蔵庫       | 125000 |        2 |
| T03 | 洗濯機       | 104000 |        2 |
| T04 | 掃除機       | 125000 |        1 |
| T05 | パソコン     | 179800 |        4 |
| T06 | カメラ       |  59800 |        3 |
+-----+--------------+--------+----------+
6 rows in set (0.00 sec)

(2)品目別の売上金額を表示する。

mysql> SELECT sid, goods, price, quantity, price*quantity AS amount FROM saleslist;
+-----+--------------+--------+----------+--------+
| sid | goods        | price  | quantity | amount |
+-----+--------------+--------+----------+--------+
| T01 | テレビ       | 198000 |        1 | 198000 |
| T02 | 冷蔵庫       | 125000 |        2 | 250000 |
| T03 | 洗濯機       | 104000 |        2 | 208000 |
| T04 | 掃除機       | 125000 |        1 | 125000 |
| T05 | パソコン     | 179800 |        4 | 719200 |
| T06 | カメラ       |  59800 |        3 | 179400 |
+-----+--------------+--------+----------+--------+
6 rows in set (0.00 sec)

(3)売上金額の合計を表示する。

mysql> SELECT SUM(price*quantity) AS total_amount FROM saleslist;
+--------------+
| total_amount |
+--------------+
|      1679600 |
+--------------+
1 row in set (0.00 sec)

総和(合計)を求めるには、集約関数を用いればよかったのでしたね。

グループ内の項目に対して、カウント、平均、総和などの集約関数を用いることができます。


サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪