SQLを学んだ2回目

Database

こんにちは、今日は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の入力画面等その他機能は問題なく使えます。

Oracle SQL Developerのようこそページ

ようこそページが問題なのかなと考え、ようこそページを表示させない設定にしようとします。下にスクロールするとページ末尾にチェック欄があるので、チェックを外そうとすると…

フリーズします!

ここは今のところ100%フリーズします。つまり、表示チェックを外すことができません。

“SQL Developer freeze”等で検索してみると同様にフリーズしてしまう症状を訴えている人がいました。しかし大抵の人はキャッシュの削除、再起動で直っているようです。私もsql developerファイルのsystem_cacheを削除し、再起動を行いました。

しかし、フリーズは治ることがありませんでした。正直ようこそページでフリーズしても大きな影響はないので、ひとまずこのままにしておきます。JDKの再インストールしてみましょうかね…

おわりに

今日は少しSQLを学びました。Where句やソートはよく使うと思いますし、過去に私も別のデータベースで利用していました。覚えた構文を忘れないようにちょくちょく使っていきたいと思います。

明日は、5/11までに作成する予定のwebアプリの構想を記事にしていきたいと思います。現在もいろいろ案は考えていますが、今のところパッとしない案や、実現できるか微妙な案が多いので、少し整理して記事にしたいと思います。

今日も最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました