スナップショット分離は "A Critique of ANSISQL Isolation Levels" にて提案の新たなトランザクション分離レベルである。レコードの情報をバージョン管理し、各トランザクションで別個に保持することでロックの取得を回避しつつ複数SQLの同時実行を可能にする。いくつかの実装が存在あるが、innodbではMVCCが採用されている。詳細は後述する。
mysql> select * from city where CountryCode='USA' limit 5;
+------+--------------+-------------+--------------+------------+
| ID | Name | CountryCode | District | Population |
+------+--------------+-------------+--------------+------------+
| 3793 | New York | USA | New York | 8008278 |
| 3794 | Los Angeles | USA | California | 3694820 |
| 3795 | Chicago | USA | Illinois | 2896016 |
| 3796 | Houston | USA | Texas | 1953631 |
| 3797 | Philadelphia | USA | Pennsylvania | 1517550 |
+------+--------------+-------------+--------------+------------+5rowsinset (0.01 sec)
CASE文による串刺し集計
↑のテーブルに対し、CASE式を使うことで、国ごとの串刺し集計ができます。
以下の例では、 CountryCode フィールドの値が USA のものは「アメリカ」、 IND のものは「インド」、それ以外の値をもつ地域は「その他」として Population フィールドの合計値を集計しています。
SELECT-- CASE式CASE CountryCode
WHEN'USA'THEN'アメリカ'WHEN'IND'THEN'インド'ELSE'その他'-- ENDで終了するENDAS country,
SUM(Population)
FROM
city
GROUPBY
country
;
実行結果
mysql> SELECT CASE CountryCode WHEN'USA'THEN'アメリカ'WHEN'IND'THEN'インド'ELSE'その他'ENDAS country, SUM(Population) FROM city GROUPBY country ;
+--------------+-----------------+
| country | SUM(Population) |
+--------------+-----------------+
| その他 | 1227635584 |
| アメリカ | 78625774 |
| インド | 123298526 |
+--------------+-----------------+3rowsinset (0.02 sec)