<?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>データベース | ビズドットオンライン</title>
	<atom:link href="https://it-biz.online/tag/%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-biz.online</link>
	<description></description>
	<lastBuildDate>Fri, 28 Feb 2025 03:05:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://it-biz.online/wp-content/uploads/2019/10/cropped-4a332f05ade4ac7bb3c46c472cb5eac8-32x32.png</url>
	<title>データベース | ビズドットオンライン</title>
	<link>https://it-biz.online</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>排他制御の基本：悲観ロックと楽観ロックを３分でわかりやすく</title>
		<link>https://it-biz.online/it-skills/exclusion-control/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 20 Jun 2024 12:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9323</guid>

					<description><![CDATA[「排他制御」は主にデータベース関連の処理に関する文脈で使われる用語で、同じデータを複数のユーザーやプロセスが同時に変更しようとしたときに起こる問題を防ぐための仕組みです。 例えば２人が同じドキュメントを同時に編集しようと [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「排他制御」は主にデータベース関連の処理に関する文脈で使われる用語で、<strong>同じデータを複数のユーザーやプロセスが同時に変更しようとしたときに起こる問題を防ぐ</strong>ための仕組みです。</p>



<p>例えば２人が同じドキュメントを同時に編集しようとすると、変更が競合してデータが壊れてしまいますよね。これを避けるために用いられるのが排他制御で、適切な排他制御を導入することで安全なデータベース利用が可能になります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ザックリいえば、同時に複数の人が同じデータに対して更新をしないようにデータに<strong>ロック</strong>をかけましょう！というのが「排他処理」です。</p>
</div></div>



<p>排他制御は大きく以下の２通りあります。ここではそれぞれどのような仕組みで排他制御を実現しているのか？という観点で１からわかりやすく初心者向けにご説明します。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th><strong>ロックの種類</strong></th><th><strong>説明</strong></th><th><strong>適用場面</strong></th></tr></thead><tbody><tr><td><strong>楽観ロック (Optimistic Locking)</strong></td><td>データの競合が少ないと仮定し、データの読み取りと書き込みの間にロックをかけず、<strong>更新時に競合が発生した場合にのみ処理をリトライ</strong>する方法。</td><td>データの更新が比較的少なく、読み取りが多いシナリオ</td></tr><tr><td><strong>悲観ロック (Pessimistic Locking)</strong></td><td>データの競合が発生する可能性が高いと仮定し、<strong>データの読み取り時点でロック</strong>をかけて、他のトランザクションがそのデータにアクセスできないようにする方法。</td><td>競合が頻繁に発生するシナリオや、データの一貫性が非常に重要な場面</td></tr></tbody></table></div></figure>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">楽観ロック (Optimistic Locking) とは？</a><ol><li><a href="#toc2" tabindex="0">楽観ロックの動作原理</a></li><li><a href="#toc3" tabindex="0">楽観ロックの具体例</a></li></ol></li><li><a href="#toc4" tabindex="0">悲観ロック (Pessimistic Locking) とは？</a><ol><li><a href="#toc5" tabindex="0">悲観ロックの動作原理</a></li><li><a href="#toc6" tabindex="0">悲観ロックの具体例</a></li></ol></li><li><a href="#toc7" tabindex="0">悲観ロックと楽観ロックの実装例</a><ol><li><a href="#toc8" tabindex="0">楽観ロック（Optimistic Lock）</a></li><li><a href="#toc9" tabindex="0">悲観ロック（Pessimistic Lock）</a></li></ol></li><li><a href="#toc10" tabindex="0">悲観ロックと楽観ロック：どちらを選ぶべきか？</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">楽観ロック (Optimistic Locking) とは？</span></h2>



<p>楽観ロックは、「<strong>他の人が同時にデータを使うことは少ないだろう</strong>」と考えてデータを扱う方法です。簡単に言うと、楽観ロックはデータの変更が同時に起きることをあまり心配せずに進めるけど、最後に問題がないかチェックする仕組みです。</p>



<h3 class="wp-block-heading"><span id="toc2">楽観ロックの動作原理</span></h3>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>データの読み取り</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">まず、データを読み取るときにそのデータのバージョンや変更された時間を記録します。これは「データがこの時点でどうなっているか」を覚えておくためです。</li>
</ul>
</li>



<li><strong>データの変更</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">次に、データを変更します。この時点では他の誰かも同じデータを変更しているかもしれないと考えますが、<strong>気にせずに変更を進めます。</strong></li>
</ul>
</li>



<li><strong>データの更新前のチェック</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">データをデータベースに保存する前に、最初に記録したバージョンや変更された時間と、現在のデータのバージョンや時間を比べます。
<ul class="wp-block-list">
<li><strong><span class="bold-blue">バージョンが同じ</span></strong>→他の誰もその間にデータを変更していないことが確認できるので、変更を保存。</li>



<li><strong><span class="bold-red">バージョンが異なる</span></strong>→他の誰かがそのデータを変更したことが分かるので、今回の変更は失敗とみなします。再度データを読み取り直して、もう一度最初からやり直し。</li>
</ul>
</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading"><span id="toc3">楽観ロックの具体例</span></h3>



<p><span class="badge-green">シナリオ</span>　<strong>オンラインショッピング</strong></p>



<p><strong>背景</strong>: オンラインショッピングサイトで商品を購入する場合を考えます。このサイトでは在庫管理のために楽観ロックを使っていることとします。</p>



<ol class="wp-block-list is-style-numeric-list-step has-list-style">
<li><strong>データの読み取り</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">あなたがサイトにアクセスして、欲しい商品を選択。この時点で在庫情報が<strong>10個</strong>存在することと<strong>現在の時間</strong>を記録しておきます。</li>
</ul>
</li>



<li><strong>データの変更</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">商品をカートに入れ、10個全部の購入手続きを進めます。（クレジットカード情報を入力し配送先の確認などを行うイメージ。）この間、他のユーザーも同じ商品を購入しようとしていますが、あなたは特に気にせず手続きを進めます。</li>
</ul>
</li>



<li><strong>データの更新前のチェック</strong>
<ul class="wp-block-list">
<li>最後に「購入」ボタンを押したときにシステムで再度在庫を確認します。
<ul class="wp-block-list">
<li><strong><span class="bold-blue">在庫がまだ10個ある場合</span></strong>→システムは他の誰もこの商品を購入していないことを確認。これにより、あなたの購入手続きを完了し、「購入が成功しました」と表示。</li>



<li><strong><span class="bold-red">在庫が変わっている場合（例えば、8個に減っている場合）</span></strong>→システムは、他の誰かがその間に商品を購入したことを検出します。この場合、システムは「在庫が不足しています」と表示し、あなたの購入手続きをやり直すように求めます。</li>
</ul>
</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このように楽観ロックは、データの競合が少ないことを前提として処理を進め、最後に一貫性を確認する方法です。システムはデータの更新時にだけ問題をチェックするので、全体的なパフォーマンスが向上しますが、競合が発生した場合には再試行が必要となるデメリットがあります。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">悲観ロック (Pessimistic Locking) とは？</span></h2>



<p>悲観ロックは、「他の人が同時にデータを使う可能性が高いから、今使っている間は他の人が触らないようにしよう」と考えてデータを扱う方法です。簡単に言うと、悲観ロックはデータを使うときにしっかりと鍵をかけて、誰もそのデータに触れないようにする仕組みです。</p>



<h3 class="wp-block-heading"><span id="toc5">悲観ロックの動作原理</span></h3>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>データの読み取り時にロックをかける</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">データを読み取るときに、そのデータに「鍵」をかけます。これにより、他の人はそのデータを使えなくなります。</li>
</ul>
</li>



<li><strong>データの変更</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">鍵をかけた状態でデータを変更。<strong>誰もそのデータにアクセスできないので、安心して変更</strong>可能。</li>
</ul>
</li>



<li><strong>トランザクションの終了</strong>
<ul class="wp-block-list">
<li>変更が終わり、トランザクションが完了したら鍵を外す。→これで他の人が再びそのデータを使えるようになる。</li>
</ul>
</li>
</ol>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/db-transaction/">トランザクションとは？</a></p>



<h3 class="wp-block-heading"><span id="toc6">悲観ロックの具体例</span></h3>



<p><span class="badge-green">シナリオ</span>　<strong>オンラインデータベースのレコード編集</strong></p>



<ol class="wp-block-list is-style-numeric-list-step has-list-style">
<li><strong>データの読み取り時にロックをかける</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">会社のデータベースで顧客情報を編集しようとする場合に悲観ロックを採用しているとします。この場合顧客情報を読み取ると同時にその情報にロックをかけます。これにより、他の社員はその顧客情報を編集できなくなります。</li>
</ul>
</li>



<li><strong>データの変更</strong>
<ul class="wp-block-list">
<li>顧客情報を更新します(例えば、住所を変更したり連絡先を追加したり）。この間、他の社員はその顧客情報を編集しようとすると、「他の人が編集中です」と表示され、待つことになります。</li>
</ul>
</li>



<li><strong>トランザクションの終了</strong>
<ul class="wp-block-list">
<li>あなたが編集を終えて変更を保存します。すると、ロックが解除され、他の社員もその顧客情報を編集できるようになります。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このように悲観ロックは<strong>データを使っている間に他の人がそのデータにアクセスできないようにする方法</strong>です。データの競合が頻繁に発生する場合や、データの一貫性が非常に重要な場合に使われます。</p>
</div></div>



<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>悲観ロックと楽観ロックの違い</strong></p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th><strong>ロックの種類</strong></th><th><strong>説明</strong></th><th><strong>適用場面</strong></th></tr></thead><tbody><tr><td><strong>楽観ロック (Optimistic Locking)</strong></td><td>データの競合が少ないと仮定し、データの読み取りと書き込みの間にロックをかけず、<strong>更新時に競合が発生した場合にのみ処理をリトライ</strong>する方法。</td><td>データの更新が比較的少なく、読み取りが多いシナリオ</td></tr><tr><td><strong>悲観ロック (Pessimistic Locking)</strong></td><td>データの競合が発生する可能性が高いと仮定し、<strong>データの読み取り時点でロック</strong>をかけて、他のトランザクションがそのデータにアクセスできないようにする方法。</td><td>競合が頻繁に発生するシナリオや、データの一貫性が非常に重要な場面</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading"><span id="toc7">悲観ロックと楽観ロックの実装例</span></h2>



<p>ここからは「楽観ロック」と「悲観ロック」について再度振り返りつつ、より具体的にその実装例をお示します。</p>



<h3 class="wp-block-heading"><span id="toc8">楽観ロック（Optimistic Lock）</span></h3>



<p><strong>概要</strong><br>楽観ロックは、「データが他のトランザクションによって変更される可能性は低い」と仮定し、ロックをかけずに更新を試みます。競合が発生した場合のみエラーを出して処理をやり直します。</p>



<p><strong>メリット</strong></p>



<ul class="wp-block-list">
<li>ロックを使用しないため、パフォーマンスに優れる</li>



<li>競合が少ない環境では効率的に動作</li>
</ul>



<p><strong>デメリット</strong></p>



<ul class="wp-block-list">
<li>競合が頻発すると、更新のリトライが発生し、処理が遅くなる</li>



<li>競合時に例外処理を適切に実装する必要がある</li>
</ul>



<h4 class="wp-block-heading">SQLを使った楽観ロックの例</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">UPDATE products 
SET stock = stock - 1, version = version + 1 
WHERE id = 1 AND version = 3;
</pre>



<p>このSQLでは、<span class="blue"><code>version</code> </span>列を利用して競合チェックを行います。もし <code>version = 3</code> のレコードが他のトランザクションで変更されていた場合、この <code>UPDATE</code> は影響を与えず、更新されません（つまり競合が発生したことを示す）。</p>



<h4 class="wp-block-heading">Java（JPA/Hibernate）を使った楽観ロックの例</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import jakarta.persistence.*;

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private int stock;
    
    @Version // 楽観ロックのためのバージョン管理
    private int version;

    // getter, setter
}

public void updateStock(EntityManager entityManager, Long productId) {
    entityManager.getTransaction().begin();
    
    Product product = entityManager.find(Product.class, productId);
    product.setStock(product.getStock() - 1);
    
    entityManager.getTransaction().commit();
}
</pre>



<p>ここでは <code><span class="blue">@Version</span></code> アノテーションを使い、バージョン管理を行っています。<br>もし <code><span class="blue">commit()</span></code> する前に他のトランザクションが <span class="blue"><code>Product</code> </span>を更新していた場合、<code><span class="blue">OptimisticLockException</span></code> がスローされ、更新が失敗します。</p>



<p><strong>例外処理の実装例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public void updateStockWithRetry(EntityManager entityManager, Long productId) {
    int retryCount = 3;

    for (int i = 0; i &lt; retryCount; i++) {
        try {
            entityManager.getTransaction().begin();
            Product product = entityManager.find(Product.class, productId);
            product.setStock(product.getStock() - 1);
            entityManager.getTransaction().commit();
            return;
        } catch (OptimisticLockException e) {
            entityManager.getTransaction().rollback();
            System.out.println("競合発生。リトライ " + (i + 1));
        }
    }
    throw new RuntimeException("更新に失敗しました");
}
</pre>



<p>このように <code>OptimisticLockException</code> をキャッチして、一定回数リトライすることで、楽観ロックによる競合が発生した際の対処を行います。</p>



<h3 class="wp-block-heading"><span id="toc9">悲観ロック（Pessimistic Lock）</span></h3>



<p><strong>概要</strong><br>悲観ロックは、「データが他のトランザクションによって変更される可能性がある」と考え、最初にロックを取得する方式です。更新対象のデータに排他ロックをかけ、他のプロセスが更新できないようにします。</p>



<p><strong>メリット</strong></p>



<ul class="wp-block-list">
<li>データ競合が頻発する場合に適している</li>



<li>データの一貫性を高く維持できる</li>
</ul>



<p><strong>デメリット</strong></p>



<ul class="wp-block-list">
<li>ロックの保持時間が長くなるとパフォーマンスに悪影響</li>



<li>デッドロックのリスクがある</li>
</ul>



<h4 class="wp-block-heading">SQLを使った悲観ロックの例（MySQL）</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">START TRANSACTION;
SELECT * FROM products WHERE id = 1 FOR UPDATE; -- レコードに排他ロック
UPDATE products SET stock = stock - 1 WHERE id = 1;
COMMIT;
</pre>



<p>このSQLでは <code><span class="blue">FOR UPDATE</span></code> を使用して、<code><span class="blue">id = 1</span></code> のレコードに排他ロックをかけています。他のトランザクションがこのレコードを更新しようとすると、現在のトランザクションが終了するまで待たされます。</p>



<h4 class="wp-block-heading">Java（JPA/Hibernate）を使った悲観ロックの例</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import jakarta.persistence.*;

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private int stock;

    // getter, setter
}

public void updateStock(EntityManager entityManager, Long productId) {
    entityManager.getTransaction().begin();
    
    Product product = entityManager.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);
    product.setStock(product.getStock() - 1);
    
    entityManager.getTransaction().commit();
}
</pre>



<p><code><span class="blue">LockModeType.PESSIMISTIC_WRITE</span></code> を指定すると、対象のエンティティに対して排他ロックが取得されます。これにより、他のトランザクションが同じ <code>Product</code> を更新しようとするとブロックされます。</p>



<h2 class="wp-block-heading"><span id="toc10">悲観ロックと楽観ロック：どちらを選ぶべきか？</span></h2>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>悲観ロック</th><th>楽観ロック</th></tr></thead><tbody><tr><td>競合の頻度</td><td>高頻度な競合に強い</td><td>低頻度な競合に向いている</td></tr><tr><td>パフォーマンス</td><td>低め（ロックによる待機）</td><td>高め（ロック不要）</td></tr><tr><td>データの一貫性</td><td>高い（競合なし）</td><td>競合時はリトライが必要</td></tr><tr><td>実装の容易さ</td><td>シンプル（ロックを取るだけ）</td><td>競合処理の実装が必要</td></tr></tbody></table></div></figure>



<ul class="wp-block-list">
<li><strong>悲観ロックが適しているケース</strong>
<ul class="wp-block-list">
<li>銀行の口座取引など、データの厳密な一貫性が求められる場面</li>



<li>更新競合が頻繁に発生し、リトライ処理が過負荷になる場合</li>
</ul>
</li>



<li><strong>楽観ロックが適しているケース</strong>
<ul class="wp-block-list">
<li>競合がほぼ発生しないシステム（ユーザーごとの個別設定データなど）</li>



<li>大量のトランザクションが発生するが、競合が少ない場合</li>
</ul>
</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<ul class="wp-block-list">
<li><strong>悲観ロック</strong> は「競合することを前提」に排他制御を行い、確実なデータ更新を保証するが、パフォーマンスの問題がある。</li>



<li><strong>楽観ロック</strong> は「競合しないことを前提」に高速に処理できるが、競合が起こるとリトライが必要。</li>
</ul>



<p>上記の実装方法を理解し、システムの特性に応じて適切なロック方式を選択することが重要です。</p>
</div></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>データベースとは？初心者向け完全ガイド｜基本概念から種類までを1分でわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/database/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 30 May 2022 12:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=6411</guid>

					<description><![CDATA[データベースとは、コンピュータ上でデータを効率的 かつ 整理された方法で保存・管理するシステムのことを指します。 データベースという概念が誕生する前は「〇〇の情報が知りたいなら東京にいく」「■■が知りたいなら大阪に行く」 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>データベースとは、<strong>コンピュータ上でデータを効率的 かつ 整理された方法で保存・管理するシステムのこと</strong>を指します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>IT初心者向けにわかりやすく説明すると「<strong><span class="marker-under">あらゆる情報が整理されている収納箱</span></strong>」のようなものと言えます。</p>
</div></div>



<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="583" height="579" src="https://it-biz.online/wp-content/uploads/2023/03/image-3.png" alt="データベースとは" class="wp-image-6871" style="width:437px;height:434px" srcset="https://it-biz.online/wp-content/uploads/2023/03/image-3.png 583w, https://it-biz.online/wp-content/uploads/2023/03/image-3-300x298.png 300w, https://it-biz.online/wp-content/uploads/2023/03/image-3-500x497.png 500w, https://it-biz.online/wp-content/uploads/2023/03/image-3-200x200.png 200w, https://it-biz.online/wp-content/uploads/2023/03/image-3-150x150.png 150w" sizes="(max-width: 583px) 100vw, 583px" /><figcaption class="wp-element-caption">図1：データベースとは？</figcaption></figure>



<p>データベースという概念が誕生する前は「〇〇の情報が知りたいなら東京にいく」「■■が知りたいなら大阪に行く」といったように、補完されている場所も形式もバラバラで、一元的な管理が行えませんでした。</p>



<p><strong>そこで必要なデータを決められた形式で保持するための仕組みとして考えだされたのがデータベース。</strong></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>システムエンジニアの世界では "<strong>D</strong>ata<strong>B</strong>ase" の頭文字をとって「DB」と呼ぶのが一般的。</p>
</div></div>



<p>このページでは、IT初心者向けに「データベースとは何か？」を１からわかりやすく解説します</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-hand-o-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li><strong>データベースとは？</strong>
<ul class="wp-block-list">
<li>データベースの成り立ち</li>
</ul>
</li>



<li><strong>データベースの種類</strong>
<ul class="wp-block-list">
<li>リレーショナルデータベース</li>



<li>階層型データベース</li>



<li>ネットワーク型データベース</li>
</ul>
</li>
</ul>
</div>
</div></div>



<p>プログラマーやシステムエンジニアを目指す方であれば、<strong><span class="marker-under">知らないと恥ずかしい超・基本知識の１つ</span></strong>。是非最後までご覧ください。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">データベースとは</a><ol><li><a href="#toc2" tabindex="0">データベースの役割</a></li><li><a href="#toc3" tabindex="0">データベースの例</a></li></ol></li><li><a href="#toc4" tabindex="0">データベースの種類</a><ol><li><a href="#toc5" tabindex="0">リレーショナルデータベース</a></li><li><a href="#toc6" tabindex="0">階層型データベース</a></li><li><a href="#toc7" tabindex="0">ネットワーク型データベース</a></li></ol></li><li><a href="#toc8" tabindex="0">【まとめ】データベースとは？</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">データベースとは</span></h2>



<p>冒頭でも簡単にご説明した通り、データベースは一言で説明すると「<strong>様々なデータを決まった形で整理して集めたもの</strong>」「<strong>それを実現するための仕組み</strong>」です。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="583" height="579" src="https://it-biz.online/wp-content/uploads/2022/05/image-25.png" alt="データベースとは わかりやすく" class="wp-image-6414" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-25.png 583w, https://it-biz.online/wp-content/uploads/2022/05/image-25-300x298.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-25-500x497.png 500w, https://it-biz.online/wp-content/uploads/2022/05/image-25-200x200.png 200w, https://it-biz.online/wp-content/uploads/2022/05/image-25-150x150.png 150w" sizes="(max-width: 583px) 100vw, 583px" /><figcaption class="wp-element-caption">【再掲】図1：データベースのイメージ</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「<strong>様々なデータを決まった形で整理して集めたもの</strong>」「<strong>それを実現するための仕組み</strong>」－。</p>



<p>この定義に当てはまるものは基本的にデータベースと呼んでOK。</p>
</div></div>



<p>ただし、このページではより実践的に「<strong>システム</strong>」「<strong>IT</strong>」の世界における「データベース」の意味や特徴に焦点を当てて解説していきます。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>広義の意味での「データベース」</strong>
<ul class="wp-block-list">
<li>定義：一定の基準や体系に従って集められ、整理・格納された情報やデータの集まり。</li>



<li>例：図書館（物理的な本や資料の集合）、成績表（学生の成績データの集合）、アルバム（写真の集合）など。</li>



<li>特徴：物理的・電子的問わず、情報やデータを一元的に集約・保管している場所やシステム全般を指す。</li>
</ul>
</li>



<li><strong>システムの世界での「データベース」</strong>
<ul class="wp-block-list">
<li>定義：<strong><span class="marker-under">コンピュータシステム上で動作し、データの保存、検索、更新、削除などを効率的に行うためのソフトウェアやシステム</span></strong>。<br>→データの持続性、整合性、並行アクセスのサポートなどの機能を持つ。</li>



<li>例：Oracle、MySQL、PostgreSQL、MongoDBなどの<a href="https://it-biz.online/it-skills/dbms/">データベース管理システム（DBMS）</a>。</li>



<li>特徴：通常、特定のクエリ言語（例：<a href="https://it-biz.online/it-skills/sql/">SQL</a>）を使用してデータにアクセスし、データの整合性やセキュリティを保ちながら、高速にデータを処理することが可能。</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading"><span id="toc2">データベースの役割</span></h3>



<p>IT / システムの文脈のおける「データベース」。その主な目的は、複数のデータを一元的に保存し、必要なデータを簡単に検索・取得・追加・更新・削除することができるようにすること。これにより、企業や組織が効率的に情報を扱うことができます。</p>



<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">データベースの主な役割</div>
<ul class="wp-block-list">
<li><span class="fz-20px">データの<strong><span class="bold-red"><span class="bold-blue">保存</span></span></strong></span><br>→情報を整理してコンピュータ上に保存する</li>



<li><span class="fz-20px">データの<strong><span class="bold-red"><span class="bold-blue">検索</span></span><span class="fz-20px"><span class="bold">/</span></span><span class="bold-red"><span class="bold-blue">取得</span></span></strong></span><br>→特定の条件に一致するデータを見つけ出し取得する</li>



<li><span class="fz-20px">データの<strong><span class="bold-red"><span class="bold-blue">追加</span></span><span class="bold">/</span><span class="bold-red"><span class="bold-blue">更新</span></span><span class="bold">/</span><span class="bold-red"><span class="bold-blue">削除</span></span></strong></span><br>→新しいデータを追加したり既存のデータを更新・削除する</li>
</ul>
</div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">Tips：データベースの歴史</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>補足としてデータベースの成り立ち・歴史を簡単にご説明したいと思います。</p>
</div></div>



<p>データベースという用語はDoD (Department of Defense = <strong>米国国防省</strong>) で誕生しています。アメリカ国内で散在していた様々な軍事情報を一か所に集め、<strong><span class="marker-under">そこを見れば国内すべての軍事情報をすべて把握できるようにしたのがデータベース</span></strong>の起源です。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="786" height="453" src="https://it-biz.online/wp-content/uploads/2022/05/image-26.png" alt="データベースのイメージ" class="wp-image-6415" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-26.png 786w, https://it-biz.online/wp-content/uploads/2022/05/image-26-300x173.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-26-500x288.png 500w, https://it-biz.online/wp-content/uploads/2022/05/image-26-768x443.png 768w" sizes="(max-width: 786px) 100vw, 786px" /><figcaption class="wp-element-caption">図2：データベースのイメージ</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>データベースという概念が誕生する前は、〇〇の情報を知りたいなら□□の図書館へ・・・△△の情報を知りたいなら●●の大学へ・・・・と情報収集するにも膨大な労力が必要でした。もっと言うと、そもそもあまり「情報」「データ」というものが今ほど重要視されていなかった時代に、情報の重要性を認識しその必要性に応じて誕生したのが「データベース」です。</p>
</div></div>



<p>散在している情報を１か所に集積し、決まった形で管理・保持することで、必要な情報を素早く収集することが可能にしたい！　→これが "データベース" の起源です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">データベースの例</span></h3>



<p>データベースはシステムの世界に限らず実は様々な場面で利用されています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>広い意味で言うと、電話帳やアドレス帳、クラスの生徒名簿など、決まった形でデータが集められているのでデータベースの例と言えます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="757" height="209" src="https://it-biz.online/wp-content/uploads/2022/05/image-27.png" alt="データベース 例" class="wp-image-6416" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-27.png 757w, https://it-biz.online/wp-content/uploads/2022/05/image-27-300x83.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-27-500x138.png 500w" sizes="(max-width: 757px) 100vw, 757px" /><figcaption class="wp-element-caption">図3：データベースの例</figcaption></figure>
</div></div>



<p>我々はこのように様々な場面でデータベースを活用していることが分かります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>もしデータベースがなかったら、〇〇さんの電話番号が知りたい！思っても、過去のメモなどを頑張って探したり、知っている人に聞いたりしないといけません。</p>



<p>同じようにシステムの世界でも、決まったデータを決まった形で整理・保持しておくことは、システムの効率性を高めるうえで非常に重要なことなのです。</p>
</div></div>



<p>では、コンピュータの世界ではどのようにデータを管理・整理しているのでしょうか。次に、コンピュータ内部におけるデータ保持形式の違いに着目してデータベースを分類して解説します。</p>



<h2 class="wp-block-heading"><span id="toc4">データベースの種類</span></h2>



<p>データベースは、どのような形でデータを保持するか？という観点で見た際、以下の３種類に分類することができます。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">３種類のデータベース</span></div><div class="tab-caption-box-content block-box-content box-content">
<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="303" src="https://it-biz.online/wp-content/uploads/2022/05/image-28-1024x303.png" alt="データベース 種類" class="wp-image-6417" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-28-1024x303.png 1024w, https://it-biz.online/wp-content/uploads/2022/05/image-28-300x89.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-28-500x148.png 500w, https://it-biz.online/wp-content/uploads/2022/05/image-28-768x227.png 768w, https://it-biz.online/wp-content/uploads/2022/05/image-28-800x237.png 800w, https://it-biz.online/wp-content/uploads/2022/05/image-28.png 1264w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">図4：データベースの分類</figcaption></figure>



<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li><strong><span class="fz-20px">リレーショナルデータベース</span></strong><br>⇒エクセルのように表形式でデータを保存する</li>



<li><strong><span class="fz-20px">階層型データベース</span></strong><br>⇒ツリー状にデータを保存する</li>



<li><strong><span class="fz-20px">ネットワーク型データベース</span></strong><br>⇒データを相互に関連付けて保存する</li>
</ul>
</div>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここでは、代表的な３つのデータベースを見ていきながら、データベースのイメージを深めていきましょう。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc5">リレーショナルデータベース</span></h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="457" height="343" src="https://it-biz.online/wp-content/uploads/2022/05/image-29.png" alt="リレーショナルデータベース わかりやすく" class="wp-image-6418" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-29.png 457w, https://it-biz.online/wp-content/uploads/2022/05/image-29-300x225.png 300w" sizes="(max-width: 457px) 100vw, 457px" /><figcaption class="wp-element-caption">図5：リレーショナルデータベースとは</figcaption></figure>



<p>データベースの中で最も一般的に利用されるのが<strong><span class="marker-under">リレーショナルデータベース</span></strong>です。</p>



<p>リレーショナルデータベースは、エクセルのように表形式（テーブル）であらわされるデータベースで、テーブル間の関係（リレーション）を定義することでデータの結びつきや関連性をわかりやすく表します。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="664" height="373" src="https://it-biz.online/wp-content/uploads/2022/05/image-31.png" alt="リレーショナルデータベース" class="wp-image-6420" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-31.png 664w, https://it-biz.online/wp-content/uploads/2022/05/image-31-300x169.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-31-500x281.png 500w, https://it-biz.online/wp-content/uploads/2022/05/image-31-240x135.png 240w, https://it-biz.online/wp-content/uploads/2022/05/image-31-320x180.png 320w, https://it-biz.online/wp-content/uploads/2022/05/image-31-640x360.png 640w" sizes="(max-width: 664px) 100vw, 664px" /><figcaption class="wp-element-caption">図6：リレーション</figcaption></figure>



<p>普段何気なく利用している電話帳や、学校の先生が使っていた出席簿などは、リレーショナルデータベースの原型とも言えます。そのうえで、リレーショナルデータベースの特徴は「<strong>リレーショナル</strong>」の名の通り（学生の個人情報を保持するテーブルや、成績を管理するテーブルなどを表形式で整理しつつ）<strong><span class="marker-under">それら２つのテーブルの関連性がわかるように</span></strong>整理されていることが特徴です。</p>



<p>「データベースといえばリレーショナルデータベース」と言っても過言ではないぐらいポピュラーな形式。<strong>データベースの勉強をする＝リレーショナルデータベースの勉強をする</strong>　という感じなので、リレーショナルデータベースという用語は必須で頭に入れておきましょう。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box cocoon-block-label-box"><div class="label-box-label block-box-label box-label fab-lightbulb"><span class="label-box-label-text block-box-label-text box-label-text">リレーショナルデータベースを専門的に解説すると</span></div><div class="label-box-content block-box-content box-content">
<p>リレーショナルデータベースをより専門的に説明すると、<strong>表形式のデータを使用してデータを保存・管理するためのデータベースモデル</strong>と説明できます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このモデルでは、データが複数のテーブルに分割され、各テーブルには行と列があります。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="512" height="358" src="https://it-biz.online/wp-content/uploads/2023/03/image-7.png" alt="リレーショナルデータベース,列 カラム,行 レコード" class="wp-image-6875" srcset="https://it-biz.online/wp-content/uploads/2023/03/image-7.png 512w, https://it-biz.online/wp-content/uploads/2023/03/image-7-300x210.png 300w, https://it-biz.online/wp-content/uploads/2023/03/image-7-500x350.png 500w" sizes="(max-width: 512px) 100vw, 512px" /><figcaption class="wp-element-caption">図7：リレーショナルデータベースの仕組み</figcaption></figure>
</div></div>



<p>各テーブルは列に対応する「<strong>フィールド</strong>」と行に対応する「<strong>レコード</strong>」で構成され、フィールドにはテーブル内で保存されるデータの種類に応じて<strong>データ型</strong>が定義されます。レコードには、テーブル内の各フィールドに対応する値が含まれます。</p>



<p>リレーショナルデータベースでは、複数のテーブルをリレーション（関連）として定義することができます。これにより、異なるテーブル間でデータを結合することができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>例えば、生徒情報を保存するテーブルと成績情報を保存するテーブルがある場合、これら2つのテーブルを生徒の所属するクラスに関連付けることで、クラスごとの科目の点数を簡単に取得することが可能になります。</p>
</div></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="657" height="347" src="https://it-biz.online/wp-content/uploads/2023/03/image-8.png" alt="リレーショナルデータベース,リレーション" class="wp-image-6876" srcset="https://it-biz.online/wp-content/uploads/2023/03/image-8.png 657w, https://it-biz.online/wp-content/uploads/2023/03/image-8-300x158.png 300w, https://it-biz.online/wp-content/uploads/2023/03/image-8-500x264.png 500w" sizes="(max-width: 657px) 100vw, 657px" /><figcaption class="wp-element-caption">図8：リレーショナルデータベース/リレーション</figcaption></figure>



<p>リレーショナルデータベースは、データの整合性を維持しやすく、柔軟性があります。</p>



<p>SQL（Structured Query Language）を使用してデータの検索、更新、挿入、削除などを行うことができます。そのため、リレーショナルデータベースは、現代のアプリケーションやビジネスにおいて、最も一般的に使用されているデータベースモデルの1つです。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql/">SQLとは？</a></p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>リレーショナルデータベースの概念を理解するためには、表形式での整理が非常に助けになると思いますので、以下、簡単な学生と講義の情報を管理するリレーショナルデータベースの例を示します。</p>



<p class="has-text-align-center"><span class="badge-green">例1</span>　<strong>学生テーブル（Students）</strong></p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>学生ID</th><th>名前</th><th>年齢</th><th>メールアドレス</th></tr></thead><tbody><tr><td>1</td><td>山田太郎</td><td>20</td><td><a href="mailto:yamada@example.com">yamada@example.com</a></td></tr><tr><td>2</td><td>鈴木花子</td><td>19</td><td><a href="mailto:suzuki@example.com">suzuki@example.com</a></td></tr><tr><td>3</td><td>佐藤一郎</td><td>21</td><td><a href="mailto:sato@example.com">sato@example.com</a></td></tr></tbody></table></div></figure>



<p class="has-text-align-center"><span class="badge-green">例2</span>　<strong>講義テーブル（Lectures）</strong></p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>講義ID</th><th>講義名</th><th>教授名</th></tr></thead><tbody><tr><td>101</td><td>数学</td><td>山本先生</td></tr><tr><td>102</td><td>物理学</td><td>高橋先生</td></tr><tr><td>103</td><td>コンピュータサイエンス</td><td>佐々木先生</td></tr></tbody></table></div></figure>



<p class="has-text-align-center"><span class="badge-green">例3</span>　<strong>学生講義マッピングテーブル（StudentLectures）</strong></p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>学生ID</th><th>講義ID</th></tr></thead><tbody><tr><td>1</td><td>101</td></tr><tr><td>1</td><td>103</td></tr><tr><td>2</td><td>102</td></tr><tr><td>3</td><td>101</td></tr></tbody></table></div></figure>



<p>この例では、学生テーブルが学生の情報、講義テーブルが講義の情報を保持しており、学生講義マッピングテーブルが学生と講義の関係性を示しています。</p>



<p>このような表形式のデータ構造が、リレーショナルデータベースでのデータ管理の基本です。リレーション（関係）とは、このようにテーブル間での関連性のことを指します。</p>
</div>



<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">まとめ：リレーショナルデータベースとは？</div>
<ul class="wp-block-list">
<li><strong>テーブル構造</strong>: データを表形式で保存し、行と列で構成される。</li>



<li><strong>リレーション</strong>: それぞれのテーブル間の関連性をリレーションと呼び、相互に関連付けられることが可能。</li>



<li><strong>データ整合性</strong>: 制約やルールを設定することで、データの整合性を維持する。</li>



<li><strong>SQL対応</strong>: SQL（Structured Query Language）を使用して、データの検索、挿入、更新、削除などの操作が行える。</li>



<li><strong>スケーラビリティ</strong>: 大量のデータと複雑なクエリに対しても、効率的に処理することができる。</li>
</ul>
</div>



<h3 class="wp-block-heading"><span id="toc6">階層型データベース</span></h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="403" height="342" src="https://it-biz.online/wp-content/uploads/2022/05/image-32.png" alt="階層型データベース わかりやすく" class="wp-image-6421" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-32.png 403w, https://it-biz.online/wp-content/uploads/2022/05/image-32-300x255.png 300w" sizes="(max-width: 403px) 100vw, 403px" /><figcaption class="wp-element-caption">図9：階層型データベース</figcaption></figure>



<p>階層型データベースは、データを<strong>階層型の親子関係で表現</strong>するデータベースです。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="536" height="297" src="https://it-biz.online/wp-content/uploads/2022/05/image-33.png" alt="階層型データベース" class="wp-image-6422" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-33.png 536w, https://it-biz.online/wp-content/uploads/2022/05/image-33-300x166.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-33-500x277.png 500w" sizes="(max-width: 536px) 100vw, 536px" /><figcaption class="wp-element-caption">図10：階層型データベースの例（1）</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>上記の階層型データベースの例では、英語の点数を各生徒別に保持しています。Cさんの点数は、英語 ＞ C と階層をたどることで取得することができます。</p>
</div></div>



<p>この他にも階層型データベースの例としては、会社の組織図やOSのファイル管理システム（ディレクトリ）が分かりやすいかと思います。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="542" height="312" src="https://it-biz.online/wp-content/uploads/2023/03/image-5.png" alt="階層型データベースの例" class="wp-image-6873" srcset="https://it-biz.online/wp-content/uploads/2023/03/image-5.png 542w, https://it-biz.online/wp-content/uploads/2023/03/image-5-300x173.png 300w, https://it-biz.online/wp-content/uploads/2023/03/image-5-500x288.png 500w" sizes="(max-width: 542px) 100vw, 542px" /><figcaption class="wp-element-caption">図11：：階層型データベースの例（2）</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>階層型データベースのポイントは、データを<strong>ツリー構造</strong>で表すということ。 そして1つのデータが他の複数のデータに対して、親子関係をもつということがポイントです。</p>
</div></div>



<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">階層型データベースが利用されるシステムの例</div>
<ul class="wp-block-list">
<li><strong>オペレーティングシステムのファイル管理</strong>: ファイルシステムの管理に階層型データベースの概念が用いられることが多く、ディレクトリやファイル間の親子関係を表現する。</li>



<li><strong>組織構造の管理</strong>: 企業の部署やチームの階層構造を管理するために使用されることがある。</li>



<li><strong>製品の部品構造</strong>: 製造業での部品の構造管理など、製品の階層構造を管理する際に用いられる。</li>



<li><strong>XML文書の管理</strong>: XML文書は階層構造を持つため、階層型データベースでの管理が適している。</li>



<li><strong>ネットワーク管理</strong>: ネットワークトポロジーの管理など、ネットワークの構造を階層型データベースで表現する場合がある。</li>
</ul>
</div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">階層型データベースのポイント</div>
<ul class="wp-block-list">
<li>データを<strong>ツリー構造</strong>で表す</li>



<li>1つのデータが他の複数のデータに対して<strong>親子関係</strong>をもつ</li>
</ul>
</div>



<p class="has-text-align-center"><span class="badge-blue">サンプル</span>　<strong>階層型データベースの操作例</strong></p>



<p>以下は、親子関係を表現するクラスを作成し、組織の階層構造を表示するプログラムです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Department:
    def __init__(self, name):
        self.name = name
        self.sub_departments = []

    def add_sub_department(self, department):
        self.sub_departments.append(department)

    def display(self, level=0):
        print('  ' * level + self.name)
        for sub_department in self.sub_departments:
            sub_department.display(level + 1)

root = Department("会社")
sales = Department("営業部")
root.add_sub_department(sales)
sales.add_sub_department(Department("東京営業部"))
sales.add_sub_department(Department("大阪営業部"))

root.display()

# 会社
#   営業部
#     東京営業部
#     大阪営業部</pre>
</div>



<h3 class="wp-block-heading"><span id="toc7">ネットワーク型データベース</span></h3>



<p>ネットワーク型データベースは、階層型データベースに代わるデータモデルの1つで、データの関係性を以下のようなグラフ構造で表現する方法です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="502" height="346" src="https://it-biz.online/wp-content/uploads/2022/05/image-34.png" alt="ネットワーク型データベース わかりやすく" class="wp-image-6423" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-34.png 502w, https://it-biz.online/wp-content/uploads/2022/05/image-34-300x207.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-34-500x345.png 500w" sizes="(max-width: 502px) 100vw, 502px" /><figcaption class="wp-element-caption">図12：ネットワーク型データベース</figcaption></figure>



<p>ネットワーク型データベースは、複数のデータレコードが相互に関連している場合に使用されます。各レコードは、複数の「親」レコードおよび「子」レコードにリンクすることができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>例えば、会社の組織図を考えてみると、ネットワーク型データベースでは、<strong><span class="marker-under">部下が複数の上司を持つ場合に柔軟に対応できます。</span></strong>上司と部下の関係がツリー構造で表現される階層型データベースではそれが表現できません。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="575" height="313" src="https://it-biz.online/wp-content/uploads/2023/03/image-6.png" alt="ネットワーク型データベース 例" class="wp-image-6874" srcset="https://it-biz.online/wp-content/uploads/2023/03/image-6.png 575w, https://it-biz.online/wp-content/uploads/2023/03/image-6-300x163.png 300w, https://it-biz.online/wp-content/uploads/2023/03/image-6-500x272.png 500w" sizes="(max-width: 575px) 100vw, 575px" /><figcaption class="wp-element-caption"><br>図13：ネットワーク型データベースの例(１)</figcaption></figure>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>また同様に下記のネットワーク型データベースを見れば、Aさんは国語と英語を受験していますが、Cさんは英語しか受験していないということが分かります。</p>
</div></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="565" height="298" src="https://it-biz.online/wp-content/uploads/2022/05/image-35.png" alt="ネットワーク型データベース" class="wp-image-6424" srcset="https://it-biz.online/wp-content/uploads/2022/05/image-35.png 565w, https://it-biz.online/wp-content/uploads/2022/05/image-35-300x158.png 300w, https://it-biz.online/wp-content/uploads/2022/05/image-35-500x264.png 500w" sizes="(max-width: 565px) 100vw, 565px" /><figcaption class="wp-element-caption">図14：ネットワーク型データベースの例(２)</figcaption></figure>



<p>ネットワーク型データベースは従来の階層型データベースに比べて柔軟性が高く、複雑な関係を持つデータを扱うのに適しています。が、データの整合性を維持するために、<strong><span class="marker-under">リンクの数やパスの長さに制限がある場合があるという点がデメリット</span></strong>です。</p>



<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">ネットワーク型データベースが利用されるシステムの例</div>
<ul class="wp-block-list">
<li><strong>在庫管理システム</strong>: 商品、サプライヤー、カテゴリーなど、複数の要素間での多対多の関連性を表現する際に使用されることがある。</li>



<li><strong>航空予約システム</strong>: フライト、乗客、予約、空港など、多くのエンティティ間の複雑な関係を管理する必要があるため、ネットワーク型データベースが用いられることがある。</li>



<li><strong>製造プロセス管理</strong>: 製品、部品、供給業者、組立ラインなど、多対多の関係を持つデータを組織化し、効率的に追跡するために使用されることがある。</li>



<li><strong>アカデミックリサーチ</strong>: 複雑な研究データを扱う際、多対多の関連性を持つデータ構造を必要とすることがあるため、ネットワーク型データベースが選択されることがある。</li>



<li><strong>医療情報管理</strong>: 患者、診断、治療、医師などの多対多の関連性を持つデータを管理するのに適してる。</li>
</ul>
</div>



<h2 class="wp-block-heading"><span id="toc8">【まとめ】データベースとは？</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">このページのまとめ</div>
<ul class="wp-block-list">
<li><strong><span class="marker-under">1. リレーショナルデータベース</span></strong>
<ul class="wp-block-list">
<li><strong>構造</strong>: 表形式でデータを保存し、各テーブル間のリレーションを用いて関連付けます。</li>



<li><strong>用途</strong>: 一般的なデータ管理。多くのビジネスアプリケーションで使用されます。</li>



<li><strong>関係</strong>: 1対1、1対多、多対多の関係を表現可能。</li>



<li><strong>イメージ</strong>: エクセルのような表でデータを管理している様子。</li>
</ul>
</li>



<li><strong><span class="marker-under">2. 階層型データベース</span></strong>
<ul class="wp-block-list">
<li><strong>構造</strong>: データを親子関係の木構造で管理します。</li>



<li><strong>用途</strong>: ファイルシステム、組織図などの階層的なデータ表現。</li>



<li><strong>関係</strong>: 親子関係のみを持つ。</li>



<li><strong>イメージ</strong>: フォルダとサブフォルダのような構造。</li>
</ul>
</li>



<li><strong><span class="marker-under">3. ネットワーク型データベース</span></strong>
<ul class="wp-block-list">
<li><strong>構造</strong>: 複数の親子関係を持つことができるグラフ構造。</li>



<li><strong>用途</strong>: 複雑な多対多の関連性を持つデータ管理。</li>



<li><strong>関係</strong>: 1つの子が複数の親を持つことができる。</li>



<li><strong>イメージ</strong>: ソーシャルネットワークの友達関係のようなグラフ。</li>
</ul>
</li>
</ul>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2相ロッキングプロトコル /2PL とは？３分でわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/2pl/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 16 Aug 2023 12:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[データベース]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8325</guid>

					<description><![CDATA[2相ロッキングプロトコル（2PL/2相ロック）とは、データベース管理システム（DBMS）における並行制御のための一般的なプロトコルです。（参考 データベース管理システムとは？） このプロトコルに従うトランザクションは、ロ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>2相ロッキングプロトコル（2PL/2相ロック）とは、データベース管理システム（DBMS）における並行制御のための一般的なプロトコルです。（<span class="badge">参考</span> <a href="https://it-biz.online/it-skills/dbms/">データベース管理システムとは？</a>）</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="692" height="479" src="https://it-biz.online/wp-content/uploads/2023/08/image-2.png" alt="2相ロッキングプロトコル（2PL/2相ロック）" class="wp-image-8328" srcset="https://it-biz.online/wp-content/uploads/2023/08/image-2.png 692w, https://it-biz.online/wp-content/uploads/2023/08/image-2-300x208.png 300w, https://it-biz.online/wp-content/uploads/2023/08/image-2-500x346.png 500w" sizes="(max-width: 692px) 100vw, 692px" /><figcaption class="wp-element-caption">図1：2相ロッキングプロトコル（2PL/2相ロック）</figcaption></figure>



<p>このプロトコルに従う<a href="https://it-biz.online/it-skills/db-transaction/">トランザクション</a>は、ロックの取得が<strong>成長フェーズ</strong>と<strong>縮小フェーズ</strong>の2つの段階で行われるため、この名前が付けられました。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>成長フェーズではロックを取得し、縮小フェーズではロックを解放します。結果として、2PLはデータベースシステムにおける一貫性と整合性を確保する重要な役割を果たします。</p>
</div></div>



<p>このページでは、2相ロッキングプロトコル（2PL）の基本原則から具体的な動作、利点と欠点、実装例までを総合的に解説します。データベースエンジニアを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい基本知識の１つ</span></strong>です。是非最後までご覧ください。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">2相ロッキングプロトコル（2PL）とは？</a><ol><li><a href="#toc2" tabindex="0">2相ロッキングプロトコルのロックの種類</a></li></ol></li><li><a href="#toc3" tabindex="0">２相ロッキングプロトコルのメリット・デメリット</a><ol><li><a href="#toc4" tabindex="0">メリット１：整合性の保証</a></li><li><a href="#toc5" tabindex="0">メリット２：並行処理のサポート</a></li><li><a href="#toc6" tabindex="0">デメリット１：デッドロックの可能性</a></li><li><a href="#toc7" tabindex="0">デメリット２：パフォーマンスの低下</a></li></ol></li><li><a href="#toc8" tabindex="0">補足：よくある質問</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">2相ロッキングプロトコル（2PL）とは？</span></h2>



<p>2相ロッキングプロトコル（2PL）は、名前の通り、<strong><span class="marker-under">2つのフェーズで構成されるロッキングプロトコル</span></strong>です。データベースで多くの人が同時に作業するとき、お互いの作業がぶつからないように管理する方法の１つとして使用されます。</p>



<p>2相ロッキングプロトコル（2PL）は、具体的には<strong>成長フェーズ</strong>と<strong>縮小フェーズ</strong>の２つのフェーズから成り立ちます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="692" height="479" src="https://it-biz.online/wp-content/uploads/2023/08/image-2.png" alt="2相ロッキングプロトコル（2PL/2相ロック）" class="wp-image-8328" srcset="https://it-biz.online/wp-content/uploads/2023/08/image-2.png 692w, https://it-biz.online/wp-content/uploads/2023/08/image-2-300x208.png 300w, https://it-biz.online/wp-content/uploads/2023/08/image-2-500x346.png 500w" sizes="(max-width: 692px) 100vw, 692px" /><figcaption class="wp-element-caption">図1：2相ロッキングプロトコル（2PL/2相ロック）</figcaption></figure>



<p class="has-text-align-center is-style-cross-line has-box-style"><span class="badge-blue">PL１</span>　<strong>成長フェーズ</strong>（Growing Phase）</p>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><strong>目的</strong>: トランザクションが必要なリソースに対してロックを取得します。</li>



<li><strong>動作</strong>: このフェーズでは、トランザクションは新たなロックを取得することができますが、一度解放したロックを再取得することはできません。</li>



<li><strong>注意点</strong>: 成長フェーズの終了時点で<strong>必要な全てのロックを取得しておく</strong>必要があります。</li>
</ul>



<p class="has-text-align-center is-style-cross-line has-box-style"><span class="badge-blue">PL2</span>　<strong>縮小フェーズ</strong>（Shrinking Phase）</p>



<ul class="wp-block-list">
<li><strong>目的</strong>: トランザクションが完了するために不要なロックを解放します。</li>



<li><strong>動作</strong>: このフェーズでは、トランザクションはロックを解放することができますが、<strong>新たなロックを取得することはできません。</strong></li>



<li><strong>注意点</strong>: 必要なロックを解放してもデータの整合性が保たれるように慎重に解放する必要があります。</li>
</ul>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-question-circle"><span class="tab-caption-box-label-text block-box-label-text box-label-text">なぜ２つのフェーズに分けるのか？</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>2相ロッキングプロトコルが2つのフェーズに分かれる理由は、データの一貫性と整合性を保つためです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>具体例を通して、この点を詳しく見ていきましょう。</p>
</div></div>



<p class="has-text-align-center is-style-clip-box has-box-style"><strong>銀行の口座間送金</strong></p>



<p>口座Aから口座Bへの送金を行うトランザクションを考えます。</p>



<p class="has-text-align-center"><span class="badge-blue">ステップ１</span>　<strong>成長フェーズ</strong></p>



<ul class="wp-block-list">
<li><strong>ロック取得</strong>: 口座Aの残高をチェックし、送金額が足りるか確認するため、口座Aにロックを取得。</li>



<li><strong>新たなロック取得</strong>: 送金額が足りることが確認できれば、送金先の口座Bにロックを取得。</li>
</ul>



<p>この段階では、ロックの取得が柔軟に行えます。</p>



<p class="has-text-align-center"><span class="badge-blue">ステップ２</span>　<strong>縮小フェーズ</strong></p>



<ul class="wp-block-list">
<li><strong>ロック解放の開始</strong>: 口座Aから送金額を減らし、口座Bに送金額を加算後、ロックを解放。</li>



<li><strong>新しいロック取得の禁止</strong>: 一度縮小フェーズに入ると新しいロックの取得はできなくなります。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>もし、この操作を2相ロッキングプロトコルに従わないとすると、例えばトランザクション1が口座Aのロックを取得している間に、トランザクション2が口座Bのロックを取得してしまう可能性があります。両者が互いの口座にロックを取得しようとすると、お互いが待ち合いの状態に陥り<strong><span class="marker-under">デッドロック</span></strong>が発生します。</p>
</div></div>



<p>また、同様に送金処理中に他のトランザクションが同じ口座への入金を行うと、最終的な口座残高が正しく反映されない可能性が出てきてしまいます。</p>



<p>2相ロッキングプロトコルは、データベースの一貫性と整合性を確保する重要なプロセス。2つのフェーズに分けない場合、死ロックの発生、データの不整合、パフォーマンスの低下など、多岐にわたる弊害が生じる可能性が生じてしまいます。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box ok-box">
<p>ざっくりいうと、2相ロッキングプロトコルは「<strong><span class="marker-under">まずは必要なデータすべてに鍵をかけ、安全な状態にしてから処理を始め、その後、順番に鍵を外していく</span></strong>」というルールです。これにより、同時に複数の処理が行われても、データが混ざり合って矛盾が生じるのを防ぐことができる、というわけです。</p>
</div>



<h3 class="wp-block-heading"><span id="toc2">2相ロッキングプロトコルのロックの種類</span></h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>2相ロッキングプロトコルでは、以下のロックが組み合わせて使用され、データベースの一貫性と整合性を確保します。各ロックの種類とその特性を理解することは、効果的なトランザクション処理の設計において重要なので、ここで詳細を以下に記載しておきます。</p>
</div></div>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>ロックの種類</th><th>概要</th><th>用途</th><th>特徴</th></tr></thead><tbody><tr><td>共有ロック（Shared Lock）</td><td>複数のトランザクションがデータを読むことを許可する</td><td>読み取り専用の処理</td><td>他の共有ロックは取得可、排他ロックは取得不可</td></tr><tr><td>排他ロック（Exclusive Lock）</td><td>単一のトランザクションだけがデータにアクセスできる</td><td>書き込みを伴う処理（更新、削除など）</td><td>他のいかなる種類のロックも取得不可</td></tr><tr><td>意図ロック（Intention Lock）</td><td>特定のロックを取得する意図を表明する</td><td>意図の通知</td><td>デッドロック防止の効率的な手段</td></tr><tr><td>互換性のあるロック</td><td>2つの異なるトランザクションが同時に取得できる</td><td>同時データアクセス</td><td>例：共有ロック同士は互換性があるため、同時に取得可</td></tr></tbody></table></div><figcaption class="wp-element-caption">2相ロッキングプロトコルで使用される主要なロックの</figcaption></figure>



<h2 class="wp-block-heading"><span id="toc3">２相ロッキングプロトコルのメリット・デメリット</span></h2>



<p>ここからは、2相ロッキングプロトコル（2PL）のメリットとデメリットについて、より具体的に実際のコード例も交えながらご説明していきます。</p>



<h3 class="wp-block-heading"><span id="toc4">メリット１：整合性の保証</span></h3>



<p><strong>2PL</strong>はデータへのアクセスが他のトランザクションと干渉しないように制御します。これにより、データの整合性、つまり一貫性が保たれます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下のコードは、トランザクションを開始する際に、必要なロックを取得するシンプルな例です。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def start_transaction():
    acquire_locks() # データにアクセスする前にロックを取得
    # 以下、処理の実行
</pre>



<p>ロックを取得することで、同時にデータへのアクセスを試みる他のトランザクションと競合しないようにします。</p>



<h3 class="wp-block-heading"><span id="toc5">メリット２：並行処理のサポート</span></h3>



<p>2PLは、多くのトランザクションを同時に効率的に処理できます。ロックの管理により、複数のトランザクションが同時にデータにアクセスしても問題が発生しないようにします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 複数のトランザクションを並行実行
threads = [Thread(target=transaction_process) for _ in range(10)]
for t in threads:
    t.start()
</pre>



<p>このコードは、10個のトランザクションを同時に起動しています。それぞれのトランザクションは独立して処理されます。</p>



<h3 class="wp-block-heading"><span id="toc6">デメリット１：デッドロックの可能性</span></h3>



<p>デッドロックは、トランザクション同士が互いのロックを待ち合う状態のことです。2PLではこの問題が発生する可能性があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># デッドロックの検知と解決
def detect_deadlock():
    # デッドロックの検知ロジック
    # 必要に応じてロックの解放</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このコード例は、デッドロックを検知し、必要に応じてロックを解放する仕組みを示しています。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">関連</span>　<strong>デッドロックとは？</strong></p>



<p>デッドロックとは、複数のプログラムやトランザクションが同時に実行されるときに、お互いが必要とするリソース（例えばデータやファイル、メモリなど）を<strong>既に相手が保持しているため、どちらも先に進めなくなってしまう状態</strong>を指します。</p>



<p>たとえば、プロセスAがリソースXを持っていてリソースYを要求し、同時にプロセスBがリソースYを保持してリソースXを必要とすると、どちらも相手のリソースが解放されるのを待つだけになり、結果として永遠に動けなくなってしまうのです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これは、狭い通路でお互いに譲らず前に進めない二人の人の状況に例えることができます。</p>
</div></div>



<p>この現象が発生すると、システム全体が停止してしまう可能性があるため、特にデータベースや複雑なマルチタスク環境では大きな問題となります。システムの設計段階から、どのリソースをどの順番で確保するか、または一定時間内に取得できなかった場合はタイムアウトして処理を中断するなどの工夫をすることで、デッドロックの発生リスクを軽減できます。</p>
</div>



<h3 class="wp-block-heading"><span id="toc7">デメリット２：パフォーマンスの低下</span></h3>



<p>2PLでロックの競合が頻繁に発生すると、システムの効率が低下することがあります。つまる、<strong>あるトランザクションがロックを持っている間、他のトランザクションが待機する</strong>必要があるため、処理の遅延が発生する可能性があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from threading import Lock

lock = Lock()

def transaction_process():
    with lock: # このロックが競合すると効率が低下します
        # 複雑な処理
        pass

# 複数のトランザクションを並行実行
threads = [Thread(target=transaction_process) for _ in range(10)]
for t in threads:
    t.start()</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このコードは、10個のトランザクションが同一のロックを取得しようとして競合する状況を示しています。一度に1つのトランザクションしかロックを取得できないため、他のトランザクションは待機する必要があります。この待機時間が積み重なると、システム全体の効率が低下する可能性があります。</p>
</div></div>



<p>この問題を解決するためには、ロックの粒度を調整する、トランザクションのスケジューリングを工夫するなどの工夫が必要です。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ol class="wp-block-list">
<li><strong>定義</strong>: データベーストランザクションにおける並行処理を管理するプロトコル。</li>



<li><strong>構成</strong>:
<ul class="wp-block-list">
<li><strong>ロック取得フェーズ</strong>: 必要なロックを取得し、データにアクセスします。</li>



<li><strong>ロック解放フェーズ</strong>: 作業完了後、ロックを解放します。</li>
</ul>
</li>



<li><strong>利点</strong>:
<ul class="wp-block-list">
<li><strong>整合性保証</strong>: トランザクション間でのデータ整合性を保つ。</li>



<li><strong>並行処理</strong>: 複数のトランザクションの同時実行をサポート。</li>
</ul>
</li>



<li><strong>欠点</strong>:
<ul class="wp-block-list">
<li><strong>デッドロック</strong>: ロックの相互待ちによる停止の可能性。</li>



<li><strong>効率の問題</strong>: ロック競合による処理の遅延。</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc8">補足：よくある質問</span></h2>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">概念は理解したが、結局2PLって実装方式のこと？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>2PL（2相ロッキング）は <strong>実装というよりはアルゴリズム（制御方式）</strong> です。<br>データベース管理システム（DBMS）などがトランザクションの整合性を確保するために採用する <strong>ロック制御のルール</strong> の一種です。つまり・・・・</p>



<p>DBMSの開発者がこの2PLのルールに従ってロックを管理するように <strong>実装</strong> していく、ということ。<br>2PLは「概念」や「ルール」であり、それをシステムの中で「実装するかどうか」はDBMS次第です。</p>



<p><strong>代表的なDBMSでの実装例</strong></p>



<ul class="wp-block-list">
<li><strong>MySQL（InnoDB）</strong>：トランザクション分離レベルによっては2PLベースのロック管理を使用</li>



<li><strong>PostgreSQL</strong>：2PLではなくMVCC（多版同時実行制御）を主に採用</li>



<li><strong>Oracle DB</strong>：基本的にはMVCCを用いるが、必要に応じてロック制御を組み合わせる</li>
</ul>
</div></dd></dl></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【SQL】window関数の基本/意味や使い方を３分で解説</title>
		<link>https://it-biz.online/it-skills/sql-window/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 03 Oct 2023 00:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8408</guid>

					<description><![CDATA[window関数は、データベースのテーブル内の行に関連する情報を取得するための特別な種類のSQL関数です。 参考　SQLとは？（初心者向け解説） 具体的には、ある行を中心に、その前後の行を「window」として捉え、その [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong><span class="marker-under">window関数</span></strong>は、<a href="https://it-biz.online/it-skills/database/">データベース</a>のテーブル内の行に関連する情報を取得するための特別な種類のSQL関数です。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql/">SQLとは？（初心者向け解説）</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>名前に「window」と付いているのは、この関数が「視点（ウインドウ）」を移動させながら、その「ウインドウ」内のデータに基づいて計算を行うからです。</p>
</div></div>



<p>具体的には、ある行を中心に、その前後の行を「window」として捉え、その範囲内のデータを使って計算を行うイメージ。例えば、4日間の平均売上を求めたいとき、1日目、2日目、3日目、4日目の売上をウインドウ（＝計算範囲）として捉え、その平均を計算する、というようなことがwindow関数で可能です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="446" height="229" src="https://it-biz.online/wp-content/uploads/2023/10/image.png" alt="window関数" class="wp-image-8411" srcset="https://it-biz.online/wp-content/uploads/2023/10/image.png 446w, https://it-biz.online/wp-content/uploads/2023/10/image-300x154.png 300w" sizes="(max-width: 446px) 100vw, 446px" /><figcaption class="wp-element-caption">図1：window関数のイメージ</figcaption></figure>



<p>このページではwindow関数の基本を１からわかりやすく初心者向けに解説します。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>window関数の基本概念
<ul class="wp-block-list">
<li>window関数と通常の集計関数の違い</li>
</ul>
</li>



<li>基本的なwindow関数の概要
<ul class="wp-block-list">
<li><code>OVER</code>句とその構成要素</li>



<li>window関数の実際の例</li>
</ul>
</li>
</ul>
</div>
</div></div>



<p>プログラマーやシステムエンジニアを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい基本知識</span></strong>です。是非最後までご覧ください。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql-abc/">【初心者向け】SQLの基本構文ルール</a></p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">window関数とは？</a><ol><li><a href="#toc2" tabindex="0">window関数の構文ルール</a></li></ol></li><li><a href="#toc3" tabindex="0">よく使われるwindow関数の紹介</a><ol><li><a href="#toc4" tabindex="0">1. ROW_NUMBER()</a></li><li><a href="#toc5" tabindex="0">2. RANK()</a></li><li><a href="#toc6" tabindex="0">3. DENSE_RANK()</a></li><li><a href="#toc7" tabindex="0">4. NTILE(n)</a></li><li><a href="#toc8" tabindex="0">5. LAG()</a></li><li><a href="#toc9" tabindex="0">6. LEAD()</a></li><li><a href="#toc10" tabindex="0">7. FIRST_VALUE(), LAST_VALUE()</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめ：window関数とは？</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">window関数とは？</span></h2>



<p>window関数は、SQLの強力な機能の1つで、各行に対して、ある「window」と呼ばれる範囲内の行を基に計算を行う関数です。これにより、<strong>各行の相対的な情報</strong>、たとえば「この行の前の行の値は何か？」や「このグループ内でのこの行のランクは？」などを求めることができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>window関数は通常の集計関数と異なり、結果セットの行数を変えずに各行に対して情報を提供します。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">window関数の構文ルール</span></h3>



<p>window関数を使用する際の基本的な構文は以下のようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;関数名>(&lt;式>) OVER (
    PARTITION BY &lt;分割列>
    ORDER BY &lt;並び替え列>
    &lt;フレーム範囲指定>
)</pre>



<ol class="wp-block-list">
<li><strong><code><span class="bold-blue">&lt;関数名&gt;(&lt;式&gt;)</span></code></strong>:
<ul class="wp-block-list">
<li>使用するwindow関数の名前と、その関数に渡す引数または式。</li>



<li>OVER はwindow関数を利用しますよ！という宣言・印だと理解すればOK。</li>
</ul>
</li>



<li><strong><code><span class="bold-blue">PARTITION BY &lt;分割列&gt;</span></code></strong>:
<ul class="wp-block-list">
<li><strong><code>PARTITION BY</code></strong>オプションを使って、データを特定の列の値に基づいてグループに分けることができる。→これにより、各グループ内でwindow関数が適用される。</li>



<li><a href="https://it-biz.online/it-skills/group-by/">GROUP BY</a> と同じようなイメージでOK。</li>
</ul>
</li>



<li><strong><code><span class="bold-blue">ORDER BY &lt;並び替え列&gt;</span></code></strong>:
<ul class="wp-block-list">
<li>ウインドウ内のデータの順序を定義します。この順序は、ランキング関数や前後の行との比較を行う関数など、関数の動作に影響を与えます。</li>
</ul>
</li>



<li><strong><code><span class="bold-blue">&lt;フレーム範囲指定&gt;</span></code></strong>:
<ul class="wp-block-list">
<li>window関数がどの範囲のデータを考慮して計算を行うかを指定します。例えば「現在の行から2行前まで」や「現在の行から次の行まで」といった具体的な範囲を定義できます。指定しない場合は、PARTITION全体が考慮されるのがデフォルトです。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>と、文字だけではイメージしづらいかと思いますので、具体例を用いながらご説明します。</p>
</div></div>



<p class="has-text-align-center"><span class="badge-blue">サンプル</span>　<strong><code>students</code>テーブルの例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">| id | name    | score |
|----|---------|-------|
| 1  | Alice   | 85    |
| 2  | Bob     | 90    |
| 3  | Charlie | 85    |
| 4  | David   | 92    |
| 5  | Eve     | 88    |
|----|---------|-------|</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>↑のテーブルを例に説明します。このテーブルは5人の生徒のテストのスコアが記録されています。</p>
</div></div>



<p>ここでは代表的なwindow関数の１つ、<code>ROW_NUMBER()</code>を使用してスコアの高い順にランキングをつけたいと考えてみます。その例が↓。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT
  name,
  score,
  ROW_NUMBER() OVER (ORDER BY score DESC) AS rank
FROM
  students;

/* 結果
|---------|-------|------|
| name    | score | rank |
|---------|-------|------|
| David   | 92    | 1    |
| Bob     | 90    | 2    |
| Eve     | 88    | 3    |
| Alice   | 85    | 4    |
| Charlie | 85    | 5    |
|---------|-------|------|
*/</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/select/">SELECT文の基本</a></p>



<ul class="wp-block-list">
<li><code>ROW_NUMBER()</code>関数は、指定された<code>ORDER BY</code>の順序に従って、各行にユニークな連番を割り当てる。</li>



<li><code>OVER (ORDER BY score DESC)</code>部分は、スコアを降順に並べ替えて、その順番に従って連番を付けることを指示。</li>



<li>結果、最もスコアが高いDavidが1位、次に高いBobが2位というようにランキングが付けられる。AliceとCharlieは同じスコアですが、<code>ROW_NUMBER()</code>はユニークな値を割り当てるため、異なるランクが付けられています。</li>
</ul>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="655" height="225" src="https://it-biz.online/wp-content/uploads/2023/10/image-1.png" alt="window関数の基本" class="wp-image-8412" srcset="https://it-biz.online/wp-content/uploads/2023/10/image-1.png 655w, https://it-biz.online/wp-content/uploads/2023/10/image-1-300x103.png 300w, https://it-biz.online/wp-content/uploads/2023/10/image-1-500x172.png 500w" sizes="(max-width: 655px) 100vw, 655px" /><figcaption class="wp-element-caption">図2：window関数の基本</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この基本的な動作を理解することで、他のウインドウ関数もより理解しやすくなるでしょう。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">【補足】PARTITION</span></div><div class="tab-caption-box-content block-box-content box-content">
<p><code>PARTITION BY</code> を使うことで、window関数を特定のカテゴリやグループごとに適用することができます。先ほどの、<code>students</code> テーブルに <code>class</code> 列を追加し、その上で <code>ROW_NUMBER()</code> を使用してクラスごとに順番をつけてみましょう。</p>



<p>↓のテーブルを利用して、クラスごとにスコアの高い順にランキングをつけてみます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* 利用するテーブル
|----|---------|-------|-------|
| id | name    | score | class |
|----|---------|-------|-------|
| 1  | Alice   | 85    | A     |
| 2  | Bob     | 90    | B     |
| 3  | Charlie | 85    | A     |
| 4  | David   | 92    | B     |
| 5  | Eve     | 88    | A     |
|----|---------|-------|-------|
*/

-- クエリ
SELECT
  name,
  score,
  class,
  ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC) AS rank_in_class
FROM
  students
ORDER BY
  class, rank_in_class;

/* 結果
| name    | score | class | rank_in_class |
|---------|-------|-------|---------------|
| Eve     | 88    | A     | 1             |
| Alice   | 85    | A     | 2             |
| Charlie | 85    | A     | 3             |
| David   | 92    | B     | 1             |
| Bob     | 90    | B     | 2             |
|---------|-------|-------|---------------|
*/</pre>



<p class="has-text-align-center"><strong>解説</strong></p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="699" height="233" src="https://it-biz.online/wp-content/uploads/2023/10/image-2.png" alt="window関数/PARTITION" class="wp-image-8413" srcset="https://it-biz.online/wp-content/uploads/2023/10/image-2.png 699w, https://it-biz.online/wp-content/uploads/2023/10/image-2-300x100.png 300w, https://it-biz.online/wp-content/uploads/2023/10/image-2-500x167.png 500w" sizes="(max-width: 699px) 100vw, 699px" /><figcaption class="wp-element-caption">図3：window関数/PARTITION</figcaption></figure>



<ul class="wp-block-list">
<li><code>PARTITION BY class</code> によって、データはクラスごとに分けられる→結果、各クラス内で独立したランキングが生成される。</li>



<li><code>ORDER BY score DESC</code> により、各クラス内でのランキングはスコアの降順にソートされる。<br>→クラスAではEveが1位、クラスBではDavidが1位に。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このように、<code>PARTITION BY</code> を使うことで、ウインドウ関数を特定のカテゴリやグループごとに適用することができます。</p>
</div></div>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">フレーム範囲指定</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>フレーム範囲指定は、window関数を適用する際の対象範囲をより細かく制御するためのものです。通常、window関数は特定の行に基づいて、その行を中心に前後の範囲で計算を行いますが、フレーム範囲指定を使うことでその計算範囲を具体的に定義することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;関数名>(&lt;式>) OVER (
    PARTITION BY &lt;分割列>
    ORDER BY &lt;並び替え列>
    ROWS &lt;範囲指定>
)</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><code>ROWS</code> の代わりに <code>RANGE</code> も利用できますが、その動作は異なります。ここでは、まず <code>ROWS</code> を用いたフレーム範囲指定について詳しく説明します。</p>
</div></div>



<p>以下は、フレーム範囲指定の一般的な使用方法の例です。</p>



<ol class="wp-block-list">
<li><strong>ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING</strong>:
<ul class="wp-block-list">
<li>現在の行を中心に、1行前と1行後を含む範囲で関数を適用します。</li>
</ul>
</li>



<li><strong>ROWS UNBOUNDED PRECEDING</strong>:
<ul class="wp-block-list">
<li>現在の行から、最初の行までの範囲で関数を適用します。</li>
</ul>
</li>



<li><strong>ROWS 2 FOLLOWING</strong>:
<ul class="wp-block-list">
<li>現在の行から、2行後までの範囲で関数を適用します。</li>
</ul>
</li>
</ol>



<p class="has-text-align-center"><span class="badge-blue">サンプル</span>　<strong>3日移動平均の計算</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* 利用するsalesテーブル
|------------|--------------|
| date       | sales_amount |
|------------|--------------|
| 2023-01-01 | 100          |
| 2023-01-02 | 110          |
| 2023-01-03 | 90           |
| 2023-01-04 | 95           |
| 2023-01-05 | 105          |
|------------|--------------|
*/

-- 各日の売上の3日移動平均を計算するためのSQLクエリ
SELECT
  date,
  sales_amount,
  AVG(sales_amount) OVER (
    ORDER BY date
    ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
  ) AS moving_avg_3days
FROM
  sales;

/* 結果
|------------|--------------|------------------|
| date       | sales_amount | moving_avg_3days |
|------------|--------------|------------------|
| 2023-01-01 | 100          | 105              |
| 2023-01-02 | 110          | 100              |
| 2023-01-03 | 90           | 98.33            |
| 2023-01-04 | 95           | 96.67            |
| 2023-01-05 | 105          | 100              |
|------------|--------------|------------------|
*/</pre>



<p class="has-text-align-center"><strong>解説</strong></p>



<ul class="wp-block-list">
<li><code>ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING</code> によって、各日の売上の1日前、当日、1日後の3日間のデータを対象として平均を計算。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>フレーム範囲指定を利用することで、累積計算や移動平均、前後のデータとの差分計算など、さまざまな集計処理を行うことができます。</p>
</div></div>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">よく使われるwindow関数の紹介</span></h2>



<p>window関数は非常に多岐にわたるため、ここでは特によく使われるwindow関数をいくつか使い方を簡潔に紹介します。</p>



<h3 class="wp-block-heading"><span id="toc4">1. ROW_NUMBER()</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: 各行に一意の連続する番号を割り当てます。主にランキングや行番号付けに使用されます。</li>



<li><strong>例</strong>: 各商品の売上順にランキングをつける場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ROW_NUMBER() OVER (ORDER BY sales_amount DESC)</pre>



<p class="has-text-align-center"><span class="badge-green">さらに詳しく→</span>　<a href="https://it-biz.online/it-skills/row_number/">ROW_NUMBER関数　</a></p>



<h3 class="wp-block-heading"><span id="toc5">2. RANK()</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: 各行にランキングを割り当てますが、同じ値を持つ行には同じランクを割り当て、次のランクはスキップされます。</li>



<li><strong>例</strong>: 各学生のテストスコアのランキングを付ける場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RANK() OVER (ORDER BY score DESC)</pre>



<h3 class="wp-block-heading"><span id="toc6">3. DENSE_RANK()</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: <code>RANK()</code>と同様にランキングを割り当てますが、同じ値を持つ行には同じランクを割り当て、次のランクはスキップされません。</li>



<li><strong>例</strong>: スポーツのポイントランキングで、同点者がいても次の順位をスキップせずに付ける場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">DENSE_RANK() OVER (ORDER BY points DESC)</pre>



<h3 class="wp-block-heading"><span id="toc7">4. NTILE(n)</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: データを指定した<code>n</code>の数だけの等しいサイズのバケットに分割します。</li>



<li><strong>例</strong>: 学生を4つのグループに分ける場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">NTILE(4) OVER (ORDER BY score)</pre>



<h3 class="wp-block-heading"><span id="toc8">5. LAG()</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: 指定したカラムの前の行の値を取得します。</li>



<li><strong>例</strong>: 各月の売上と前月の売上の差分を計算する場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">sales_amount - LAG(sales_amount) OVER (ORDER BY month)</pre>



<h3 class="wp-block-heading"><span id="toc9">6. LEAD()</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: 指定したカラムの次の行の値を取得します。</li>



<li><strong>例</strong>: 各月の売上と次月の売上の差分を計算する場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">sales_amount - LEAD(sales_amount) OVER (ORDER BY month)</pre>



<h3 class="wp-block-heading"><span id="toc10">7. FIRST_VALUE(), LAST_VALUE()</span></h3>



<ul class="wp-block-list">
<li><strong>説明</strong>: ウィンドウの最初の値や最後の値を取得します。</li>



<li><strong>例</strong>: 各月の売上とその四半期の最初の月の売上を比較する場合</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">sales_amount - FIRST_VALUE(sales_amount) OVER (ORDER BY month)</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これらの関数は、ビジネスやデータ分析の現場で頻繁に使われます。適切な関数を選ぶことで、複雑な集計や解析を効率的に行うことができます。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc11">まとめ：window関数とは？</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ul class="wp-block-list">
<li><strong><span class="bold-blue">定義</span></strong>: window関数は、結果セットのサブセット（ウィンドウ）上での計算を行うためのSQL関数。</li>



<li><strong><span class="bold-blue">特性</span></strong>: 通常の集計関数とは異なり、各行の詳細を保持しつつ集計を行うことが可能。
<ul class="wp-block-list">
<li><strong>PARTITION BY</strong>: <code>PARTITION BY</code>句を使用して、結果セットを特定のカテゴリや部分ごとに分けて関数を適用することが可能。</li>



<li><strong>ORDER BY</strong>: ウィンドウ内の行の順序を定義するために使用される。</li>



<li><strong>フレーム範囲指定</strong>: <code>ROWS</code>や<code>RANGE</code>を用いて、計算の対象となる行の範囲を具体的に定義することが可能。</li>
</ul>
</li>



<li><strong><span class="bold-blue">主な用途</span></strong>: ランキング、移動平均、累積合計など、特定のウィンドウ内での計算を行う場合に使用されます。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* 利用するテーブル
|------------|------------|--------------|
| date       | product_id | sales_amount |
|------------|------------|--------------|
| 2023-01-01 | A          | 100          |
| 2023-01-02 | A          | 110          |
| 2023-01-03 | A          | 90           |
| 2023-01-01 | B          | 95           |
| 2023-01-02 | B          | 105          |
| 2023-01-03 | B          | 105          |
|------------|------------|--------------|
*/

-- 各製品ごとに日付を基にした売上の3日移動平均を計算するSQLクエリ
SELECT
  date,
  product_id,
  sales_amount,
  AVG(sales_amount) OVER (
    PARTITION BY product_id
    ORDER BY date
    ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
  ) AS moving_avg_3days
FROM
  sales;

/* 結果
|------------|------------|--------------|------------------|
| date       | product_id | sales_amount | moving_avg_3days |
|------------|------------|--------------|------------------|
| 2023-01-01 | A          | 100          | 105              |
| 2023-01-02 | A          | 110          | 100              |
| 2023-01-03 | A          | 90           | 100              |
| 2023-01-01 | B          | 95           | 100              |
| 2023-01-02 | B          | 105          | 101.67           |
| 2023-01-03 | B          | 105          | 105              |
|------------|------------|--------------|------------------|
*/

-- PARTITION BY product_id により、各製品ごとにウィンドウ関数を適用。
-- ORDER BY date で、日付の昇順にデータを整列しています。
-- ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING で、各日の売上の1日前、当日、1日後の3日間のデータを対象として平均を計算。</pre>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box">
<div class="speech-person">
<figure class="speech-icon"><img decoding="async" class="speech-icon-image" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" /></figure>
<div class="speech-name"></div>
</div>
<div class="speech-balloon">
<p><!-- wp:paragraph --></p>
<p>現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。</p>
<p><!-- /wp:paragraph --></p>
</div>
</div>
<p><!-- /wp:cocoon-blocks/balloon-ex-box-1 --></p>
<p><!-- wp:paragraph --></p>
<p>SQLやデータベースの仕組みを１から学習したい方（学び直したい方）向けに、現役エンジニア達のスキルを結集して <strong><span class="marker-under"><span class="fz-14px"><span class="fz-18px"><span class="fz-20px">完全無料</span></span></span></span></strong> のSQL教材を作成しました。是非この機会にブックマークを！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p class="has-text-align-center" style="text-align: center;"><span class="badge-green">読者料典</span>　<a href="https://it-biz.online/it-skills/sql_roadmap/">【完全無料】SQL：初心者向け学習ロードマップ</a>　←こちらから！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【SQL】ROW_NUMBER関数（連番付与）の使い方を３分で解説</title>
		<link>https://it-biz.online/it-skills/row_number/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 06 Oct 2023 10:39:08 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8438</guid>

					<description><![CDATA[ROW_NUMBER()は、SQLのwindow関数の1つ。ROW_NUMBER関数を使用すると、結果セットの行に一意の連番を付与することができます。実際のデータには影響を与えませんが、結果として表示されるデータに番号を [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><code><strong>ROW_NUMBER()</strong></code>は、<a href="https://it-biz.online/it-skills/sql/">SQL</a>のwindow関数の1つ。<code><strong>ROW_NUMBER</strong></code>関数を使用すると、<span class="marker-under"><strong>結果セットの行に一意の連番を付与</strong></span>することができます。実際のデータには影響を与えませんが、結果として表示されるデータに番号を付けるのに便利です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT ROW_NUMBER() OVER() as rownum, *
FROM sample_data;</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/select/">SELECT文の基本</a></p>



<ul class="wp-block-list">
<li><code>ROW_NUMBER()</code>は、結果セットの行に連番を付与する関数。</li>



<li><code>ORDER BY</code>を使って、特定の順序で番号を付けることが可能。</li>



<li><code>PARTITION BY</code>を使うと、指定した列の値ごとに番号付けをリセットすることができる。</li>
</ul>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql-window/">window関数とは？</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページでは<code><strong>ROW_NUMBER</strong></code>関数の基本を１からわかりやすく初心者向けに解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>ROW_NUMBER関数の意味と使い方：構文ルール</li>



<li>ROW_NUMBER関数の利用方法：サンプルコード</li>
</ul>
</div>
</div></div>



<p>プログラマーやシステムエンジニアを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい基本知識</span></strong>です。是非最後までご覧ください。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql-abc/">【初心者向け】SQLの基本構文ルール</a></p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ROW_NUMBER関数とは？</a><ol><li><a href="#toc2" tabindex="0">ROW_NUMBER関数：構文ルール</a></li></ol></li><li><a href="#toc3" tabindex="0">ROW_NUMBER関数を利用する際の注意点</a><ol><li><a href="#toc4" tabindex="0">1. 一意性の確保</a></li><li><a href="#toc5" tabindex="0">2. 性能に関する注意点</a></li><li><a href="#toc6" tabindex="0">3. ROW_NUMBER() vs RANK() vs DENSE_RANK()</a></li><li><a href="#toc7" tabindex="0">4. バージョンやデータベースの種類による違い</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ROW_NUMBER関数とは？</span></h2>



<p><code>ROW_NUMBER()</code>はSQLのウィンドウ関数の１つで、<strong><span class="marker-under">データセットの各行に一意の連続する番号（行番号）を付与するときに使用</span></strong>します。主に、行に番号をつけたい場面や特定の条件でのランキングをつけたい場面などで使用されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>実際のデータに変更を加えるわけではなく、クエリの結果として表示されるデータに一時的に番号を付けるためのものです。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">ROW_NUMBER関数：構文ルール</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ROW_NUMBER() OVER (
    [PARTITION BY 列名1, 列名2, ... ]
    [ORDER BY 列名A [ASC | DESC], ... ]
)</pre>



<ul class="wp-block-list">
<li><code><span class="bold-blue">PARTITION BY</span></code>
<ul class="wp-block-list">
<li>オプション（任意）：特定の列を基にしてデータをグループ分けし、そのグループごとに行番号を1から付け直します。</li>
</ul>
</li>



<li><code><span class="bold-blue">ORDER BY</span></code>
<ul class="wp-block-list">
<li>オプション（任意）：行番号を付与する際の順序を指定するためのもので、指定した列の順に従って行番号が付与されます。</li>
</ul>
</li>
</ul>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード１</span>　studentsテーブル</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* サンプルデータ
|----|---------|-------|
| id | name    | score |
|----|---------|-------|
| 1  | Alice   | 85    |
| 2  | Bob     | 90    |
| 3  | Charlie | 85    |
| 4  | David   | 92    |
| 5  | Eve     | 88    |
|----|---------|-------|
*/

SELECT 
    ROW_NUMBER() OVER(ORDER BY score, name) as rownum,
    id, 
    name, 
    score
FROM students;

/* 実行結果
scoreの昇順（低いスコアから高いスコアへ）に基づいて行番号が付与された結果が得られる
|--------|----|---------|-------|
| rownum | id | name    | score |
|--------|----|---------|-------|
| 1      | 1  | Alice   | 85    |
| 2      | 3  | Charlie | 85    |
| 3      | 5  | Eve     | 88    |
| 4      | 2  | Bob     | 90    |
| 5      | 4  | David   | 92    |
|--------|----|---------|-------|
*/</pre>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード２</span>　employeesテーブル</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* 
サンプルデータ: employees
|----|---------|------------|--------|
| id | name    | department | salary |
|----|---------|------------|--------|
| 1  | Alice   | HR         | 5000   |
| 2  | Bob     | Sales      | 5500   |
| 3  | Charlie | HR         | 5200   |
| 4  | David   | Sales      | 5300   |
| 5  | Eve     | Sales      | 6000   |
|----|---------|------------|--------|
*/

-- 部署（department）ごとに給与（salary）の昇順で行番号を付けるクエリ
SELECT 
    ROW_NUMBER() OVER(PARTITION BY department ORDER BY salary) as rownum,
    id, 
    name,
    department,
    salary
FROM employees;

/* 実行結果
|--------|----|---------|------------|--------|
| rownum | id | name    | department | salary |
|--------|----|---------|------------|--------|
| 1      | 1  | Alice   | HR         | 5000   |
| 2      | 3  | Charlie | HR         | 5200   |
| 1      | 4  | David   | Sales      | 5300   |
| 2      | 2  | Bob     | Sales      | 5500   |
| 3      | 5  | Eve     | Sales      | 6000   |
|--------|----|---------|------------|--------|
*/</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このクエリの実行結果を見ると、<code>PARTITION BY</code>の効果により、部署ごとに行番号が1から始まっています。そして、その中で<code>ORDER BY</code>により給与の昇順に行番号が付けられていることがわかります。</p>
</div></div>



<p>このように、<code>PARTITION BY</code>と<code>ORDER BY</code>を組み合わせることで、特定のカテゴリやグループ内での順序付けを行うことができます。</p>



<h2 class="wp-block-heading"><span id="toc3">ROW_NUMBER関数を利用する際の注意点</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最後にROW_NUMBER関数を利用する際の注意点について補足しておきます。</p>



<p>この関数はよく利用する関数でもあるので、特に以下の点を押さえておくことが重要です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc4">1. 一意性の確保</span></h3>



<p><code>ROW_NUMBER()</code>関数は、指定した順序で行に一意の番号を付与します。しかし、<strong><span class="marker-under">同じ値を持つ行（つまり順序が同じ行）が複数存在する場合、それらの行の順序はデータベースエンジンに依存する</span></strong>ため、必ずしも一定ではありません。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* サンプルデータ: students
|----|---------|-------|
| id | name    | score |
|----|---------|-------|
| 1  | Alice   | 85    |
| 2  | Bob     | 85    |
| 3  | Charlie | 90    |
|----|---------|-------|
*/

SELECT 
    ROW_NUMBER() OVER(ORDER BY score) as rownum,
    id, 
    name, 
    score
FROM students;

/* 実行結果 (順序は不確定)
|--------|----|---------|-------|
| rownum | id | name    | score |
|--------|----|---------|-------|
| 1      | ?  | ?       | 85    |
| 2      | ?  | ?       | 85    |
| 3      | 3  | Charlie | 90    |
|--------|----|---------|-------|
*/</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このクエリでは、AliceとBobの<code>score</code>が同じであるため、それらに付与される行番号の順序は不確定です。</p>
</div></div>



<p>一意の順序を確保するためには、<code>ORDER BY</code>句に複数の列を追加することで、一意性を強制することができます。以下のように、<code>score</code>の後に<code>id</code>を追加してみます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* サンプルデータ: students
|----|---------|-------|
| id | name    | score |
|----|---------|-------|
| 1  | Alice   | 85    |
| 2  | Bob     | 85    |
| 3  | Charlie | 90    |
|----|---------|-------|
*/

SELECT 
    ROW_NUMBER() OVER(ORDER BY score, id) as rownum,
    id, 
    name, 
    score
FROM students;

/* 実行結果 (一意の順序が確保される)
|--------|----|---------|-------|
| rownum | id | name    | score |
|--------|----|---------|-------|
| 1      | 1  | Alice   | 85    |
| 2      | 2  | Bob     | 85    |
| 3      | 3  | Charlie | 90    |
|--------|----|---------|-------|
*/</pre>



<p>このクエリでは、<code>score</code>が同じ場合、次に<code>id</code>の順番を考慮するため、一意の順序が確保されます。</p>



<h3 class="wp-block-heading"><span id="toc5">2. 性能に関する注意点</span></h3>



<p>大量のデータを扱う場合、<code>ROW_NUMBER()</code>関数の計算には時間がかかることがあります。特に<code>PARTITION BY</code>や<code>ORDER BY</code>を使った複雑なソートや分割を行う際には、パフォーマンスの低下が考えられます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>適切なインデックスの作成やクエリの最適化を検討することが重要です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc6">3. ROW_NUMBER() vs RANK() vs DENSE_RANK()</span></h3>



<p><code>ROW_NUMBER()</code>以外にも、<code>RANK()</code>や<code>DENSE_RANK()</code>などの関数があります。これらの関数も行に番号を付与するのに使用されますが、同じ値を持つ行に対する取り扱いが異なります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>使用する関数を選択する際には、それぞれの動作を理解して、目的に合った関数を選択することが重要です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc7">4. バージョンやデータベースの種類による違い</span></h3>



<p><code>ROW_NUMBER()</code>関数は、多くのリレーショナルデータベースシステムでサポートされていますが、使用できるバージョンや具体的な動作、性能などにはデータベースの種類やバージョンによる違いがあります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>公式のドキュメントやリファレンスを確認することをおすすめします。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><strong>ROW_NUMBER関数のまとめ</strong></p>



<ul class="wp-block-list">
<li><code>ROW_NUMBER()</code>は、結果セットの行に連番を付与する関数です。</li>



<li><code>ORDER BY</code>を使って、特定の順序で番号を付けることができます。</li>



<li><code>PARTITION BY</code>を使うと、指定した列の値ごとに番号付けをリセットすることができます。</li>
</ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box">
<div class="speech-person">
<figure class="speech-icon"><img decoding="async" class="speech-icon-image" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" /></figure>
<div class="speech-name"></div>
</div>
<div class="speech-balloon">
<p><!-- wp:paragraph --></p>
<p>現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。</p>
<p><!-- /wp:paragraph --></p>
</div>
</div>
<p><!-- /wp:cocoon-blocks/balloon-ex-box-1 --></p>
<p><!-- wp:paragraph --></p>
<p>SQLやデータベースの仕組みを１から学習したい方（学び直したい方）向けに、現役エンジニア達のスキルを結集して <strong><span class="marker-under"><span class="fz-14px"><span class="fz-18px"><span class="fz-20px">完全無料</span></span></span></span></strong> のSQL教材を作成しました。是非この機会にブックマークを！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p class="has-text-align-center" style="text-align: center;"><span class="badge-green">読者料典</span>　<a href="https://it-biz.online/it-skills/sql_roadmap/">【完全無料】SQL：初心者向け学習ロードマップ</a>　←こちらから！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【データベース】正規化とは？わかりやすく３分で解説</title>
		<link>https://it-biz.online/it-skills/normalization/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 04 Jul 2022 05:42:48 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[データベース]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=6625</guid>

					<description><![CDATA[正規化とはデータを扱いやすくするために行う「データベース設計の手法」です。 データベースは常にレコードが追加され更新され、また削除され続けます。もし正規化を適切に行っていなければ、データベースの中でレコード間で矛盾が発生 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>正規化とは<strong><span class="marker-under">データを扱いやすくするために行う「データベース設計の手法」</span></strong>です。</p>



<p><a href="https://it-biz.online/it-skills/database/">データベース</a>は常にレコードが追加され更新され、また削除され続けます。もし正規化を適切に行っていなければ、データベースの中でレコード間で矛盾が発生し、データベースとして役割を果たさなくなってしまいます。</p>



<p>簡単に言えば、正規化の目的はデータの重複や不要な依存関係を排除することです。これにより、データの整合性を維持しやすくなります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページでは、データベース初心者向けに（もしくは、何度か正規化について学習しているけれどいまいち理解しきれない・・・という方向けに）<strong><span class="marker-under">データベース正規化の目的や、正規化の手順、基本となる知識</span></strong>をわかりやすく網羅的に解説します。</p>
</div></div>



<p>前提となる知識もこのページで網羅的に解説していくので、専門用語がわからない・・・という方でもご安心ください。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-hand-o-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>データベースの「正規化」とは？
<ul class="wp-block-list">
<li>「正規化」の目的</li>



<li>「正規化」の種類</li>
</ul>
</li>



<li>正規化の手順
<ul class="wp-block-list">
<li>第１正規形</li>



<li>第２正規形</li>



<li>第３正規形</li>
</ul>
</li>
</ul>
</div>
</div></div>



<p>データベースエンジニアを目指す方はもちろん、システムエンジニアやプログラマーを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい超・基本知識</span></strong>です。</p>



<p>是非最後までご覧ください。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">正規化とは？</a><ol><li><a href="#toc2" tabindex="0">正規化をわかりやすく</a></li></ol></li><li><a href="#toc3" tabindex="0">正規化の手順</a></li><li><a href="#toc4" tabindex="0">第１正規形</a></li><li><a href="#toc5" tabindex="0">第２正規形</a></li><li><a href="#toc6" tabindex="0">第３正規形</a></li><li><a href="#toc7" tabindex="0">システムエンジニアを目指したい方は</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">正規化とは？</span></h2>



<p>正規化（英：Normalization）の最大の目的は、<strong><span class="marker-under">データベース上で扱うデータの重複を削除し、データの更新時に発生する異常を取り除くこと</span></strong>です。</p>



<p>データベースには常に更新が発生します。正規化を適切に行っていない場合、レコードの更新時に異常が発生し、正しくレコードが登録されなくなってしまいます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最初に<strong> "正規化されていないデータベース" にはどんなリスクが潜んでいるのか？</strong>を簡単にご説明します。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">正規化をわかりやすく</span></h3>



<p>「<strong>正規化できていない</strong>」以下２つのテーブルを考えます。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="237" src="https://it-biz.online/wp-content/uploads/2022/06/image-71-1024x237.png" alt="正規化 わかりやすく" class="wp-image-6631" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-71-1024x237.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-71-300x69.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-71-500x116.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-71-768x178.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-71-800x185.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-71.png 1285w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">例１）非正規形テーブル</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>左側のテーブルは注文を受けたらその内容をどんどん追加していくようなテーブルで、右側のテーブルは注文した人とその内容を整理して出来上がったようなテーブルです。</p>
</div></div>



<p>一見、２つのテーブルはちゃんと利用できるように思えます。ですが、実はこのテーブルは利用しているとレコード間の不整合が発生します。</p>



<p>例として、このとき<strong><span class="marker-under">注文がキャンセルされてしまい、注文番号テーブルから対象のレコードを削除するとどうなるか？</span></strong>を考えてみたいと思います。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="948" height="269" src="https://it-biz.online/wp-content/uploads/2022/06/image-72.png" alt="" class="wp-image-6632" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-72.png 948w, https://it-biz.online/wp-content/uploads/2022/06/image-72-300x85.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-72-500x142.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-72-768x218.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-72-800x227.png 800w" sizes="(max-width: 948px) 100vw, 948px" /><figcaption class="wp-element-caption">注文番号「1003」のレコードがキャンセル（削除される）</figcaption></figure>



<p>もし、キャンセルを受けた担当が、上記４つのレコード「<strong>だけ</strong>」削除してしまうと、テーブル間での矛盾が発生します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>本来であれば、４つのレコードを削除すると同時に、<span class="marker-under">注文者テーブルの方のレコードも同じように削除しておく必要があります。</span></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://it-biz.online/wp-content/uploads/2022/06/image-74-1024x222.png" alt="" class="wp-image-6634" style="aspect-ratio:687/149" width="687" height="149" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-74-1024x222.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-74-300x65.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-74-500x109.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-74-768x167.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-74-800x174.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-74.png 1400w" sizes="(max-width: 687px) 100vw, 687px" /></figure>



<p>「注文番号テーブル」には存在しないのに、「注文者テーブル」にはそれに対応するレコードが存在するという謎な現象が起きてしまうのです。</p>
</div></div>



<p>このように正規化されていないテーブルを扱おうとすると、テーブル間の不整合が起きたり、レコードが破損してしまうなど、どこかで異常が発生することは避けられないということが分かります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここでは非常に簡単な例で説明しましたが、これだけではなく様々なパターンの更新時異常が存在します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box"><div class="label-box-label block-box-label box-label fab-question-circle"><span class="label-box-label-text block-box-label-text box-label-text">必ずどちらも更新するようにすれば良いのでは？という疑問</span></div><div class="label-box-content block-box-content box-content">
<p>正規化しなくても、毎回必ず両方のテーブルを更新するようにすればOKなのでは？という疑問が出てきますよね。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>結論から言えば、ある意味では「その通り」です。</p>
</div></div>



<p>例えば、更新時に異常が発生しないように更新が必要なすべてのテーブルをプログラムで更新するようにしたり、マニュアルを用意して片方のテーブルを更新したらもう一方のテーブルも更新するようにしたり・・・などの案が考えられます。</p>



<p>が、<strong>いずれにせよプログラムをきちんと作りこむ必要性やマニュアルの作成など、別のコストが発生してしまうことには変わりありません。</strong>また、通常そのような無理な回避策は長年動くシステムや業務では必ず破綻していきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>したがって、あらかじめデータベースの正規化を適切に行っておく方がGood！な判断である場合がほとんどです。</p>
</div></div>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">正規化の手順</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>では、正規化はどのように行うのか？ここからは具体的に正規化とは何か？その手順はどのように進めるのか？をご説明していきます。</p>
</div></div>



<p>データベースの正規化は以下の通り順を追って進められます。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="425" src="https://it-biz.online/wp-content/uploads/2022/06/image-75-1024x425.png" alt="正規化 わかりやすく" class="wp-image-6635" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-75-1024x425.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-75-300x125.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-75-500x208.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-75-768x319.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-75-800x332.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-75.png 1057w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">図2：正規化とは</figcaption></figure>



<p>上記図の通り、正規化の過程ではデータベースはいくつかの「<strong>正規形</strong>」（例：第１正規形 / 第２正規形～）を経て構築されます。以下は正規化の主要な手順を簡単に説明したものです。</p>



<ol class="wp-block-list">
<li><strong>第1正規形 (1NF)</strong>
<ul class="wp-block-list">
<li>各カラムに１つの値のみを持たせる。</li>



<li>同じカラム内での重複を避ける。</li>
</ul>
</li>



<li><strong>第2正規形 (2NF)</strong>
<ul class="wp-block-list">
<li>合成キー（2つ以上のカラムの組み合わせ）を持つテーブルで、キーの一部のみに依存するカラムを分離する。</li>
</ul>
</li>



<li><strong>第3正規形 (3NF)</strong>
<ul class="wp-block-list">
<li>ある非キーカラムが他の非キーカラムに依存している場合、その依存関係を排除する。</li>
</ul>
</li>



<li><strong>高次の正規形</strong>
<ul class="wp-block-list">
<li>3NFを超える正規形（BCNF、4NF、5NFなど）も存在しますが、実際のデータベース設計でこれらを厳密に適用することは珍しい→しかし、特定の問題を解決するためにこれらの正規形を考慮することは有益。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>正規化は一気に終わるのではなく、<strong><span class="marker-under">順を追って徐々により高次な正規形に進化していくようなイメージを持てればまずはOK</span></strong>です。</p>
</div></div>



<p>また、上記では現在存在する正規化の手順をすべて記載しましたが、<strong>実際のところは「第１正規形～第３正規形」までが基本</strong>で、それより高次の正規化は大抵の場合は不要。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>理由はページ後半でまた解説しますが、まずは第１正規形～第３正規形を確実に理解することを目標としてください。</p>
</div></div>



<p>それでは実際の正規化の手順を順を追ってご説明していきます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>データベーススペシャリスト試験でも出題のメインとなるのは正規化です。その中でも第１正規形～第３正規形に関する出題が９割以上を占めます。</p>
</div>



<h2 class="wp-block-heading"><span id="toc4">第１正規形</span></h2>



<p>第１正規形の定義は、わかりやすく説明すると<strong><span class="marker-under">Excelのような１セル１レコードのテーブルとして表現できるようにすること</span></strong>です。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="585" src="https://it-biz.online/wp-content/uploads/2022/06/image-69-1024x585.png" alt="データベース　正規化　第１正規形" class="wp-image-6629" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-69-1024x585.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-69-300x172.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-69-500x286.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-69-768x439.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-69-800x457.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-69.png 1268w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">図：第１正規形</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>第１正規形はご覧の通り超・単純です。</p>
</div></div>



<p>正式にはすべてのドメインがシンプルであること（＝１セル１レコード）というのが第１正規形の定義です。</p>



<p>具体的には<strong><span class="marker-under">①：繰り返し項目を取り除くこと</span></strong>、<strong><span class="marker-under">②：２つ以上のレコードが保存されているドメインを取り除くこと</span></strong>、の２つが一番初めにおこなう正規化です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下のテーブルを例にすると<span class="blue">青字部分</span>は繰り返し項目・<span class="blue"><span class="green">緑字部分</span></span>が１つのドメインに２つのレコードが存在（商品IDと商品名）しているので、第１の正規化対象です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="994" height="301" src="https://it-biz.online/wp-content/uploads/2022/06/image-76.png" alt="" class="wp-image-6636" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-76.png 994w, https://it-biz.online/wp-content/uploads/2022/06/image-76-300x91.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-76-500x151.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-76-768x233.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-76-800x242.png 800w" sizes="(max-width: 994px) 100vw, 994px" /></figure>



<p>これらの項目を整理して出来上がるテーブルが<strong><span class="marker-under">第１正規形</span></strong>です。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="271" src="https://it-biz.online/wp-content/uploads/2022/06/image-77-1024x271.png" alt="" class="wp-image-6637" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-77-1024x271.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-77-300x79.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-77-500x132.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-77-768x203.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-77-800x212.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-77.png 1427w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">正規化のまとめ①</div>
<ul class="wp-block-list">
<li><strong>第１正規形</strong><br>１セル１レコードとなるようにシンプルなテーブルに整理された状態</li>
</ul>
</div>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="585" src="https://it-biz.online/wp-content/uploads/2022/06/image-69-1024x585.png" alt="データベース　正規化　第１正規形" class="wp-image-6629" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-69-1024x585.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-69-300x172.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-69-500x286.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-69-768x439.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-69-800x457.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-69.png 1268w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">図：第１正規形</figcaption></figure>
</div>



<h2 class="wp-block-heading"><span id="toc5">第２正規形</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>続いて第２正規形の説明です。<strong>ここからグッと専門用語が多くなり、難易度も上がります。</strong></p>



<p>多くの人はこの第２正規形の説明でドロップダウンしてしまうので、ゆっくり確実に学習を進めていきましょう。</p>
</div></div>



<p>第２正規形は「<strong><span class="marker-under">テーブルの各候補キーに従属する部分関数従属性が整理された</span></strong>」状態です。</p>



<p>「<strong>候補キー</strong>」「<strong>部分関数従属</strong>」の２点について用語の意味をご説明します。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box"><div class="label-box-label block-box-label box-label fab-exclamation-circle"><span class="label-box-label-text block-box-label-text box-label-text">候補キー（Candidate Key）をわかりやすく</span></div><div class="label-box-content block-box-content box-content">
<p><strong>候補キー</strong>とは「レコードを一意に特定するための属性（＝カラム）」または「レコードを一意に特定するための属性の組み合わせ」です。</p>



<p>例えば、以下のテーブルであれば候補キーは「出席番号」です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="646" height="175" src="https://it-biz.online/wp-content/uploads/2022/06/image-79.png" alt="候補キーとは" class="wp-image-6639" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-79.png 646w, https://it-biz.online/wp-content/uploads/2022/06/image-79-300x81.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-79-500x135.png 500w" sizes="(max-width: 646px) 100vw, 646px" /><figcaption class="wp-element-caption">例）候補キー</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><span class="marker-under"><strong>出席番号さえ分かれば、どのレコードを指し示しているかが分かりますよね。</strong></span></p>



<p>したがって、上記のテーブルでは出席番号項目が候補キーであるといえます。</p>



<p>逆に「氏名」列や「生年月日」列は同じ値が存在する可能性もあるため、<strong>候補キーとは言えません。</strong></p>
</div></div>



<p>では、先ほど第１正規形を行ったテーブルの候補キーはどれになるでしょうか？</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="1013" height="301" src="https://it-biz.online/wp-content/uploads/2022/06/image-80.png" alt="" class="wp-image-6640" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-80.png 1013w, https://it-biz.online/wp-content/uploads/2022/06/image-80-300x89.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-80-500x149.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-80-768x228.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-80-800x238.png 800w" sizes="(max-width: 1013px) 100vw, 1013px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong>この場合は、どの列も単独ではレコードを一意に特定することができません。</strong>「注文番号」も「注文者」などが候補キーに該当しそうな気もしますが、どちらの列にも同じ値が存在します。</p>



<p>この場合、１つの項目が単独でレコードを特定することができないため、候補キーは各項目の組み合わせを判断し特定する必要があります。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center">再掲</p>



<p><strong>候補キー</strong>とは「レコードを一意に特定するための属性（＝カラム）」または「レコードを一意に特定するための属性の組み合わせ」です。</p>
</div>
</div></div>



<p>上記テーブルの場合は "注文番号" と "商品ID" が分かれば（"注文番号" と "商品ID" の組み合わせを見れば）、どのレコードを指し示しているかを特定することができます。</p>



<p>したがって、候補キーは "注文番号" と "商品ID" になります。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="274" src="https://it-biz.online/wp-content/uploads/2022/06/image-81-1024x274.png" alt="" class="wp-image-6641" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-81-1024x274.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-81-300x80.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-81-500x134.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-81-768x206.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-81-800x214.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-81.png 1121w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>また、重要なポイントの１つが「候補キーは複数存在する可能性がある」ということです。例えば、上記のテーブルでは「注文番号」と「<strong>商品名</strong>」の組み合わせも、候補キーになります。</p>



<p>何故なら、注文番号と商品名が分かれば、先ほどと同様にどのレコードを指し示しているかが分かるためです。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="275" src="https://it-biz.online/wp-content/uploads/2022/06/image-82-1024x275.png" alt="" class="wp-image-6642" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-82-1024x275.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-82-300x81.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-82-500x134.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-82-768x206.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-82-800x215.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-82.png 1121w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div></div>



<p>したがって、上記テーブルの<strong>候補キー</strong>は（注文番号,商品ID）と（注文番号,商品名）ということになります。</p>
</div></div>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box"><div class="label-box-label block-box-label box-label fab-exclamation-circle"><span class="label-box-label-text block-box-label-text box-label-text">部分関数従属をわかりやすく</span></div><div class="label-box-content block-box-content box-content">
<p>部分関数従属とは<strong><span class="marker-under">「一部の候補キーに対して」関数従属する属性</span></strong>を言います。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">関数従属</div>
<ul class="wp-block-list">
<li>Xの値が決まるYの値が決まる関係のこと（X→Y）<br>例) <strong>Y=3+X</strong> の場合 Xの値が<strong>7</strong>に決まれば Yの値は<strong>10</strong>に決定する</li>
</ul>
</div>
</div>



<p>例えば、以下のテーブルでは注文番号が決まれば「注文日」「注文者ID」「注文者」のカラムは一意に決定することが分かります。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="842" height="319" src="https://it-biz.online/wp-content/uploads/2022/07/image.png" alt="" class="wp-image-6645" srcset="https://it-biz.online/wp-content/uploads/2022/07/image.png 842w, https://it-biz.online/wp-content/uploads/2022/07/image-300x114.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-500x189.png 500w, https://it-biz.online/wp-content/uploads/2022/07/image-768x291.png 768w, https://it-biz.online/wp-content/uploads/2022/07/image-800x303.png 800w" sizes="(max-width: 842px) 100vw, 842px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>注文番号が「1001」であれば必ず注文日は「2020/10/1」で注文者IDは「A001」、注文者は「田中商事」に確定します。</p>
</div></div>



<p>このとき、注文日・注文者ID・注文者のカラムは候補キーの１つである「注文番号」に関数従属しているため「部分関数従属」している、ということができます。</p>



<p>また、同じ原理で「商品名」も商品IDに対して部分関数従属しているということができます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="931" height="379" src="https://it-biz.online/wp-content/uploads/2022/07/image-1.png" alt="" class="wp-image-6646" srcset="https://it-biz.online/wp-content/uploads/2022/07/image-1.png 931w, https://it-biz.online/wp-content/uploads/2022/07/image-1-300x122.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-1-500x204.png 500w, https://it-biz.online/wp-content/uploads/2022/07/image-1-768x313.png 768w, https://it-biz.online/wp-content/uploads/2022/07/image-1-800x326.png 800w" sizes="(max-width: 931px) 100vw, 931px" /></figure>
</div></div>



<p>第２正規形は「<strong><span class="marker-under">テーブルの各候補キーに従属する部分関数従属性が整理された</span></strong>」状態です。</p>



<p>したがって、部分関数従属している列を切り離し別のテーブルとして整理するのが第２正規化の手順です。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="https://it-biz.online/wp-content/uploads/2022/07/image-2-1024x512.png" alt="" class="wp-image-6647" srcset="https://it-biz.online/wp-content/uploads/2022/07/image-2-1024x512.png 1024w, https://it-biz.online/wp-content/uploads/2022/07/image-2-300x150.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-2-500x250.png 500w, https://it-biz.online/wp-content/uploads/2022/07/image-2-768x384.png 768w, https://it-biz.online/wp-content/uploads/2022/07/image-2-800x400.png 800w, https://it-biz.online/wp-content/uploads/2022/07/image-2.png 1384w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">正規化のまとめ②</div>
<ul class="wp-block-list">
<li><strong>第１正規形</strong><br>１セル１レコードとなるようにシンプルなテーブルに整理された状態</li>



<li><strong>第２正規形</strong><br><strong><span class="marker-under">テーブルの各候補キーに従属する部分関数従属性が整理された</span></strong>状態</li>
</ul>
</div>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="https://it-biz.online/wp-content/uploads/2022/07/image-2-1024x512.png" alt="" class="wp-image-6647" srcset="https://it-biz.online/wp-content/uploads/2022/07/image-2-1024x512.png 1024w, https://it-biz.online/wp-content/uploads/2022/07/image-2-300x150.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-2-500x250.png 500w, https://it-biz.online/wp-content/uploads/2022/07/image-2-768x384.png 768w, https://it-biz.online/wp-content/uploads/2022/07/image-2-800x400.png 800w, https://it-biz.online/wp-content/uploads/2022/07/image-2.png 1384w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>初心者にとってはこの第２正規形が第１正規形～第３正規形の中で１番理解しづらい部分です。</p>



<p>一度読んで理解しきれなかった方はもう一度この章を学習しなおしておきましょう。</p>



<p>第２正規形が分かれば、第３正規形は実はそこまで難しくはありません。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc6">第３正規形</span></h2>



<p>第３正規形は<strong><span class="marker-under">候補キー以外の列に関数従属している列が整理された状態</span></strong>です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>第２正規化で整理された注文詳細テーブルを例に第３正規化の手順を見ていきましょう。</p>
</div></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="671" height="247" src="https://it-biz.online/wp-content/uploads/2022/07/image-3.png" alt="" class="wp-image-6648" srcset="https://it-biz.online/wp-content/uploads/2022/07/image-3.png 671w, https://it-biz.online/wp-content/uploads/2022/07/image-3-300x110.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-3-500x184.png 500w" sizes="(max-width: 671px) 100vw, 671px" /></figure>



<p>第３正規形は「候補キー以外の列に関数従属している列が存在しない」状態です。したがって、上記の例でいうと、候補キーではない注文者IDに関数従属している「注文者」列を別表に移すのが第３正規化で行う手順です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="893" height="418" src="https://it-biz.online/wp-content/uploads/2022/07/image-4.png" alt="" class="wp-image-6649" srcset="https://it-biz.online/wp-content/uploads/2022/07/image-4.png 893w, https://it-biz.online/wp-content/uploads/2022/07/image-4-300x140.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-4-500x234.png 500w, https://it-biz.online/wp-content/uploads/2022/07/image-4-768x359.png 768w, https://it-biz.online/wp-content/uploads/2022/07/image-4-800x374.png 800w" sizes="(max-width: 893px) 100vw, 893px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>"注文者" 列を注文詳細テーブルから切り離し顧客マスタとして独立させました。</p>



<p>これによって、候補キー以外の列に関数従属している列が存在しない状態を作り出すことができます。</p>
</div></div>



<p>当初１つのテーブルに存在していたデータが正規化を行うことで、以下の４つのテーブルに整理されました。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="556" src="https://it-biz.online/wp-content/uploads/2022/07/image-5-1024x556.png" alt="" class="wp-image-6650" srcset="https://it-biz.online/wp-content/uploads/2022/07/image-5-1024x556.png 1024w, https://it-biz.online/wp-content/uploads/2022/07/image-5-300x163.png 300w, https://it-biz.online/wp-content/uploads/2022/07/image-5-500x272.png 500w, https://it-biz.online/wp-content/uploads/2022/07/image-5-768x417.png 768w, https://it-biz.online/wp-content/uploads/2022/07/image-5-800x434.png 800w, https://it-biz.online/wp-content/uploads/2022/07/image-5.png 1278w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>この４つのテーブルが以下の第１正規形～第３正規形までの定義を満たしていることを確認してみてください。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">正規化のまとめ③</div>
<ul class="wp-block-list">
<li><strong>第１正規形</strong><br>１セル１レコードとなるようにシンプルなテーブルに整理された状態</li>



<li><strong>第２正規形</strong><br><strong>テーブルの各候補キーに従属する部分関数従属性が整理された</strong>状態</li>



<li><strong>第３正規形</strong><br><strong>候補キー以外の列に関数従属している列</strong>が整理された状態</li>
</ul>
</div>
</div>



<h2 class="wp-block-heading"><span id="toc7">システムエンジニアを目指したい方は</span></h2>



<p>システムエンジニアを目指す方や、IT知識を１から身につけたい方は以下のページをご覧ください。</p>



<p><strong><span class="marker-under">正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか？が分からない・・・という方は必見です。</span></strong></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>システムエンジニア向けに「できるエンジニア」になる方法を１から解説しておりますので、是非ご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ビズドットオンライン wp-block-embed-ビズドットオンライン"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/lifehack/curriculum/" title="1人前のシステムエンジニア(SE)になるために勉強した５つのこと" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2019/02/SE_Learn-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2019/02/SE_Learn-320x180.png 320w, https://it-biz.online/wp-content/uploads/2019/02/SE_Learn-240x135.png 240w, https://it-biz.online/wp-content/uploads/2019/02/SE_Learn-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">1人前のシステムエンジニア(SE)になるために勉強した５つのこと</div><div class="blogcard-snippet internal-blogcard-snippet">本ページでは、１人前のシステムエンジニアになるために学んだこと・読んだ本・勉強したプログラミング言語を現役のエンジニアが１から紹介しています。「正直何を勉強したらよいかわからない」という疑問をお持ちの方は特に必見です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2021.07.29</div></div></div></div></a>
</div></figure>
</div></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【SQL】COUNT関数を１分でわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/sql-count/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 08 Jun 2022 00:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=6485</guid>

					<description><![CDATA[SQLを利用してテーブルのレコード数を調べたいときに便利なCOUNT関数について初心者向けにわかりやすく１分で解説します。 参考　SQLとは？ このページではCOUNT関数の構文ルール / 利用する際の注意点を初心者でも [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SQLを利用してテーブルのレコード数を調べたいときに便利な<strong>COUNT関数</strong>について初心者向けにわかりやすく１分で解説します。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql/">SQLとは？</a></p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(対象カラム)
FROM テーブル名
WHERE 条件（任意）;</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>COUNT関数は指定したテーブル/カラムに存在するレコード数を返してくれます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="575" height="261" src="https://it-biz.online/wp-content/uploads/2022/06/image-23.png" alt="count関数のイメージ" class="wp-image-6488" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-23.png 575w, https://it-biz.online/wp-content/uploads/2022/06/image-23-300x136.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-23-500x227.png 500w" sizes="(max-width: 575px) 100vw, 575px" /><figcaption class="wp-element-caption">図1：count関数のイメージ</figcaption></figure>



<p><a href="https://it-biz.online/it-skills/select-distinct/">DISTINCTキーワード</a>や<a href="https://it-biz.online/it-skills/group-by/">GROUP BYキーワード</a>と同時に利用したりすると、できることがたくさん増えるので理解必須の基本知識です。</p>
</div></div>



<p>このページではCOUNT関数の構文ルール / 利用する際の注意点を初心者でも理解できるように１分で解説します。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>COUNT関数の使い方/構文ルール</li>



<li>COUNT関数の注意点：NULLのカウントについて</li>



<li>Tips：DISTINCTキーワードとの合わせ技</li>
</ul>
</div>
</div></div>



<p>プログラマー/システムエンジニアを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい超・重要知識</span></strong>です。是非最後までご覧ください。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql-abc/">【初心者向け】SQLの基本構文ルール</a></p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SQL：COUNT関数の基本</a><ol><li><a href="#toc2" tabindex="0">カラムを指定してCOUNT関数を利用する</a></li></ol></li><li><a href="#toc3" tabindex="0">COUNT関数の注意点</a></li><li><a href="#toc4" tabindex="0">Tips：DISTINCTキーワードとの合わせ技</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">SQL：COUNT関数の基本</span></h2>



<p>COUNT関数の基本構文ルールは以下の通り。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(対象カラム)
FROM テーブル名
WHERE 条件（任意）;</pre>



<p>レコード数をカウントしたいカラム名を "<strong>COUNT</strong>" で囲んであげるだけの簡単な構文です。もしくは、カラムを指定せずに *（アスタリスク）でテーブルのレコード数をシンプルに取得することも可能。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下のテーブルに含まれるレコード数をカウントしてみます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="526" height="327" src="https://it-biz.online/wp-content/uploads/2022/06/image-24.png" alt="" class="wp-image-6495" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-24.png 526w, https://it-biz.online/wp-content/uploads/2022/06/image-24-300x187.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-24-500x311.png 500w" sizes="(max-width: 526px) 100vw, 526px" /></figure>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(*)
FROM MemberList;

-- 結果「8」</pre>



<p>結果は「８」となります。レコード数が８個あるので、その結果が返ってきてくるということ。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="575" height="261" src="https://it-biz.online/wp-content/uploads/2022/06/image-23.png" alt="" class="wp-image-6488" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-23.png 575w, https://it-biz.online/wp-content/uploads/2022/06/image-23-300x136.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-23-500x227.png 500w" sizes="(max-width: 575px) 100vw, 575px" /></figure>



<h3 class="wp-block-heading"><span id="toc2">カラムを指定してCOUNT関数を利用する</span></h3>



<p>先ほどは <strong>COUNT(*)</strong> のようにカラムを指定せずに単純にレコード数をカウントしました。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(*)
FROM MemberList;
--カラムを指定せずにレコード数をカウント</pre>



<p>ですが、例えば Department カラムではNULL値が２行含まれており、このNULLを除外したレコード件数をカウントしたいような場合も存在します。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="526" height="327" src="https://it-biz.online/wp-content/uploads/2022/06/image-24.png" alt="" class="wp-image-6495" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-24.png 526w, https://it-biz.online/wp-content/uploads/2022/06/image-24-300x187.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-24-500x311.png 500w" sizes="(max-width: 526px) 100vw, 526px" /></figure>



<p>この場合は、Departmentカラムを以下のように指定してカウントすることで実現することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(Department)
FROM MemberList;
--カラム "Department" を指定してカウント</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この場合、NULL値がカウントされないので、結果は「６」となります。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">COUNT関数の注意点</span></h2>



<p>COUNT関数の大きな注意点がこの<strong>NULLのカウント方法</strong>にあります。</p>



<p>例えば、以下のテーブルをカラムを指定せずにカウントしてみます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="576" height="307" src="https://it-biz.online/wp-content/uploads/2022/06/image-25.png" alt="" class="wp-image-6497" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-25.png 576w, https://it-biz.online/wp-content/uploads/2022/06/image-25-300x160.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-25-500x266.png 500w" sizes="(max-width: 576px) 100vw, 576px" /><figcaption class="wp-element-caption">すべてのカラムがNULL</figcaption></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(*) FROM MemberList;
--カラムを指定せずにレコード数をカウント</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>普通に考えるとどのカラムもNULLなので、結果は０となりそうですが、<strong><span class="marker-under">実はこのSQLを実行すると「８」が返って来ます。</span></strong></p>
</div></div>



<p>これは、COUNT関数が以下のような性質を持っていることが理由です。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">COUNT関数の仕組み</div>
<ul class="wp-block-list">
<li><strong>COUNT(*)</strong> は<strong><span class="marker-under">NULLも含めて</span></strong>レコード数をカウントする</li>



<li><strong>COUNT(カラム名)</strong> はNULLを除外してレコード数をカウントする</li>
</ul>
</div>
</div>



<p>つまり、以下のSQLを実行した場合は「８」と「０」が取得されるということ。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(*), COUNT(Department)
  FROM MemberList;

--COUNT(*)⇒8  /  COUNT(Department)⇒0</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以上がCOUNT関数の大きな注意点です。SQL初心者にとって陥りがちな罠の１つですので、しっかりと押さえておきましょう。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">Tips：DISTINCTキーワードとの合わせ技</span></h2>



<p>COUNT関数は<a href="https://it-biz.online/it-skills/select-distinct/">DISTINCT</a>と組み合わせて利用することも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(DISTINCT Department)
FROM MemberList;

-- 結果「3」
-- Department列の重複を削除してカウント</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="526" height="327" src="https://it-biz.online/wp-content/uploads/2022/06/image-24.png" alt="" class="wp-image-6495" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-24.png 526w, https://it-biz.online/wp-content/uploads/2022/06/image-24-300x187.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-24-500x311.png 500w" sizes="(max-width: 526px) 100vw, 526px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong><span class="marker-under">Department列には「総務部」「財務部」「営業部」の３つの重複しないレコードが存在するため、結果は３となります。</span></strong></p>



<p>先ほど解説した通り、COUNT(カラム名) とした場合はNULLを除外するので４では返って来ません。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>利用する<a href="https://it-biz.online/it-skills/dbms/">DBMS</a>によっては COUNT(DISTINCT カラム名) の構文が許容されていない場合もあります。その場合は、以下のようにDISTINCTをサブクエリとして利用することで同様の処理を実現することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT COUNT(*)
FROM (SELECT DepartMent FROM MemberList );</pre>
</div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">このページのまとめ</div>
<ul class="wp-block-list">
<li>COUNT関数はレコード件数を返す</li>



<li><strong>COUNT(*)</strong> は<strong><span class="marker-under">NULLも含めて</span></strong>レコード数をカウントする</li>



<li><strong>COUNT(カラム名)</strong> はNULLを除外してレコード数をカウントする</li>
</ul>
</div>



<p class="has-text-align-center"><strong>より実践的なサンプルコード</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- テーブルの作成
CREATE TABLE students (
    id INT PRIMARY KEY,
    first_name VARCHAR(255),
    last_name VARCHAR(255),
    age INT
);

-- データの挿入
INSERT INTO students (id, first_name, last_name, age)
VALUES (1, 'John', 'Doe', 20);

INSERT INTO students (id, first_name, last_name, age)
VALUES (2, 'Jane', 'Smith', NULL);

INSERT INTO students (id, first_name, last_name, age)
VALUES (3, 'Bob', 'Johnson', 22);

INSERT INTO students (id, first_name, last_name, age)
VALUES (4, 'Alice', 'Martin', 24);

-- SELECT COUNT
SELECT COUNT(*) FROM students;

/* 結果
4
*/

--age 列を指定してカウント
SELECT COUNT(age) FROM students;

/* 結果
3

COUNT(age)はageカラムのNULL値を除外してレコード数をカウントします。
このサンプルコードでは1つのレコードにNULL値が含まれているため、
カウントは4から1つ減って3になります。
*/</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/create-table/">CREATE TABLE</a> / <a href="https://it-biz.online/it-skills/sql-insert/">INSERT</a></p>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box">
<div class="speech-person">
<figure class="speech-icon"><img decoding="async" class="speech-icon-image" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" /></figure>
<div class="speech-name"></div>
</div>
<div class="speech-balloon">
<p><!-- wp:paragraph --></p>
<p>現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。</p>
<p><!-- /wp:paragraph --></p>
</div>
</div>
<p><!-- /wp:cocoon-blocks/balloon-ex-box-1 --></p>
<p><!-- wp:paragraph --></p>
<p>SQLやデータベースの仕組みを１から学習したい方（学び直したい方）向けに、現役エンジニア達のスキルを結集して <strong><span class="marker-under"><span class="fz-14px"><span class="fz-18px"><span class="fz-20px">完全無料</span></span></span></span></strong> のSQL教材を作成しました。是非この機会にブックマークを！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p class="has-text-align-center" style="text-align: center;"><span class="badge-green">読者料典</span>　<a href="https://it-biz.online/it-skills/sql_roadmap/">【完全無料】SQL：初心者向け学習ロードマップ</a>　←こちらから！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【SQL】SELECT DISTINCT（重複レコードの除外）を１分で解説</title>
		<link>https://it-biz.online/it-skills/select-distinct/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 07 Jun 2022 00:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=6467</guid>

					<description><![CDATA[SQLのSELECT文で用いられるDISTINCTの意味と使い方をわかりやすく１分で解説します。 参考　SQLとは？ DISTINCTはSELECTした結果から "重複するレコードを除外する" オプションです。 プログラ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SQLの<a href="https://it-biz.online/it-skills/select/">SELECT文</a>で用いられるDISTINCTの意味と使い方をわかりやすく１分で解説します。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql/">SQLとは？</a></p>



<p><strong><span class="marker-under">DISTINCTはSELECTした結果から "重複するレコードを除外する" オプション</span></strong>です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="880" height="235" src="https://it-biz.online/wp-content/uploads/2022/06/image-21.png" alt="SELECT DISTINCT" class="wp-image-6480" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-21.png 880w, https://it-biz.online/wp-content/uploads/2022/06/image-21-300x80.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-21-500x134.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-21-768x205.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-21-800x214.png 800w" sizes="(max-width: 880px) 100vw, 880px" /><figcaption class="wp-element-caption">図1：DISTINCTキーワード</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページではDISTINCTの構文ルールや利用方法の注意点を解説します。難しい内容ではないので１分ほどでマスターできます。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-hand-o-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>DISTINCTの使い方：構文ルール</li>



<li>DISTINCTで複数のカラムを指定する場合</li>



<li>DISTINCTの注意点</li>
</ul>
</div>
</div></div>



<p>プログラマー/システムエンジニアを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい超・基本知識</span></strong>です。是非最後までご覧ください。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/select/">SELECT文の基本</a></p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SELECT：DISTINCTの構文ルール</a><ol><li><a href="#toc2" tabindex="0">NULLも１種類としてカウント</a></li><li><a href="#toc3" tabindex="0">DISTINCTで複数のカラムを指定する場合</a></li></ol></li><li><a href="#toc4" tabindex="0">DISTINCTキーワードの注意点</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">SELECT：DISTINCTの構文ルール</span></h2>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- 基本形
SELECT DISTINCT カラム名
FROM テーブル名;

-- 複数のカラムに適用
SELECT DISTINCT カラム名1, カラム名2
FROM テーブル名;</pre>



<ol class="wp-block-list">
<li><strong>位置</strong>: <code>DISTINCT</code>キーワードは、<code>SELECT</code>文の直後に配置。</li>



<li><strong>対象</strong>: <code>DISTINCT</code>は１つ以上のカラムに適用され、そのカラムの組み合わせに対してユニークなレコードを返します。</li>



<li><strong>組み合わせ</strong>: 複数のカラムに<code>DISTINCT</code>を適用する場合、カラムの間にカンマ(,)を使用して区切る。</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>DISTINCTは<strong>SELECT句で指定するカラム名の前に記述</strong>します。</p>
</div></div>



<p>以下のテーブルから、"Department" 列を重複を除外したい場合のサンプルコードがこちら。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="434" height="207" src="https://it-biz.online/wp-content/uploads/2022/06/image-13.png" alt="" class="wp-image-6472" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-13.png 434w, https://it-biz.online/wp-content/uploads/2022/06/image-13-300x143.png 300w" sizes="(max-width: 434px) 100vw, 434px" /></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT DISTINCT Department 
  FROM MemberList;</pre>



<p id="block-b37eb40e-7f59-4eaf-85d1-7d9fa4f526b8">"Department" 列の重複が削除され、以下の結果が得られます。</p>



<figure class="wp-block-image aligncenter" id="block-87c7152b-148d-4ea4-9a96-94b513a26ddd"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2022/06/image-14.png" alt="画像に alt 属性が指定されていません。ファイル名: image-14.png"/><figcaption class="wp-element-caption">DISTINCTの実行結果</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>もし、DISTINCTを用いずに単純にSELECTした場合は以下の結果が得られます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Department 
  FROM MemberList;</pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="728" height="201" src="https://it-biz.online/wp-content/uploads/2022/06/image-17.png" alt="" class="wp-image-6476" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-17.png 728w, https://it-biz.online/wp-content/uploads/2022/06/image-17-300x83.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-17-500x138.png 500w" sizes="(max-width: 728px) 100vw, 728px" /></figure>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">NULLも１種類としてカウント</span></h3>



<p>DISTINCTを用いた場合はNULL値も１種類のデータとしてカウントされます。</p>



<p>例えば、どこにも所属していない社員がいるような場合。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="895" height="275" src="https://it-biz.online/wp-content/uploads/2022/06/image-19.png" alt="DISTINCT null" class="wp-image-6478" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-19.png 895w, https://it-biz.online/wp-content/uploads/2022/06/image-19-300x92.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-19-500x154.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-19-768x236.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-19-800x246.png 800w" sizes="(max-width: 895px) 100vw, 895px" /><figcaption class="wp-element-caption">図2：DISTINCT null</figcaption></figure>



<p>この場合、DISTINCTを用いるとNULLも消えずに選択されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT DISTINCT Department 
  FROM MemberList;</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="651" height="133" src="https://it-biz.online/wp-content/uploads/2022/06/image-20.png" alt="" class="wp-image-6479" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-20.png 651w, https://it-biz.online/wp-content/uploads/2022/06/image-20-300x61.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-20-500x102.png 500w" sizes="(max-width: 651px) 100vw, 651px" /><figcaption class="wp-element-caption">DISTINCT：NULLが含まれる場合の実行結果</figcaption></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>NULLを出力したくない場合は、WHERE句でNULLを除外するように指定しましょう。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">DISTINCTで複数のカラムを指定する場合</span></h3>



<p>DISTINCTは以下のように複数のカラムを指定することも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT DISTINCT Name, Department 
  FROM MemberList;</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>複数のカラムを指定する場合は、指定したカラムの<strong><span class="marker-under">組み合わせ</span></strong>がすべて一意に決まるように重複が除かれます。</p>
</div></div>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="224" src="https://it-biz.online/wp-content/uploads/2022/06/image-22-1024x224.png" alt="" class="wp-image-6481" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-22-1024x224.png 1024w, https://it-biz.online/wp-content/uploads/2022/06/image-22-300x66.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-22-500x109.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-22-768x168.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-22-800x175.png 800w, https://it-biz.online/wp-content/uploads/2022/06/image-22.png 1170w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>以上のように、Name列が "山田" かつDepartment列が "営業部" のように、組み合わせの結果が重複しているものが削除されるという点を押さえておきましょう。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>初心者にとっては少しだけ難しいかもしれませんが、これだけ覚えればDISTINCTは完璧です。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">DISTINCT は先頭のカラムの前にしか置けない</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>DISTINCTは先頭のカラムの前にしか記述することができません。</p>



<p>例えば、これはNG例。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Number, DISTINCT Department 
  FROM MemberList;</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Department列の重複だけを削除したいと考えるとこのような使い方をしがちですが、これはSQLの構文ルール違反です。よくあるミスの１つです。</p>
</div></div>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">DISTINCTキーワードの注意点</span></h2>



<p><code>DISTINCT</code>キーワードを使用する際の注意点について、サンプルコードを用いながらご説明します。</p>



<p class="has-text-align-center"><span class="badge-red">注意点１</span>　<strong>パフォーマンス</strong></p>



<ul class="wp-block-list">
<li><code>DISTINCT</code>は重複するレコードを除外するため、内部的にはソートやグルーピングが行われることがあります。そのため、大量のデータが存在するテーブルに対して使用するとパフォーマンスが低下する可能性があります。</li>



<li>インデックスの有無や設計もパフォーマンスに影響します。</li>
</ul>



<p class="has-text-align-center"><span class="badge-red">注意点２</span>　<strong>結果の順序</strong></p>



<ul class="wp-block-list">
<li><code>DISTINCT</code>の後に続くカラムの順序は結果の表示順に影響しますが、ユニーク性の評価には影響しません。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- 例1
SELECT DISTINCT column1, column2
FROM some_table;

-- 例2
SELECT DISTINCT column2, column1
FROM some_table;

-- 上記２つのSQLはユニークなレコードのセットは同じになりますが、結果の表示順は異なる可能性があります。</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">SELECT DISTINCTのまとめ</div>
<ul class="wp-block-list">
<li>DISTINCTはSELECTした結果から "重複するレコードを除外する" オプション</li>
</ul>
</div>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- 基本形
SELECT DISTINCT カラム名
FROM テーブル名;

-- 複数のカラムに適用
SELECT DISTINCT カラム名1, カラム名2
FROM テーブル名;</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="880" height="235" src="https://it-biz.online/wp-content/uploads/2022/06/image-21.png" alt="" class="wp-image-6480" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-21.png 880w, https://it-biz.online/wp-content/uploads/2022/06/image-21-300x80.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-21-500x134.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-21-768x205.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-21-800x214.png 800w" sizes="(max-width: 880px) 100vw, 880px" /></figure>



<p class="has-text-align-center"><strong>サンプルコード</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- テーブルの作成
CREATE TABLE employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(255),
    last_name VARCHAR(255),
    job_title VARCHAR(255)
);

-- レコードの挿入
INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (1, 'John', 'Doe', 'Software Engineer');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (2, 'Jane', 'Smith', 'Software Engineer');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (3, 'Bob', 'Johnson', 'Project Manager');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (4, 'Alice', 'Martin', 'Data Analyst');

INSERT INTO employees (id, first_name, last_name, job_title)
VALUES (5, 'Charlie', 'Brown', 'Data Analyst');

-- SELECT DISTINCT
SELECT DISTINCT job_title
FROM employees;

/* 結果
job_title
------------------
Software Engineer
Project Manager
Data Analyst

重複するjob_titleが取り除かれ一意のjob_titleのみが表示される
*/</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/create-table/">CREATE TABLE</a> / <a href="https://it-biz.online/it-skills/sql-insert/">INSERT</a></p>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box">
<div class="speech-person">
<figure class="speech-icon"><img decoding="async" class="speech-icon-image" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" /></figure>
<div class="speech-name"></div>
</div>
<div class="speech-balloon">
<p><!-- wp:paragraph --></p>
<p>現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。</p>
<p><!-- /wp:paragraph --></p>
</div>
</div>
<p><!-- /wp:cocoon-blocks/balloon-ex-box-1 --></p>
<p><!-- wp:paragraph --></p>
<p>SQLやデータベースの仕組みを１から学習したい方（学び直したい方）向けに、現役エンジニア達のスキルを結集して <strong><span class="marker-under"><span class="fz-14px"><span class="fz-18px"><span class="fz-20px">完全無料</span></span></span></span></strong> のSQL教材を作成しました。是非この機会にブックマークを！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p class="has-text-align-center" style="text-align: center;"><span class="badge-green">読者料典</span>　<a href="https://it-biz.online/it-skills/sql_roadmap/">【完全無料】SQL：初心者向け学習ロードマップ</a>　←こちらから！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【SQL】SELECT文の基本をわかりやすく３分で解説</title>
		<link>https://it-biz.online/it-skills/select/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 06 Jun 2022 12:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=6454</guid>

					<description><![CDATA[SELECT文は指定したテーブルからレコードを抽出する際に用いるSQL文で、SQL文全体の中で最も頻繁に用いられる構文です。 参考　SQLとは？ SELECT文の基本を知らないと、どの言語を扱うプログラマーであっても現場 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong><span class="marker-under">SELECT文は指定したテーブルからレコードを抽出する際に用いるSQL文</span></strong>で、SQL文全体の中で最も頻繁に用いられる構文です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT 列名1, 列名2, ... 
FROM テーブル名
WHERE 条件式;</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql/">SQLとは？</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>SELECT文は何も見なくてもすらすらと書けるのが、プログラマー/システムエンジニアとしての基本です！是非最後までご覧ください。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-edit"><span class="tab-caption-box-label-text block-box-label-text box-label-text">このページで学べる内容</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-hand-o-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>SELECT文の基本
<ul class="wp-block-list">
<li>カラムを指定</li>



<li>全カラムを指定</li>



<li>AS：別名の付与</li>
</ul>
</li>



<li>WHERE：抽出条件の指定</li>
</ul>
</div>
</div></div>



<p>SELECT文の基本を知らないと、<span class="marker-under"><strong>どの言語を扱うプログラマーであっても現場でも大変苦労します。</strong></span>このページの内容は確実に理解するようにしましょう！</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>"SELECT" は大文字で書けば良い？小文字で書けば良い・・・？</p>



<p>SQLの基本的な記述ルールが実は曖昧・・・。という方は以下の記事も併せてご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ビズドットオンライン wp-block-embed-ビズドットオンライン"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/sql-abc/" title="【SQL】基本的な記述ルール5つを１分で解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2022/06/sql_abc-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2022/06/sql_abc-320x180.png 320w, https://it-biz.online/wp-content/uploads/2022/06/sql_abc-240x135.png 240w, https://it-biz.online/wp-content/uploads/2022/06/sql_abc-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【SQL】基本的な記述ルール5つを１分で解説</div><div class="blogcard-snippet internal-blogcard-snippet">【SQL入門】SQL文を記述する際の基本ルール４つを解説します。OK例/NG例のそれぞれをサンプルコード付きでわかりやすく説明しています。たった今SQL文でエラーが発生して「ハマってる」人は必見です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2023.10.04</div></div></div></div></a>
</div></figure>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SELECT文の基本</a><ol><li><a href="#toc2" tabindex="0">WHERE：抽出条件の指定</a></li><li><a href="#toc3" tabindex="0">SELECT *：すべてのカラムを抽出する</a></li><li><a href="#toc4" tabindex="0">AS：カラム名に別名を付与して抽出</a></li><li><a href="#toc5" tabindex="0">WHERE句では別名（AS）は使用不可</a></li></ol></li><li><a href="#toc6" tabindex="0">SQL：SELECT文のまとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">SELECT文の基本</span></h2>



<p>テーブルからデータを取得する際の基本的なSELECT文は以下の通りです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT 列名1, 列名2, ... 
FROM テーブル名
WHERE 条件式;</pre>



<ul class="wp-block-list">
<li><code><span class="bold-blue">SELECT</span></code>: 取得したいカラム（列）を指定します。</li>



<li><code><span class="bold-blue">FROM</span></code>: どのテーブルからデータを取得するかを指定します。</li>



<li><code><span class="bold-blue">WHERE</span></code>（<strong>任意</strong>）: 取得するデータの条件を指定します。この句はオプションで、指定しなければテーブルの全てのデータが取得されます。</li>
</ul>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">句（clause）</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>句 とは<strong>SQLを構成する要素</strong>のこと。SELECT / FROM などのSQLキーワードから始まるフレーズを指します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>SELECT句やFROM句などというように「SQLキーワード＋句」とセットで呼称するのが一般的です。</p>
</div></div>
</div></div>



<p>以下は、<code>employees</code>というテーブルから<code>first_name</code>と<code>last_name</code>を取得する例です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>取得したいカラムが複数ある場合は「,」で区切ります。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* 対象テーブルのレコード
+----+------------+-----------+-------------+
| id | first_name | last_name | department  |
+----+------------+-----------+-------------+
|  1 | John       | Doe       | Engineering |
|  2 | Jane       | Smith     | HR          |
|  3 | Alice      | Johnson   | Sales       |
|  4 | Bob        | White     | Engineering |
+----+------------+-----------+-------------+
*/

-- 全ての従業員の名前を取得
SELECT first_name, last_name 
FROM employees;

/* 結果
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| John       | Doe       |
| Jane       | Smith     |
| Alice      | Johnson   |
| Bob        | White     |
+------------+-----------+
*/

-- first_nameが"John"である従業員の名前と部署を取得
SELECT first_name, last_name, department
FROM employees 
WHERE first_name = 'John';

/* 
+------------+-----------+-------------+
| first_name | last_name | department  |
+------------+-----------+-------------+
| John       | Doe       | Engineering |
+------------+-----------+-------------+
*/</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>↑の形がSELECT文の基本中の基本です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">WHERE：抽出条件の指定</span></h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>WHERE句についてはいくつかの注意点があるので、１から基本から再度振り返っておきます。</p>
</div></div>



<ul class="wp-block-list">
<li><code><span class="bold-blue">WHERE</span></code>（<strong>任意</strong>）: 取得するデータの条件を指定。指定しなければテーブルの全てのデータが取得される。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>例えば、↓のテーブルから「Suzuki」さんに関するデータを取得したいような場合。</p>



<p>このようなシーンで利用されるのが<strong>WHERE句</strong>です。</p>
</div></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="860" height="179" src="https://it-biz.online/wp-content/uploads/2022/06/image-9.png" alt="where句" class="wp-image-6464" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-9.png 860w, https://it-biz.online/wp-content/uploads/2022/06/image-9-300x62.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-9-500x104.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-9-768x160.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-9-800x167.png 800w" sizes="(max-width: 860px) 100vw, 860px" /><figcaption class="wp-element-caption">図1：where句</figcaption></figure>



<p>レコードを抽出する条件を指定する場合、以下のようにWHERE句を用います。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>MemberList テーブルから "Name" 列が「Suzuki」となっているものを取得する場合のサンプルコードがこちらです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Number, Name, Address, PhoneNumber
  FROM MemberList
 WHERE Name = "Suzuki";</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="857" height="149" src="https://it-biz.online/wp-content/uploads/2022/06/image-10.png" alt="" class="wp-image-6465" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-10.png 857w, https://it-biz.online/wp-content/uploads/2022/06/image-10-300x52.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-10-500x87.png 500w, https://it-biz.online/wp-content/uploads/2022/06/image-10-768x134.png 768w, https://it-biz.online/wp-content/uploads/2022/06/image-10-800x139.png 800w" sizes="(max-width: 857px) 100vw, 857px" /></figure>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p class="has-text-align-center"><strong><code>WHERE</code>句を利用する際の注意点</strong></p>



<ol class="wp-block-list">
<li><strong>データ型の一致</strong>：<code>WHERE</code>句で条件を指定する際、比較するカラムの<a href="https://it-biz.online/it-skills/data_type/">データ型</a>と比較値のデータ型が一致していることを確認する必要があります。データ型が異なるとエラーが発生する場合があります。</li>



<li><strong>NULLの取り扱い</strong>: <a href="https://it-biz.online/it-skills/dbms/">DBMS</a>によっては、NULLとの比較に特別な取り扱いが必要です。例えば、<code><span class="red">= NULL</span></code>ではなく<code><span class="red">IS NULL</span></code>を使用する必要があるなど。</li>



<li><strong>複数の条件の組み合わせ</strong>: <code>AND</code>や<code>OR</code>を使用して複数の条件を組み合わせる際、適切な括弧を使用して条件の優先順位を明確にすることが重要です。</li>



<li><strong>パフォーマンス</strong>: 複雑な条件やサブクエリ、JOINなどを多用すると、クエリのパフォーマンスに影響が出ることがあります。クエリの最適化やEXPLAINコマンドを使用して実行計画を確認することで、ボトルネックを特定し最適化の方向性を探ることができます。</li>
</ol>
</div>



<h3 class="wp-block-heading"><span id="toc3">SELECT *：すべてのカラムを抽出する</span></h3>



<p>テーブルのカラムが多くなっていくと、１つ１つのカラムをSELECT句で指定するのは大変です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>そこで、テーブルにあるすべてのカラムを抽出したい場合は「<strong>*　アスタリスク</strong>」を用います。</p>
</div></div>



<p class="has-text-align-center is-style-cross-line has-box-style"><code><span class="bold-blue">SELECT *</span></code>　の基本</p>



<ul class="wp-block-list">
<li><code>*</code>はワイルドカードとして機能し、<span class="marker-under">テーブル内のすべてのカラム</span>を意味する。</li>



<li>このコマンドは、テーブルの内容を迅速に確認したい時や、テーブルの構造（どのようなカラムがあるか）を知りたい場合に便利です。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT *
  FROM （テーブル名）;</pre>



<p>例えばテーブル「employees」からすべてのカラムを抽出したい場合は以下のように記述します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT * FROM employees;</pre>



<p>結果はすべてのカラムがそのまま抽出されます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>「*」を使用すると、結果の並び順は「<a href="https://it-biz.online/it-skills/create-table/">CREATE TABLE</a>」で定義した通りに出力されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>結果の並び順を変更したい場合には、SELECT句でカラム名を順番を変えて記述する必要があります。</p>
</div></div>
</div>



<p>「*」を利用すればSQL文の記述も早くなりカラム名指定などのミスも格段に減ります。</p>



<p>ただし、すべてのカラムを抽出する分、SQL実行のパフォーマンスも落ちてしまうというデメリットも存在します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ちょっとしたときにSELECT文を書くようなときは「*」指定はOKですが、例えば<strong><span class="marker-under">高効率なパフォーマンスが求められる場合や、抽出したいカラムが決まっている場合は１個１個カラムを指定するように心がけることをおすすめします。</span></strong></p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p class="has-text-align-center"><strong>注意点</strong></p>



<ol class="wp-block-list">
<li><strong>パフォーマンス</strong>：大きなテーブルで<code>SELECT *</code>　を使うと、不要なデータも読み込むことになり、システムのパフォーマンスに影響を与える可能性があります。必要なカラムのみを指定してデータを取得することが、効率的です。</li>



<li><strong>明確さ</strong>: カラムを明示的に指定することで、コードが読みやすくなり、どの情報が取得されるのか明確になります。<code>SELECT *</code>を使うと、後からコードを見返したときに、どの情報が取得されているのかすぐにはわからない場合があります。</li>



<li><strong>スキーマ変更の影響</strong>: テーブルの構造（スキーマ）が変更された場合、<code>SELECT *</code>を使用しているSQLはその変更を反映して結果を返します。これは予期しない結果をもたらす可能性があります。</li>
</ol>
</div>



<h3 class="wp-block-heading"><span id="toc4">AS：カラム名に別名を付与して抽出</span></h3>



<p>SQL文では、抽出するカラム名に別名を付与してレコードを抽出することが可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Number      AS "番号", 
       Name        AS "氏名", 
       Address     AS "住所", 
       PhoneNumber AS "電話番号"
  FROM MemberList;</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="587" height="342" src="https://it-biz.online/wp-content/uploads/2022/06/image-7.png" alt="select AS" class="wp-image-6462" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-7.png 587w, https://it-biz.online/wp-content/uploads/2022/06/image-7-300x175.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-7-500x291.png 500w" sizes="(max-width: 587px) 100vw, 587px" /><figcaption class="wp-element-caption">SELECT文（ASキーワード）</figcaption></figure>



<p>通常、テーブルのカラム名はアルファベットか数字で表されている場合が多いのですが、これだと少し分かりづらい場面があります。このようなタイミングで<strong>ASキーワード</strong>を利用して日本語の別名を付与してあげたりする使い方もできます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>日本語で別名を付与する場合は必ず「"　ダブルクォーテーション」で囲んであげる必要があります。</p>



<p>もし、別名もアルファベットで付与する場合にはダブルクォーテーションは不要です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Number      AS A, 
       Name        AS B, 
       Address     AS C, 
       PhoneNumber AS D
  FROM MemberList;</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="676" height="121" src="https://it-biz.online/wp-content/uploads/2022/06/image-8.png" alt="" class="wp-image-6463" srcset="https://it-biz.online/wp-content/uploads/2022/06/image-8.png 676w, https://it-biz.online/wp-content/uploads/2022/06/image-8-300x54.png 300w, https://it-biz.online/wp-content/uploads/2022/06/image-8-500x89.png 500w" sizes="(max-width: 676px) 100vw, 676px" /></figure>
</div></div>



<h3 class="wp-block-heading"><span id="toc5">WHERE句では別名（AS）は使用不可</span></h3>



<p>WHERE句の注意点の１つが、別名使用不可という点です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>例えば以下のような利用方法はできません。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Number      AS A, 
       Name        AS B, 
       Address     AS C, 
       PhoneNumber AS D
  FROM MemberList
 WHERE B = "Suzuki";</pre>
</div></div>



<p>せっかくASキーワードで別名を付けたのだからWHERE句でも使いたい・・・！という気持ちもしますが、SQLではNGです。データベース初心者にとっては陥りがちなミスの１つでもあるので、しっかり頭に入れておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc6">SQL：SELECT文のまとめ</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">このページのまとめ</div>
<ul class="wp-block-list">
<li>指定したテーブルからレコードを抽出するには<strong>SELECT文</strong>を用いる</li>



<li><strong>SELECT句：抽出するカラムを指定</strong>
<ul class="wp-block-list">
<li>* アスタリスクで全カラムを抽出</li>



<li>ASキーワードで別名を指定</li>
</ul>
</li>



<li><strong>FROM句：抽出するテーブルを指定</strong></li>



<li><strong>WHERE句：抽出する条件を指定</strong></li>
</ul>
</div>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- SELECT文の基本
SELECT * FROM employees;

-- 複雑なSELECT文
SELECT first_name, last_name, salary
FROM employees
WHERE salary > 50000
ORDER BY salary DESC;

-- より複雑なSELECT文
SELECT e1.first_name, e1.last_name, e1.salary, d.department_name
FROM employees e1
INNER JOIN (
    SELECT department_id, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
) AS e2 ON e1.department_id = e2.department_id
INNER JOIN departments d ON e1.department_id = d.department_id
WHERE e1.salary > e2.avg_salary
ORDER BY d.department_name, e1.salary DESC;</pre>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box">
<div class="speech-person">
<figure class="speech-icon"><img decoding="async" class="speech-icon-image" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" /></figure>
<div class="speech-name"></div>
</div>
<div class="speech-balloon">
<p><!-- wp:paragraph --></p>
<p>現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。</p>
<p><!-- /wp:paragraph --></p>
</div>
</div>
<p><!-- /wp:cocoon-blocks/balloon-ex-box-1 --></p>
<p><!-- wp:paragraph --></p>
<p>SQLやデータベースの仕組みを１から学習したい方（学び直したい方）向けに、現役エンジニア達のスキルを結集して <strong><span class="marker-under"><span class="fz-14px"><span class="fz-18px"><span class="fz-20px">完全無料</span></span></span></span></strong> のSQL教材を作成しました。是非この機会にブックマークを！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p class="has-text-align-center" style="text-align: center;"><span class="badge-green">読者料典</span>　<a href="https://it-biz.online/it-skills/sql_roadmap/">【完全無料】SQL：初心者向け学習ロードマップ</a>　←こちらから！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【SQL】基本的な記述ルール5つを１分で解説</title>
		<link>https://it-biz.online/it-skills/sql-abc/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 02 Jun 2022 00:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=6449</guid>

					<description><![CDATA[SQL文を記述する際の基本的なルール5つを初心者向けにわかりやすく解説します。 参考　SQLとは？ このページでは、頭に入れておきたいSQLの基本的な構文ルールを簡単に解説しておきたいと思います。 プログラマーやシステム [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SQL文を記述する際の<strong><span class="marker-under">基本的なルール5つ</span></strong>を初心者向けにわかりやすく解説します。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/sql/">SQLとは？</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>SQL自体は決して難しくはない言語です。ですが、初心者にとってはなかなかエラーなくSQL文を書くことも簡単ではないのではないでしょうか。</p>
</div></div>



<p>このページでは、頭に入れておきたいSQLの基本的な構文ルールを簡単に解説しておきたいと思います。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">SQL基本ルール</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>SQLの文末は「;」セミコロン</li>



<li>キーワードの大文字・小文字は区別されない</li>



<li>単語は半角スペースか改行で区切る</li>



<li>定数は「'」で囲む</li>



<li>１行コメントは「--」：複数行コメントは「/*  */」</li>
</ul>
</div>
</div></div>



<p>プログラマーやシステムエンジニアを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい超・基本知識</span></strong>です。是非最後までご覧ください。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-question-circle"><span class="tab-caption-box-label-text block-box-label-text box-label-text">そもそもSQLって何？という方はこちら</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下のページではSQLとは何か？データベースとは？をIT初心者向けにわかりやすく解説しています。気になった方は併せてチェックしておきましょう。</p>
</div></div>



<figure class="wp-block-embed is-type-wp-embed is-provider-ビズドットオンライン wp-block-embed-ビズドットオンライン"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/sql/" title="SQLとは？初心者向けにわかりやすく３分で解説【簡単】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2022/05/sql-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2022/05/sql-320x180.png 320w, https://it-biz.online/wp-content/uploads/2022/05/sql-300x168.png 300w, https://it-biz.online/wp-content/uploads/2022/05/sql-500x280.png 500w, https://it-biz.online/wp-content/uploads/2022/05/sql-768x431.png 768w, https://it-biz.online/wp-content/uploads/2022/05/sql-800x449.png 800w, https://it-biz.online/wp-content/uploads/2022/05/sql-240x135.png 240w, https://it-biz.online/wp-content/uploads/2022/05/sql-640x360.png 640w, https://it-biz.online/wp-content/uploads/2022/05/sql-1024x574.png 1024w, https://it-biz.online/wp-content/uploads/2022/05/sql.png 1332w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">SQLとは？初心者向けにわかりやすく３分で解説【簡単】</div><div class="blogcard-snippet internal-blogcard-snippet">【IT初心者向け】SQL (Structured Query Language) って何？というプログラマー/エンジニア志望の方向けにSQLの基本を１からわかりやすく解説。DDL,DCL,DMLって何？という方でも理解できるよう、豊富なサンプルコード付きでご説明します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2023.10.04</div></div></div></div></a>
</div></figure>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ルール１：SQLの文末は「;」セミコロン</a></li><li><a href="#toc2" tabindex="0">ルール２：キーワードの大文字・小文字は区別されない</a></li><li><a href="#toc3" tabindex="0">ルール３：単語は半角スペースか改行で区切る</a></li><li><a href="#toc4" tabindex="0">ルール４：定数は「'」で囲む</a></li><li><a href="#toc5" tabindex="0">ルール５：１行コメントは「--」：複数行コメントは「/*  */」</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ルール１：SQLの文末は「;」セミコロン</span></h2>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">SQL基本ルール</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li><strong><span class="marker-under">SQLの文末は「;」セミコロン</span></strong></li>



<li>キーワードの大文字・小文字は区別されない</li>



<li>単語は半角スペースか改行で区切る</li>



<li>定数は「'」で囲む</li>



<li>１行コメントは「--」：複数行コメントは「/*  */」</li>
</ul>
</div>
</div></div>



<p>SQL文は「;」セミコロンで終えるのが必須のルールです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Name FROM MemberList;</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/select/">SELECT文</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>よくある初歩的なミスとして「;」セミコロンを忘れるのがSQL初心者の罠。一つひとつのSQL文は必ず「;」で終わりを示すのがルールです。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>特定のツールや<a href="https://it-biz.online/it-skills/dbms/">DBMS</a>では必須ではない場合もあるため、具体的な使用状況に応じて適切な手法を選択することが必要です。</p>
</div>



<h2 class="wp-block-heading"><span id="toc2">ルール２：キーワードの大文字・小文字は区別されない</span></h2>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">SQL基本ルール</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>SQLの文末は「;」セミコロン</li>



<li><strong><span class="marker-under">キーワードの大文字・小文字は区別されない</span></strong></li>



<li>単語は半角スペースか改行で区切る</li>



<li>定数は「'」で囲む</li>



<li>１行コメントは「--」：複数行コメントは「/*  */」</li>
</ul>
</div>
</div></div>



<p>SQLのキーワード（<a href="https://it-biz.online/it-skills/select/">SELECT</a>など）は大文字・小文字の区別はされません。</p>



<p>したがって、以下どちらの記述で書いても結果は同じです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Name FROM MemberList;</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">select Name from MemberList;</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p class="has-text-align-center"><strong>以下の点に注意が必要</strong></p>



<ol class="wp-block-list">
<li><strong>データベースオブジェクトの名前</strong>：一部のデータベース管理システム（DBMS）では、テーブル名、カラム名、その他のオブジェクト名に対して大文字・小文字が区別される場合がある。例えば、PostgreSQLではデフォルトで大文字・小文字が区別される。</li>



<li><strong>慣習と可読性</strong>：SQLキーワードを大文字で書くのは、多くの開発者や組織の慣習となっているので基本的にはこれに従うこと。→キーワードを大文字で書くことで、実際のテーブル名やカラム名などのオブジェクト名との視覚的な区別が容易になる（テーブルやカラム名は小文字が一般的）。</li>



<li><strong>DBMSの特性</strong>：使用しているDBMSのドキュメントやガイドラインを参照することで、そのDBMSが大文字・小文字の区別をどのように扱っているのかを正確に知ることができるので、詳しくはそちらを参照すること。</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc3">ルール３：単語は半角スペースか改行で区切る</span></h2>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">SQL基本ルール</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>SQLの文末は「;」セミコロン</li>



<li>キーワードの大文字・小文字は区別されない</li>



<li><strong><span class="marker-under">単語は半角スペースか改行で区切る</span></strong></li>



<li>定数は「'」で囲む</li>



<li>１行コメントは「--」：複数行コメントは「/*  */」</li>
</ul>
</div>
</div></div>



<p>SQLのキーワードやテーブル名、カラム名などの単語は必ず「半角スペース」か「改行」で区切ります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Name FROM MemberList;</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT
Name
FROM
MemberList;</pre>



<p>半角スペースか改行で区切らないとエラーとなります。例えば以下はNGです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECTName FROM MemberList;
-- SELECT と Name の間にスペースが存在しないため構文エラー</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>また、これもよくある落とし穴ですが「<strong><span class="marker-under">全角スペースで区切るのもNG</span></strong>」です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT　Name FROM MemberList;
--SELECT と Name の間が全角スペースなのでNG</pre>



<p>たまに、このミスを犯してドツボにはまる人もいるので、基本の「き」としてしっかり頭に入れておきましょう！</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p class="has-text-align-center"><strong>以下の点に注意が必要</strong></p>



<ol class="wp-block-list">
<li><strong>複数のスペース</strong>：１つ以上の連続する半角スペースは、１つのスペースとして解釈される。→したがって、SQL文内において複数のスペースを挟んでも問題はない。</li>



<li><strong>可読性</strong>：コードの可読性を向上させるために、適切なインデントや改行を使用することが推奨される。→他の開発者や将来の自分がそのSQL文を読みやすくなる。</li>



<li><strong>DBMSの特性</strong>：一部のDBMSやツールには、特定の書式要件や制約がある場合がある。</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc4">ルール４：定数は「'」で囲む</span></h2>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">SQL基本ルール</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>SQLの文末は「;」セミコロン</li>



<li>キーワードの大文字・小文字は区別されない</li>



<li>単語は半角スペースか改行で区切る</li>



<li><strong><span class="marker-under">定数は「'」で囲む</span></strong></li>



<li>１行コメントは「--」：複数行コメントは「/*  */」</li>
</ul>
</div>
</div></div>



<p>SQL文では、抽出条件を指定する場面などで「定数」を記述することができます。「定数」を記述する場合は、<strong><span class="marker-under">それが定数であることを明示するために「'」シングルコーテーションで囲みます。</span></strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">CREATE TABLE MemberList (
Number INT,
Name VARCHAR(50),
Address VARCHAR(150),
----------------------------
PhoneNumber VARCHAR(13) DEFAULT '090-1234-5678'
----------------------------
);

--'090-1234-5678' は定数</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/create-table/">CREATE TABLE文</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ただし、<strong>数字の定数の場合は「'」シングルコーテーションで囲む必要はありません</strong>。以下ではNumberカラムのデフォルト値として 100 を指定するSQL文の例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">CREATE TABLE MemberList (
----------------------------
Number INT DEFAULT 100,
----------------------------
Name VARCHAR(50),
Address VARCHAR(150),
PhoneNumber VARCHAR(13) DEFAULT '090-1234-5678'
);</pre>
</div></div>



<h2 class="wp-block-heading"><span id="toc5">ルール５：１行コメントは「--」：複数行コメントは「/*  */」</span></h2>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box"><div class="tab-caption-box-label block-box-label box-label fab-pencil"><span class="tab-caption-box-label-text block-box-label-text box-label-text">SQL基本ルール</span></div><div class="tab-caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul class="wp-block-list">
<li>SQLの文末は「;」セミコロン</li>



<li>キーワードの大文字・小文字は区別されない</li>



<li>単語は半角スペースか改行で区切る</li>



<li>定数は「'」で囲む</li>



<li><strong><span class="marker-under">１行コメントは「--」：複数行コメントは「/*  */」</span></strong></li>
</ul>
</div>
</div></div>



<p>SQLでは文中にコメントを記述することができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>複雑なSQL文の説明を記載しておいたりするような使い方が一般的です。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">-- これは1行のコメントです
SELECT * FROM tablename;</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/*
これは複数行の
コメントです
*/
SELECT * FROM tablename;</pre>



<p>コメントはSQL実行時に一切考慮されない行なので、基本的には何を書いてもOKです。日本語で書いてもアルファベットで書いてもSQL自体の処理内容には一切影響がありません。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="sql" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">SELECT Name FROM MemberList;
-- MemberListからName列のレコードを取得

SELECT Name
/* このようにSQL文中に無理やりコメントを挟むこともできます。
   ですが、返って可読性を落としてしまうのでオススメできる利用方法ではありません。*/
FROM MemberList;</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title">このページのまとめ</div>
<ul class="wp-block-list">
<li>SQLの基本的な記述ルールは以下の４つ
<ul class="wp-block-list">
<li>SQLの文末は「;」セミコロン</li>



<li>キーワードの大文字・小文字は区別されない</li>



<li>単語は半角スペースか改行で区切る</li>



<li>定数は「'」で囲む</li>



<li>１行コメントは「--」：複数行コメントは「/*  */」</li>
</ul>
</li>
</ul>
</div>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box">
<div class="speech-person">
<figure class="speech-icon"><img decoding="async" class="speech-icon-image" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" /></figure>
<div class="speech-name"></div>
</div>
<div class="speech-balloon">
<p><!-- wp:paragraph --></p>
<p>現在のスキルに今一つ満足できていないシステムエンジニア/プログラマーの方へ。</p>
<p><!-- /wp:paragraph --></p>
</div>
</div>
<p><!-- /wp:cocoon-blocks/balloon-ex-box-1 --></p>
<p><!-- wp:paragraph --></p>
<p>SQLやデータベースの仕組みを１から学習したい方（学び直したい方）向けに、現役エンジニア達のスキルを結集して <strong><span class="marker-under"><span class="fz-14px"><span class="fz-18px"><span class="fz-20px">完全無料</span></span></span></span></strong> のSQL教材を作成しました。是非この機会にブックマークを！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p class="has-text-align-center" style="text-align: center;"><span class="badge-green">読者料典</span>　<a href="https://it-biz.online/it-skills/sql_roadmap/">【完全無料】SQL：初心者向け学習ロードマップ</a>　←こちらから！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
