ホームページ  >  記事  >  データベース  >  MySQL マルチテーブル関連付けクエリの例の分析

MySQL マルチテーブル関連付けクエリの例の分析

PHPz
PHPz転載
2023-05-28 13:32:351514ブラウズ

データベース設計パラダイム

データベース設計には現在 5 つのパラダイムがあります。通常、データベースが満たす必要があるのは最初の 3 つのパラダイムだけです

最初のパラダイム: 各列がアトミックであることを確認します

原子性とは何ですか? 細分化できないことを意味します。たとえば、以下の連絡先情報は

MySQL マルチテーブル関連付けクエリの例の分析

です。連絡先情報には、QQ、WeChat、電話が含まれますなど。明らかに、この列は原子性を満たしていません。別の QQ または電話番号の場合、第 1 正規形を満たすのは 1 つだけです。

第 2 正規形: 主キーを持つには、その他フィールドは主キーに依存する必要があります

なぜ主キーがそれほど重要なのでしょうか?テーブルをチームとみなした場合、主キーはチームのフラグであると理解できます

• 主キーがなければ、一意性はありません。一意性がなければ、このレコード行をコレクション内で見つけることができません。そのため、主キーが必要です。

他のフィールドが主キーに依存する必要があるのはなぜですか?主キーに頼らずにそれらの場所を特定する方法がないためです。さらに重要なのは、他のフィールドで構成されるレコード行は主キーと同じものを表しており、主キーは一意であり、主キーに依存するだけで一意になります。

第 3 正規形: 第 3 正規形は、推移的な依存関係を排除し、理解を容易にするものです。これは「冗長性の排除」とみなすことができます

これを理解するにはどうすればよいですか? 次の例を参照してください

MySQL マルチテーブル関連付けクエリの例の分析

#上記のようなテーブルを設計すると、見た目は普通ですが、テーブルを分割します

MySQL マルチテーブル関連付けクエリの例の分析

これを行うとより明確になります。製品番号を通じて 2 つのテーブルを直接関連付けます。あらゆる面で、すべてを 1 つのテーブルに詰め込むよりもはるかに優れています。

キー

私たちはそれを知っています。テーブルの識別子に相当する主キーがありますが、外部キーはどうなるのでしょうか?

# 外部キー: 別のデータ テーブル内のレコードを参照します。

# 外部キー列の型は主キー列の型と一致しており、特定の主キー (主キー) と外部キー (外部キー) に依存してデータ テーブル間の関連付け/参照関係が確立されます

構文:

外部キー制約の追加
ALTER TABLE テーブル名 ADD [CONSTRAINT 制約名] FOREIGN KEY (外部キー列)
REFERENCES 関連テーブル (主キー) ;
外部チェック キーを削除します。 ALTER TABLE テーブル名 DROP FOREIGN KEY 外部キー制約名

上記の第 3 正規形の例では、冗長性を排除し、2 つのテーブルを関連付けます。通常、2 つのテーブルを接続するこの列を外部キーとして設定します。

ただし、2 つのテーブル間の関連情報をクエリする必要がある場合は、必ずしも外部キー制約を使用するとは限りません

  • 2 つのテーブルがクエリに関連付けられている場合、外部キー制約は追加しません。これを弱参照と呼びます。

  • 外部キー制約が追加された場合場合、それは強力な参照です。

では、これら 2 つの参照の違いは何ですか?

外部キーを使用すると、外部キーが配置されることがわかります。セカンダリ テーブルのキーはメイン テーブルの主キーを指すため、2 つのテーブル間に制約が設定されます。この時点では、メイン テーブルまたはスレーブ テーブルに関連付けられた値を自由に変更することはできません。これは強参照です

1. マスターテーブルに該当するレコードがない場合、スレーブテーブルにレコードを追加できません

#2. マスターテーブルの値は変更できません、スレーブ テーブルに孤立したレコードが発生します

3、スレーブ テーブルにはマスター テーブルに対応するレコードがあり、その行をマスター テーブルから削除することはできません

4。マスターを削除する前にテーブル、最初にスレーブ テーブルを削除します

弱い参照を使用すると、関連付けを自由に変更できます。

-- 创建学生表
CREATE TABLE student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    num INT,
    NAME VARCHAR(20),
    sex CHAR(1),
    gradeId INT   -- 从表外键列
)
-- 创建年级表
CREATE TABLE grade(
    -- 主表主键列
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
)     
-- 添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_grade 
      FOREIGN KEY(gradeId) REFERENCES grade(id)

間の値を作成してメイン テーブルにデータを追加します:

MySQL マルチテーブル関連付けクエリの例の分析

データを作成してスレーブ テーブルに追加します。

MySQL マルチテーブル関連付けクエリの例の分析#ご覧のとおり、外部キー制約が GradeId フィールドに追加されています

この時点で、メイン テーブルの列を削除しようとします:

MySQL マルチテーブル関連付けクエリの例の分析はい、メイン テーブルを自由に変更することはできません。一度変更すると、データはスレーブ テーブル内のデータは分離されます。

#内部結合

##●● 条件を満たす 2 つのテーブルの交差データをクエリします。MySQL マルチテーブル関連付けクエリの例の分析

構文:

表 1、表 2 から結果を選択します (表 1.列 1 = 表 2.列 2)

内部結合には、等価結合、非等価結合、自己結合が含まれますここでは主に自己結合について説明します。

デカルト積現象: テーブル 1 には m 行があり、テーブル 2 には n 行があり、結果 =m*n

自己接続とは何ですか?これは、自分自身を自分自身と関連付け、自分自身とデカルト積を計算することを意味します。これは簡単に理解できないかもしれません。例を次に示します:

我们平时在淘宝网购填地址的时候, 都是采用选择的方式, 先选择省,然后是省下面的市, 接着是市下面的区(县) ,它们都是在数据库中存着, 如何去实现这个功能呢 ? 

有人可能会说, 建三张表相互关联即可 , 但实际是 , 我们采用自连接的方式 , 一张表即可实现

CREATE TABLE demo(     -- 建立demo表
    id INT PRIMARY KEY,
    NAME VARCHAR(50),
    pid INT    
 )

往表中填入数据, pid为关联上一级的id

MySQL マルチテーブル関連付けクエリの例の分析

-- 自连接 
-- 在多表关系中我们需要定义别名来区分
SELECT d1.name,d2.name,d3.name FROM demo d1 
            INNER JOIN demo d2 ON d1.id=d2.pid  --自连接条件
            INNER JOIN demo d3 ON d2.id=d3.pid  --自连接条件
  WHERE d3.id=6101011   -- 查询条件

结果 : 

MySQL マルチテーブル関連付けクエリの例の分析

外连接

外连接又分为左外连接与右外连接

先看左外连接 : 

MySQL マルチテーブル関連付けクエリの例の分析

语法 

select 结果 from 表1 left join 表 2 on 表1.column1 = 表 2.column2 

左连接和内连接有什么不同呢?  通过两幅图我们就可以看出 ,内连接是取了两张表的共同部分 , 而左连接是取了左边表的全部(包括两张表的共同部分)

也就是说, 不仅查询两张表的共同部分, 并且左边表会被全部查询出来

我们通过上面外键所建的表来演示 , 为了演示方便,我们为student表再添加一列数据

MySQL マルチテーブル関連付けクエリの例の分析

可以看到, 此时第五列并没有去关联grade表

-- 左外连接查询
SELECT * FROM student s 
     LEFT JOIN grade g ON s.gradeId= g.id

查询结果如下 : 

MySQL マルチテーブル関連付けクエリの例の分析

 那么说到这, 右外连接也就不难理解了 , 每次都会完整的查询右边的表

MySQL マルチテーブル関連付けクエリの例の分析

同样我们再为grade添加一条无关联的数据

MySQL マルチテーブル関連付けクエリの例の分析

语法 :

 select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2 

-- 右外连接查询
SELECT * FROM student s 
     RIGHT JOIN grade g ON s.gradeId= g.id

查询结果 : 

MySQL マルチテーブル関連付けクエリの例の分析

可以看到, 右表被完全查询

以上がMySQL マルチテーブル関連付けクエリの例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。