MySQLのチップス - SQL

投稿日 2015/02/09

[Home] [Index] 


以下の説明では次のようなテーブル ja, en を使います。これらは、日本語と英語の単語の一覧テーブルでどちらにも共通の単語とそうでない単語があります。そして、コード n が同じ単語は意味が同じです。

 

内部結合を使うには

この例では ja, en テーブルで共通のものだけを抽出しています。

mysql> SELECT ja.word, en.word FROM ja INNER JOIN en ON ja.n = en.n;
+-----------+--------+
| word      | word   |
+-----------+--------+
| コメ      | rice   |
| たまご    | egg    |
| ハム      | ham    |
| チーズ    | cheese |
+-----------+--------+
4 rows in set (0.00 sec

外部結合を使うには

外部結合には LEFT JOIN と RIGHT JOIN があります。LEFT JOIN は左側に書かれたテーブルに右側のテーブルを結合します。RIGHT JOIN はその逆です。

ja テーブルに en テーブルを結合する例

mysql> SELECT ja.word, en.word FROM ja LEFT JOIN en ON ja.n = en.n;
+--------------+--------+
| word         | word   |
+--------------+--------+
| コメ         | rice   |
| たまご       | egg    |
| みそしる     | NULL   |
| ハム         | ham    |
| チーズ       | cheese |
| おしんこ     | NULL   |
| サケ         | NULL   |
| のり         | NULL   |
+--------------+--------+
8 rows in set (0.00 sec)

ja テーブルを en テーブルに結合する例

mysql> select ja.word, en.word from ja right join en on ja.n = en.n;
+-----------+-----------+
| word      | word      |
+-----------+-----------+
| コメ      | rice      |
| たまご    | egg       |
| ハム      | ham       |
| チーズ    | cheese    |
| NULL      | cookie    |
| NULL      | pizza     |
| NULL      | hamburger |
| NULL      | chips     |
+-----------+-----------+
8 rows in set (0.00 sec)

UNION を使うには

UNION を使うと 複数のテーブル(集合)の和集合を作ることができます。

mysql> SELECT n,word FROM en UNION SELECT n,word FROM ja;
+------+--------------+
| n    | word         |
+------+--------------+
| 1000 | rice         |
| 1001 | egg          |
| 1003 | ham          |
| 1004 | cheese       |
| 2000 | cookie       |
| 2001 | pizza        |
| 2002 | hamburger    |
| 2003 | chips        |
| 1000 | コメ         |
| 1001 | たまご       |
| 1002 | みそしる     |
| 1003 | ハム         |
| 1004 | チーズ       |
| 1005 | おしんこ     |
| 1006 | サケ         |
| 1007 | のり         |
+------+--------------+

IN を使うには

IN 演算子はテーブルのフィールドに値のリストが含まれるかを調べるのに使います。

mysql> SELECT * FROM en WHERE en.n IN (2000, 2001);
+------+--------+
| n    | word   |
+------+--------+
| 2000 | cookie |
| 2001 | pizza  |
+------+--------+

LIKE を使うには

LIKE 演算子は「あいまい検索」をするのに使います。下の例は LIKE 演算子を使って 'c' で始まる単語を検索しています。

mysql> SELECT * FROM en WHERE word LIKE 'c%';
+------+--------+
| n    | word   |
+------+--------+
| 1004 | cheese |
| 2000 | cookie |
| 2003 | chips  |
+------+--------+

DISTINCT を使うには

DISTINCT 演算子を使うと、重複のあるデータは1つだけ抽出します。

mysql> SELECT * FROM en2;
+------+--------------+
| n    | word         |
+------+--------------+
| 1004 | cheese       |
| 1100 | Big Mac      |
| 1200 | big mac      |
| 1300 | hamburger    |
| 1302 | hamburger    |
| 1304 | hamburger    |
| 2000 | cookie       |
| 2100 | big mac      |
| 2200 | Filet-O-Fish |
| 2201 | filet-o-fish |
+------+--------------+
mysql> SELECT DISTINCT word FROM en2;
+--------------+
| word         |
+--------------+
| cheese       |
| Big Mac      |
| hamburger    |
| cookie       |
| Filet-O-Fish |
+--------------+

結果を並べ替えるには

検索結果を並べ替えて取得するには、ORDER BY 句を使用します。さらに DESC を付けると降順になります。

mysql> SELECT * FROM ja ORDER BY n;
+------+--------------+
| n    | word         |
+------+--------------+
| 1000 | コメ         |
| 1001 | たまご       |
| 1002 | みそしる     |
| 1003 | ハム         |
| 1004 | チーズ       |
| 1005 | おしんこ     |
| 1006 | サケ         |
| 1007 | のり         |
+------+--------------+

mysql> SELECT * FROM ja ORDER BY n DESC;
+------+--------------+
| n    | word         |
+------+--------------+
| 1007 | のり         |
| 1006 | サケ         |
| 1005 | おしんこ     |
| 1004 | チーズ       |
| 1003 | ハム         |
| 1002 | みそしる     |
| 1001 | たまご       |
| 1000 | コメ         |
+------+--------------+

サブクエリを使うには

テーブルの代わりにクエリ結果(サブクエリ)を使うことができます。その場合、サブクエリには必ず別名を付ける必要があります。この例では "a" (WHERE句の直前) になっています。

mysql> SELECT n, word FROM (SELECT n,word FROM en UNION select n,word FROM en2) a WHERE n <=1500;
+------+-----------+
| n    | word      |
+------+-----------+
| 1000 | rice      |
| 1001 | egg       |
| 1003 | ham       |
| 1004 | cheese    |
| 1100 | Big Mac   |
| 1200 | big mac   |
| 1300 | hamburger |
| 1302 | hamburger |
| 1304 | hamburger |
+------+-----------+

集計するには

GROUP BY 句を使うとフィールドの総数や合計などを求めることができます。

mysql> SELECT word, count(word) cnt FROM en2 GROUP BY word ORDER BY cnt;
+--------------+-----+
| word         | cnt |
+--------------+-----+
| cookie       |   1 |
| cheese       |   1 |
| Filet-O-Fish |   2 |
| Big Mac      |   3 |
| hamburger    |   3 |
+--------------+-----+

HAVING 句を使うには

HAVING 句は GROUP BY の条件を設定するのに使います。

mysql> SELECT word, count(word) cnt FROM en2 GROUP BY word HAVING cnt > 1 ORDER BY cnt;
+--------------+-----+
| word         | cnt |
+--------------+-----+
| Filet-O-Fish |   2 |
| Big Mac      |   3 |
| hamburger    |   3 |
+--------------+-----+

関数を使うには (カウント、最大最少、平均、総和)

mysql> select count(*) from en;
+----------+
| count(*) |
+----------+
|        8 |
+----------+

mysql> select max(n) from en;
+--------+
| max(n) |
+--------+
|   2003 |
+--------+

mysql> select min(n) from en;
+--------+
| min(n) |
+--------+
|   1000 |
+--------+

mysql> select sum(n) from en;
+--------+
| sum(n) |
+--------+
|  12014 |
+--------+

mysql> select avg(n) from en;
+-----------+
| avg(n)    |
+-----------+
| 1501.7500 |
+-----------+

演算子を使うには (結合、算術演算)

mysql> select concat('Count=', count(*)) from ja;
+----------------------------+
| concat('Count=', count(*)) |
+----------------------------+
| Count=8                    |
+----------------------------+

mysql> SET sql_mode='PIPES_AS_CONCAT' ;
mysql> select 'Count=' || count(*) from ja;
+----------------------+
| 'Count=' || count(*) |
+----------------------+
| Count=8              |
+----------------------+

mysql> select 1+2 result;
+--------+
| result |
+--------+
|      3 |
+--------+

 

 


 このページの先頭 

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。(お仕事も大募集)