- 大規模言語モデルは、次に何が来るかを予測するために膨大な量のテキストでトレーニングされたニューラル ネットワークです。
- トークンで動作し、attentionを使用して以前のどのトークンが最も重要かを比較検討します。
- 一連の確率から選択して、一度に 1 トークンずつ応答を生成します。
- 間違っているにもかかわらず自信に満ちているように聞こえる可能性があるため、重要な出力は確認する必要があります。
チャットしたり、要約したり、コードを書いたりするツールは、その下にあるメカニズムを見るまでは、ほとんど魔法のように思えます。 大規模言語モデル (LLM) は本質的に、次のテキストを予測するための非常に洗練されたシステムです。この 1 つのアイデアは、これらのツールが優れている点と、その方法で失敗する理由の両方を説明します。
このガイドでは、数学を使わずに主な概念を説明し、アイデアを具体化するための小さな次の単語予測子を構築します。そのコードを Python 3.13 で実行し、その実行からの出力が得られます。これはニューラル ネットワークではなく、単純な数を数えるおもちゃであり、実際の LLM ははるかに高性能です。また、特定のモデルの数値はすぐに変化するため、引用することも避けています。
大規模言語モデルとは何ですか?
LLM は、人間の言語を理解して生成するように訓練された人工知能の一種です。名前を 1 語ずつ取り上げてみましょう。
- Large: パラメータと呼ばれる調整可能な内部値が膨大な数あり、膨大な量のテキストから学習します。
- 言語: 自然言語やコードを含むテキストを処理します。
- モデル: データからパターンを取得し、それを使用して予測を行う数学的システムです。
モデルはエンジンであり、チャット アシスタントなどの製品はモデルを中心に構築される車です。製品には、ユーザー インターフェイス、安全システム、検索、その他のツールが追加されることがよくあります。
核となるアイデア: 次に何が起こるかを予測する
これはあなた自身が行います。 「フランスの首都は」と読めば、あなたの頭はすぐに「パリ」を思い浮かべます。 LLM は同様のことを行いますが、はるかに大規模です。テキストが与えられると、次に考えられる各トークンの可能性を計算し、1 つを選択し、それをテキストに追加して繰り返します。
検索対象となる、保存された回答のデータベースはありません。モデルは、トレーニング中に学習したパターンを数値の形式で保持します。それらのパターンが真実と一致すると、正しい答えが得られます。そうでない場合でも、流暢な回答を得ることができます。これが検索エンジンとの重要な違いです。
小さな動作デモ
最も単純な形式で次のトークンの予測を確認するために、このスクリプトは小さなテキスト内のどの単語の後に続くかをカウントします。次に、それらのカウントから新しいテキストを生成します。統計学者はこれをバイグラム モデルと呼びます。
import random
from collections import Counter, defaultdict
TEXT = """the cat sat on the mat . the dog sat on the rug .
the cat saw the dog . the dog saw the cat ."""
tokens = TEXT.split()
follows = defaultdict(Counter)
for current, following in zip(tokens, tokens[1:]):
follows[current][following] += 1
def probabilities(word):
counts = follows[word]
total = sum(counts.values())
return {w: round(n / total, 2) for w, n in counts.most_common()}
print(probabilities("the"))
print(probabilities("sat"))
# {'cat': 0.38, 'dog': 0.38, 'mat': 0.12, 'rug': 0.12}
# {'on': 1.0}
その出力は確率分布です。 「the」の後に、モデルは「cat」と「dog」が最も可能性が高いと考えます。次に、これらの確率からサンプリングを繰り返してテキストを生成します。
def generate(start, length, seed):
rng = random.Random(seed)
words = [start]
for _ in range(length):
counts = follows[words[-1]]
words.append(rng.choices(list(counts), weights=counts.values())[0])
return " ".join(words)
print(generate("the", 6, seed=1))
print(generate("the", 6, seed=2))
print(generate("the", 6, seed=3))
# the cat . the cat saw the
# the rug . the cat . the
# the cat saw the dog . the
3 つのことに注意してください。選択はランダムであるため、同じ開始でも異なるテキストが生成される可能性があります。出力は、トレーニング データに現れなかったシーケンスであっても、トレーニング データに似ています。そしてそれはまったく理解できないので、「敷物.猫」がナンセンスのように聞こえるのはそのためです。
見たことのない単語について尋ねても、何も提供できません。follows["elephant"] は空です。私たちのおもちゃは、前の 1 つ の単語だけを調べます。実際の LLM の大きな飛躍は、単純なカウントではなくニューラル ネットワークを使用して、長期間のコンテキストを考慮し、はるかに多くのデータから学習することによって実現します。
トークン: モデルの読み取り方法
LLM は私たちとは異なり、単語全体を読みません。テキストはまず トークン に分割されます。トークンは単語、単語の一部、句読点などです。各トークンは数値にマッピングされ、モデルは完全に数値で機能します。
トークンは実際には 2 つの理由から重要です。ホストされたモデルの使用は通常トークンによって価格設定され、各モデルには一度に処理できる数に制限があります。トークン化は、いくつかの有名な奇妙な動作も説明します。モデルは文字ではなく塊を認識するため、単語内の文字を数えるなどのタスクは従来、モデルにとって驚くほど困難でした。
埋め込み: 数値としての意味
各トークンは、ある種の意味空間に配置される数値の長いリストである embedding に変換されます。関連する概念は最終的に近くにあるため、「猫」と「子猫」は近くの位置にありますが、「猫」と「請求書」は近くにありません。
同じ考え方がセマンティック検索にも応用されており、正確な単語ではなく意味に基づいてドキュメントを検索します。私たちの ベクター データベース ガイド では、その使用について説明しています。
注意と変圧器
最新の LLM のほとんどは、2017 年の論文「Attending Is All You Need」で Google 研究者によって紹介された transformer アーキテクチャに基づいています。その重要なメカニズムは自己注意です。
「トロフィーは大きすぎたのでスーツケースに入りませんでした。」という文を考えてみましょう。 「それ」とは何を指すのでしょうか?それがトロフィーを意味することはわかります。アテンションを使用すると、モデルは新しいトークンを処理するときに、以前のトークンをすべて重み付けできるため、単語が遠く離れている場合でも、「それ」を最も関連性の高い単語にリンクできます。
以前のアプローチではテキストを段階的に処理し、遠くの単語を見失う傾向がありました。トランスフォーマーはコンテキスト全体を一緒に調べ、この作業の多くを専用のハードウェアで並行して実行できるため、このような大量のテキストのトレーニングが実用的になります。
LLM のトレーニング方法
| ステージ | 何が起こるか |
|---|---|
| データ収集 | 大量のテキストが収集され、クリーンアップされます |
| 事前トレーニング | モデルは次のトークンを繰り返し予測し、それが間違っている場合は常にそのパラメーターが微調整されます。 |
| 微調整 | 回答をランク付けするために人間のフィードバックがよく使用され、役立つ回答の例から学習します。 |
| 評価 | チームは品質、安全性、失敗例をテストします |
事前トレーニングにより、モデルに広範な言語能力が与えられますが、テキストに答えるのではなく、テキストを続けるだけになる可能性があります。後の段階では、それを便利なアシスタントに形作ります。大規模なモデルのトレーニングにはかなりのコンピューティング能力が必要であり、コストもかかります。 inference として知られる完成モデルを使用すると、リクエストあたりのコストがはるかに安くなります。
テキストの生成方法
- プロンプトはトークンに分割され、埋め込みに変換されます。
- ネットワークは、それらを相互に関連付けるために注意を使用して処理します。
- 考えられるすべての次のトークンの確率を出力します。
- 1 つのトークンが選択され、コンテキストに追加されます。
- ステップ 2 ~ 4 を停止条件に達するまで繰り返します。
通常、ストリーミング時に返信が 1 語ずつ表示されるのはこのためです。テキストは文字通り順番に作成されます。 温度は、ステップ 4 の冒険性を制御します。低い値では最も可能性の高いトークンが優先され、高い値ではより多様なトークンが許可されます。
ヒント: 抽出、分類、その他の繰り返し可能なタスクでは、設定が利用可能な低温を使用してください。ブレーンストーミングでは、設定を高くすると便利です。それでも、値が低いからといって毎回同じ答えが得られるとは限りません。
満たす条件
| 期間 | 意味 |
|---|---|
| プロンプト | モデルに与える入力 |
| コンテキストウィンドウ | 一度に考慮できるトークンの最大数 |
| パラメータ | 研修中に学んだ内的価値観 |
| 推論 | トレーニングされたモデルを実行して出力を取得する |
| 幻覚 | false である自信のある出力 |
| 知識の遮断 | トレーニングデータが終了する時点 |
| ラグ | ドキュメントを取得してモデルに追加のコンテキストを与える |
| オープンウェイトモデル | パラメータをダウンロードして自分で実行できるモデル |
知っておくべき制限事項
- 幻覚。 モデルは事実、引用、またはコード関数を発明できます。ありそうなテキストが生成されるため、虚偽の発言が完全にもっともらしく見える可能性があります。
- 知識の遮断。 製品が検索や他のツールに接続していない限り、最近の出来事について認識できない可能性があります。
- 限られたコンテキスト。 会話がコンテキスト ウィンドウを超える場合、以前の詳細が省略されたり要約されたりする可能性があります。また、製品にその機能が追加されない限り、モデルは過去のチャットを自動的に記憶しません。
- バイアス トレーニング データには人間のバイアスが反映されており、それが出力に現れる場合があります。
- 矛盾 同じ質問から異なる回答が得られる可能性があり、これは、ある質問の上にソフトウェアを構築する場合に重要です。
- セキュリティ リスク。 テキスト内の隠された命令によりモデルが操作される可能性があり、これはプロンプト インジェクションとして知られる問題です。
LLM を上手に活用する
LLM を、作業をレビューする必要がある迅速で有能なアシスタントとして扱います。いくつかの習慣が大きな違いを生みます。
- 具体的であること。 明確な指示、コンテキスト、例がより良い結果をもたらします。 プロンプト エンジニアリングに関するガイドでは、その方法を示しています。
- 事実を提供します。自分の文書から回答する必要がある場合は、記憶に頼るのではなく、RAGを使用してください。
- 何が重要であるかを確認します。数字、引用、法的または医学的主張を信頼できる情報源と照合してください。
- 生成されたコードをテストします。同僚の場合と同じように、それを実行してテストを作成します。私たちのAIコードレビューツールガイドにはいくつかのサポートが含まれています。
- 機密データを保護します。 ホストされているツールで機密情報を共有する前に、組織のルールを確認してください。
自分の作業に合わせてモデルをカスタマイズする方法を決定している場合は、RAG、微調整、プロンプト エンジニアリングの比較が選択に役立ちます。
まとめ
LLM は、並外れた規模でトレーニングされた次のトークンの予測子であり、その説明が示すよりも便利ですが、誤りの可能性が高くなります。このメカニズムを念頭に置くと、それをうまく使用することができます。このメカニズムは言語とパターンに強く、事実についての監督が必要です。具体的にするには、独自のテキストを使用して上記の小さなスクリプトを実行し、実際のアシスタントで同じプロンプトを数回試して、答えを比較します。
よくある質問
大規模言語モデルとは簡単に言うと何ですか?
これは、次に何が来るかを予測するために膨大な量のテキストで訓練された AI システムです。その予測を繰り返すことで、質問に答えたり、書いたり、要約したりすることができます。
AI と LLM の違いは何ですか?
AI は、インテリジェント システムを構築する幅広い分野です。 LLM は、言語の処理と生成に焦点を当てた、特定のタイプの AI モデルの 1 つです。
LLM は自分たちの言うことを理解していますか?
これは議論されています。彼らは意味の豊富なパターンを捉えており、多くの問題を論理的に解決することができますが、世界を経験していないため、人が経験しない方法で失敗する可能性があります。
LLM が物事をでっち上げるのはなぜですか?
検証された事実を取得するのではなく、可能性の高いテキストを生成します。パターンがもっともらしいが誤った答えを示している場合、モデルは明らかに自信を持ってそれを述べることができます。
LLM のトークンとは何ですか?
トークンは、単語、単語の一部、句読点など、モデルが処理するテキストの塊です。制限と価格はトークンで測定されることがよくあります。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →