こんにちは、今日はSQLを学ぶ記事です。私はSQLの扱いは素人なので、少しずつ学んでブログ記事にしていきます。
参考にするテキストは”ORACLE MASTER Bronze SQL基礎Ⅰ日本オラクル 公式テキスト”です。使用する開発環境はOracle SQL Developer*です。
1回目では基本となるSELECT文でのデータの取得を記事にしました。今回はデータの制限とソートを学んでいきます。
SQL学習:データの選択とソート
Where句
Where句で条件式w指定することで特定のレコードのみ取り出すことができます。Where句は必ずFromの後につけるようです。
SELECT 列名 FROM テーブル名 WHERE 条件式;
条件式は、”列名 比較演算子(定数、値のリスト、列名)”という3つが利用できます。employeesテーブルをを使用して、少し試してみます。
SELECT * FROM employees WHERE name = 'King';
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
100 King 4500 200 17-11月-87 10
SELECT * FROM employees WHERE comm = comm;
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
100 King 4500 200 17-11月-87 10
101 John 1800 150 07-4月 -89 100 20
103 Paul 1800 120 01-6月 -94 101 20
104 Jones 2500 120 21-11月-98 102 30
nameにKingという文字列を指定したので、name列がKingのレコードが表示されました。二つ目はcomm = commで列名に値があるもの(NULLではないレコード)が表示されました。
さらに、Where句ではINを使うことで、値のリストを比較できます。
SELECT * FROM employees WHERE name IN('John','Paul');
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
101 John 1800 150 07-4月 -89 100 20
103 Paul 1800 120 01-6月 -94 101 20
WHERE name IN(’John’, ‘Paul’)としたことで、nameにJohnもしくはPaulの値があるレコードが表示されました。
比較演算子
すでにいくつか出てきましたが、比較を行う演算をする際に比較演算子を使います。’=’や'<=’のことです。”以上”、”以下”を表す際はイコールが右側にきます。これを反対にするとエラーになってしまいますので気を付けます。(c++を学んでいたころ、この間違いに気づかずにエラーを出してしまったことがあります)
少しきになる比較演算子は等しくないことを表す'<>’、’^=’です。これまでこういった否定の演算子はあまりみませんでした。実際に使ってみます。
SELECT * FROM employees WHERE salary <> 1800;
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
100 King 4500 200 17-11月-87 10
102 David 2400 31-8月 -91 100 30
104 Jones 2500 120 21-11月-98 102 30
105 Steven 2500 11-7月 -98 102 30
106 Denver 2600 08-11月-98 101 20
salaryが1800ではないレコード全て表示されました。別の否定演算子でも同様の結果となりました。
SELECT * FROM employees WHERE salary != 1800;
省略
NULL値を条件にする演算子は’IS NULL’というそうです。’= NULL’ではないので気をつけましょう。また、BETWEEN ‘値’ AND ‘値’でその間のレコードを取り出すこともできます。
Like演算子
Like演算子は文字パターンとの一致が条件となります。俗にいうワイルドカードというものです。’%’0以上の任意の文字列や’_’任意の一文字を合わせて利用します。
SELECT name FROM employees WHERE name LIKE 'D%';
NAME
----------
David
Denver
“D%”つまりDから始まる文字列を表しています、したがって上記のSQLではnameがDから始まる’David’と’Denver’が表示されています。これは結構使い勝手が良さそうですね。’_’は一文字を表すので、name LIKE ‘_a%’とした場合は、どうなるでしょう。
nameの二文字目がaであるDavidとPaulが表示されると考えられます。試してみます。
SELECT name FROM employees WHERE name LIKE '_a%';
NAME
----------
David
Paul
想定どおりの結果が返ってきました。これは覚えておきたいです。
論理演算子
論理式であるor、and, notを使用できます。論理条件式を追加することで利用できます。ちょっと試してみます。
SELECT * FROM employees WHERE name = 'King' OR salary < '2500';
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
100 King 4500 200 17-11月-87 10
101 John 1800 150 07-4月 -89 100 20
102 David 2400 31-8月 -91 100 30
103 Paul 1800 120 01-6月 -94 101 20
上記の式ではnameが”King”である”もしくは”salaryが2500未満であることが条件となっており、それに適したレコードが表示されています。AND NOTも同様です。非常にわかりやすく使いやすいですね。
ソート(並び替え)
ついにソートです!というのも少ないですが私の経験からソートは非常に利用頻度が高いです。*個人的な意見です ここで扱うORDER BYは私がMySQLを利用したときにお世話になりました。ORDER BY句を使用すると、ソートした検索結果を取得できます。
ORDER BY区はSQL文末に記述します。
ORDER BY 列名 ASC|DESC;
ASCは昇順、DESCは降順を意味します。実際に使ってみます。
SELECT * FROM employees ORDER BY salary DESC;
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
100 King 4500 200 17-11月-87 10
106 Denver 2600 08-11月-98 101 20
105 Steven 2500 11-7月 -98 102 30
104 Jones 2500 120 21-11月-98 102 30
102 David 2400 31-8月 -91 100 30
101 John 1800 150 07-4月 -89 100 20
103 Paul 1800 120 01-6月 -94 101 20
salaryの降順を指定したので、上から給与の高い順に表示されました。数値ではなく文字列の場合はどうなるのでしょう。
SELECT * FROM employees ORDER BY name DESC;
EMPNO NAME SALARY COMM HIREDATE MANAGER DEPT_ID
---------- ---------- ---------- ---------- --------- ---------- ----------
105 Steven 2500 11-7月 -98 102 30
103 Paul 1800 120 01-6月 -94 101 20
100 King 4500 200 17-11月-87 10
104 Jones 2500 120 21-11月-98 102 30
101 John 1800 150 07-4月 -89 100 20
106 Denver 2600 08-11月-98 101 20
102 David 2400 31-8月 -91 100 30
アルファベット順になりました。列の位置での指定や、複数列の指定も可能です。
今日のSQL学習はここまでにします。
Oracle SQL Developerの不調
*Mac版のOracle SQL Developerを利用していますが、毎回とある操作でフリーズしてしまう現象が発生しています。
起動すると以下のようこそページが表示されます。このページの動作がどうにも不安定で、右側のスクロールバーも思うように動きません。さらに、スクロールバーを動かそうとクリックすると95%ほどの確率でフリーズしてしまいます。データベース接続は問題なく、データベース接続、SQLの入力画面等その他機能は問題なく使えます。
ようこそページが問題なのかなと考え、ようこそページを表示させない設定にしようとします。下にスクロールするとページ末尾にチェック欄があるので、チェックを外そうとすると…
フリーズします!
ここは今のところ100%フリーズします。つまり、表示チェックを外すことができません。
“SQL Developer freeze”等で検索してみると同様にフリーズしてしまう症状を訴えている人がいました。しかし大抵の人はキャッシュの削除、再起動で直っているようです。私もsql developerファイルのsystem_cacheを削除し、再起動を行いました。
しかし、フリーズは治ることがありませんでした。正直ようこそページでフリーズしても大きな影響はないので、ひとまずこのままにしておきます。JDKの再インストールしてみましょうかね…
おわりに
今日は少しSQLを学びました。Where句やソートはよく使うと思いますし、過去に私も別のデータベースで利用していました。覚えた構文を忘れないようにちょくちょく使っていきたいと思います。
明日は、5/11までに作成する予定のwebアプリの構想を記事にしていきたいと思います。現在もいろいろ案は考えていますが、今のところパッとしない案や、実現できるか微妙な案が多いので、少し整理して記事にしたいと思います。
今日も最後までご覧いただきありがとうございました。
コメント