>  기사  >  데이터 베이스  >  MySQL 다중 테이블 연관 쿼리 예시 분석

MySQL 다중 테이블 연관 쿼리 예시 분석

PHPz
PHPz앞으로
2023-05-28 13:32:351465검색

데이터베이스 설계 패러다임

현재 데이터베이스 설계에는 5가지 패러다임이 있습니다. 일반적으로 데이터베이스는 처음 세 가지 패러다임만 충족하면 됩니다.

첫 번째 패러다임: 각 열이 원자성을 유지하도록 보장하세요

원자성이란 무엇입니까? 예를 들어 다음

MySQL 다중 테이블 연관 쿼리 예시 분석

연락처 정보에는 QQ, WeChat, 전화 등이 포함됩니다. 분명히 이 열은 별도의 QQ 또는 전화 등인 경우 원자성을 만족하지 않습니다. 첫 번째 정규형을 만족합니다

두 번째 정규형: 기본 키를 가지려면 다른 필드도 기본 키에 의존해야 합니다.

테이블을 생각하면 기본 키가 왜 그렇게 중요한가요? 팀으로서 기본 키는 팀의 플래그입니다

• 기본 키가 없으면 고유성이 없으므로 이 레코드 행을 컬렉션에서 찾을 수 없으므로 기본 키가 필요합니다.

다른 필드에서 기본 키를 사용해야 하는 이유는 무엇인가요? 기본 키에 의존하지 않고서는 위치를 확인할 수 있는 방법이 없기 때문입니다. 더 중요한 것은 다른 필드로 구성된 레코드 행이 기본 키와 동일한 것을 나타내며 기본 키는 기본 키에만 의존하면 고유해진다는 것입니다.

제3정규형: 전이적 종속성을 제거하고 이해를 돕기 위한 것입니다. "중복성 제거"라고 할 수 있습니다.

이것을 어떻게 이해해야 할까요?

MySQL 다중 테이블 연관 쿼리 예시 분석

테이블을 디자인한다면? 위와 같이 평범해 보이지만 이 테이블을 분할하면

MySQL 다중 테이블 연관 쿼리 예시 분석

이렇게 하면 모든 면에서 제품 번호를 통해 두 테이블을 직접 연결하는 것이 훨씬 더 명확해집니다. 모든 것을 하나의 테이블에 압축하는 것보다 훨씬 낫습니다

외래 키

테이블의 식별자와 동일한 기본 키가 있다는 것을 알고 있지만 외래 키는 어떻습니까?

● 외래 키: 다음을 참조합니다. 다른 데이터 테이블은 특정 레코드입니다.

● 외래 키 열 유형은 기본 키 열 유형과 일치합니다. 데이터 테이블 간의 연관/참조 관계는 특정 기본 키(기본 키) 및 외래 키(외래 키)를 사용하여 설정됩니다.

외래 키 제약 조건 추가
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)

마스터 테이블에 데이터 생성 및 추가:

슬레이브 테이블에 데이터 생성 및 추가: MySQL 다중 테이블 연관 쿼리 예시 분석

gradeId 필드에 외래 키 제약 조건이 추가된 것을 볼 수 있습니다 MySQL 다중 테이블 연관 쿼리 예시 분석

이제 기본 테이블의 열을 삭제해 보겠습니다.

기본 테이블을 마음대로 변경할 수 없다는 것을 알 수 있습니다. 변경하면 테이블의 데이터가 격리됩니다. MySQL 다중 테이블 연관 쿼리 예시 분석

내부 조인

● 조건을 충족하는 두 테이블의 교차 데이터를 쿼리합니다. MySQL 다중 테이블 연관 쿼리 예시 분석

구문: ​​

표 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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제