リンク †正規形 †
SQLの実行順序 †FROM → WHERE → GROUP BY → HAVING → SELECT (→ ORDER BY) HAVING 句、GROUP BY 句で書ける要素 †
自動時間更新の設定 †create table sample ( id int primary key auto_increment, val varchar(16), created_at timestamp not null default current_timestamp, updated_at timestamp not null default current_timestamp on update current_timestamp ); 11.3.5 TIMESTAMP および DATETIME の自動初期化および更新機能 SQL の文とその種類 †
重複を排除する(DISTINCT) †SELECT DISTINCT job FROM emp; GROUP BY †SELECT グループ化する列名, 関数(列名), … FROM 表名 GROUP BY グループ化する列名 … SELECT deptno, COUNT(empno) AS "社員数", TRUNC(AVG(sal)) AS "平均給与" FROM emp GROUP BY deptno ORDER BY deptno; GROUP BY句に複数の列を指定すると、複数の列を使ってさらに細かくグループ化することもできます。次の例では、GROUP BY句にdeptno列と、job列を指定しています。このように指定すると、最初に指定したdeptno(部門番号)でグループ化し、部門が同じ人をさらにjob(職種)でグループ化することができます。 SELECT deptno, job, COUNT(empno) AS "社員数", TRUNC(AVG(sal)) AS "平均給与" FROM emp GROUP BY deptno, job ORDER BY deptno, job; HAVING句 †グループ化した結果に対して条件を付けて、特定のグループだけを検索する場合には、WHERE句ではなく、HAVING句を使用します。 SELECT グループ化する列名, 関数(列名), … FROM 表名 GROUP BY グループ化する列名 HAVING グループ化した結果に対する条件 … 例えば、社員が2人以上いるグループだけを表示したい場合には、以下のように指定します。 SELECT deptno, COUNT(empno) AS "社員数", TRUNC(AVG(sal)) AS "平均給与" FROM emp GROUP BY deptno, job HAVING COUNT(empno)>=2 ORDER BY deptno, job; グループ関数 †
SELECT 関数(列名), 関数(列名), … FROM 表名 … 内部結合と外部結合 †
外部結合では、FROM句に「RIGHT」または「LEFT」キーワードを指定します。「RIGHT」または「LEFT」で、FROM句に記載した表の、左右どちらの表のデータをすべて表示するかを指定します。一般的に「LEFT」を使う場合が多い。 SELECT e.ename, d.deptno, d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno; また、互いに一致するデータがない場合でも、両方の表すべてのデータを表示したい場合には、「FULL OUTER JOIN」を指定します。 JOIN †NATURAL JOIN 句 †SELECT 表1.列名, 表2.列名, 共通列… FROM 表1 NATURAL JOIN 表2 …… SELECT emp.ename, deptno, dept.dname FROM emp NATURAL JOIN dept; USING 句 †SELECT 表1.列名, 表2.列名, 共通列… FROM 表1 JOIN 表2 USING (共通列) …… SELECT emp.ename, deptno, dept.dname FROM emp JOIN dept USING (deptno); ON 句 †SELECT 表1.列名, 表2.列名, 表1.共通列… FROM 表1 JOIN 表2 ON 表1.共通列 = 表2.共通列 …… SELECT emp.ename, dept.deptno, dept.dname FROM emp JOIN dept ON emp.deptno=dept.deptno; 表別名 †SELECT 表別名1.列名, 表別名2.列名, 表別名1.共通列… FROM 表1 表別名1 JOIN 表2 表別名2 ON 表別名1.共通列 = 表別名2.共通列 …… SELECT e.ename, d.deptno, d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno; |