현재 데이터베이스 설계에는 5가지 패러다임이 있습니다. 일반적으로 데이터베이스는 처음 세 가지 패러다임만 충족하면 됩니다.
첫 번째 패러다임: 각 열이 원자성을 유지하도록 보장하세요
원자성이란 무엇입니까? 예를 들어 다음
연락처 정보에는 QQ, WeChat, 전화 등이 포함됩니다. 분명히 이 열은 별도의 QQ 또는 전화 등인 경우 원자성을 만족하지 않습니다. 첫 번째 정규형을 만족합니다
두 번째 정규형: 기본 키를 가지려면 다른 필드도 기본 키에 의존해야 합니다.
테이블을 생각하면 기본 키가 왜 그렇게 중요한가요? 팀으로서 기본 키는 팀의 플래그입니다
• 기본 키가 없으면 고유성이 없으므로 이 레코드 행을 컬렉션에서 찾을 수 없으므로 기본 키가 필요합니다.
다른 필드에서 기본 키를 사용해야 하는 이유는 무엇인가요? 기본 키에 의존하지 않고서는 위치를 확인할 수 있는 방법이 없기 때문입니다. 더 중요한 것은 다른 필드로 구성된 레코드 행이 기본 키와 동일한 것을 나타내며 기본 키는 기본 키에만 의존하면 고유해진다는 것입니다.
제3정규형: 전이적 종속성을 제거하고 이해를 돕기 위한 것입니다. "중복성 제거"라고 할 수 있습니다.
이것을 어떻게 이해해야 할까요?
테이블을 디자인한다면? 위와 같이 평범해 보이지만 이 테이블을 분할하면
이렇게 하면 모든 면에서 제품 번호를 통해 두 테이블을 직접 연결하는 것이 훨씬 더 명확해집니다. 모든 것을 하나의 테이블에 압축하는 것보다 훨씬 낫습니다
테이블의 식별자와 동일한 기본 키가 있다는 것을 알고 있지만 외래 키는 어떻습니까?
● 외래 키: 다음을 참조합니다. 다른 데이터 테이블은 특정 레코드입니다.
● 외래 키 열 유형은 기본 키 열 유형과 일치합니다. 데이터 테이블 간의 연관/참조 관계는 특정 기본 키(기본 키) 및 외래 키(외래 키)를 사용하여 설정됩니다.
외래 키 제약 조건 추가ALTER TABLE 테이블 이름 ADD [CONSTRAINT 제약 조건 이름] FOREIGN KEY (외래 키 열)REFERENCES 관련 테이블 (기본 키);
여기 위의 세 번째 정규형 예에서 언급한 것처럼 중복성을 제거하고 특정 열을 통해 두 테이블을 연결하기 위해 일반적으로 두 테이블을 연결하는 이 열을 외래 키로 설정합니다
외래 검사 키 삭제 ALTER TABLE 테이블 이름 DROP FOREIGN KEY 외래 키 제약 조건 이름
그러나 만약 우리가 두 개의 테이블 관련 쿼리가 필요하므로 반드시 외래 키 제약 조건을 사용할 필요는 없습니다
우리는 외래 키를 사용할 때 외래 키가 슬레이브 테이블에 있고 외래 키가 기본 키를 가리킨다는 것을 알고 있습니다. 이 때, 두 테이블 사이에 제약 조건이 설정됩니다. 이때 메인 테이블이나 슬레이브 테이블의 관련 값을 임의로 수정할 수 없습니다. 이는 강력한 참조입니다.
1. 메인 테이블에 해당 레코드가 없으면 슬레이브 테이블에 레코드를 추가할 수 없습니다2. 마스터 테이블의 값을 변경할 수 없어 슬레이브 테이블에 레코드가 고아가 됩니다3. 마스터 테이블에 해당하는 테이블이 슬레이브 테이블에 존재하며 마스터 테이블에서 해당 행을 삭제할 수 없습니다4. 마스터 테이블을 삭제하기 전에 먼저 슬레이브 테이블을 삭제하세요 Association 간의 값을 마음대로 수정할 수 있습니다. 약한 참조 포함
-- 创建学生表 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)
슬레이브 테이블에 데이터 생성 및 추가:
gradeId 필드에 외래 키 제약 조건이 추가된 것을 볼 수 있습니다
이제 기본 테이블의 열을 삭제해 보겠습니다.기본 테이블을 마음대로 변경할 수 없다는 것을 알 수 있습니다. 변경하면 테이블의 데이터가 격리됩니다.
내부 조인● 조건을 충족하는 두 테이블의 교차 데이터를 쿼리합니다.
구문: 표 1, 표 2에서 결과를 선택합니다. 여기서 표 1.column1 = 표 2.column2
데카르트 곱 현상에 대해 논의합니다. 테이블 1에는 m개의 행이 있고 테이블 2에는 n개의 행이 있습니다. 결과 =m*n셀프 연결이란 무엇입니까? 이는 자신과 관련이 있고 자신과 데카르트 곱을 수행한다는 것을 의미합니다. 이는 이해하기 쉽지 않을 수 있습니다. 예를 들면 다음과 같습니다.내부 조인에는 등호 조인, 비조인이 포함됩니다. -등가 조인 및 셀프 조인 여기서는 주로 셀프 조인
我们平时在淘宝网购填地址的时候, 都是采用选择的方式, 先选择省,然后是省下面的市, 接着是市下面的区(县) ,它们都是在数据库中存着, 如何去实现这个功能呢 ?
有人可能会说, 建三张表相互关联即可 , 但实际是 , 我们采用自连接的方式 , 一张表即可实现
CREATE TABLE demo( -- 建立demo表 id INT PRIMARY KEY, NAME VARCHAR(50), pid INT )
往表中填入数据, pid为关联上一级的id
-- 自连接 -- 在多表关系中我们需要定义别名来区分 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 -- 查询条件
结果 :
外连接又分为左外连接与右外连接
先看左外连接 :
语法
select 结果 from 表1 left join 表 2 on 表1.column1 = 表 2.column2
左连接和内连接有什么不同呢? 通过两幅图我们就可以看出 ,内连接是取了两张表的共同部分 , 而左连接是取了左边表的全部(包括两张表的共同部分)
也就是说, 不仅查询两张表的共同部分, 并且左边表会被全部查询出来
我们通过上面外键所建的表来演示 , 为了演示方便,我们为student表再添加一列数据
可以看到, 此时第五列并没有去关联grade表
-- 左外连接查询 SELECT * FROM student s LEFT JOIN grade g ON s.gradeId= g.id
查询结果如下 :
那么说到这, 右外连接也就不难理解了 , 每次都会完整的查询右边的表
同样我们再为grade添加一条无关联的数据
语法 :
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 다중 테이블 연관 쿼리 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!