▲ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┏┓ ┃┃  のんびりやろう!情報処理試験! 〜1問1問コツコツと〜  ┃┃ ┃┃ 2003.1.17 vol.1027 21,776 部発行 http://www.shunzei.com/ ┃┃ ┗┛ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼ ━PR━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ◆◆◆◆◆◆◆◆◆「短期コース」お申込は1/22(水)まで◆◆◆◆◆◆◆◆◆ 2003年春試験対策 短期コースお申込 好評受付中! 2003年1月22日お申込〆切りですので,お早めにお申込ください。 詳細とお申込は http://www.itec.co.jp/ から ◆◆◆◆ 《IT技術者教育のパイオニア》 アイテックの通信講座 ◆◆◆◆ ---------------------------------------------------------------------- ◆◆◆◆◆◆◆◆ テクノブレインが求める【私の経歴】◆◆◆◆◆◆◆◆◆ 私は元ハッカーなんです。でもこれじゃいけないと、一念発起でネットワーク エンジニアになりました。そんな私が今目指しているのは、以前の私と正反対 のセキュリティーエンジニアです。 ◆◆ そんな人材を求めています ◆◆ 私だ!と思ったら登録を⇒ http://211.10.20.135/a/a.cgi?k03985Cm01027 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━PR━ >/****************** 今日の問題はお休みします。 ******************/< ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ★これ、おしえてっ!(回答編)★ vol.1024(2003.1.14)の質問に対する回答 ----------------------------------------------------------------------  vol.1024 の質問はこちらでした。(出典:H13. データベース 問37) ----------------------------------------------------------------------  “社員”表から同姓同名を検索する SQL 文として,適切なものはどれか。   社員  ┌────┬─────┬─────┬───┐  │社員番号│ 氏 名 │ 生年月日 │所 属│  ┝━━━━┿━━━━━┿━━━━━┿━━━┥  │ 0001 │新井 健二│1950-02-04│営業部│  ├────┼─────┼─────┼───┤  │ 0002 │鈴木 太郎│1955-03-13│総務部│  ├────┼─────┼─────┼───┤  │ 0003 │佐藤 宏 │1961-07-11│技術部│  ├────┼─────┼─────┼───┤  │ 0004 │田中 博 │1958-01-24│企画部│  ├────┼─────┼─────┼───┤  │ 0005 │鈴木 太郎│1948-11-09│営業部│  ├────┼─────┼─────┼───┤  │ ‥‥ │ ‥‥‥ │ ‥‥‥ │ ‥ │  └────┴─────┴─────┴───┘  ア SELECT DISTINCT 氏名 FROM 社員 ORDER BY 氏名  イ SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1  ウ SELECT 氏名 FROM 社員 WHERE 氏名 > 1  エ SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 ---------------------------------------------------------------------- > 答えは、イ ということですが、“HAVING COUNT(*) > 1”の意味が > 解かりません。  という質問でしたが、いかがだったでしょうか?  SQL は普段から使っている人が多いようで、多めの回答が届きました。  できるだけ、みなさんの回答を紹介しますね。  ○Yukiさん > これは「GROUP BY 〜 HAVING 条件」という条件付きグループ関数の問題です。 > 「GROUP BY 氏名」だけなら氏名でグルーピングした結果が全件返されますが、 > 「HAVING 条件」をつけることで、氏名でグルーピングされた結果のうちから、 > さらに、条件を満たすものだけを結果として返します。 > > 今回の条件は「COUNT(*) > 1」なので、氏名でグルーピングした > グループのうち、グループ毎の件数が1より大きいもの、 > つまり、同姓同名の氏名が存在するデータを抽出することができます。 > > > 問題の社員表の場合、 > (1)「SELECT 氏名, COUNT(*) FROM 社員 GROUP BY 氏名 」の実行結果は、 > 以下の通りなので、 > >  氏名    COUNT(*) >  ---------- --------- >  新井 健二     1 >  鈴木 太郎     2 >  佐藤 宏      1 >  田中 博      1 > > (2) HAVING COUNT(*) >1を満たすものは「鈴木 太郎」だけとなり、 > 結果、同姓同名の氏名を抽出する事が出来る。  HAVING COUNT の意味はこのようになりますね。  このやり方で同姓同名の氏名を抽出することができます。  よって、正解は「イ」になります。  どうもありがとうございました。  ○あきよしさん > >  ア SELECT DISTINCT 氏名 FROM 社員 ORDER BY 氏名 > >  DISTINCTは、重複する行を無視するコマンドで、ORDER BY はソート > 命令です。 >  同姓同名の方が表示されなくなるので×。 > > >  イ SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1 > >  これが正解です。 >  GROUP BY [A] HAVING [B] >  [A]郡をグループ化し、その対象となる条件を[B]に記述します。 >  上記の場合、氏名でグループ化し、氏名の件数が2件以上のものを取得 > します。 > >  ちょっとわかりにくいので、別のSQLを書きます。 > >  SELECT 氏名,COUNT(*) FROM 社員 GROUP BY 氏名 > >  とすると、 > >  氏名    COUNT(*) >  ---------- --------- >  新井 健二     1 >  鈴木 太郎     2(これが同姓同名) >  佐藤 宏      1 >  田中 博      1 > >  と表示されます(ソート順は違うかもしれませんが) >  COUNT(*)の検索条件として、COUNT(*) > 1とすれば、取得できるのは > 鈴木 太郎だけとなります。 >  余談ですが、GROUP BY句を設定すると、SELECTの列には、GROUP > BYで指定した列と集計関数以外は設定できなくなります。 > > >  ウ SELECT 氏名 FROM 社員 WHERE 氏名 > 1 > >  WHERE文以下は検索条件ですが、氏名は漢字なので、恐らくSJISコー > ド(等)が2以上かどうかと言う比較になる? >  ちょっとわかりませんが、普通漢字と数字を比較するようなSQLは指定 > しませんので×。 > > >  エ SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 > >  WHERE文以下の検索条件が同じ列名を指定していますから、表全件が > 対象になってしまいます。×です。  「ウ」に関してはどうでしょうねぇ? エラーになるような気がしますが、  試してみないとちょっとわかりません。  どうもありがとうございました。  ○へっぽこさん > ア:命令内容としては、重複した行を取り除いた、「氏名」列を、昇順に表示 >   するというもの。 >   これだと、 > ・Distinct句:重複するデータを取り除く > > イ:詳しく書いてみました。以下をご覧下さい。 > ・Having句:Group Byで指定されたグループに対して、検索の条件を指定 >      することができます。 > > となっていますが、分かりやすく表を見てみると、氏名は > > 新井 健二 > 鈴木 太郎 > 佐藤 宏  > 田中 博  > 鈴木 太郎 > > となっています。 > ここで、氏名でグループ化(Group By)すると、 > > 新井 健二 > 鈴木 太郎(2人分) > 佐藤 宏  > 田中 博  > > となります。 > この各グループに対して条件を与えます(Having)。 > 各、グループ内のデータが1つ以上(Count(*) > 1)の氏名を取り出と、 > > 鈴木 太郎(2人分) > > となる為、同姓同名を探す命令文は、イとなる。 > > ウ:命令内容としては、「氏名」列のデータが、1つ以上のものを抽出する >   ものとなります。 >   これは、列に対して条件を出しているわけではなく、1つのデータに対 >   しての命令なので、×。(データ型自体も異なると思います) > > エ:命令内容としては、「氏名」列のデータが、「氏名」列のデータ内容と >   同じものをを抽出するものとなります。 >   これだと、結局全てのデータが表示されてしまうので、×。  「ア」の文章が途中で切れていましたが、  この場合「鈴木太郎」と言う氏名は1行しか出てこないので、  一人なのか複数なのかがわからなくなりますね。  どうもありがとうございました。  ○オケマツさん > ×ア SELECT DISTINCT 氏名 FROM 社員 ORDER BY 氏名 > > distinct > 別々の,まるで異なった,別個の → 区別できるものを並べる > (見た目が同じになっている行は一つにする) > > order by > 〜の順序に > >  「社員」表から >  重複するものは一つにした「氏名」(※)を, >  「氏名」順に並べる. > > ※ 同姓同名は,一つの行にまとめられてしまう. > > ○イ SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1 > > group by > 〜で分類する(グループ分けする) > > having > 〜であるところの・・・という意味(かな?) > > GROUP句を使ったときには,(グループに対する演算等の)条件に > WHERE句でなくHAVING句を使う. > >  「社員」表から「氏名」を, >  「氏名」でグループ分けしたときにグループのメンバー数が1を超える >  もの(※)だけを選ぶ. > > ※ 同姓同名=「氏名」でグループ分けしたとき,同姓同名の居る >  「氏名」グループは2人以上(1人を超える)メンバーが存在する. > > > ×ウ SELECT 氏名 FROM 社員 WHERE 氏名 > 1 > >  「社員」表から >  「氏名」が1を超えるものを選ぶ. >  (「氏名」は数値でないので多分エラー.) > > > ×エ SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 > > ある行(社員)の「氏名」はその行の「氏名」と常に一致するので > WHERE句の条件が成り立ち,全ての行の氏名が出力される.  GROUP句を使ったときは、HAVING句を使うものと頭に入れておけばいいですね。  どうもありがとうございました。  ○夢幻花さん > ア DISTINCTは重複する行を除いて検索結果を表示します。 >   アのSQL文では表示されるのは『氏名』だけですから、 >   0002番の鈴木太郎さんと氏名が同じ0005番の鈴木太郎さんは >   『氏名』が重複するため表示されません。 >   そのため、鈴木太郎という名の社員は果たして一人なのか、 >   二人以上存在するのか検索結果からは読み取れなくなってしまいます。 > > イ このSQL文では『GROUP BY 氏名』によって氏名ごとにグループ化 >   (一まとめに)されます。 >   つまり、同じ氏名を持つ人は同じグループに属するということに >   なります。 >   さらに、HAVING句によってそのグループごとに対しての抽出条件が >   加えられます。『COUNT(*)>1』ですから、グループごとに考えて、 >   そのグループの行数(件数)が1より大きいものが抽出の対象となる >   ということです。 >   問題にある社員表の0001から0005までで考えてみると、 >   「氏名が新井健二」というグループには、0001番の新井さん >   一人しかいません。よって、抽出対象外です。 >   しかし、「氏名が鈴木太郎」というグループには0002番と0005番の二人の >   鈴木太郎さんがいます。このグループは件数が2件ですので、 >   抽出条件を満たします。 > > ウ 『氏名』の列に格納されているのは文字列ですから >   WHERE句の『氏名>1』は意味を成しません。 > > エ このSQL文では『氏名と氏名が等しい社員の氏名を取り出せ』と >   いっています。 >   しかし、0001番の新井健二さんの氏名は新井健二さん自身との名前と >   等しいです。 >   よって、新井健二さんは抽出の対象です。 >   同じことが他の人にも言えますので、結果として社員全員の名前が >   抽出されることになります。 > > 以上より、答えはイ > > HAVING句の説明がなんとも怪しいですね。 > 「GROUP BYでグループされた場合はWHEREでなくHAVINGで条件付けする」という > 程度でしか覚えていませんでしたから・・・。  僕もそんな程度の認識ですが、本質的にはどうなんでしょうね?  どうもありがとうございました。  ○ヨッシーさん > 以下のHPを参考にしたので、そちらを見たほうがいいかも?? > http://www.affrc.go.jp/Cinfo/doc/ap/informix/INFO_007.html  回答は他の方と重複していたので、URL だけの紹介とさせていただきます。  どうもありがとうございました。  ○カスミソウさん > 学研の合格情報処理より > > FROM句で指定された表から、条件を満たすグループを抽出するには、 > HAVING句を指定する。 > >  SELECT 列名,… >   FROM 表名 >     GROUP BY 列名,… >     HAVING 探索条件 ←グループを抽出する条件 > > SELECT文の処理順序は > 「FROM句→GROUP BY句→HAVING句→SELECT句」 > 解釈は「××表を、△△という列でグループ化して、 > ○○という条件を満たすグループを抽出し、 > 抽出されたグループの□□という列を抽出する」 > > (集合関数)表から抽出したデータを集計するための関数 >  SUM(列名)  列の合計値を求める >  AVG(列名)   列の平均値を求める >  MAX(列名)   列の最大値を求める >  MIN(列名)   列の最小値を求める >  COUNT(列名)  指定した列に値を持つ行の数を求める >  COUNT(*)   行の数を求める  これらの関数は基本的なものなので、覚えておきましょうね>みなさん  どうもありがとうございました。  他にも、シャイン☆結希さん、asa さん、まねこさんも  どうもありがとうございました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ★これ、おしえてっ!(質問編)★ 回答期限:1月20日(月)の夜まで ----------------------------------------------------------------------  「この問題がわからないっ!!」という、  読者からの質問をみなさんに回答してもらおう!というコーナーです。  今回の質問はこちらです。(出典:H14. データベース 問32) ----------------------------------------------------------------------  2層コミットプロトコルを用いたトランザクションの同時実行制御に関する  記述のうち, 適切なものはどれか。  ア すべてのトランザクションが直列に制御され,デッドロックが発生する    ことはない。  イ トランザクションのコミット順序は,実行時の時刻順となるように    制御される。  ウ トランザクションは, 自分が獲得したロックをすべて解除した後にだけ,    コミット操作を実行できる。  エ トランザクションは, 必要なロック獲得命令をすべて実行した後にだけ,    ロック解除命令をを実行できる。 --[回答のめやす(横幅:全角34文字)]-------------------------------- > 1234567890123456789012345678901234 ----------------------------------------------------------------------  リクエストが来ているので、データベースの問題をもう1問。  これに対する回答(解説)を1月20日(月)の夜までにお願いします。  このコーナーで取り上げてほしい問題のリクエストも募集中です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼選択肢で勉強しよっ!▼(答えはこのメールの一番下にあります) ---------------------------------------------------------------------- > フリーソフトウェア(free software) って? ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ > *********************** 投稿募集中のテーマ *********************** < ----------------------------------------------------------------------  ●「これ、おしえてっ!」で扱ってほしい問題のリクエストやその回答  ●「選択肢で勉強しよっ!」で扱ってほしい用語のリクエスト  ●「その他、試験などに関するお便り(テーマフリー)」  ハンドル名を添えて mail@shunzei.com まで送ってください!! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  のんびりやろう!情報処理試験! 〜1問1問コツコツと〜(週5日発行) ----------------------------------------------------------------------  編集・発行:しゅんぜい mail@shunzei.com      ─ 発行部数 ─    発送:melma!   http://www.melma.com/     5,558 部       :まぐまぐ  http://www.mag2.com/     12,077 部       :めろんぱん http://www.melonpan.net/   4,141 部                           ───────  登録・解除:http://www.shunzei.com/mm/        21,776 部(total)  ○本の購入:http://books.rakuten.co.jp/itexam/  ○バックナンバー  ダウンロード: http://www.shunzei.com/mm/backnumber.html  立ち読み  : http://www.melma.com/mag/89/m00000189/index_bn.html  転載について: http://www.shunzei.com/about/disclaimer.html  広告掲載に関しては mail@shunzei.com まで、直接お願いします。 ----------------------------------------------------------------------  ○メールマガジンの購読の登録・解除は個人の責任で行ってください。   しゅんぜいは一切代行しません! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼選択肢で勉強しよっ!の答え▼ ----------------------------------------------------------------------  (初級シスアド平成13年春問79エ)  (初級シスアド平成14年秋問78エ)の選択肢より > ライセンスに従って、内容の変更、コピー及び配布が自由にできる > 無償のソフトウエア  (1種平成9年問74)の問題文より > 著作権は著作者に留保されていて、利用、複製、配布は自由である > ソフトウェア  フリーソフトウェア(free software) とは、無償で提供されている  ソフトウェアのことです。フリーウェア、フリーソフトともいいます。  基本的に著作権は放棄されず、利用や改変、再配布に関しては  著作者の指示に従う必要があります。  フリーソフトでも、市販のソフト並みの機能を持つものは多いですね(^^) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ==PR================================================================== ▼24時間いつでもどこでも本が買える!【インターネット上の本屋さん】▼  のんびりやろう!〜楽天ブックス http://books.rakuten.co.jp/itexam/ ======================================================================