MySQLのマルチテーブルデザインと連想クエリ(データベースデザインパラダイム、外部キーの使用、関連付けられたクエリの内部と外部のクロス)

マルチテーブルデザイン関連クエリ

なぜマルチテーブルデザインが必要なのですか?

マルチテーブル設計の目的は、冗長なデータを排除したり、テーブルを複数のテーブルに分割したり、複数のテーブルから共通のデータを1つのテーブルに抽出したりすることです。

たとえば、次の2つのテーブルがあります

ナンバリング 名前 国家 国籍
1 張さん 漢国籍 中国
2 Li Si 漢国籍 中国
ナンバリング 国籍
1 Shaanxi 中国
2 広州 中国

これらの2つのテーブルには、民族性や国籍など、多くの冗長性があります。複数のテーブルで設計すると、次のようになります。

ナショナルテーブル

民族番号 国家
1 漢国籍
2 ホイ

カントリーテーブル

国コード 国籍
1 中国
2 パキスタン

そして、上位2つのテーブルは

ナンバリング 名前 民族番号 国コード
1 張さん 1 1
2 Li Si 1 1
ナンバリング 国コード
1 Xi'an 1
1 広州 1

このようにして、重複する冗長データを排除し、1つのデータを再利用できます。

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

1.冗長性が少なく、合理的な構造のデータベースを構築するには、データベースを設計する際に特定のルールに従う必要があります。このルールは、リレーショナルデータベースでは時間パラダイムとも呼ばれます。このパラダイムは、特定の設計要件を満たす要約です。

2.現在のリレーショナルデータベースには6つのパラダイムがあります。

(1)最初の通常の形式(1NF);

(2)第2正規形(2NF);

(3)第3正規形(3NF);

(4)バスコードパラダイム(BCNF);

(5)第4正規形(4NF);

(6)5番目の通常の形式(5NF)、完全な通常の形式としても知られています。

3.最小要件を満たすパラダイムは、最初のパラダイム(1NF)です。最初のパラダイムに基づいて、より規範的な要件をさらに満たすことが2番目のパラダイム(2NF)と呼ばれ、残りのパラダイムは順番になります。一般的に言えば、データベース3番目の通常の形式(3NF)のみが必要です。

最初の通常の形式(1NF)

最初の通常の形式は最も基本的な通常の形式です。データベーステーブルの各列がアトミックのままであることを確認する必要があります。データベーステーブルのすべてのフィールド値が分解できないアトミック値である場合、データベーステーブルが最初の通常の形式を満たしていることを意味します。

例えば

ナンバリング 名前 連絡先の詳細
1 ワンマジ メール/電話/ qq

最初の正規形を満たした後のテーブル構造

ナンバリング 名前 メールボックス 電話 QQ
1 ワンマジ [email protected] 1313131 2212321

セカンドノーマルフォーム(2NF)

1. 2番目のパラダイムは、主キーを持つことであり、他のフィールドが主キーに依存することを要求します。

2.主キーがないと一意性がなく、一意性がないとこのレコードの行をコレクションに配置できないため、主キーが必要です。

3.他のフィールドが主キーに依存しているのはなぜですか?主キーに依存していないため、見つかりません。さらに重要なことに、他のフィールドと主キーで構成されるレコードの行は同じことを表し、主キーは一意です。主キーに依存するだけで、一意になります。

サードノーマルフォーム(3NF)

3つ目のパラダイムは、一時的な依存関係を排除し、理解を容易にすることであり、「冗長性の排除」と見なすことができます。

注文番号 製品番号 商品名 単価 注文金額
1000 2 2020 携帯電話 2000 4000
製品番号 商品名 単価
2020 携帯電話 2000
注文番号 注文金額 製品番号
1000 2 4000 2020

一般的に言って、データベースは第3正規形(3NF)のみを必要とします。

データベースインスタンス

学生表:氏名、性別、携帯電話番号、学年番号、登録時期
学年表:学年番号、学年名、学年紹介
コーススケジュール:コース番号、コース名、コース紹介
表と表の関係:
1.One 1対1の関連付け;
2。1対多の関連付け;
3。多対1の関連付け;
4。多対多の関連付け。

-- 创建年级表
CREATE TABLE t_grade(
	g_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'年级编号',
	g_name VARCHAR(10) COMMENT'年级名称',
	g_desc VARCHAR(50) COMMENT'年级介绍'
)

ここに写真の説明を挿入

-- 创建学生表
CREATE TABLE t_stu(
	s_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'学号',
	s_name VARCHAR(10) COMMENT'姓名',
	s_sex CHAR(1) DEFAULT'男' COMMENT'性别',
	s_phone INT(11) COMMENT'电话',
	s_g_id INT COMMENT'年级编号',
	reg_time DATETIME COMMENT'注册时间'
)

ここに写真の説明を挿入

弱い関連関係の導入:テーブル構造は本質的に無関係です。テーブルとテーブルの関係は人為的に定義されています。関連テーブルのデータを削除しても、他のデータには影響しません。上の図のグレード番号とグレードテーブルは一種の弱い関連です。関係。

外部キー

強い関連付け関係について説明し、外部キーに制約を追加し、外部キーに対応するプライマリキー(別のテーブルのプライマリキーに対応する外部キー)との関連付け関係を強制します。

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

2.外部キー列のデータタイプは、プライマリキー列と一致している必要があります。

3.データテーブル間の関連付け/参照関係は、特定のプライマリキーと外部キーによって確立されます。

テーブルを作成するときに外部キーを追加するための構文:

create table 表名(
	constraint 约束名 foreign key(外键列) references 主键表(主键列)
)

外部キー制約構文を追加します。

alter table 表名 
add [constraint 约束名(自己起的)] 
foreign key(外键列) 
references 关联表(主键)

外部キー構文を削除します。

alter table 表名 drop foreign key 外键约束名;

データベースインスタンス

上記の表に外部キーを追加します

ALTER TABLE t_stu 
ADD CONSTRAINT s_foreign_key 
FOREIGN KEY(s_g_id) 
REFERENCES t_grade(g_id); 
-- 创建课程表,多对多关系,一个学生对应多个课程,一个课程对应多个学生
CREATE TABLE t_course(
	c_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'课程号',
	c_name VARCHAR(10) COMMENT'课程名',
	c_desc VARCHAR(20) COMMENT'课程介绍'
)
-- 设计关系表来存储多个数据之间的关系
CREATE TABLE t_stu_course(
	sc_id INT PRIMARY KEY AUTO_INCREMENT,
	sc_stu_id INT,
	sc_course_id INT,
	CONSTRAINT stu_id_fk FOREIGN KEY(sc_stu_id) REFERENCES t_stu(s_id),
	CONSTRAINT cou_id_fk FOREIGN KEY(sc_course_id) REFERENCES t_course(c_id)
)

ここに写真の説明を挿入
ここに写真の説明を挿入

注意

1.マスターテーブルに対応するレコードがない場合、そのレコードをスレーブテーブルに追加することはできません。

2.メインテーブルの値を変更して、スレーブテーブルのレコードを分離することはできません

3.テーブルのメインテーブルに対応するレコードがあり、メインテーブルから行を削除することはできません。

4.プライマリテーブルを削除する前に、セカンダリテーブルを削除します

関連クエリ

概要概要

1.関連付けられたクエリはマルチテーブルクエリとも呼ばれます。クエリフィールドが複数のテーブルからのものである場合、結合クエリが使用されます

2.カルテシアン積現象:表1にはm行、表2にはn行、クエリ結果にはm * n行があります。

(1)理由:有効な接続条件がありません

(2)回避方法:有効な接続条件を追加します

分類

インナージョイン

条件を満たす2つのテーブルの交差点データをクエリします

文法:

select 结果 from1,2 where1.1=2.2
SELECT s_id,s_name,s_sex,s_g_id,g_name,g_id 
FROM t_stu,t_grade
WHERE s_g_id = g_id

ここに写真の説明を挿入

1.同等の接続

#等值连接
/*
语法
select 结果 from 表名 inner join 被连接的表名(外键表) on 外键=主键
*/
SELECT * 
FROM t_stu
INNER JOIN t_grade ON s_g_id = g_id 

ここに写真の説明を挿入

2.非等価接続

#创建一个等级表
CREATE TABLE t_level(
	l_name CHAR(1),
	l_min_score INT,
	l_max_score INT
)
/*
非等值连接
语法
select 结果
from 表1
inner join 表2
on 表1.列1 between 表2.列2 and 表2.列3
*/
SELECT
  s_name,
  l_name
FROM
  t_stu
  INNER JOIN t_level
    ON s_score BETWEEN l_min_score
    AND l_max_score

ここに写真の説明を挿入

ここに写真の説明を挿入

3.自己接続:テーブルで接続関係を確立します

CREATE TABLE t_area(
	a_id INT,
	a_name VARCHAR(10),
	a_father INT
)
#在一张表中建立连接关系
SELECT
  t1.a_name,
  t2.a_name
FROM
  t_area t1
  INNER JOIN t_area t2
    ON t1.a_father = t2.a_id;

ここに写真の説明を挿入
ここに写真の説明を挿入

アウタージョイン

1.左外側結合(左結合)

/*
语法
select 结果
from 表1
left join 表2 
on 表1.字段=表2.字段l;

不管表1的字段与表2的字段是否有连接,都会显示表1的所有信息
*/
SELECT *
FROM t_stu s
LEFT JOIN t_grade g
ON s.s_g_id = g.g_id;

2.右外側結合(右結合)

/*
语法
select 结果
from 表1
right join 表2 
on 表1.字段1=表2.字段2;

不管表1有没有和表2中的所有数据关联,都会显示出表2的所有
*/
SELECT *
FROM t_stu s
RIGHT JOIN t_grade g
ON s.s_g_id = g.g_id;
クロスコネクト
-- 交叉连接 类似于内连接
SELECT *
FROM t_stu s
CROSS JOIN t_grade g
ON s.s_g_id = g.g_id;

おすすめ

転載: blog.csdn.net/Lotus_dong/article/details/112913839