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がなんかちょっと違う感じになってて、調べてみたけど死にそう。言ってることはなんとなくわかるからとりあえずこんな感じでやってみる。うまくいくかは知らない。

参考

qiita.com

codezine.jp

 

なんかいろいろ記事あさってたけど、なぜその書き方をしたのか、そのクエリを使用した理由を説明できたらちゃんとわかってることになるのかな〜?

いまはこのときはこれをつかうって感じで表面的にしかわかってない感じする

ちょっと意識してやってみよかな〜

 

次は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つは単体で使うよりも道具と組み合わせて使用するほうがよいがその道具についてはのちのち!

 

論理演算子

  • WHERE句で条件式を使用するとき、1つの条件式ではうまく行を絞り込めない場合があるかも。そんなときに論理演算子を用いて、複数の条件式を組み合わせることができる!

代表的な論理演算子

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として特別な意味を持つ「予約語」である
  • 予約語を記述する際は大文字と小文字の区別なし
  • テーブル名や列名に予約語を利用することはできない

SELECTやWHEREなどの一部の単語はSQLの機能として特別な意味を持つため列名などに使えない

大文字小文字の区別については会社やプロジェクトで決められたルールに従えばいいんでないかと書いてあった

 

データの種類を示す記法

SQL文の中に書き込まれたデータそのものを特にリテラルという

 

リテラル記述に関するルール

  • 「'」でくくらず記述されたリテラルは数値情報として扱われる
  • 「'」でくくられたリテラルは基本的に文字列情報として扱われる
  • 「'」でくくられ、'2016-03-03'のような一定の形式で記述されたリテラルは日付情報として扱われる

たとえば「123」と「'123'」では意味が違う

前者は123(ひゃくにじゅうさん)という数量を表す数値データ

後者は123(いち・に・さん)という3つの文字の並びを表す文字列データ

 

列とデータ型

データベースの中には複数のテーブルがありテーブルは行と列から成り立っている

それぞれの列には名前が付いているがそれに加え列ごとに格納できるデータの種類を表すデータ型を定めることになっている

列にはデータ型で指定された種類の情報しか格納できない

利用可能なデータ型はDBMS製品によって違う

 

固定長と可変長

文字列型にはCHARVARCHARがある

  • 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

 がある

 

書き方の順序としては

  1. 命令文を記述
  2. テーブル指定の部分を記述
  3. テーブル指定よりうしろの部分を記述
  4. テーブル指定より前の部分を記述(SELECT文のみ)

 

2章はだいたいこんな感じ〜

この記事書いたの大分前なのだけどその頃はASの必要性が全くわからなかった!

今は頻繁につかうから(ASとは書かないけど)結構使えるな〜くらいの認識にはなってきたかも!

 

次は3章操作する行の絞り込みだ!

 

SQL入門 1章 :)

今回からスッキリわかるSQL入門(中山清喬・飯田理恵子著)にお世話になります

 

今日は1章〜はじめてのSQL

 

SQLとは

データベースを操作する専用の言語のこと

 

◎データベースとは

検索や書き換え、分析などのデータ管理を目的としてさまざまな情報を蓄積したもの

  • データベースはデータをどのような形で保存し管理するかによっていくつかの種類に分類できる
  • 最近人気なのは複数の表の形式でデータ管理をするリレーショナルデータベース(RDB

 

RDBの基本構造

複数の表が入っていて、個々の表をテーブルという

・個々のテーブルには名前(テーブル名)が付いている

・テーブルは(column)と(row)で構成される

・1つの行が1件のデータに対応し、列はその要素に対応する(行のことをカラムやフィールドと呼ぶこともある)

 

 

データベースは情報の集まりで、その実態はファイルだから、ファイルに命令を送ってもしょうがない・・

そこでデータベース管理システム(DBMSと呼ばれるプログラムにSQLを送る

DBMSはコンピュータ内で常に稼働してSQLを待ち受けて、届いたSQLの内容に従ってデータベースファイルの内容を検索したり書き換えたりしてくれる

 

DBMSのうち、複数の表の形式でデータを取り扱うものを特にRDBMSという

これはいろんなのがあるんだけど(Oracleとか)製品によって使用できるSQLの命令や記述法に違いがある

でも基本は一緒らしい

 

普通DBMSに対してはネットワーク経由でSQLを送る

各データベース製品ではDBMSと通信するための専用プログラム(ドライバという)が提供されている

 

SQLには3命令の動作がある

 

  • SELECT文 ある条件を満たす行を探す→その行の内容を取得
  • UPDATE文 ある条件を満たす行を探す→その行の内容を書き換える
  • DELETE文 ある条件を満たす行を探す→その行を消す

 

だいたいこんな感じだった

実際やって覚えてくださいって感じなのでいろいろやってみようと思う

 

次は2章 基本文法と4大命令だ!

 

まるきゅう サーブレットとJSP 9:)

今回は

スッキリわかるサーブレット&JSP入門(国本大悟著)

9章〜

 

◎アプリケーションスコープについて

 

これまでのリクエストスコープとセッションスコープはユーザーごとのスコープだったけど、アプリケーションの中には全ユーザーで利用したいインスタンス(データ)もある

この場合に使えるのがアプリケーションスコープ1つのアプリケーションにつき1つ作成されるスコープ)

アプリケーションスコープに保存したインスタンスはWebアプリケーションが終了するまでの間アプリケーション内のすべてのサーブレットクラスとJSPファイルで利用できる

 

Webアプリケーションの開始と終了は次のような操作や機能で行われる

・サーバの開始と停止

・オートリロード機能

・管理ツールによる開始と終了

 

アプリケーションスコープの正体はjavax.servlet.http.ServletContextインスタンスである

JSPファイルでアプリケーションスコープを使用する場合暗黙オブジェクトapplicationを使用する

 

◎アプリケーションスコープの注意点

 

・同時アクセスによる更新

アプリケーションスコープ内のインスタンスを更新するような処理を複数のリクエストがほぼ同じタイミングで行うとアプリケーションスコープのインスタンスに不整合が発生する場合がある

対処法としてはこういうことが問題になる場合はアプリケーションスコープでデータを保存しない(データベースとかつかう)、またはスレッド(処理の単位のこと)による競合が発生しないよう調停を行う

 

インスタンスの保存期間

アプリケーションスコープに保存したデータ(インスタンス)はメモリ上にあるためWebアプリケーションを終了すると消滅する

Webアプリケーション再開後でも使用するならファイルやデータベースに保存する必要がある

またセッションスコープと違いタイムアウトがない。削除しないとメモリにインスタンスが残り続けてしまう

そのままだとメモリを圧迫するから注意!

 

9章はこんな感じ

 

Webアプリケーションの開始と終了のとこがイマイチかなぁ?

一旦すべてのスコープの違いをしっかり把握すること

注意点のところをよく理解しておくこと

 

次は10章アプリケーション作成だ!

 

 

 

 

まるはち サーブレットとJSP 8:)

今回は

スッキリわかるサーブレット&JSP入門(国本大悟著)

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:)

今回は

スッキリわかるサーブレット&JSP入門(国本大悟著)

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章セッションスコープ〜