<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>データベース - 工業大学生ももやまのうさぎ塾 (Momousagi Academy)</title>
	<atom:link href="https://www.momoyama-usagi.com/entry/category/kihon/technology/database/feed" rel="self" type="application/rss+xml" />
	<link>https://www.momoyama-usagi.com</link>
	<description>人間からうさぎまで数学と情報をわかりやすくお届け！</description>
	<lastBuildDate>Fri, 16 Oct 2020 15:42:25 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.momoyama-usagi.com/wp-content/uploads/cropped-New-Usagi-Dosei-2-32x32.jpg</url>
	<title>データベース - 工業大学生ももやまのうさぎ塾 (Momousagi Academy)</title>
	<link>https://www.momoyama-usagi.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第04羽　SQL中編</title>
		<link>https://www.momoyama-usagi.com/entry/info-database04</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database04#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 16 Oct 2020 15:42:25 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database04</guid>

					<description><![CDATA[今回は、SQLの中編として、データベースや表の作成、変更、削除、およびデータの挿入、削除方法、データベースの権限について簡潔に説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回は、SQLの中編ということで、</p>
<ul class="wp-block-list dbp-list"><li>データベースの作成、削除</li><li>表の定義, 構造変更, 削除</li><li>データの挿入, 削除</li><li>データベースの権限</li></ul>
<p>の4つについて説明します。</p>

<h2 class="wp-block-heading">１．データベースの作成・削除</h2>
<p>特に意識して覚える必要はなし。</p>
<h3 class="wp-block-heading">(1) データベースの作成</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">create</span> database 作成するデータベース名
</pre>
<h3 class="wp-block-heading">(2) データベースの削除</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">drop</span> database 削除するデータベース名
</pre>
<p><code>create</code> が作成、<code>drop</code> が削除というのは頭に入れておきましょう。</p>
<p>本番、SQLの構文をど忘れしたときでも選択肢を絞ることができます。</p>
<h2 class="wp-block-heading">２．表の定義, 構造変更, 削除</h2>
<h3 class="wp-block-heading">(1) 表の定義</h3>
<p>定義に関する問題はたまに見かけるので、どんなふうに書くのかをさらっと確認しておきましょう。</p>
<h4 class="wp-block-heading">基本構文</h4>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">create</span> <span class="synSpecial">table</span> 表名 (
列名<span class="synConstant">1</span>  データ型  [列名<span class="synConstant">1</span>の列制約]
列名<span class="synConstant">2</span>  データ型  [列名<span class="synConstant">2</span>の列制約]
列名<span class="synConstant">3</span>  データ型  [列名<span class="synConstant">3</span>の列制約]
　︙
[表制約]
)
</pre>
<p>それぞれの列の列制約、および表制約が必要ない場合は省略できます。また、2つ以上の制約を入れることもできます。</p>
<p>データ型、[列制約]、[表制約] に具体的に何が入れられるかは下で説明しています。</p>
<h4 class="wp-block-heading">データ型</h4>
<table>
<thead>
<tr>
<th>  種類  </th>
<th style="text-align:left;">  <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td>  int  </td>
<td style="text-align:left;">  整数  </td>
</tr>
<tr>
<td>  real  </td>
<td style="text-align:left;">  浮動小数  </td>
</tr>
<tr>
<td>  char(n)  </td>
<td style="text-align:left;">  n文字の固定長文字列  </td>
</tr>
<tr>
<td>  varchar(n)  </td>
<td style="text-align:left;">  n文字以下の可変長文字列  </td>
</tr>
<tr>
<td> date </td>
<td style="text-align:left;">  日付  </td>
</tr>
<tr>
<td> time </td>
<td style="text-align:left;">  時間  </td>
</tr>
</tbody>
</table>
<p><code>char</code> と <code>varchar</code> の違いに気をつけましょう。</p>
<p>例えば、<code>char(5)</code> であれば必ず「5文字」の文字列が格納される必要があります。一方 <code>varchar(5)</code> であれば「5文字以下」の文字列を格納することができます（5文字でなくてもOK）。</p>
<h4 class="wp-block-heading">列制約</h4>
<table>
<thead>
<tr>
<th>  種類  </th>
<th style="text-align:left;">  <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> unique </td>
<td style="text-align:left;"> 列内で値の重複を許さない </td>
</tr>
<tr>
<td> primary key </td>
<td style="text-align:left;"> 主キー扱いにする※ </td>
</tr>
<tr>
<td> not null </td>
<td style="text-align:left;"> 空値(NULL)を許さない </td>
</tr>
<tr>
<td> check(条件) </td>
<td style="text-align:left;"> 条件に一致する値のみを許す </td>
</tr>
<tr>
<td> default X </td>
<td style="text-align:left;"> 追加時の初期値をXとする </td>
</tr>
<tr>
<td> references 表名(列名) </td>
<td style="text-align:left;"> 外部キー扱いにする※ </td>
</tr>
</tbody>
</table>
<p>[※注意]</p>
<ul class="wp-block-list dbp-list"><li>primary keyを使って主キー制約を行うと、unique制約とnot null 制約も自動的に加わる<a href="#f-a5e2fcbe" name="fn-a5e2fcbe" title="主キーになるためには、列内で重複する値がなく、さらに値が空でない必要があるため。">*1</a></li><li>参照先は <code>references 表名(列名)</code> で指定した表、列となる</li></ul>
<h4 class="wp-block-heading">表制約</h4>
<p>表制約では (列名1, 列名2,…) と指定した列名に対して、一括で制約を加えることができます。</p>
<table>
<thead>
<tr>
<th>  種類  </th>
<th style="text-align:left;">  <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> unique(列名1,列名2,…) </td>
<td style="text-align:left;"> 値の重複を禁止に </td>
</tr>
<tr>
<td> primary key (列名1,列名2,…) </td>
<td style="text-align:left;"> 主キー扱いに </td>
</tr>
<tr>
<td> foreign key(列名1, 列名2)<br>references 表名 (列名1,列名2,…) </td>
<td style="text-align:left;"> 外部キー※ </td>
</tr>
<tr>
<td> check(条件) </td>
<td style="text-align:left;"> 表全体に対して条件を設定※ </td>
</tr>
</tbody>
</table>
<p>[※注意]</p>
<ul class="wp-block-list dbp-list"><li><code>foreign key(列名1, 列名2)</code> の部分で外部キーを設定し、<code>references</code> 以降で参照先を決定する</li><li><code>check(条件)</code> では、表全体に対して条件を満たすもののみを登録できるようにする</li></ul>
<h4 class="wp-block-heading">具体例</h4>
<p>具体的に表の定義例を見てみましょう。</p>
<p><b>表：メニュー</b></p>
<table>
<thead>
<tr>
<th>  番号 </th>
<th style="text-align:center;"> 名前  </th>
<th style="text-align:right;">  <center>値段</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> N001 </td>
<td style="text-align:center;"> カレー </td>
<td style="text-align:right;"> 250 </td>
</tr>
<tr>
<td> N002 </td>
<td style="text-align:center;"> ラーメン </td>
<td style="text-align:right;"> 300 </td>
</tr>
<tr>
<td> N003 </td>
<td style="text-align:center;"> 日替わり丼 </td>
<td style="text-align:right;"> 350 </td>
</tr>
<tr>
<td> N004 </td>
<td style="text-align:center;"> Aランチ </td>
<td style="text-align:right;"> 400 </td>
</tr>
<tr>
<td> N005 </td>
<td style="text-align:center;"> Bランチ </td>
<td style="text-align:right;"> 350 </td>
</tr>
</tbody>
</table>

<p>以下の条件を満たすように、表「メニュー」を定義してみましょう。</p>
<ul class="wp-block-list dbp-list"><li>必要な列は番号、メニュー、値段の3つ</li><li>番号は4文字の文字列型、メニューは10文字以内型、値段は0円以上の整数型</li><li>列「番号」に主キー制約を書ける</li></ul>

<p>実際に書いて見ると、以下のようになります。皆さんも同じになりましたか？</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">create</span> <span class="synSpecial">table</span> メニュー (
番号  <span class="synType">char</span>(<span class="synConstant">4</span>), primary key,
名前  <span class="synType">varchar</span>(<span class="synConstant">10</span>),
値段  int,
<span class="synSpecial">check</span>(値段 &gt;= <span class="synConstant">0</span>)
)
</pre>
<h3 class="wp-block-heading">(2) 表の変更</h3>
<p>表の変更 <code>alter</code> は、過去に1～2回ほど基本情報の午後問題で出題されたことがあります。（例えば<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22_2/2010h22a_fe_pm_qs.pdf#page=9">平成22年度秋期</a>）</p>
<h4 class="wp-block-heading">列の追加</h4>
<p>列の追加と削除は念の為に覚えておくと安心。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">alter</span> <span class="synSpecial">table</span> 表名 <span class="synSpecial">add</span> 列名 データ型
</pre>
<p>列名　　：追加する列の名前<br>
データ型：追加する列のデータ型</p>
<h4 class="wp-block-heading">列の削除</h4>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">alter</span> <span class="synSpecial">table</span> 表名 <span class="synStatement">drop</span> 列名
</pre>
<p>列名　　：削除する列の名前</p>
<h4 class="wp-block-heading">表名の変更</h4>
<p>出ないから覚えなくてOK</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">alter</span> <span class="synSpecial">table</span> 旧表名 renames <span class="synSpecial">to</span> 新表名
</pre>
<h3 class="wp-block-heading">(3) 表の削除</h3>
<p><code>drop database</code> の <code>database</code> を <code>table</code> に変えただけ。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">drop</span> <span class="synSpecial">table</span> 削除する表名
</pre>
<h2 class="wp-block-heading">３．データの挿入(insert)・削除</h2>
<h3 class="wp-block-heading">(1) データの挿入</h3>
<p><code>insert</code> 文によるデータの挿入です。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> 表名 (列名<span class="synConstant">1</span>, 列名<span class="synConstant">2</span>, …)
<span class="synSpecial">values</span> (値<span class="synConstant">1</span>, 値<span class="synConstant">2</span>, …)
</pre>
<p>「列名1が値1、列名2が値2、…」となっているデータが挿入されます（列名1と値1、列名2と値2、のように同じ番号の列と値が1対1に対応しています。）。</p>
<p>例えば、下のように挿入を行うとします。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003757.gif" alt="f:id:momoyama1192:20201017003757g:plain" title="f:id:momoyama1192:20201017003757g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>このような操作を行うSQLは以下で表せます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> メニュー (番号, 名前, 値段) <span class="synSpecial">values</span> (<span class="synSpecial">'</span><span class="synConstant">N006</span><span class="synSpecial">'</span>, <span class="synSpecial">'</span><span class="synConstant">そば</span><span class="synSpecial">'</span>, <span class="synConstant">200</span>)
</pre>
<p>[注意]</p>
<ul class="wp-block-list dbp-list"><li>挿入対象は必ず1つの表（複数の表に同時挿入はできない）</li><li>文字列は必ず <code>''</code> で囲うこと</li></ul>
<h4 class="wp-block-heading">[応用] select文との併用</h4>
<p>データの挿入の際に <code>select</code> 文の結果をそのまま挿入することもできます。</p>
<p><code>select</code> 文の結果を挿入する場合、<code>values (値1, 値2,…)</code> の部分に <code>select</code> 文が入ります。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> 表名 (列<span class="synConstant">1-1</span>, 列<span class="synConstant">1-2</span>, …) <span class="synStatement">select</span> 列<span class="synConstant">2-1</span>, 列<span class="synConstant">2-2</span>, … <span class="synSpecial">from</span> 参照表名 <span class="synSpecial">where</span> 条件
</pre>
<p>[注意]</p>
<ul class="wp-block-list dbp-list"><li>列1-1と列1-2、列2-1と列2-2、…のように列の並びが1対1に対応するようにすること</li><li>whereによる条件が不要であれば省略もOK</li></ul>

<p>例えば、右側にある表「一覧」からジャンルが「うどん」であるものを表「メニュー」に追加する場合を考えましょう。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003819.gif" alt="f:id:momoyama1192:20201017003819g:plain" title="f:id:momoyama1192:20201017003819g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>この処理は、以下のSQLで実現できます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> メニュー (番号, 名前, 値段)
<span class="synStatement">select</span> 番号, 名前, 値段 <span class="synSpecial">from</span> 一覧 <span class="synSpecial">where</span> ジャンル = <span class="synSpecial">'</span><span class="synConstant">うどん</span><span class="synSpecial">'</span>
</pre>
<h3 class="wp-block-heading">(2) データの更新</h3>
<p>列を指定する部分では、更新する列と値のみを記述すればOKです。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">update</span> 表名 <span class="synStatement">set</span> 列<span class="synConstant">1</span> = 値<span class="synConstant">1</span>, 列<span class="synConstant">2</span> = 値<span class="synConstant">2</span>, … <span class="synSpecial">where</span> 条件
</pre>
<p>[注意]</p>
<ul class="wp-block-list dbp-list"><li>条件には、select文で使える条件と同じものが使える（<code>between</code> やら <code>in</code> やら <code>like</code> なども使用OK）</li><li>必要がなければ <code>where 条件</code> は不要</li></ul>

<p>先程出てきた下の表で具体例を考えてみましょう。</p>
<p><b>表：メニュー</b></p>
<table>
<thead>
<tr>
<th>  番号 </th>
<th style="text-align:center;"> 名前  </th>
<th style="text-align:right;">  <center>値段</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> N001 </td>
<td style="text-align:center;"> カレー </td>
<td style="text-align:right;"> 250 </td>
</tr>
<tr>
<td> N002 </td>
<td style="text-align:center;"> ラーメン </td>
<td style="text-align:right;"> 300 </td>
</tr>
<tr>
<td> N003 </td>
<td style="text-align:center;"> 日替わり丼 </td>
<td style="text-align:right;"> 350 </td>
</tr>
<tr>
<td> N004 </td>
<td style="text-align:center;"> Aランチ </td>
<td style="text-align:right;"> 400 </td>
</tr>
<tr>
<td> N005 </td>
<td style="text-align:center;"> Bランチ </td>
<td style="text-align:right;"> 350 </td>
</tr>
</tbody>
</table>

<p>例えば、ラーメンの値段を20円下げるのであれば以下のSQLで実現できます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">update</span> メニュー <span class="synStatement">set</span> 値段 = 値段 - <span class="synConstant">20</span> <span class="synSpecial">where</span> 名前 = <span class="synSpecial">'</span><span class="synConstant">ラーメン</span><span class="synSpecial">'</span>
</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003810.gif" alt="f:id:momoyama1192:20201017003810g:plain" title="f:id:momoyama1192:20201017003810g:plain" class="hatena-fotolife" itemprop="image"></span></p>

<p>同じように、全部のメニューを50円値下げするSQLは以下のように書けます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">update</span> メニュー <span class="synStatement">set</span> 値段 = 値段 - <span class="synConstant">50</span>
</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003815.gif" alt="f:id:momoyama1192:20201017003815g:plain" title="f:id:momoyama1192:20201017003815g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h3 class="wp-block-heading">(3) データの削除</h3>
<p>データの削除方法も確認しておきましょう。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">delete</span> <span class="synSpecial">from</span> 表名 <span class="synSpecial">where</span> 条件
</pre>
<p>例えば、先程の表「メニュー」から、Bランチを削除するのであれば以下のSQLで記述できます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">delete</span> <span class="synSpecial">from</span> メニュー <span class="synSpecial">where</span> 名前 = <span class="synSpecial">'</span><span class="synConstant">Bランチ</span><span class="synSpecial">'</span>
</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003802.gif" alt="f:id:momoyama1192:20201017003802g:plain" title="f:id:momoyama1192:20201017003802g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">４．権限の変更</h2>
<p>基本情報ではあまり重要ではないので、基本情報で受験するだけであれば読み飛ばしてもらってOKです。</p>

<p>権限名には、以下の5つを選ぶことができます。</p>
<table>
<thead>
<tr>
<th style="text-align:center;">  名前 </th>
<th style="text-align:center;"> <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;"> select </td>
<td style="text-align:center;"> 検索 </td>
</tr>
<tr>
<td style="text-align:center;"> update </td>
<td style="text-align:center;"> 更新 </td>
</tr>
<tr>
<td style="text-align:center;"> insert </td>
<td style="text-align:center;"> 挿入 </td>
</tr>
<tr>
<td style="text-align:center;"> delete </td>
<td style="text-align:center;"> 削除 </td>
</tr>
<tr>
<td style="text-align:center;"> all privileges </td>
<td style="text-align:center;"> 上の4つ全部 </td>
</tr>
</tbody>
</table>
<h3 class="wp-block-heading">(1) 権限の付与</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">grant</span> 権限名 <span class="synSpecial">on</span> 表名 <span class="synSpecial">to</span> ユーザー名
</pre>
<p>例：<code>owner</code> には表「メニュー」に対しての全部の権限を付与する</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">grant</span> <span class="synStatement">all</span> <span class="synSpecial">privileges</span> <span class="synSpecial">on</span> メニュー <span class="synSpecial">to</span> owner
</pre>
<h3 class="wp-block-heading">(2) 権限の取り消し</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">revoke</span> 権限名 <span class="synSpecial">on</span> 表名 <span class="synSpecial">to</span> ユーザー名
</pre>
<p>例：<code>momoyama</code> には表「メニュー」に対しての削除の権限を剥奪する</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">revoke</span> <span class="synStatement">delete</span> <span class="synSpecial">on</span> メニュー <span class="synSpecial">to</span> momoyama
</pre>
<h2 class="wp-block-heading">５．さいごに</h2>
<p>今回は、少しシンプルにSQLの中編として、以下の4つについて説明しました。</p>
<ul class="wp-block-list dbp-list"><li>データベースの作成、削除</li><li>表の定義, 構造変更, 削除</li><li>データの挿入, 削除</li><li>データベースの権限</li></ul>
<p>後編では、さらに応用として、以下の3つを中心に説明する予定です。</p>
<ul class="wp-block-list dbp-list"><li>複数の表を用いた <code>select</code> 文</li><li>副問合せ</li><li>仮想的な表「ビュー」の定義、利用</li></ul>
<div class="footnote">
<p class="footnote"><a href="#fn-a5e2fcbe" name="f-a5e2fcbe" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">主キーになるためには、列内で重複する値がなく、さらに値が空でない必要があるため。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database04/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第03羽　SQL前編（select文の使い方とその応用）</title>
		<link>https://www.momoyama-usagi.com/entry/info-database03</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database03#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 18 Sep 2020 01:03:05 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database03</guid>

					<description><![CDATA[基本情報の午前午後ともに頻出のSQLを３回に分けて説明しています。前編ではselect文の使い方とその応用例として複雑な条件の指定、集合関数の使い方、group by, having による場合分けを用いた集計、表の結合、表のソートなどについてまとめています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回から3回に分けてSQLの基礎について勉強していきましょう。</p>

<p>初回となる今回は、表を検索するために使うselect文の使い方を、少し応用的なところまで見てきましょう。</p>


<p>なお、重要度は「基本情報で必要かどうか」を基準に設定しています。★の意味は、以下の通りです。</p>
<ul class="wp-block-list dbp-list"><li>★★★：超重要、よく出る</li><li>★★☆：重要、結構出る</li><li>★☆☆：余裕があれば見とこうね</li></ul>
<h2 class="wp-block-heading">1．select文の基本　重要度：★★★</h2>
<p>select文では、関係データベース内に保存されているデータ（つまり表）の中から、条件に合致したものを抽出するのが基本です。</p>
<p>まずは、select文の基本的な使い方を見てきましょう。</p>
<h3 class="wp-block-heading">(1) 列の抽出（射影）</h3>
<p>射影演算は、<span class="marker-yellow"><b>表の中から列を取り出す演算</b></span>でしたね。</p>
<p>select文を用いて列を抽出する場合、列名の部分に抽出したい列名を列挙します。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名</pre>
<p>例えば下の例の場合、関係「学生一覧」の中から、「名前」、「学年」の列を取り出し、表示します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212424.gif" alt="f:id:momoyama1192:20200908212424g:plain" title="f:id:momoyama1192:20200908212424g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、下のように<span class="marker-yellow"><b>列名部分に <code>*</code> をつけると、すべての列を抽出</b></span>します。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生一覧</pre>
<h3 class="wp-block-heading">(2) 全く同じデータを表示させない方法 (distinct)</h3>
<p>射影演算の厳密な定義は<span class="marker-pink"><b>全く同じデータを2回以上出力しません</b></span>。</p>
<p>しかし、単にselect文で列を指定しただけだと、下のように重複したデータが2回以上出力されてしまう可能性があります。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212430.gif" alt="f:id:momoyama1192:20200908212430g:plain" title="f:id:momoyama1192:20200908212430g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>そこで、下のように列名を列挙する前に <code>distinct</code> をつけることで、<span class="marker-yellow"><b>重複データを2回以上出力させなくすること</b></span>ができます。</p>
<pre class="code" data-lang="" data-unlink>select distinct 列名 from 表名</pre>
<p>例えば下の例の場合、工学部と情報工学部が1度だけ出力されます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212435.gif" alt="f:id:momoyama1192:20200908212435g:plain" title="f:id:momoyama1192:20200908212435g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h3 class="wp-block-heading">(3) 行の抽出（選択）</h3>
<p>選択演算は、表の中から行を取り出す演算でしたね。</p>
<p>select文を用いて行を抽出する場合、<span class="marker-yellow"><b>where 以降の「条件」に一致するものを抽出</b></span>します。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件</pre>
<p>下の例の場合、関係「学生一覧」の中から、「学年が2であるもの（2年生）」を抽出します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212440.gif" alt="f:id:momoyama1192:20200908212440g:plain" title="f:id:momoyama1192:20200908212440g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">2．条件文の書き方　重要度：★★★</h2>
<p>第2章では、where以降で指定できる条件の書き方について見ていきましょう。</p>
<h3 class="wp-block-heading">(1) 条件の複数指定 (and, or)</h3>
<p>Excelやプログラミングと同じように、複数の条件を <code>and</code> (かつ) や <code>or</code> (または) で指定することができます。</p>
<h4 class="wp-block-heading">and（2つの条件をともに満たす行を出力）</h4>
<p><code>where 条件1 and 条件2</code> と書くことで、条件1、条件2を両方とも満たすものを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件1 and 条件2</pre>
<p>下の例の場合、「学年が1(1年生)」と「取得単位が30未満」の両方を満たす行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212445.gif" alt="f:id:momoyama1192:20200908212445g:plain" title="f:id:momoyama1192:20200908212445g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h4 class="wp-block-heading">or（2つの条件を片方でも満たす行を出力）</h4>
<p><code>where 条件1 or 条件2</code> と書くことで、条件1、条件2のうち、片方でも満たすものを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件1 or 条件2</pre>
<p>下の例の場合、「学年が1(1年生)」と「取得単位が70未満」のうち、片方もしくは両方満たす行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200918094714.gif" alt="f:id:momoyama1192:20200918094714g:plain" title="f:id:momoyama1192:20200918094714g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h3 class="wp-block-heading">(2) 条件の否定 (not)</h3>
<p>条件の最初に <code>not</code> をつけると、条件を満たさないものを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where not 条件</pre>
<p>下の例の場合、「学部が情報学部ではない」行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212456.gif" alt="f:id:momoyama1192:20200908212456g:plain" title="f:id:momoyama1192:20200908212456g:plain" class="hatena-fotolife" itemprop="image"></span></p>

<p>また、下のように <code>and</code>, <code>or</code> と <code>not</code> と組み合わせて条件を記述することができます。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生一覧 where not 学年 = 1 or 取得単位 &lt; 70 </pre>
<p>ただし、処理順序に気をつけましょう。(not → and → orの順に処理が行われます）</p>
<p>自分で記述をする際には、下のように<span class="marker-yellow"><b>括弧をつけて計算順序を明確化させておく</b></span>ことをおすすめします。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生一覧 where (not 学年 = 1) or (取得単位 &lt; 70) </pre>
<h3 class="wp-block-heading">(3) 範囲の指定 (between)</h3>
<p>条件の部分に <code>列名 between A and B</code> と書くことで、A以上B以下のデータを取り出すことができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 列名 between A and B</pre>
<p>下の例の場合、取得単位が40以上80以下である行を取り出し、出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212502.gif" alt="f:id:momoyama1192:20200908212502g:plain" title="f:id:momoyama1192:20200908212502g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、notを付け加えて <code>not between A and B</code> とすることで、値がA以上B以下ではないデータを取り出すことができます。</p>
<h3 class="wp-block-heading">(4) 指定した項目を抽出 (in)</h3>
<p>条件の部分を <code>列名 in (値1, 値2, …)</code> とすることで、括弧内で指定した値のどれかと一致するデータを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 列名 in (値1, 値2, …)</pre>
<p>下の例の場合、学部が「文学部」もしくは「経済学部」となっている行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212510.gif" alt="f:id:momoyama1192:20200908212510g:plain" title="f:id:momoyama1192:20200908212510g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、notを付け加えて <code>not in (値1, 値2, …)</code> とすることで、括弧内で指定した値と一致しないデータを出力することができます。</p>
<h3 class="wp-block-heading">(5) 指定したパターンを出力 (like)</h3>
<p>条件の部分を <code>列名 like '文字パターン'</code> とすることで、特定の文字パターンと一致（部分一致）する行を出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 列名 like '文字パターン'</pre>
<p>文字パターンの指定では、下の２つのワイルドカードを使うことができます。</p>
<pre class="code" data-lang="" data-unlink>% → 任意の文字列
_ → 任意の1文字</pre>
<p>下の例の場合、番号が「Aで始まる」行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212514.gif" alt="f:id:momoyama1192:20200908212514g:plain" title="f:id:momoyama1192:20200908212514g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、notを付け加えて <code>not like '文字パターン'</code> とすることで、特定の文字パターンと一致しない行を出力することができます。</p>
<h3 class="wp-block-heading">(6) 空からどうかの判定 (ls null)　重要度：★★☆</h3>
<p><code>where 項目名 is null</code>  とすることで、項目が空になっているものを出力します。</p>
<p>ただし、実際には <code>is not null</code> のように not を付け加えて「項目が殻になっていない」ものを出力させることが多いです。</p>
<p>例えば、下のSQLの書き方であれば、番号（学生番号のこと）が空になっていない学生を出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 番号, 名前 from 受講一覧 where 番号 is not null </pre>
<h2 class="wp-block-heading">３．結果のソート (order by)　重要度：★★★</h2>
<p>条件を指定したあとに <code>order by</code> を付け加えることで出力結果に対して、昇順(asc)もしくは降順(desc)でソートを行うことができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件 order by 列名 ソート方法(asc / desc)</pre>
<p>下の例の場合、出力結果を点数の昇順(asc)でソートしたものを改めて出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212522.gif" alt="f:id:momoyama1192:20200908212522g:plain" title="f:id:momoyama1192:20200908212522g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>なお、昇順ソートを行う場合は<span class="marker-yellow"><b>ソート方法を示す asc を省略</b></span>することができます。そのため、下のSQLでも先程の例と同じ結果を得ることができます。</p>
<pre class="code" data-lang="" data-unlink>select * from 受講一覧 order by 点数</pre>
<h3 class="wp-block-heading">2つ以上の列を用いたソート</h3>
<p>複数の列を用いてもソートすることができます。ただし、<span class="marker-yellow"><b>列名ごとに昇順(asc)か降順(desc)を指定</b></span>する必要があります。（昇順であれば省略OK）</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件 order by 列名1 条件1, 列名2 条件2, …</pre>
<p>複数の列を用いる場合、</p>
<ul class="wp-block-list dbp-list"><li>まずは1つ目の列の値でソート</li><li>1つ目の列の値が同じ行のみ、2つ目を確認し、ソート</li><li>さらに同じであれば3つ目……</li></ul>
<p>と行います。</p>
<p>下の例の場合、</p>
<ul class="wp-block-list dbp-list"><li>まずは国語の値が昇順になるように並べる</li><li>国語が同じ値の行に対し、数学の値が降順になるように並べる</li></ul>
<p>の２段階の処理が行われます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212527.gif" alt="f:id:momoyama1192:20200908212527g:plain" title="f:id:momoyama1192:20200908212527g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">４．様々な集合関数　重要度：★★★</h2>
<p>SQLでは集計を行う様々な関数（集合関数と呼びます）を使うことができます。</p>
<p>よく出てくる関数を下に載せておきます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200918094718.gif" alt="f:id:momoyama1192:20200918094718g:plain" title="f:id:momoyama1192:20200918094718g:plain" class="hatena-fotolife" itemprop="image"></span></p>

<p>実際に関数を用いて計算をするときは、下のように <code>列名</code> の部分に関数名を入れることで、関数を用いた演算を行えます。</p>
<pre class="code" data-lang="" data-unlink>select count(*) from 受験一覧  # 表に格納されている行の数を出力
select avg(点数) from 受験一覧 #  点数の平均値を出力</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212532.gif" alt="f:id:momoyama1192:20200908212532g:plain" title="f:id:momoyama1192:20200908212532g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">５．集合関数の応用1（グループごとの出力 group by）重要度：★★★</h2>
<p>ここからは、集合関数の応用的な使い方を見てきましょう。</p>
<p><code>group by 列名</code> とすることで、指定した列内にあるデータの種類それぞれに対して集合関数を適用することができます。</p>
<p>例えば、<code>group by 学部</code> とすると、各学部ごとに集合関数を適用することができます。</p>
<pre class="code" data-lang="" data-unlink>select 学部, count(*) from 受験一覧 group by 学部   # 学部ごとに行をcountする
select 学部, avg(得点) from 受験一覧 group by 学部  # 学部ごとの得点の平均（平均点）を求める</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212549.gif" alt="f:id:momoyama1192:20200908212549g:plain" title="f:id:momoyama1192:20200908212549g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>なお、<code>select 学部, count(*)</code> のところを <code>select count(*)</code> のように「学部」を消してしまうと、数字だけが出力されるので要注意です。（どの数字がどの学部と対応しているかがわからなくなる）</p>
<h3 class="wp-block-heading">条件をつけた絞り込み (having)</h3>
<p>グループごとに集合関数を適用するときに、特定の条件を満たしたものだけを出力させたいと思うかもしれません。</p>
<p>このようにグループ化した後に、ある条件を満たしたものだけ出力する際には <code>group by 列名</code> の後に <code>having 条件</code> を付け加えます。</p>
<pre class="code" data-lang="" data-unlink>select 出力する列名, 集合関数 from 表名 group by 列名 having 条件</pre>
<p>（group by に対する条件指定では where は使わないので注意！）</p>

<p>下の例の場合、学部ごとの平均点を求めたあと、70点以上の学部のみを出力しています。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212554.gif" alt="f:id:momoyama1192:20200908212554g:plain" title="f:id:momoyama1192:20200908212554g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h4 class="wp-block-heading">having と where の違い</h4>
<p><code>having</code> と <code>where</code> はどちらも抽出条件を定めるものですね。</p>
<p>しかし、なぜ group by を使ったときにだけ <code>where</code> を使わずに <code>having</code> を使わなければならないのでしょうか。</p>

<p>まず、<code>group by</code>, <code>where</code>, <code>having</code> の3つはそれぞれ呼び出される優先順位があり、下のようになっています。</p>
<ul class="wp-block-list dbp-list"><li>where</li><li>group by</li><li>having</li></ul>
<p>つまり、</p>
<ul class="wp-block-list dbp-list"><li><code>where</code> は <code>group by</code> の前に実行されるため、グループ化する前の元々のデータに対して絞りこみ条件を指定する</li><li><code>having</code> は <code>group by</code> の後に実行されるため、グループ化後の表に対しての絞りこみ条件を指定する</li></ul>
<p>ことになります。</p>
<p>そのため、グループ化後の表に対して条件を指定する際には、<code>where</code> ではなく <code>having</code> を使う必要があるのです。</p>

<p>逆に言うと、<code>group by</code> を使わなければ <code>having</code> も <code>where</code> も全く同じ働きをします。</p>
<p>そのため、多くの参考書では <span class="marker-yellow"><b><code>having</code> は <code>group by</code> に対して使うもの</b></span>と説明されています。</p>
<h2 class="wp-block-heading">６．集合関数の応用2（入れ子として使用）重要度：★★☆</h2>
<p>集合関数の結果を、<code>where</code> や <code>having</code> の条件として使うことができます。</p>
<p>例えば、下のように「受験一覧」から平均点以上をとっている人の行を抽出することができます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212542.gif" alt="f:id:momoyama1192:20200908212542g:plain" title="f:id:momoyama1192:20200908212542g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>集合関数を絞り込みの条件として使う際には、条件文の中にselect文を入れる必要があることに注意しましょう。</p>
<p>例えば、抽出をする際に <code>点数 &gt;= avg(点数)</code> のように<span class="marker-pink"><b>直接集合関数を用いて比較をすることはできません</b></span>。</p>

<p>入れ子を用いたSQLについては、SQLの後編（応用）で詳しく説明します。</p>
<h2 class="wp-block-heading">７．列名の付け替え (as)　重要度：★☆☆</h2>
<p><code>select 列名 from 表名</code> で列名を指定する際に、<code>as 新列名</code> とすることで、出力結果の列名を付け替えることができます。（※asは省略OK）</p>
<pre class="code" data-lang="" data-unlink>select 列名 as 新列名 from 表名
select 列名 新列名 from 表名  # as を省略</pre>
<p>下の例の場合、列名 <code>count(*)</code> を <code>合計</code> と付け加えて出力しています。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212611.gif" alt="f:id:momoyama1192:20200908212611g:plain" title="f:id:momoyama1192:20200908212611g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p><code>as</code> は上の例のように、集合関数の名前を付け替える際に使われることが多いです。</p>
<p>なお、複数の列名を指定している場合、付け替えたい列名のみに <code>as 新列名</code> を付け加えます。（asは省略OK）</p>
<p>下の例の場合、列名1と列名2をそれぞれ新列名1、新列名2と付け替えて出力をします。</p>
<pre class="code" data-lang="" data-unlink>select 列名1 as 新列名1, 列名2 as 新列名2, 列名3 from 表名</pre>
<p>名前の付け替えは、基本的にめったに出ないので「こんなことができるんだ～」程度の理解度でOKです。</p>
<h2 class="wp-block-heading">８．複数の表から結果を得る（表の結合）重要度：★★★</h2>
<p>2つ以上の表を読み込むことにより、複数の表から結果を得ることができます。</p>
<p>ただし、2つの表をくっつけるための結合条件を書く必要があります。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表1, 表2 where 結合条件</pre>
<p>例えば下の2つの表を結合させる場合、両方の表にある「学部コード」を結合条件として使います。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212558.gif" alt="f:id:momoyama1192:20200908212558g:plain" title="f:id:momoyama1192:20200908212558g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>しかし、whereで結合条件を示す際に <code>学部コード = 学部コード</code> と書いてしまうと、どっちの表の学部コードを読み込むかがわかりません。</p>
<p>そのため、読み込む表の中に同じ項目がある場合、<code>表名.列名</code> とすることで、<span class="marker-yellow"><b>どの表の列名なのかを明らかにします</b></span>。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212604.gif" alt="f:id:momoyama1192:20200908212604g:plain" title="f:id:momoyama1192:20200908212604g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>なお、列名部分を <code>*</code> としても同じ結果を得ることができます<a href="#f-90706547" name="fn-90706547" title="余談ですが、今回は学生の「学部コード」と学部の「学部コード」の列名が同じなので、重複した列名が２回出てきません（自然結合）。しかし、学生の「学部コード」と学部の「コード」のように、重複した列名になっていない場合は重複した列名が２回出てきてしまう（単結合）ので注意が必要です。">*1</a>。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生, 学部 where 学生.学部コード = 学部.学部コード</pre>
<h2 class="wp-block-heading">９．まとめ</h2>
<p>今回はSQL前編として、select文の使い方を少し応用的なところまで見ていきました。</p>
<p>最後に、今回出てきた <code>select</code>, <code>from</code>, <code>where</code>, <code>group by</code>, <code>order by</code>, <code>having</code> をどの順番で並べるか確認しましょう。</p>

<p>まず、select文を使う場合、最初に <code>select 表示させる列名 from 使う表名</code> を必ず列挙する必要があります。その後必要であれば <code>where</code>, <code>group by</code>, <code>having</code>, <code>order by</code> の順に記します。</p>
<pre class="code" data-lang="" data-unlink>select 表示させる列名 from 使う表名 where 絞り込む条件 group by グループ化させる列名 having グループ化後の抽出条件 order by ソートに使う列名 (asc/desc)</pre>

<p>次回は、表の作成、更新などの <code>select</code> 文以外のSQLを紹介します。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-90706547" name="f-90706547" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">余談ですが、今回は学生の「学部コード」と学部の「学部コード」の列名が同じなので、重複した列名が２回出てきません（自然結合）。しかし、学生の「学部コード」と学部の「コード」のように、重複した列名になっていない場合は重複した列名が２回出てきてしまう（単結合）ので注意が必要です。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database03/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第02羽　関係演算</title>
		<link>https://www.momoyama-usagi.com/entry/info-database02</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database02#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2020 04:43:38 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database02</guid>

					<description><![CDATA[今回は、データベースの中でも射影、選択、結合のような関係演算について例を踏まえながらわかりやすく説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回はデータベースで出てくる関係演算について一緒にお勉強しましょう！</p>
<p> </p>
<p>関係演算には、集合でもよく使われる</p>
<ul class="wp-block-list dbp-list"><li>和</li><li>積</li><li>差</li><li>直積</li></ul>
<p>の4つと、データベースの関係演算独自の、</p>
<ul class="wp-block-list dbp-list"><li><strong><span class="marker-yellow">選択</span></strong></li><li><strong><span class="marker-yellow">射影</span></strong></li><li><strong><span class="marker-yellow">結合</span></strong></li><li>商</li></ul>
<p>の4つがあります。</p>
<p>特に今黄色い線を引いた3つは、基本情報の試験や期末試験にも頻出する超重要な演算です。必ず覚えましょう。</p>
<p> </p>
<h2 class="wp-block-heading">１．集合演算</h2>
<p>まずは、集合演算について見ていきましょう。</p>
<h3 class="wp-block-heading">(1) 和</h3>
<p>2つの表に対して、論理和(OR)を行う演算です。</p>
<p>つまり、2つの表のうち、<strong><span class="marker-yellow">どちらか一方でも存在する行を出力</span></strong>します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230535.gif" alt="f:id:momoyama1192:20200905230535g:plain" title="f:id:momoyama1192:20200905230535g:plain" class="hatena-fotolife" itemprop="image"></p>
<h4 class="wp-block-heading">演算が成立するための条件</h4>
<p>和、積、差の計算では、以下の2つの条件がそろっていない場合、そもそも計算を行うことができません。</p>
<p> </p>
<p><strong>(a) 2つの表の項目数が異なる場合</strong></p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230541.gif" alt="f:id:momoyama1192:20200905230541g:plain" title="f:id:momoyama1192:20200905230541g:plain" class="hatena-fotolife" itemprop="image"></p>
<p><strong>(b) 2つの表の項目名が異なる場合</strong></p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230546.gif" alt="f:id:momoyama1192:20200905230546g:plain" title="f:id:momoyama1192:20200905230546g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>基本的に、<strong><span class="marker-pink">2つの表の項目が全く同じでないと演算ができない</span></strong>と思っていただけたらOKです。</p>
<h3 class="wp-block-heading">(2) 積</h3>
<p>2つの表に対して、論理積(AND)を行う演算です。</p>
<p>つまり、<strong><span class="marker-yellow">2つの表の両方に存在する行を出力</span></strong>します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230550.gif" alt="f:id:momoyama1192:20200905230550g:plain" title="f:id:momoyama1192:20200905230550g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>和演算と同じく、2つの表にある項目が全く等しいときのみ演算を行うことができます。</p>
<h3 class="wp-block-heading">(3) 差</h3>
<p>2つの表に対して、演算元にある行の中から、演算先の行にないものを出力します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230555.gif" alt="f:id:momoyama1192:20200905230555g:plain" title="f:id:momoyama1192:20200905230555g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>差の演算は、今まで紹介してきた和や積の演算と異なり、<strong><span class="marker-yellow">計算順序を変えると演算結果も変わる</span></strong>ため、注意が必要です。</p>
<p>また、和演算・差演算と同じく、2つの表にある項目が全く等しいときのみ演算を行うことができます。</p>
<h3 class="wp-block-heading">(4) 直積</h3>
<p><strong>2つの表にある項目のすべての組み合わせ</strong>を出力します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230602.gif" alt="f:id:momoyama1192:20200905230602g:plain" title="f:id:momoyama1192:20200905230602g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h2 class="wp-block-heading">２．関係演算（データベース独自）</h2>
<p>つぎに、データベース独自の関係演算について見ていきましょう。</p>
<p>ここからが超重要ですよ！</p>
<h3 class="wp-block-heading">(1) 選択</h3>
<p><strong><span class="marker-yellow">ある条件に従って特定の行を取り出す演算</span></strong>が<strong><span class="marker-green">選択</span></strong>です。</p>
<p>（条件を \( c \)、表名を \( P \) とし、\( \sigma_c (P) \) と記号で表されます。）</p>
<p>（※記号については、基本情報などの情報処理試験では出ないので覚えなくてOKです） </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230607.gif" alt="f:id:momoyama1192:20200905230607g:plain" title="f:id:momoyama1192:20200905230607g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば、上の例の場合、表Pから「部活がサッカー部の人」を行単位で出力しています。</p>
<h4 class="wp-block-heading">SQLでの選択の書き方</h4>
<p>SQLの場合、以下の青線部分が「選択演算」に相当します。（where句以降ですね。）</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125033.gif" alt="f:id:momoyama1192:20200906125033g:plain" title="f:id:momoyama1192:20200906125033g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※SQLについては第03羽で詳しく説明するので、まだわからなくてもOKです。</p>
<h3 class="wp-block-heading">(2) 射影</h3>
<p><strong><span class="marker-yellow">ある条件に従って特定の列を取り出す演算</span></strong>が<strong><span class="marker-green">射影</span></strong>です。</p>
<p>（選択する項目(列)を \( i \)、表名を \( P \) とし、\( \pi_i (P) \) と記号で表されます。） </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230613.gif" alt="f:id:momoyama1192:20200905230613g:plain" title="f:id:momoyama1192:20200905230613g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば、上の例の場合、表Pから 名前, 部活 の列を抽出し、出力しています。</p>
<h4 class="wp-block-heading">重複に注意！</h4>
<p>射影の演算では、選択する列によっては、下のように行内のすべてのデータが全く同じになってしまうことがあります。</p>
<p>この場合、全く同じデータとなるものは最初の1回だけ出力し、2回目以上は出力しません。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230620.gif" alt="f:id:momoyama1192:20200905230620g:plain" title="f:id:momoyama1192:20200905230620g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>射影演算では、重複するデータを2度以上出力しないと頭の中に入れておきましょう！</p>
<h4 class="wp-block-heading">SQLでの射影の書き方</h4>
<p>SQLの場合、以下の赤線部分が「射影」に相当します。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125038.gif" alt="f:id:momoyama1192:20200906125038g:plain" title="f:id:momoyama1192:20200906125038g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>重複データを2回以上出力しない disctinct が必要な点に注意しましょう。 </p>
<p>※SQLについては第03羽で詳しく説明します。</p>
<p> </p>
<h3 class="wp-block-heading">(3) 結合</h3>
<p><strong><span class="marker-yellow">2つの表をある共通の列を用いてくっつける演算</span></strong>が<strong><span class="marker-green">結合</span></strong>です。</p>
<p>結合演算には、</p>
<ul class="wp-block-list dbp-list"><li>等結合</li><li>自然結合</li></ul>
<p>の2つがあります。それぞれ見ていきましょう。</p>
<h4 class="wp-block-heading">(a) 等結合</h4>
<p>等結合は2つの表をある共通の列を用いて<strong><span class="marker-yellow">単純にくっつける</span></strong>演算です。</p>
<p>ただし、単純にくっつけるため、同じ意味を持った項目（ピンクの枠部分）が2つあって冗長になってしまいます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230624.gif" alt="f:id:momoyama1192:20200905230624g:plain" title="f:id:momoyama1192:20200905230624g:plain" class="hatena-fotolife" itemprop="image"></p>
<h4 class="wp-block-heading">(b) 自然結合</h4>
<p>等結合では、同じ意味を持った項目が2回出てきて冗長になってしまいます。</p>
<p>そこで、共通の列のうちの片方を削除する<a href="#f-525aa54d" name="fn-525aa54d" title="基本的に後者の列が消されることが多いです。つまり、結合元Pと結合先Qを自然結合させる場合、共通の列のうち、結合先Qの列を削除することが多いです。">*1</a>ことで<strong><span class="marker-yellow">冗長性を取り除いて結合</span></strong>したものが<strong><span class="marker-green">自然結合</span></strong>となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230630.gif" alt="f:id:momoyama1192:20200905230630g:plain" title="f:id:momoyama1192:20200905230630g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>特に指示がない限り、結合と言われたら、こちらの自然結合を表していると思っていただけたらOKです。</p>
<h4 class="wp-block-heading">(c) 結合演算の仕組み</h4>
<p>結合演算は、<strong><span class="marker-yellow">直積と選択の2つを組み合わせた</span></strong>演算です。</p>
<p>どうしてこの2つを組み合わせたら結合演算になるのかを、実際に1つ例で試すことで確認しましょう。</p>
<p><strong>Step1. 2つの表の直積を取る</strong></p>
<p>まず、2つの表の直積を求めることですべての組み合わせを求めます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230635.gif" alt="f:id:momoyama1192:20200905230635g:plain" title="f:id:momoyama1192:20200905230635g:plain" class="hatena-fotolife" itemprop="image"></p>
<p><strong>Step2. くっつけるための条件</strong></p>
<p>すべての組み合わせの中で、くっつけるための条件を満たすもの（結合元の列と結合先の列が等しい）を選択します。</p>
<p>（さらに、自然結合の場合、結合先の列を削除します。）</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230641.gif" alt="f:id:momoyama1192:20200905230641g:plain" title="f:id:momoyama1192:20200905230641g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>確かに、結合演算は直積と選択の2つで表せることを確認しましたね。</p>
<h4 class="wp-block-heading">(d) 結合の際の注意</h4>
<p>結合演算を用いる際には、結合するための列条件の書き方に注意が必要です。</p>
<p>例えば、下のP, Qの表を結合させる場合、条件で「部活=部活」と書いてしまうと、<strong><span class="marker-yellow">どちらの表にある部活なのかがわからなく</span></strong>なってしまいます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230646.gif" alt="f:id:momoyama1192:20200905230646g:plain" title="f:id:momoyama1192:20200905230646g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このように項目名が2つの表で重複してしまう場合、どの表にある項目かを「表名.項目名」の形で書く必要があります。</p>
<p>例えば、上の例の場合、条件は、</p>
<p>学生.部活 = 部.部活</p>
<p>のように明記します。</p>
<h4 class="wp-block-heading">SQLでの選択の書き方</h4>
<p>SQLの場合、以下の青線部分が「結合」に相当します。</p>
<p>直積を意識せずに書けることが特徴ですが、項目名が2つの表で重複する場合は「表名.項目名」のように<strong><span class="marker-yellow">どの表の項目であるかを明記</span></strong>する必要があります。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125047.gif" alt="f:id:momoyama1192:20200906125047g:plain" title="f:id:momoyama1192:20200906125047g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※SQLについては第03羽で詳しく説明します。</p>
<p> </p>
<h3 class="wp-block-heading">(4) 商</h3>
<p>直積を逆算したものが商となります。</p>
<p>といきなり言われてもわかりにくいと思うので、実際に1つ例で確かめてみましょう。</p>
<p> </p>
<p>例えば、下のような演算でできる表 \( R \) があります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230652.gif" alt="f:id:momoyama1192:20200905230652g:plain" title="f:id:momoyama1192:20200905230652g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>表 \( R \) は \( P \times Q \) の直積演算によってできた表ですね。</p>
<p> </p>
<p>では、逆に直積によってできた表 \( R = P \times Q \) と表 \( P \) から表 \( Q \) を求めてみましょう、というのが商 \( R \div P \) の定義です。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125053.gif" alt="f:id:momoyama1192:20200906125053g:plain" title="f:id:momoyama1192:20200906125053g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>同じように、\( R \) と \( Q \) から \( P \) を求めることもできます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125057.gif" alt="f:id:momoyama1192:20200906125057g:plain" title="f:id:momoyama1192:20200906125057g:plain" class="hatena-fotolife" itemprop="image"></p>
<h2 class="wp-block-heading">３．練習問題</h2>
<p>では、前回と同じように基本情報の問題で3問ほど練習していきましょう。</p>
<h3 class="wp-block-heading">練習1</h3>
<p>関係データベースにおいて、表から特定の列を得る操作はどれか。</p>
<p>[基本情報技術者平成22年秋期 午前問30]</p>
<p>ア：結合<br>イ：削除<br>ウ：射影<br>エ：選択</p>
<p> </p>
<h3 class="wp-block-heading">練習2</h3>
<p>関係XとYを自然結合した後、関係Zを得る関係代数演算はどれか。</p>
<p>[基本情報技術者平成30年秋期 午前問28]</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125105.gif" alt="f:id:momoyama1192:20200906125105g:plain" title="f:id:momoyama1192:20200906125105g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ア：射影と和<br>イ：選択<br>ウ：選択と射影<br>エ：選択と和</p>
<p> </p>
<h3 class="wp-block-heading">練習3</h3>
<p>関係Rと関係Sに対して、関係Xを求める関係演算はどれか。</p>
<p>[応用情報技術者平成25年秋期 午前問30]</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125101.gif" alt="f:id:momoyama1192:20200906125101g:plain" title="f:id:momoyama1192:20200906125101g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ア：IDで結合<br>イ：差<br>ウ：直積<br>エ：和</p>
<p> </p>
<h2 class="wp-block-heading">４．練習問題の答え</h2>
<h3 class="wp-block-heading">解答1</h3>
<p>解答：ウ</p>
<p>表から列を抜き出す演算は「射影」です。よって答えはウ。</p>
<p>[それぞれの選択肢]</p>
<p>ア：結合<br>→ 2つの表をくっつける演算</p>
<p>イ：削除<br>→ 関係演算ですらない。</p>
<p>ウ：射影<br>→ 表から特定の列を抜き出す演算</p>
<p>エ：選択<br>→ 表から特定の行を抜き出す演算</p>
<h3 class="wp-block-heading">解答2</h3>
<p>解答：ウ</p>
<p>まず、関係XとYを自然結合してみましょう。すると、下のような表となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906132043.gif" alt="f:id:momoyama1192:20200906132043g:plain" title="f:id:momoyama1192:20200906132043g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ここで、表Zを見てみると、</p>
<ul class="wp-block-list dbp-list"><li>学生番号2, 4の行が抽出されている（選択）</li><li>学部名、学生番号、氏名の列が抽出されている（射影）</li></ul>
<p>が行われていることがわかりますね。よって、答えはウです。</p>
<p> </p>
<p>実際に結合した表に対して、選択演算と射影演算をやってみましょう。</p>
<p>まず、選択演算を行います。すると、下のような結果となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125109.gif" alt="f:id:momoyama1192:20200906125109g:plain" title="f:id:momoyama1192:20200906125109g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>さらに射影演算を行うことで、Zを得ることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125113.gif" alt="f:id:momoyama1192:20200906125113g:plain" title="f:id:momoyama1192:20200906125113g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">解答3</h3>
<p>解答：エ</p>
<p>まず、関係R, S, Xで項目の種類、数が一致していますね。</p>
<p>そのため、集合演算の和、差、積のいずれかとなります。</p>
<p>よって、選択肢アとウが消えます。</p>
<p> </p>
<p>あとは和か差を考えるのですが、差演算であれば、計算元Rよりも結果Xのほうが行数が少なくなりますよね。（関係Rにあって関係Sにないものを出力するので、当然結果Xは関係Rよりも表の行数が減る）</p>
<p> </p>
<p>よって、答えは和のエとなります。</p>
<p>実際にRとSを和演算するとXになることを確認しましょう。</p>
<p> </p>
<h2 class="wp-block-heading">５．さいごに</h2>
<p>今回は、データベースの関係演算について説明しました。</p>
<p>関係演算を使うことで、データベース内にある表から様々な表を一時的に作り出すことができます。</p>
<p> </p>
<p>このような<strong><span class="marker-yellow">一時的に作られた仮想的な表</span></strong>のことを<strong><span class="marker-green">ビュー表</span></strong>と呼びます。</p>
<p>普段は整合性を保つために表を小分けにしておき、ユーザーに見せる際にユーザーが見やすいようにビュー表を一時的に作ることで、整合性、利便性の両立が可能となります。</p>
<p> </p>
<p>次回からは、データベースを操作するプログラミング言語SQLについて説明していきたいと思います。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-525aa54d" name="f-525aa54d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">基本的に後者の列が消されることが多いです。つまり、結合元Pと結合先Qを自然結合させる場合、共通の列のうち、結合先Qの列を削除することが多いです。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database02/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第01羽　関係データベース（主キーと外部キーの違い）</title>
		<link>https://www.momoyama-usagi.com/entry/info-database01</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database01#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 04 Sep 2020 14:32:25 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database01</guid>

					<description><![CDATA[今回はデータベースの単元に出てくる関係データベースの基本用語と、主キー、候補キー、外部キーなどの基本用語について復習していきます。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>最近忙しすぎて全然ブログを書くことに集中できていませんでしたが、久しぶりに更新をしていきたいと思います。 </p>
<p>今回から数回に分けてデータベースについて説明していきます。</p>
<p>初回となる今回は、データベースの中で一番出てくる関係データベースについて、用語などを確認しながら見ていきましょう。</p>
<h2 class="wp-block-heading">１．関係データベース (ﾘﾚｰｼｮﾅﾙﾃﾞｰﾀﾍﾞｰｽ)</h2>
<h3 class="wp-block-heading">(1) 関係データベースとは</h3>
<p>関係データベースでは、データをExcelのような<strong><span class="marker-yellow">2次元の表</span></strong>として管理します。リレーショナルデータベースと呼ぶ人もいます。</p>
<p> </p>
<p>下のような2次元の表として管理するので、我々人間にとって非常に確認をしやすいといえます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194702.gif" alt="f:id:momoyama1192:20200903194702g:plain" title="f:id:momoyama1192:20200903194702g:plain" class="hatena-fotolife" itemprop="image" width="501"></p>
<p>データベース単元では、基本的に関係データベースの操作方法、管理方法についてお勉強していきます。</p>
<p> </p>
<p> </p>
<p> </p>
<h3 class="wp-block-heading">(2) 用語紹介</h3>
<p>ここからは、関係データベースでよく出てくる単語について確認をしていきましょう。</p>
<h4 class="wp-block-heading">(a) 行と列</h4>
<p>データベースの世界では、</p>
<ul class="wp-block-list dbp-list"><li>行のことを<strong><span class="marker-green">レコード</span></strong>、タプル<br>（それぞれのデータを特定するのが行）</li><li>列のことを<strong><span class="marker-green">項目</span></strong>、フィールド、属性<br>（それぞれの項目を特定するのが列）</li><li>表のことを<strong><span class="marker-green">テーブル</span></strong></li></ul>
<p>と呼ぶこともあります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194707.gif" alt="f:id:momoyama1192:20200903194707g:plain" title="f:id:momoyama1192:20200903194707g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">(3) 関係データベースとスキーマ</h3>
<p>データベースに格納されているデータの種類を表したものをスキーマといいます。</p>
<p> </p>
<p>関係データベースの場合、2次元の表の「テーブル名と項目」を格納したものがスキーマ<a href="#f-7bac0155" name="fn-7bac0155" title="関係データベースのスキーマのことを関係スキーマと呼ぶ人もいます。">*1</a>となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200904083855.gif" alt="f:id:momoyama1192:20200904083855g:plain" title="f:id:momoyama1192:20200904083855g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、データベースの試験の場合、データベース内に格納されているデータは関係スキーマの形で表されることが多いです。さらに、</p>
<p>表名 ( 項目名1, 項目名2, 項目名3, … )</p>
<p>と省略した形で書かれることが基本です。</p>
<p> </p>
<p>例えば、上の学生一覧だと、関係スキーマの省略形は、</p>
<p>学生一覧 (学生番号, 氏名, 部活)</p>
<p>となります。</p>
<h2 class="wp-block-heading">２．主キー</h2>
<h3 class="wp-block-heading">(1) 主キーとは</h3>
<p><strong><span class="marker-yellow">この列を見れば、必ず各データを特定することができる！</span></strong>という列のことを<strong><span class="marker-green">主キー</span></strong>と呼びます。</p>
<p>言われてもわかりにくいと思うので、先ほどの表で確認しましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194711.gif" alt="f:id:momoyama1192:20200903194711g:plain" title="f:id:momoyama1192:20200903194711g:plain" class="hatena-fotolife" itemprop="image" width="531"></p>
<p>この表には、学生番号、氏名、部活の3つの項目があります。</p>
<p> </p>
<p>学生番号は、必ず<strong><span class="marker-yellow">各個人で異なり</span></strong>ますよね<a href="#f-49947bae" name="fn-49947bae" title="同じ番号になる人がいないように振られてます">*2</a>。そのため、学生番号は主キーです。</p>
<p>別に氏名でも各個人特定できるじゃん。と思った方もいると思います。しかし、運悪く同姓同名の人が入ってしまうことが考えられるので、各データを特定することはできません<a href="#f-a89b1210" name="fn-a89b1210" title="部活で各データを特定するのは絶対無理です。それぞれの部活に入っている人は1人とは限らないからです。というか、それぞれの部活に1人しか入れなかったら野球部とかどうするんですか。">*3</a>。</p>
<p> </p>
<p>主キーとなる項目は、<strong><span class="marker-yellow">学生番号、受験番号、社員番号などの個人を特定する番号番号(ID)</span></strong>がほとんどです。</p>
<h3 class="wp-block-heading">(2) 主キーに選ばれる項目の条件</h3>
<p>主キーは、各個人を1つに特定できるような項目でなければなりません。</p>
<p>そのために、以下の2つの条件が課されます。</p>
<ul class="wp-block-list dbp-list"><li><strong><span class="marker-yellow">データが一意</span></strong>であること（<strong><span class="marker-yellow">重複するデータがない</span></strong>こと）<br>→ 同じデータが2つ以上あるとデータを1つに特定できません</li><li><strong><span class="marker-yellow">NULLではない</span></strong>こと（<strong><span class="marker-yellow">値が設定されていないデータがない</span></strong>こと）<br>→ データが空だと、当然特定をすることができません。例えば、答案用紙に受験番号を忘れると、だれの答案用紙かわかりませんよね。</li></ul>
<h3 class="wp-block-heading">(3) 主キーの組み合わせ・複合キー</h3>
<p>1つの項目だけではデータを特定できないけど、2つ以上の項目を組みあわせれば1つに特定できる場合があります。</p>
<p>このように、<strong><span class="marker-yellow">複数の項目を組みあわせて主キーとしたもの</span></strong>を<strong><span class="marker-green">複合キー</span></strong>と呼びます。</p>
<p> </p>
<p>例えば学校の組ごとに出席番号が振られているとします。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194715.gif" alt="f:id:momoyama1192:20200903194715g:plain" title="f:id:momoyama1192:20200903194715g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このとき、出席番号だけを主キーにしてしまうと、どの組（or 学年）かわかりません。</p>
<p> </p>
<p>しかし、学年、組、番号の3つがすべて異なればほかの人と重複することはありませんね。</p>
<p>そのため、「学年、組、番号」の3つの項目を組みあわせて主キーとして組み合わせれば各個人を特定できる複合キーとなりますね。</p>
<h3 class="wp-block-heading">(4) 主キーになるかも・候補キー</h3>
<p>主キーとなりうる項目、つまり<strong><span class="marker-yellow">データを1つに特定できる項目</span></strong>のことを<strong><span class="marker-green">候補キー</span></strong>と呼びます。</p>
<p>データを特定できる項目（候補キー）が2つ以上ある場合、<strong><span class="marker-yellow">特定できる列の中から1つを選び</span></strong>、主キーとします。</p>
<p> </p>
<p>例えば、下の表のように学生番号と（試験のとき用に使った）受験番号が両方入っているとしましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194719.gif" alt="f:id:momoyama1192:20200903194719g:plain" title="f:id:momoyama1192:20200903194719g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>学生番号は、学校の中で個人（それぞれの行）を識別するための番号なので、当然各個人を識別することができるデータだといえます。</p>
<p>今回は学生番号を主キーとしたいと思います。</p>
<p> </p>
<p>同じく、受験番号も受験する人の中で個人を識別するための番号なので、各個人を識別できます。</p>
<p> </p>
<p>そのため、候補キーは学生番号、受験番号の2つとなりますね。</p>
<p>（すでに特定に使っている主キーも候補キーに入るので注意）</p>
<p> </p>
<p>なお、候補キーの中で、主キーとして使っていないキーのことを代替キーと呼びます。</p>
<p> </p>
<p> </p>
<div class="box27" style="box-sizing: border-box; margin: 1em 0px; padding: 0.5em 1em; border: 3px solid #008000; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', YuGothic, 'Yu Gothic', Verdana, Meiryo, sans-serif; font-size: 16px; vertical-align: baseline; max-width: 640px; position: relative; color: #333333; letter-spacing: 0px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span class="box-title" style="box-sizing: border-box; margin: 0px; padding: 0px 9px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; font-stretch: inherit; line-height: 25px; font-size: 16px; vertical-align: middle; position: absolute; display: inline-block; top: -27px; left: -3px; height: 27px; background: #008000; color: #ffffff;">主キーで覚えるべき用語</span>
<p>主キー：各データを1通りに特定することができる項目（列）</p>
<p>複合キー：複数の項目を主キーとすることで各データを1通りに特定することができる項目</p>
<p>候補キー：主キーとなりうる候補となる項目</p>
<p> </p>
<p>主キーとなる項目にかけられる制約</p>
<ul class="wp-block-list dbp-list"><li>データが一意であること（重複するデータがないこと）</li><li>データが空ではないこと</li></ul>
</div>
<p> </p>
<h2 class="wp-block-heading">３．外部キー</h2>
<h3 class="wp-block-heading">(1) 外部キーとは</h3>
<p>関係データベースでは、複数の表同士を対応付ける場面が出てきます。その際、<strong><span class="marker-yellow">どのデータを使って表を対応づけるか</span></strong>を決める必要があります。</p>
<p> </p>
<p>例えば、下の2つの表があるとします。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194723.gif" alt="f:id:momoyama1192:20200903194723g:plain" title="f:id:momoyama1192:20200903194723g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> 下のように学生一覧にある部活IDから、部活一覧にあるIDを対応付けることで、各個人の部活を特定することができますね。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194727.gif" alt="f:id:momoyama1192:20200903194727g:plain" title="f:id:momoyama1192:20200903194727g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このように、<strong><span class="marker-yellow">ほかの表の主キーを参照することで、表と表を対応付ける項目（列）</span></strong>のことを<strong><span class="marker-green">外部キー</span></strong>と呼びます。</p>
<h3 class="wp-block-heading">(2) 外部キーに選ばれる項目の条件</h3>
<p>外部キーは、ほかの表へ参照するために必要なため、<strong><span class="marker-pink">外部キーとなる項目は、参照先の項目の列内に存在する値しか設定できない</span></strong>という制限があります。</p>
<p>この制限のことを<strong><span class="marker-yellow">参照制約</span></strong>と呼びます。</p>
<h3 class="wp-block-heading">(3) 最初から表をくっつけたらいいのでは？</h3>
<p>わざわざ表を分けて外部キーまで設定しなくても、最初から下のように表をくっつけたらいいじゃんと思った人もいると思います。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194702.gif" alt="f:id:momoyama1192:20200903194702g:plain" title="f:id:momoyama1192:20200903194702g:plain" class="hatena-fotolife" itemprop="image" width="531"></p>
<p>しかし、このように表をくっつけて管理してしまうと、1つ問題が発生してしまいます。</p>
<p> </p>
<p>こちらが分けた後の表なのですが、分ける前の表には「サッカー部」や「帰宅部」の存在がありませんよね。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194723.gif" alt="f:id:momoyama1192:20200903194723g:plain" title="f:id:momoyama1192:20200903194723g:plain" class="hatena-fotolife" itemprop="image" p=""></p>
<p>このように、表をくっつけて管理してしまうと、だれも<strong><span class="marker-yellow">所属していない部</span></strong><a href="#f-05790033" name="fn-05790033" title="現実的にはあまりありませんが、新しくできた部活だと誰もいないということはあるかもしれません。">*4</a><strong><span class="marker-yellow">の存在が消えてしまう</span></strong>という問題があります</p>
<p>また、「かるた部」が「競技かるた部」のように名前を変えた場合、部活一覧表と分けて管理していた場合は、<strong><span class="marker-lightskyblue">部活一覧の部分を1か所変えるだけ</span></strong>で済みます。しかし、くっつけて管理していた場合は「かるた部」に<strong><span class="marker-pink">所属する人の部活全員をいちいち「競技かるた部」に変えなければ</span></strong>ならず、結構しんどいです。</p>
<p> </p>
<p>そのため、データベースではデータに矛盾が生じたり、管理をなるべく楽にするために適切に表を分けることで最適化をします。</p>
<p>この表を分ける操作のことを<strong><span class="marker-yellow">正規化</span></strong>と呼びます。正規化は、データベースの試験で頻出する項目なのでまた分けて紹介したいと思います。</p>
<p> </p>
<p> </p>
<div class="box27" style="box-sizing: border-box; margin: 1em 0px; padding: 0.5em 1em; border: 3px solid #008000; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', YuGothic, 'Yu Gothic', Verdana, Meiryo, sans-serif; font-size: 16px; vertical-align: baseline; max-width: 640px; position: relative; color: #333333; letter-spacing: 0px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span class="box-title" style="box-sizing: border-box; margin: 0px; padding: 0px 9px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; font-stretch: inherit; line-height: 25px; font-size: 16px; vertical-align: middle; position: absolute; display: inline-block; top: -27px; left: -3px; height: 27px; background: #008000; color: #ffffff;">外部キーで覚えるべき用語</span>
<p>外部キー：各データを1通りに特定することができる項目（列）</p>
<p> </p>
<p>外部キーとなる項目にかけられる制約</p>
<ul class="wp-block-list dbp-list"><li>参照先の項目の列内に存在する値以外は登録できない（参照制約）</li></ul>
</div>
<p> </p>
<h2 class="wp-block-heading">４．インデックス</h2>
<h3 class="wp-block-heading">(1) インデックスとは</h3>
<p>データベースには、大量のデータが記録されています。そんな大量のデータを、やみくもに上から下へ順番にデータを検索する（線形探索を行う）と非常に時間がかかってしまいます。</p>
<p> </p>
<p>そこで、<strong><span class="marker-yellow">データがどこにあるのかを表す目次</span></strong>をつけてあげます。この目次のことを<strong><span class="marker-green">インデックス</span></strong>と呼びます。</p>
<p>インデックスをつけることで、探したいデータがデータベース中のどこにあるのかをすぐ見つけることができるので、検索効率、速度のアップを行うことができます。</p>
<p> </p>
<h3 class="wp-block-heading">(2) インデックスがあまり有効ではない例</h3>
<p>ただし、インデックスを用意するだけで必ず速度が上がるとは限りません。</p>
<p> </p>
<p>データベースの中身を追加、削除を行うと当然場所が変わるので、目次の内容も書き換えないといけません。</p>
<p>そのため、<strong><span class="marker-yellow">頻繁に書き換わるデータに対しては、書き換えるたびに目次も書き換える必要が出てくるため、効率、速度がかえって落ちてしまいます</span></strong>。</p>
<p> </p>
<p>インデックスが有効な例は、以下の2つを満たすときが条件です。</p>
<ul class="wp-block-list dbp-list"><li>データベース内にあるデータが大量にあるとき</li><li>データベース内のデータの追加、削除があまり起こらない場合</li></ul>
<p> </p>
<h2 class="wp-block-heading">５．練習問題</h2>
<p>では、3問ほど練習していきましょう。</p>
<h3 class="wp-block-heading">練習1</h3>
<p>関係データベースの主キーの性質として適切なものはどれか。</p>
<p>[基本情報技術者平成21年秋期 午前問32]</p>
<p>ア：主キーとした列に対して検索条件を指定しなければ、行の検索はできない。<br>イ：数値型の列を主キーに指定すると、その列は算術演算の対象としては使えない。<br>ウ：一つの表の中に、主キーの値が同じ行が複数存在することはない。<br>エ：複数の列からなる主キーを構成することはできない。</p>
<h3 class="wp-block-heading">練習2</h3>
<p>関係データベースの主キー制約の条件として、キー値が重複していないことの他に、主キーを構成する列に必要な条件はどれか。</p>
<p>[基本情報技術者平成25年秋期 午前問30]</p>
<p>ア：キー値が空でないこと<br>イ：構成する列が一つであること<br>ウ：表の先頭に定義されている列であること<br>エ：別の表の候補キーとキー値が一致していること</p>
<p> </p>
<h3 class="wp-block-heading">練習3</h3>
<p>関係データベースにおいて、外部キ一定義を行う目的として、適切なものはどれか。</p>
<p>[基本情報技術者平成23年特別 午前問34]</p>
<p>ア：関係する相互のテーブルにおいて、レコード間の参照一貫性が維持される制約をもたせる。</p>
<p>イ：関係する相互のテーブルの格納場所を近くに配置することによって、検索、更新を高速に行う。</p>
<p>ウ：障害によって破壊されたレコードを、テーブル間の相互の関係から可能な限り復旧させる。<br>エ：レコードの削除、追加の繰返しによる、レコード格納エリアの虫食い状態を防止する。</p>
<p> </p>
<h2 class="wp-block-heading">６．練習問題の答え</h2>
<h3 class="wp-block-heading">解答1</h3>
<p>解答：ウ</p>
<p>ア：主キーとした列に対して検索条件を指定しなければ、行の検索はできない。<br>→ そんなことはありません。</p>
<p>イ：数値型の列を主キーに指定すると、その列は算術演算の対象としては使えない。<br>→ 主キーだろうが演算の対象として使えます。</p>
<p>ウ：一つの表の中に、主キーの値が同じ行が複数存在することはない。<br>→ 正解。</p>
<p>エ：複数の列からなる主キーを構成することはできない。<br>→ できる。複合キーのこと。</p>
<h3 class="wp-block-heading">解答2</h3>
<p>解答：ア</p>
<p>主キーになるための2つの条件を必ず覚えておきましょう。</p>
<ul class="wp-block-list dbp-list"><li>キー値が重複していないこと</li><li>キー値が空でないこと</li></ul>
<h3 class="wp-block-heading">解答3</h3>
<p>解答：ア</p>
<p>外部キーは、参照一貫性を保つために参照先の項目の列内に存在する値しか登録できないようにするのでしたね。</p>
<p>よって答えはア。</p>
<p> </p>
<h2 class="wp-block-heading">７．さいごに</h2>
<p>今回は関係データベースの基本用語（主キー、外部キー、候補キーなど）について説明していきました。</p>
<p>次回は、関係データベース内で使われる演算について確認していきましょう。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-7bac0155" name="f-7bac0155" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">関係データベースのスキーマのことを関係スキーマと呼ぶ人もいます。</span></p>
<p class="footnote"><a href="#fn-49947bae" name="f-49947bae" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">同じ番号になる人がいないように振られてます</span></p>
<p class="footnote"><a href="#fn-a89b1210" name="f-a89b1210" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">部活で各データを特定するのは絶対無理です。それぞれの部活に入っている人は1人とは限らないからです。というか、それぞれの部活に1人しか入れなかったら野球部とかどうするんですか。</span></p>
<p class="footnote"><a href="#fn-05790033" name="f-05790033" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">現実的にはあまりありませんが、新しくできた部活だと誰もいないということはあるかもしれません。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database01/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるソフトウェア工学　Part05　ER図</title>
		<link>https://www.momoyama-usagi.com/entry/info-software05</link>
					<comments>https://www.momoyama-usagi.com/entry/info-software05#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sun, 12 Jul 2020 04:00:00 +0000</pubDate>
				<category><![CDATA[ソフトウェア工学]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-software05</guid>

					<description><![CDATA[ソフトウェア工学やデータベースに出てくるER図の読み方、書き方や多重度の読み方、ER図から実際にデータベースのテーブルを作る方法について説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回は、データベースの論理設計で使われるER図について説明します。</p>
<p>具体的には、</p>
<ul class="wp-block-list dbp-list"><li>ER図の読み方</li><li>多重度の説明、読み方</li><li>ER図から実際にテーブルを作成する方法</li></ul>
<p> の3つについて説明しています。</p>
<p> </p>

<p> </p>
<p>前回のソフトウェア工学に関する記事はこちら！</p>
<p><cite class="hatena-citation"><a href="https://www.momoyama-usagi.com/entry/info/software04">www.momoyama-usagi.com</a></cite></p>
<h2 class="wp-block-heading">１．なぜER図が必要なのか</h2>
<p>何かしらのデータを格納するデータベースを設計するとします。</p>
<p>しかし、いきなりデータベースの構造や仕様<a href="#f-163b477c" name="fn-163b477c" title="データベースがどんなデータを格納するかの構造、仕様を定めたものをスキーマと呼びます。なんだか難しそうに聞こえますが、">*1</a>を設計するのはかなり難しいです。</p>
<p> </p>
<p>そこで、「データベース上でデータをどうやって管理するか」を決める論理設計の前に、<strong><span class="marker-yellow">現実の世界をどのようにしてデータベース内に構築するか</span></strong>を決める<strong><span class="marker-green">概念設計</span></strong>を行います。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203238.gif" alt="f:id:momoyama1192:20200726203238g:plain" title="f:id:momoyama1192:20200726203238g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<p>この概念設計の際によく使われるのが<strong><span class="marker-yellow">ER図（ERD、実体管理図）</span></strong>なのです！</p>
<p>（実際には、ER図を書く前に、管理するデータに矛盾や重複が発生しないように正規化を行います。正規化の仕方については<a href="https://www.momoyama-usagi.com/entry/info/database/seikika">こちら</a>から。）</p>
<p> </p>
<p>次の章からは、ER図の読み方、書き方について説明していきます。</p>
<p> </p>
<h2 class="wp-block-heading">２．ER図の設計例</h2>
<p>ER図では、人間が他のものと区別してする<strong><span class="marker-yellow">実体（エンティティ）</span></strong>と実体同士の相互関係を表す<strong><span class="marker-green">関連（リレーション）</span></strong>の2つを使って、データの構造を図に表します。</p>
<p>（※基本情報などの情報処理試験でER図の問題が出てくるとき、なぜかエンティティやリレーションのようなカタカナ表記で出てくることが多いので、カタカナ表記も頭に入れておくことを強くおすすめします。）</p>
<p> </p>
<p>ER図の書き方には、様々な書き方があります。</p>
<p>今回は、ER図の元祖であるPeter Chen記法と、実世界や試験でもよく使われるIE記法の2つをメインに説明したいと思います。</p>
<h3 class="wp-block-heading">(1) Peter Chen記法</h3>
<p>Peter Chen記法では、以下のような記号を用いて属性、実体、関連を表します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203101.gif" alt="f:id:momoyama1192:20200726203101g:plain" title="f:id:momoyama1192:20200726203101g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>実際にER図を用いてデータの構造を表したものが下となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203050.gif" alt="f:id:momoyama1192:20200726203050g:plain" title="f:id:momoyama1192:20200726203050g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>早速、このER図の意味を読み取っていきましょう。</p>
<p> </p>
<h4 class="wp-block-heading">(i) 実体と属性</h4>
<p>まず、実体と属性の関係を見てみましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203105.gif" alt="f:id:momoyama1192:20200726203105g:plain" title="f:id:momoyama1192:20200726203105g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば実体「学生」には、「学生番号」、「所属」、「名前」という3つの属性がありますね。</p>
<p>このように、<strong><span class="marker-yellow">実体が持つ性質を抽出していき、属性としていく</span></strong>ことで実体と属性を抽出することができます。</p>
<p> </p>
<p>もし、C言語を書いたことがある人は「構造体の名前」が実体、「構造体のメンバ（構造体の中にあるそれぞれの変数）」が属性と考えるとわかりやすいかもしれません。</p>
<h4 class="wp-block-heading">(ii) 実体と関連</h4>
<p>次に、実体と関連の関係を見てみましょう。</p>
<p>下の図は、学生と科目には「履修」という相互関係があることを示しています。</p>
<p>このように、2つの実体をひし形で挟むことにより、関連があることを示すことができます。<img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203111.gif" alt="f:id:momoyama1192:20200726203111g:plain" title="f:id:momoyama1192:20200726203111g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ここで、ひし形の横にNとMというよくわからないものが書かれていると思った人もいるかもしれません。</p>
<p>このNやMは、多重度と呼ばれ、それぞれの実体が何個の関連を持つかを表しています。</p>
<h4 class="wp-block-heading">(iii) 関連に属性を持たせる</h4>
<p>実体に属性を持たせることができることは先ほど説明しました。</p>
<p>同じようにして、<strong><span class="marker-yellow">関連にも属性を持たせることができます</span></strong>。</p>
<p> </p>
<p>例えば、下の図の場合、関連「履修」に属性「成績」を持たせていることが読み取れます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203117.gif" alt="f:id:momoyama1192:20200726203117g:plain" title="f:id:momoyama1192:20200726203117g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">(2) IE記法 (Crow's Foot)</h3>
<p>IE記法では、以下のような記号を用いて属性、実体、関連を表します。</p>
<p>実体と属性を1つにまとめて書くのがポイントです。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203056.gif" alt="f:id:momoyama1192:20200726203056g:plain" title="f:id:momoyama1192:20200726203056g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※紫色で示されている記号 <img src="https://knooto.info/img/page/20200223190753.png" alt="" style="max-width: 100%; height: auto; vertical-align: middle; border: 0px; color: #2c2c2c; font-family: sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-style: initial; text-decoration-color: initial;"> が鳥の足に見えるのでCrow's Feet（カラスの足）記法とも言われます</p>
<p>※多重度の読み方が少し特殊なので、後程説明したいと思います。</p>
<p> </p>
<p> </p>
<p>実際にIE記法を用いて先程Peter Chen記法で出てきたデータの構造を表したものが下となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203046.gif" alt="f:id:momoyama1192:20200726203046g:plain" title="f:id:momoyama1192:20200726203046g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>Peter Chen記法で出てきた<strong><span class="marker-yellow">「属性を持っている関連」もエンティティ（実体）とみなして記述</span></strong>するのがポイントです<a href="#f-cddfcbbb" name="fn-cddfcbbb" title="IE記法では属性を書かないため、属性を持っている関連がある場合にはこのように実体とみなして記述する必要がある。">*2</a>。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203225.gif" alt="f:id:momoyama1192:20200726203225g:plain" title="f:id:momoyama1192:20200726203225g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h2 class="wp-block-heading">３．多重度（カーディナリティ）</h2>
<p>ER図では、それぞれの実体が何個関連を持つのかを<strong><span class="marker-green">多重度（カーディナリティ）</span></strong>という形で表します。</p>
<p>（多重度の考え方はクラス図と同じです。）</p>
<p> </p>
<p>ER図で出てくる多重度には、「1対1」、「1対多(1対N)」、「多対多(N対M)」の3種類があります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727004954.gif" alt="f:id:momoyama1192:20200727004954g:plain" title="f:id:momoyama1192:20200727004954g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<p>ここからは、3つの対応関係「1対1」、「1対多(1対N)」、「多対多(N対M)」がどのような意味なのかを説明していきます。</p>
<h3 class="wp-block-heading">(1) 1対1</h3>
<p>1対1とは、<strong><span class="marker-yellow">どちらの実体からももう一方の実体を一意に特定できる状態</span></strong>のことを表します。</p>
<p>専属の家庭教師のような関係が「1対1」です。</p>
<p> </p>
<p>例えば、下のような教員と学生の関係があるとします。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727004958.gif" alt="f:id:momoyama1192:20200727004958g:plain" title="f:id:momoyama1192:20200727004958g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>この場合、</p>
<ul class="wp-block-list dbp-list"><li>ある1人の教員は、1人の学生を指導する<br>（つまり、教員が分かれば指導している学生も一意に特定できる）</li><li>ある1人の学生は、1人の教員に指導してもらう<br>（つまり、学生がわかれば指導してもらっている教員も一意に特定できる）</li></ul>
<p>ことがわかります。</p>
<p> </p>
<p>余談ですが、今の日本の結婚制度は一夫一妻制、つまり1人の夫に対して1人の妻が、1人の妻に対して1人の夫と結婚する「1対1」の結婚関係を結ぶ制度になっていますね。</p>
<h3 class="wp-block-heading">(2) 1対多</h3>
<p>1対多とは、<strong><span class="marker-yellow">ある一方の実体Aからもう一方の実体Bを一意に特定することはできるが、もう一方の実体Bからは実体Aを一意に特定することができない状態</span></strong>です。</p>
<p>学校や塾（個別指導を除く）の「先生」と「学生」のような関係が「1対多」です。</p>
<p> </p>
<p>例えば、下のような教員と学生の関係があるとします。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727005002.gif" alt="f:id:momoyama1192:20200727005002g:plain" title="f:id:momoyama1192:20200727005002g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>この場合、</p>
<ul class="wp-block-list dbp-list"><li>ある1人の教員は、たくさんの学生を指導する<br>（つまり、教員が分かっても指導している学生がたくさんいるため、一意に特定できない）</li><li>ある1人の学生は、1人の教員に指導してもらう<br>（つまり、学生がわかれば指導してもらっている教員も一意に特定できる）</li></ul>
<p>ことがわかります。</p>
<p> </p>
<p>余談ですが、一部の国の結婚制度は一夫多妻制、つまり1人の夫に対してたくさん（0人以上）の妻が、1人の妻に対して1人の夫と結婚する「1対多」の結婚関係を結ぶ制度になっていますね。</p>
<p>（もちろん一妻多夫制でも「1対多」の結婚関係になります。）</p>
<h3 class="wp-block-heading">(3) 多対多</h3>
<p>多対多とは、<strong><span class="marker-yellow">ある一方の実体Aからもう一方の実体Bを一意に特定することはできないし、逆に実体Bから実体Aも一意に特定することができない状態</span></strong>です。</p>
<p> </p>
<p>例えば、下のような教員と学生の関係があるとします。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727005007.gif" alt="f:id:momoyama1192:20200727005007g:plain" title="f:id:momoyama1192:20200727005007g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>この場合、</p>
<ul class="wp-block-list dbp-list"><li>ある1人の教員は、たくさんの学生を指導する<br>（つまり、教員が分かっても指導している学生がたくさんいるため、一意に特定できない）</li><li>ある1人の学生も、たくさんの教員に指導してもらう<br>（つまり、学生が分かっても指導してもらっている教員がたくさんいるため、一意に特定できない）</li></ul>
<p>ことがわかります。</p>
<p> </p>
<p>余談ですが、多夫多妻制、つまり1人の夫に対してたくさん（0人以上）の妻が、1人の妻に対してたくさんの夫と結婚する「多対多」の結婚関係を結ぶ制度がある国はない気がします。人間ではなく他の動物ならあったかもしれませんが。</p>
<h3 class="wp-block-heading">他の記法での多重度の書き方</h3>
<p>Peter Chen記法以外のERで「1対1」、「1対多」、「多対多」を記述する方法をまとめました。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203156.gif" alt="f:id:momoyama1192:20200726203156g:plain" title="f:id:momoyama1192:20200726203156g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※ IE記法での多重度の書き方は、下のほうでより詳しく説明します。</p>
<h2 class="wp-block-heading">４．IE記法での多重度の書き方</h2>
<p>IE記法では、多重度を書く際に1やNのような数字や変数を使わず、専用の記号が使われます。</p>
<p>基本的には、</p>
<ul class="wp-block-list dbp-list"><li>0（〇を書く）</li><li>1（ | を書く）</li><li>たくさん（&lt;か&gt;を書く<a href="#f-e141a8a6" name="fn-e141a8a6" title="左側の関連で使う場合は &amp;gt; を、右側の関連で使う場合は &amp;lt; を書きます。">*3</a>）</li></ul>
<p>の3つの基本表記が使われます。</p>
<p> </p>
<p>ただし、IE記法では0を含むか含まないかを厳密に書くために基本表記の記号を2つ組み合わせた下のような多重度の表記が使われることが多いです。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203220.gif" alt="f:id:momoyama1192:20200726203220g:plain" title="f:id:momoyama1192:20200726203220g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<p>IE記法で多重度を表した例が下の図となります。</p>
<p>（Twitterのアカウント、ツイート、投稿画像の関係をIE記法でまとめたものです。）</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203230.gif" alt="f:id:momoyama1192:20200726203230g:plain" title="f:id:momoyama1192:20200726203230g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※本来は画像は4枚まで投稿できるのですが、IE記法の説明のために1枚までにしています。</p>
<p> </p>
<h2 class="wp-block-heading">５．多重度とリレーションスキーマの導出</h2>
<p>（ここからはソフトウェア工学というよりはデータベースに関するお話になります。）</p>
<p>多重度を把握することで、ER図からリレーションスキーマ（テーブルを何個用意し、それぞれのテーブルに何を格納するか）を決めることができます。</p>
<p> </p>
<p>ここでは、「1対1」、「1対多」、「多対多」それぞれの関連からリレーションスキーマを決める方法について説明します。</p>
<h3 class="wp-block-heading">(1) 1対1のとき</h3>
<p>1対1の関係の例としてTwitterにおける「ユーザー」と「プロフィール」の関係を例にし説明します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203144.gif" alt="f:id:momoyama1192:20200726203144g:plain" title="f:id:momoyama1192:20200726203144g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>まず、</p>
<ul class="wp-block-list dbp-list"><li>ユーザーの属性（ユーザーID、アカウント名、パスワード）を保存するテーブル</li><li>プロフィールの属性（プロフィールID、本文）を保存するテーブル</li></ul>
<p>の2つを作ります。</p>
<p> </p>
<p>1対1の場合、次に2つのテーブルをリンク（関連付け）させるために2つのテーブルのどちらか（もしくは両方）に<a href="#f-08378723" name="fn-08378723" title="どちらの実体からももう一方の実体を一意に特定できるので。">*4</a>、もう一方の主キー属性<a href="#f-ef53d80b" name="fn-ef53d80b" title="テーブル内の行を一意に識別できる属性のこと。IDや番号が用いられることが多い。">*5</a>となる属性を追加します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203150.gif" alt="f:id:momoyama1192:20200726203150g:plain" title="f:id:momoyama1192:20200726203150g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>今回の例の場合、</p>
<ul class="wp-block-list dbp-list"><li>テーブル「プロフィール」にユーザーIDを追加</li><li>テーブル「ユーザー」にプロフィールIDを追加</li></ul>
<p>することで2つのテーブルをリンクさせることができます。</p>
<p> </p>
<p>なお、上のように2つのテーブルをリンクさせるために追加した他の表の主キーのことを<strong><span class="marker-green">外部キー</span></strong>と呼びます。</p>
<p>（プロフィール内にある「ユーザーID」もしくはユーザー内にある「プロフィールID」が外部キーとなります。）</p>
<h3 class="wp-block-heading">(2) 1対多のとき</h3>
<p>1対多の関係の例としてTwitterにおける「ユーザー」と「ツイート」の関係を例にし説明します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203134.gif" alt="f:id:momoyama1192:20200726203134g:plain" title="f:id:momoyama1192:20200726203134g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>まず、</p>
<ul class="wp-block-list dbp-list"><li>ユーザーの属性（ユーザーID、アカウント名、パスワード）を保存するテーブル</li><li>ツイートの属性（ツイートID、ツイート本文）を保存するテーブル</li></ul>
<p>の2つを作ります。</p>
<p> </p>
<p>1対多の場合、ある一方の実体Aからもう一方の実体Bを一意に特定することはできるが、<strong><span class="marker-pink">実体Bからは実体Aを一意に特定することができない状態</span></strong>でしたね。</p>
<p> </p>
<p>そのため、次に2つのテーブルをリンク（関連付け）させるために、<strong><span class="marker-yellow">多の方（今回の場合はリレーション）に</span></strong>1の方の主キー属性となる属性を追加します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203140.gif" alt="f:id:momoyama1192:20200726203140g:plain" title="f:id:momoyama1192:20200726203140g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、関連づけのために追加した属性は外部キーとなります。上の例の場合、テーブル「ツイート」にあるユーザーIDが外部キーとなります。</p>
<p> </p>
<p>（間違えて1の方に主キー属性を追加すると、多の実体（今回の場合はツイート）を一意に特定することができないため、テーブルをリンクすることができない。）</p>
<h3 class="wp-block-heading">(3) 多対多のとき</h3>
<p>多対多の関係の例として先程出てきた「学生」と「科目」の関係を例にし説明します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203124.gif" alt="f:id:momoyama1192:20200726203124g:plain" title="f:id:momoyama1192:20200726203124g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>まず、</p>
<ul class="wp-block-list dbp-list"><li>学生の属性（学生番号、所属、名前）を保存するテーブル</li><li>科目の属性（科目番号、科目名）を保存するテーブル</li></ul>
<p>の2つを作ります。</p>
<p> </p>
<p>多対多の場合、ある一方の実体Aからもう一方の実体Bを<strong><span class="marker-pink">一意に特定することはできない</span></strong>し、逆に実体Bから実体Aも<strong><span class="marker-pink">一意に特定することができない</span></strong>状態でしたね。</p>
<p> </p>
<p>そのため、1対1や1対多のように「別のテーブルの主キー属性となる属性」を追加するだけでは、2つのテーブルをリンクすることができません。</p>
<p>（多対多の場合、一意に特定ができないため、リンクができない）</p>
<p> </p>
<p>そこで、<strong><span class="marker-yellow">関連（履修）を保存する新たなテーブルを作り</span></strong>、合計3つのテーブルとします。</p>
<p> </p>
<p>3つ目のテーブルに、2つのテーブルの主キー（学生番号、科目番号）を追加し、さらに履修が持っている属性（成績）も追加することで、学生と科目の2つのテーブルをリンクさせることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726203129.gif" alt="f:id:momoyama1192:20200726203129g:plain" title="f:id:momoyama1192:20200726203129g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>（3つ目の表を作り、無理やり「学生と履修」の1対多の関係、「履修と科目」の多対1の関係を作ることで多対多の関係を「1対多」か「多対1」に分解していると思ってください。）</p>
<p> </p>
<p>なお、関連づけるためにテーブル「履修」に追加した「学生」と「成績」は外部キーとなります。</p>
<p>多対多の場合、<strong><span class="marker-yellow">外部キーが少なくとも2つ必要</span></strong>な点に注意が必要です。</p>
<p> </p>
<p> </p>
<p> </p>
<h2 class="wp-block-heading">６．少し特殊な記法</h2>
<p>ER図で使われる特殊な記法</p>
<ul class="wp-block-list dbp-list"><li>弱実体</li><li>汎化関係</li></ul>
<p>について確認しておきましょう。</p>
<p>（基本情報では出ないのでスキップしてOKです。）</p>
<h3 class="wp-block-heading">(1) 弱実体</h3>
<p>結ばれている関連自体が消滅すると同時に消える実体であることを強調する場合には、実体の枠を2重線で書きます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726235859.gif" alt="f:id:momoyama1192:20200726235859g:plain" title="f:id:momoyama1192:20200726235859g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>クラス図でいうコンポジションがほぼ同じような働きを持っています。</p>
<p> </p>
<p>ただし、弱実体にするためには関連の消滅と同時に実体も消滅するようにするために、もう一方の実体が持っている主キーの属性（上の場合は科目の主キーの属性）を追加する必要があります。</p>
<p> </p>
<h3 class="wp-block-heading">(2) 継承</h3>
<p>ある上位の実体の具体的な例を下位の実体と考えます。</p>
<p>このとき、下位の実体が上位の実体の属性を引き継いで使う機能のことを継承と呼び、下のような記号であらわされます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727001811.gif" alt="f:id:momoyama1192:20200727001811g:plain" title="f:id:momoyama1192:20200727001811g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>継承を行うことで、下位の実体は改めて属性を定義することなく、上位の実体の属性を使うことができます。</p>
<p>ただし、上位の実体の属性を追加するために、上位の実体が持っている主キーの属性を下位の実体にも追加する必要があります。</p>
<p>（例えば味噌ラーメンの例であれば、ラーメンが持っている主キーの属性を味噌ラーメンにも追加することで継承を実現できます。）</p>
<p> </p>
<p>（継承は、オブジェクト指向にも出てくる重要な概念なので頭に入れておきましょう。）</p>
<h2 class="wp-block-heading">７．練習問題</h2>
<p>では、基本情報や応用情報の午前の問題でER図に関する知識を復習しましょう。</p>
<h3 class="wp-block-heading">練習1</h3>
<p>ER図の説明のうち、適切なものはどれか。</p>
<p>[基本情報技術者平成24年秋期 午前問26]</p>
<p>ア：エンティティタイプ間には、1対多、多対多などのリレーションシップがある。<br>イ：エンティティタイプ間の関連は、参照側から被参照側への方向の矢印線で表現する。<br>ウ：エンティティタイプには属性をもたせないで、リレーションシップタイプに属性をもたせる。<br>エ：エンティティタイプの中に関連先のエンティティ名を記述することによって、リレーションシップを表す。</p>
<h3 class="wp-block-heading">練習2</h3>
<p>ER図に関する記述として、適切なものはどれか。</p>
<p>[基本情報技術者平成24年春期 午前問28]</p>
<p>ア：関係データベースの表として実装することを前提に作成する。<br>イ：業務で扱う情報をエンティティ及びエンティティ間のリレーションシップとして表現する。<br>ウ：データの生成から消滅に至るデータ操作を表現できる。<br>エ：リレーションシップは、業務上の手順を表現する。</p>
<h3 class="wp-block-heading">練習3</h3>
<p>顧客は一般に複数の銀行に預金するものとして、顧客と銀行の関連を、E-R図で次のように表現する。このモデルを関係データベース上に"銀行"表、"口座"表、"顧客"表として実装する場合の記述として、適切なものはどれか。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727005012.gif" alt="f:id:momoyama1192:20200727005012g:plain" title="f:id:momoyama1192:20200727005012g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>[応用情報技術者平成22年春期 午前問29]</p>
<p>ア："銀行"表から"口座"表へのカーディナリティは多対1である。 <br>イ："銀行"表中に参照制約を課した外部キーがある。 <br>ウ："口座"表から"顧客"表へのカーディナリティは1対多である。 <br>エ："口座"表には二つ以上の外部キーがある。</p>
<p> </p>
<h2 class="wp-block-heading">８．練習問題の答え</h2>
<h3 class="wp-block-heading">解答1</h3>
<p>解答：ア</p>
<p>[それぞれの選択肢ごとの解説]</p>
<p>ア：エンティティタイプ間には、1対多、多対多などのリレーションシップがある<br>→ 正しい。他にも「1対1」のリレーションシップもある。</p>
<p>イ：エンティティタイプ間の関連は、参照側から被参照側への方向の矢印線で表現する。<br>→ 誤り。矢印線ではなく、ただの線。</p>
<p>ウ：エンティティタイプには属性をもたせないで、リレーションシップタイプに属性をもたせる。<br>→ 誤り。エンティティタイプも属性は持たせている。（というかエンティティタイプをメインに属性を持たせている。）</p>
<p>エ：エンティティタイプの中に関連先のエンティティ名を記述することによって、リレーションシップを表す。<br>→ 誤り。リレーションシップは2つのエンティティを線で結ぶことで表す。</p>
<h3 class="wp-block-heading">解答2</h3>
<p>解答：イ</p>
<p>[それぞれの選択肢ごとの解説]</p>
<p>ア：関係データベースの表として実装することを前提に作成する。<br>→ 引っ掛け選択肢。確かにER図は関係データベースの表として実装することが多いが、<strong><span class="marker-pink">前提ではない！！</span></strong></p>
<p>イ：業務で扱う情報をエンティティ及びエンティティ間のリレーションシップとして表現する。<br>→ 大正解。</p>
<p>ウ：データの生成から消滅に至るデータ操作を表現できる。<br>→ 誤り。これはDFDの説明。DFDについては<a href="https://www.momoyama-usagi.com/entry/info/software04">こちら</a>の記事をご覧ください。</p>
<p>エ：リレーションシップは、業務上の手順を表現する。<br>→ 誤り。リレーションシップは、エンティティ同士の相互関係を表す。</p>
<h3 class="wp-block-heading">解答3</h3>
<p>解答：エ</p>
<p>銀行と顧客の関係は多対多なので、関係データベース上に実装する際には、銀行と顧客の表だけでなく、2つの主キーを格納した顧客の表も実装する必要がある。</p>
<p>（銀行と顧客をリンクさせるために2つの主キーを格納した別の表を用意する必要がある）</p>
<p> </p>
<p>具体的には、</p>
<ul class="wp-block-list dbp-list"><li>銀行の表（属性：銀行の主キー、…）</li><li>顧客の表（属性：顧客の主キー、…）</li><li>口座の表（属性：銀行の主キー、顧客の主キー、…）</li></ul>
<p>の3つの表が必要。</p>
<p> </p>
<p>ここで、銀行と口座、口座と銀行のカーディナリティを調べる。（選択肢アとウの正誤を確認するために）</p>
<p>3つの表の関係をIE記法（っぽい）ER図で書くと、下のようになる。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200727010308.gif" alt="f:id:momoyama1192:20200727010308g:plain" title="f:id:momoyama1192:20200727010308g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>よって、銀行と口座は「1対多」の関係に、口座と銀行は「多対1」の関係になる。</p>
<p> </p>
<p>ここで、選択肢を見ていこう。</p>
<p>[それぞれの選択肢]</p>
<p>ア："銀行"表から"口座"表へのカーディナリティは多対1である。<br>→ 1対多の間違い。</p>
<p>イ："銀行"表中に参照制約を課した外部キーがある。<br>→ 間違い。外部キー（表と表を関連づけるために他の表の主キーを参照する列のこと）は銀行ではなく、"口座" 表中にある。</p>
<p>ウ："口座"表から"顧客"表へのカーディナリティは1対多である。<br>→ 多対1の間違い。</p>
<p>エ："口座"表には二つ以上の外部キーがある。<br>→ 正しい。銀行と顧客の2つの表を関連づけるまえに銀行の主キー、顧客の主キーと最低でも2つ以上の外部キーを用意する必要があるため。</p>
<p> </p>
<h2 class="wp-block-heading">９．さいごに</h2>
<p>今回は、データベースの論理設計で使われるER図について説明しました。</p>
<p>どちらかというとソフトウェア工学というよりはデータベースの記事でしたね…。</p>
<p> </p>
<p>ちなみに、Part07で説明する「クラス図」はER図の拡張版みたいなものなので、ER図を頭に入れておくことでクラス図の理解が少し楽になるかもしれません。</p>
<p> </p>
<p>次回は、オブジェクト指向についての説明をしていきたいと思います。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-163b477c" name="f-163b477c" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">データベースがどんなデータを格納するかの構造、仕様を定めたものをスキーマと呼びます。なんだか難しそうに聞こえますが、</span></p>
<p class="footnote"><a href="#fn-cddfcbbb" name="f-cddfcbbb" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">IE記法では属性を書かないため、属性を持っている関連がある場合にはこのように実体とみなして記述する必要がある。</span></p>
<p class="footnote"><a href="#fn-e141a8a6" name="f-e141a8a6" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">左側の関連で使う場合は &gt; を、右側の関連で使う場合は &lt; を書きます。</span></p>
<p class="footnote"><a href="#fn-08378723" name="f-08378723" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">どちらの実体からももう一方の実体を一意に特定できるので。</span></p>
<p class="footnote"><a href="#fn-ef53d80b" name="f-ef53d80b" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">テーブル内の行を一意に識別できる属性のこと。IDや番号が用いられることが多い。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-software05/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
