SQL入門 4章 :)
今日はスッキリわかるSQL入門(中山清喬・飯田理恵子著)4章〜
検索結果の加工
SELECT文だけに可能な修飾というのがあるらしいからとりあえずかいておく〜
◎DISTINCT
- SELECT文に付加すると結果表の中で内容が重複している行があれば取り除いてくれる
- データの種類を取得したいとき役にたつ
- DISTINCT修飾だけはSELECT文の最初に記述する必要があるので注意!
◎ORDER BY
- SELECT文の最後にORDER BY句を記述すると指定した列の値を基準として検索結果を並び替え取得できる
- 昇順にする場合はASC、降順にする場合はDESCを指定(ちなみに初期値は昇順)
- ORDER BY句に文字列を指定するとDBMSに設定された照合順序(文字コード順、アルファベット順など)を基準として並び替えられる
ORDER BY句における列指定に列番号を用いる場合、SELECT文の選択列リストの記述を修正すると並び替えの結果にも影響が及ぶので注意!
◎LIMIT
- LIMIT句には全部で何件のデータを取得するのかを整数値で指定
- OFFSETは先頭からではなくデータの途中から数えたい場合に任意で指定する
LIMIT句は ORDER BY句と併用されることが多い機能だがLIMIT句だけでも使用可能
集合演算子
集合演算とはSELECT命令によって抽出した結果表を1つのデータの集合ととらえ、その結果同士を足し合わせたり、共通部分を探したりといったさまざまな演算を行ってくれる
◎UNION
2つのSELECT文をUNIONでつないで記述すると、それぞれの検索結果を足し合わせた結果(和集合)が返される
UNIONでは重複行を1行にまとめるのに対しUNION ALLでは重複行をすべてそのまま返す
◎EXCEPT/MINUS
ある集合と別の集合の差である差集合を求める
OracleDBではMINUSをつかう
差集合はどの集合を基準とするかによって結果が変わるのでSELECT文の順番に注意が必要
◎INTERSECT
2つのSELECT文に共通する行を集めた積集合を求める
4章はこんな感じかな。
ORDER BY句のASC(昇順)ってつけなくても昇順になるのになんであるんだろ。
いまMySQL使ってるんだけど、MySQLではこの章のEXCEPTが使えないのと、INTERSECTがなんかちょっと違う感じになってて、調べてみたけど死にそう。言ってることはなんとなくわかるからとりあえずこんな感じでやってみる。うまくいくかは知らない。
参考
なんかいろいろ記事あさってたけど、なぜその書き方をしたのか、そのクエリを使用した理由を説明できたらちゃんとわかってることになるのかな〜?
いまはこのときはこれをつかうって感じで表面的にしかわかってない感じする
ちょっと意識してやってみよかな〜
次は5章 式と関数
SQL入門 3 :)
今日はスッキリわかるSQL入門(中山清喬・飯田理恵子著)3章〜
操作する行の絞り込み
WHERE句の大切さ
・WHEREから始まるのをWHERE句という
・WHEREを使うと処理対象となる行の絞り込みができる
・テーブル内すべての行を更新したり削除するのってなかなかないから、WHERE句を重宝するらしい
◎WHERE句の基本
- 処理対象行の絞り込みに用いる(WHEREを指定しない場合すべての行が処理対象)
- SELECT,UPDATE,DELETE文で使用可(INSERT文では使ったらダメ)
- WHEREのうしろには条件式を記述
WHEREのうしろには条件式と呼ばれる式しか書けない
条件式とはその結果が必ず真か偽になる式のこと
DBMSは1行ずつ順番に条件にあうかチェックしていくから真か偽になる式しかかいちゃいけないらしい
◎基本的な比較演算式
条件式は=とか<>とかの記号を含んだ式になるのがほとんどなんだけど
これらの記号を比較演算子といって、その記号の左右にある値を比較して記号の意味が正しければ真、正しくなければ偽に化ける(SQLの実行によって演算子などが別の値に変化すること)役割をもっている
◎NULL
なにもない、未定義なことをしめす。ゼロとも異なる
列の値がNULLであることを判定するにはIS NULL演算子、NULLでないことを判定するにはIS NOT NULL演算子をつかう
◎LIKE演算子
パターンマッチング(文字列があるパターンに合致しているかをチェックすること)に使う
パターンマッチングを行うと部分一致の検索(◯◯という文字列を一部に含むか?という判定)が簡単にできる
パターン文字列に使用できる文字には主に
%:任意の0文字以上の文字列
_(アンダースコア):任意の1文字
がある
◎BETWEEN演算子
ある範囲内に値が収まっているかを判定
値が「値1以上かつ値2以下」の場合真になる
値がちょうど値1や値2の場合も真になる
◎IN/NOT IN演算子
IN演算子:値がカッコ内に列挙した複数の値(値リスト)のいずれかに合致するかを判定する
NOT IN演算子:カッコ内に列挙した値のどれとも合致しないことを判定するのに使う
◎ANY/ALL演算子
複数の値と大小を比較したい場合使う
必ずその直前に比較演算子をつけて利用すること
この2つは単体で使うよりも道具と組み合わせて使用するほうがよいがその道具についてはのちのち!
論理演算子
代表的な論理演算子に
AND演算子(2つの条件式の両方が真の場合だけ真となる)
OR演算子(2つの条件式のどちらかが真ならば真となる)
がある
ANDとORは両辺に条件式を必要とする演算子である
一方、右辺しか必要としないNOT演算子もある。これは右辺の条件式の結果が、真は偽に、偽は真に逆転する
条件式はカッコでくくると評価の優先順位があがる
数学でそんなんあったきがする。。
NOT/AND/OR/の順で演算子が評価されるらしい。
◎主キーの必要性
主キーがあると特定の行を認識できる
そもそも行を区別できないということはある特定の行だけを指定して操作することができないことを意味する
完全に重複した行が存在するとそのうちのある行だけを区別、識別することはできないので、ある行だけを操作するということもできないから
テーブルの中に重複した行が格納されるのを避けるべき!!
「この値を指定することである1行を完全に特定できる」という役割を担う列のことを主キーという
主キーが持つ特性
・必ず何らかのデータが格納される(NULLではない)
・他の行と値が重複しない
すべてのテーブルは主キーとなるような列を必ず持つべきである
例えば社員情報を管理するために社員テーブルを作ろうと考える過程で「氏名」「性別」などに加え「社員番号」という列を作ることは自然
自然に登場して主キーの役割を果たせる列は自然キーと呼ばれる
もし自然キーがないなら無理やり主キーを作るのが一般的
これを人工キーや代替キーという
また、氏名住所生年月日など複数の列を1つの主キーとして扱うものを複合主キーという
3章はこんな感じ
ANY/ALL演算子とNOT演算子まともに使ったことないんだよなあ
また復習しなおすことになりそう。
次は4章検索結果の加工だ〜
SQL入門 2章 :)
今日はスッキリわかるSQL入門(中山清喬・飯田理恵子著)2章
基本文法と4大命令
まずはSQLの基本ルールから!
◎SQLに共通する基本ルール1
- 文の途中に改行を入れることができる
- 行の先頭や途中に半角の空白を入れることができる
これで読みやすいSQL文を書ける〜
ちなみに文の終了はセミコロンで表す;(複数のSQL文を続けて書くとき使える)
◎SQLに共通する基本ルール2
- ハイフン2つ(--)から行末まではコメントになり無視される
- /*から*/まではコメントになり無視される
解説とかコメントを書き込める
チームで作ってるときとか便利
◎SQLに共通する基本ルール3
SELECTやWHEREなどの一部の単語はSQLの機能として特別な意味を持つため列名などに使えない
大文字小文字の区別については会社やプロジェクトで決められたルールに従えばいいんでないかと書いてあった
データの種類を示す記法
SQL文の中に書き込まれたデータそのものを特にリテラルという
◎リテラル記述に関するルール
- 「'」でくくらず記述されたリテラルは数値情報として扱われる
- 「'」でくくられたリテラルは基本的に文字列情報として扱われる
- 「'」でくくられ、'2016-03-03'のような一定の形式で記述されたリテラルは日付情報として扱われる
たとえば「123」と「'123'」では意味が違う
前者は123(ひゃくにじゅうさん)という数量を表す数値データ
後者は123(いち・に・さん)という3つの文字の並びを表す文字列データ
列とデータ型
データベースの中には複数のテーブルがありテーブルは行と列から成り立っている
それぞれの列には名前が付いているがそれに加え列ごとに格納できるデータの種類を表すデータ型を定めることになっている
列にはデータ型で指定された種類の情報しか格納できない
利用可能なデータ型はDBMS製品によって違う
固定長と可変長
文字列型にはCHARとVARCHARがある
- CHAR型は固定長の文字列データを扱うデータ型でたとえばCHAR(10)と指定されている列ではあらかじめ10バイトの領域が確保されていて格納するデータは常に10バイト。だから10バイトにみたないときは文字列の右側に空白が追加されぴったりに調節される
- VARCHAR型を指定された列は、入力された文字列に合わせて領域が確保されるから空白を追加したりはしない。でもVARCHAR(10)と指定されてたら11バイトの文字列は格納できない
CHAR型は郵便番号とか、格納するデータの桁数が決まってるときがよくて
VARCHAR型は氏名とか、格納するデータの桁数が変動するときよい
SQLの命令体系
SQLではSELECT,UPDATE,DELETE,INSERTの4つの命令でほとんどのデータ操作ができちゃう
この4つのSQL命令はDML(Data Manipulation Language)と総称されている
このDMLにいろんな装飾をして複雑なデータを扱っていく
◎SELECT文の基本構造
- データベースとデータのやり取りをするにあたり最も頻繁に使われる
- テーブルから目的のデータを指定して取得する役割
・SELECTの後ろには取得したい列名
・2行目はデータを取得するテーブルを指定するためFROM句を必ず指定
・以降は必要に応じWHEREによる修飾やその他の修飾を記述
SELECT文における列名やテーブル名などの指定ではそれぞれの記述の後ろにAS+任意のキーワードをつけることで別名を定義できる。これ省略できることが多いらしいしOracleだと書いたらだめらしい
別名をつけるメリットとしては
・結果表における列のタイトルを任意のものに変更できる
・わかりにくい列名や長い列名でもわかりやすく短くできる
ってなってたけどメリットというか便利らしいということしかわからん
◎UPDATE文の基本構造
- すでにテーブルに存在するデータを書き換える
・UPDATEのうしろに更新したいデータがあるテーブル名を記述
・2行目に更新したい列名とその列に書き込むデータを記述するSET句を
・ある特定の行のみ書き換えたいときはWHEREを使って目的の行を指定(基本的にWHEREは必ず一緒)
◎DELETE文の基本構造
- すでにテーブルに存在する行を削除するための命令
行をまるごと削除してしまう機能で、特定の列だけを指定することはできない
・DELETE文では列名指定がいらないから1行目のDELETEのうしろにはなにも記述しない
・2行目はデータを取得するテーブルを指定するためFROM句を必ず指定
・WHEREをつけないと全部の行が消えるので基本的にWHEREは必ず一緒
◎INSERT文の基本構造
- テーブルに新しいデータを追加する
- テーブルの行を指定するWHEREはないがどこにどのようなデータを追加するのかを指定する
・INSERTのあとINTOをつけ、データを追加するテーブル名を記述
・テーブル名のうしろにカッコでくくってデータを追加する列名を指定(そのテーブルのすべての列に値を追加する場合2行目はまるごと省略できる)
・3行目はVALUES句といい2行目に記述した列名に対応するデータの値を指定する
4つの命令を分類すると
検索系:SELECT
更新系:UPDATE,DELETE,INSERT
となる
もうひとつの分類の仕方で
既存系:SELECT,UPDATE,DELETE
新規系:INSERT
がある
書き方の順序としては
- 命令文を記述
- テーブル指定の部分を記述
- テーブル指定よりうしろの部分を記述
- テーブル指定より前の部分を記述(SELECT文のみ)
2章はだいたいこんな感じ〜
この記事書いたの大分前なのだけどその頃はASの必要性が全くわからなかった!
今は頻繁につかうから(ASとは書かないけど)結構使えるな〜くらいの認識にはなってきたかも!
次は3章操作する行の絞り込みだ!
SQL入門 1章 :)
今回からスッキリわかるSQL入門(中山清喬・飯田理恵子著)にお世話になります
今日は1章〜はじめてのSQL
◎SQLとは
データベースを操作する専用の言語のこと
◎データベースとは
検索や書き換え、分析などのデータ管理を目的としてさまざまな情報を蓄積したもの
◎RDBの基本構造
・複数の表が入っていて、個々の表をテーブルという
・個々のテーブルには名前(テーブル名)が付いている
・テーブルは列(column)と行(row)で構成される
・1つの行が1件のデータに対応し、列はその要素に対応する(行のことをカラムやフィールドと呼ぶこともある)
データベースは情報の集まりで、その実態はファイルだから、ファイルに命令を送ってもしょうがない・・
そこでデータベース管理システム(DBMS)と呼ばれるプログラムにSQLを送る
DBMSはコンピュータ内で常に稼働してSQLを待ち受けて、届いたSQLの内容に従ってデータベースファイルの内容を検索したり書き換えたりしてくれる
DBMSのうち、複数の表の形式でデータを取り扱うものを特にRDBMSという
これはいろんなのがあるんだけど(Oracleとか)製品によって使用できるSQLの命令や記述法に違いがある
でも基本は一緒らしい
各データベース製品ではDBMSと通信するための専用プログラム(ドライバという)が提供されている
◎SQLには3命令の動作がある
- SELECT文 ある条件を満たす行を探す→その行の内容を取得
- UPDATE文 ある条件を満たす行を探す→その行の内容を書き換える
- DELETE文 ある条件を満たす行を探す→その行を消す
だいたいこんな感じだった
実際やって覚えてくださいって感じなのでいろいろやってみようと思う
次は2章 基本文法と4大命令だ!
まるきゅう サーブレットとJSP 9:)
今回は
9章〜
◎アプリケーションスコープについて
これまでのリクエストスコープとセッションスコープはユーザーごとのスコープだったけど、アプリケーションの中には全ユーザーで利用したいインスタンス(データ)もある
この場合に使えるのがアプリケーションスコープ(1つのアプリケーションにつき1つ作成されるスコープ)
アプリケーションスコープに保存したインスタンスはWebアプリケーションが終了するまでの間アプリケーション内のすべてのサーブレットクラスとJSPファイルで利用できる
Webアプリケーションの開始と終了は次のような操作や機能で行われる
・サーバの開始と停止
・オートリロード機能
・管理ツールによる開始と終了
アプリケーションスコープの正体はjavax.servlet.http.ServletContextインスタンスである
JSPファイルでアプリケーションスコープを使用する場合暗黙オブジェクトapplicationを使用する
◎アプリケーションスコープの注意点
・同時アクセスによる更新
アプリケーションスコープ内のインスタンスを更新するような処理を複数のリクエストがほぼ同じタイミングで行うとアプリケーションスコープのインスタンスに不整合が発生する場合がある
対処法としてはこういうことが問題になる場合はアプリケーションスコープでデータを保存しない(データベースとかつかう)、またはスレッド(処理の単位のこと)による競合が発生しないよう調停を行う
・インスタンスの保存期間
アプリケーションスコープに保存したデータ(インスタンス)はメモリ上にあるためWebアプリケーションを終了すると消滅する
Webアプリケーション再開後でも使用するならファイルやデータベースに保存する必要がある
またセッションスコープと違いタイムアウトがない。削除しないとメモリにインスタンスが残り続けてしまう
そのままだとメモリを圧迫するから注意!
9章はこんな感じ
Webアプリケーションの開始と終了のとこがイマイチかなぁ?
一旦すべてのスコープの違いをしっかり把握すること
注意点のところをよく理解しておくこと
次は10章アプリケーション作成だ!
まるはち サーブレットとJSP 8:)
今回は
8章〜
セッションスコープについて
リクエストスコープにはリクエストをまたいでインスタンスを共有できないという限界があった
その限界を克服するのがセッションスコープである
セッションスコープに保存したインスタンスは基本的に利用者がブラウザを閉じるか開発者が明示的にインスタンスを削除するまで利用可能
保存したインスタンスがレスポンス後も残るためリダイレクト先などリクエストをまたいで利用できる
HttpServletRequestインスタンスのgetSession()メソッドを呼ぶとjavax.servlet.hhtp.HttpSession型のインスタンスが取得できる
このインスタンスこそがセッションスコープの正体!
セッションスコープに保存したインスタンスはremoveAttribute()メソッドで削除
JSPファイルでセッションスコープを使う場合暗黙オブジェクトsessionを使用
セッションスコープの正体であるHttpSessionインスタンスはユーザー(ブラウザ)ごとに作成される
アプリケーションサーバはHttpSessionインスタンスを作成すると内部でセッションIDというものを発行しHttpSessionインスタンスとブラウザに設定することで両者を紐づける
クッキーとはWebサーバがブラウザにデータを保存、送信させる仕組みで
サーバがレスポンスにクッキーと呼ばれるデータを含めるとレスポンスを受信したブラウザはクッキーをコンピュータに保存し、以後そのサーバにアクセスする際には、保存したクッキー情報を自動的にHTTPリクエストに付加して送信するようになる
アプリケーションサーバはクッキーにセッションIDを含めブラウザとサーバ間でのセッションIDのやりとりを可能にする
クッキーには有効期限が設定できる
ブラウザを開きなおしてもセッションIDの有効期限が切れるまでセッションスコープを継続して利用できる
セッションスコープの注意点
セッションスコープを多用するとアプリケーションサーバがメモリ不足になる(HttpSessionインスタンスがブラウザから使われなくなってもすぐに消滅しないから)
アプリケーションサーバは一定時間利用されていないHttpSessionインスタンスについては不要と判断しガベージコレクションの対象とする(セッションタイムアウト)
でもやっぱり開発者がセッションスコープに格納するインスタンスを積極的に管理したほうがいい
session.invalidate()でセッションスコープを破棄する
これは典型的にユーザーがログアウトを行った時用いる
8章はこんな感じ
よくセッションがタイムアウトしましたとか出てくることあったけどこれのことだったんだな〜
p226が微妙な気がするし全体的にスコープのところは何周かしたほうがよさそう
全体像はざっくりわかってるけど細かいところを実践と一緒にうめていかなきゃな〜
次は9章アプリケーションスコープだ!
まるなな サーブレットとJSP 7:)
今回は
7章〜
リクエストスコープについて
第6章で学んだフォワード転送は処理の連携はできるがデータの連携ができない!
これだとサーブレットクラスの処理結果をJSPファイルで出力できない・・・
サーブレットクラスで生成したインスタンスをJSPファイルで利用するにはスコープ(インスタンスを保存できる領域)を利用する
スコープを経由させてサーブレットクラスとJSPファイルの間でインスタンスを共有したり受け渡すことが可能になる
スコープには4種類ある
・ページスコープ
・リクエストスコープ
・セッションスコープ
・アプリケーションスコープ
種類によって保存したインスタンスの有効期限が異なる
スコープにはインスタンスだけが保存できる
基本データ型変数はインスタンスではないのでスコープに保存できない
(この場合はラッパークラスを使用する)
基本的にJavaBeansと呼ばれるクラスのインスタンスを保存する
(Javaのクラスの独立性を高め部品として再利用しやすくするためのルールまたはそのルールを守っているクラスのこと)
JavaBeansのルール
①直列化可能
②クラスはpublicでパッケージに所属する
③publicで引数のないコンストラクタを持つ
④フィールドはカプセル化されている
⑤命令規則に従ったgetter/setterを持つ
getter/setterの命令規則
getter
・メソッド名はgetから始め、以降の単語の先頭の文字は大文字
ただし戻り値の型がbooleanの場合はisからはじめる
・引数はないが戻り値はフィールド
setter
・メソッド名はsetから始め、以降の単語の先頭の文字は大文字
・引数は1つでフィールドに設定する値を受けとる。戻り値なし
JavaBeansのプロパティとはインスタンスの属性のこと
これはgetterまたはsetterを作ることでうまれる
リクエストスコープはリクエストごとに生成される
保存したインスタンスはレスポンスが返されるまで利用できる
リクエストスコープにインスタンスを保存するにはHttpServletRequestインスタンスのsetAtrribute()メソッドを使用する
第1引数はスコープに保存するインスタンスの管理用の名前(属性名)を指定(スコープに保存したインスタンスを取得する際必要)
リクエストスコープ内のインスタンスを取得する場合
HttpServletRequestのgetAttribute()メソッドで取得
JSPファイルでリクエストスコープを使用する場合暗黙オブジェクトrequestを使用
リクエストスコープではできないことがある
・リクエストスコープの正体のHttpServletRequestインスタンスはレスポンスが返されると同時に消滅する
・そのときリクエストスコープに保存していたインスタンスも消える
・だからリクエストスコープに保存したインスタンスは次回のリクエストでは取得できない
つまりリクエストをまたいでインスタンスを共有できない
それから
転送前に一度レスポンスを行うからリダイレクト元でリクエストスコープに保存したインスタンスはリダイレクト先では取得できないから注意!
第7章はこんなかんじ
JavaBeansのこととか
p193とかp194とか
あいまいだから何度か作ったり読んだりする
課題が少し長くて複雑だから何度もやって覚える
次は8章セッションスコープ〜