>  기사  >  데이터 베이스  >  MySQL의 제약 조건, 다중 테이블 쿼리 및 하위 쿼리에 대한 자세한 설명

MySQL의 제약 조건, 다중 테이블 쿼리 및 하위 쿼리에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-07 10:58:441808검색

1. 제약 조건의 기본 키 제약 조건

제약 조건: 열을 제한하기 위해 제약 조건이 열에 추가됩니다.

1. 기본 키 제약 조건(고유 식별): 비어 있지 않음, 고유, 참조됨

테이블의 열이 기본 키로 지정되면 클래스가 비어 있을 수 없으며 중복 값이 ​​나타날 수 없습니다

테이블 생성 시 기본 키 지정 두 가지 방법:

CREATE TABLE stu(
    sid  CHAR(6) PRIMARY KEY,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
);

CREATE TABLE stu(
    sid  CHAR(6) ,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10),
    PRIMARY KEY(sid)
);

sid 열을 기본 키 열로 지정합니다. 즉, sid 열에 기본 키 제약 조건을 추가합니다.

테이블 수정 시 기본 키 지정:

ALTER TABLE stu ADD PRIMARY KEY(sid);

기본 키 삭제:

ALTER TABLE stu DROP PRIMARY KEY;

2. 기본 키는 자동으로 커집니다

기본 키 열의 특징은 다음과 같습니다. 고유해야 하고 비워둘 수 없으므로 일반적으로 기본 키를 정수로 지정하고 다음과 같이 설정합니다. 이렇게 하면 데이터를 삽입할 때 기본 키 열의 고유하고 Null이 아닌 특성을 보장할 수 있습니다.

테이블 생성 시 기본 키 자동 증가 지정

CREATE TABLE stu(
    sid  INT PRIMARY KEY AUTO_INCREMENT,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
);

테이블 수정 시 기본 키 자동 증가 설정:

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

테이블 수정 시 기본 키 자동 증가 삭제:

ALTER TABLE stu CHANGE sid sid INT ;

기본 키 테스트 자동 증가:

INSERT INTO stu VALUES(NULL,'zhangsan',23,'man');
INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');

3. Null이 아닌 제약 조건

일부 열은 Null 값으로 설정할 수 없으므로 Null이 아닌 제약 조건을 추가할 수 있습니다.

예:

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL,
   age   INT,
   sex  VARCHAR(10)
);

는 sname 열에 null이 아닌 제약 조건을 설정합니다.

4. 고유 제약조건

차고의 일부 열은 반복되는 값을 가질 수 없으므로 해당 열에 고유 제약조건을 추가할 수 있습니다.

예:

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL UNIQUE,
   age   INT,
   sex  VARCHAR(10)
);

2. 개념 모델

1. 객체 모델: Java의 도메인, 예: 사용자, 학생

2 관계형 모델: 데이터베이스의 테이블, 1대다, 1대1. 다수 대 다수.

3. 외래 키 제약 조건

외래 키는 다른 테이블의 기본 키 값이어야 합니다. (외래 키는 기본 키를 참조해야 합니다.)

외래 키는 반복될 수 있습니다.

외래 키는 비어 있을 수 있습니다

1. 제약 조건 생성 시 외래 키 추가

CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
insert into dept values(10,'研发部');
insert into dept values(20,'人力部');
insert into dept values(30,'财务部');

CREATE TABLE emp (
    empno INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(50),
    deptno INT,
    CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno) 
);

CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
INSERT INTO dept VALUES(10,'研发部');
INSERT INTO dept VALUES(20,'人力部');
INSERT INTO dept VALUES(30,'财务部');

INSERT INTO emp(empno,ename) VALUES(null,'zhangsan');
INSERT INTO emp(empno,ename,deptno) VALUES(null,'lisi',10);


INSERT INTO emp(empno,ename,deptno) VALUES(null,'zhangsan',80);
/* Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 
(`mydb2`.`emp`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`))
*/

2. 테이블 수정 시 외래 키 제약 조건 추가:

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);

4. 데이터베이스 관계형 모델

1. 일대일 관계 설정 테이블의 기본 키는 기본 키와 외래 키 중 하나를 만들어야 합니다.

CREATE TABLE hasband (
    hid INT PRIMARY KEY AUTO_INCREMENT,
    hname VARCHAR(50)
);

CREATE TABLE wife (
    wid INT PRIMARY KEY AUTO_INCREMENT,
    wname VARCHAR(50),
    CONSTRAINT fk_wife_hasband FOREIGN KEY (wid)  REFERENCES hasband(hid) 
);

2. 다대다 관계

테이블에 다대다 관계를 설정하려면 중간 테이블을 사용해야 합니다. 즉, 3개의 테이블이 필요하고 중간에 2개의 외래 키를 사용해야 합니다. 다른 두 테이블의 기본 키를 참조하는 테이블입니다.

CREATE TABLE student (
    sid INT PRIMARY KEY ,
    ......
);

CREATE TABLE teacher(
    tid INT PRIMARY KEY ,
    ......
);

CREATE TABLE stu_tea (
    sid INT,
    tid INT,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY (sid)  REFERENCES student(sid) ,
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY (tid)  REFERENCES teacher(tid) 
);

다음과 같이 중간 테이블에 관계를 설정합니다.

INSERT INTO stu_tea VALUES(5,1);
INSERT INTO stu_tea VALUES(2,2);
INSERT INTO stu_tea VALUES(3,2);

5. 다중 테이블 쿼리

1. 분류

결과 집합 병합

연결 쿼리

하위 쿼리

2. to be merge 테이블에서 결과 집합의 열 유형과 개수가 동일합니다

UNION, 중복 행 제거

UNION ALL, 중복 행 제거 안 함

SELECT * FROM 表1名
UNION ALL
SELECT * FROM 表2名;

3 Join query

①분류

Inner Join

Outer Join

Left Outer Join

Right Outer Join

Full Outer Join(mysql은 지원하지 않음)

Natural Join(간단화된 방식에 속함)

②Inner Join

Dialect: SELECT * FROM Table 1 별칭 ​​1, 표 2 별칭 ​​2 WHERE 별칭 ​​1.xx = 별칭 ​​2.xx

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;

조건부 필터링을 사용하여 데카르트 곱에서 불필요한 정보를 제거합니다.

표준: SELECT * FROM 테이블 1 별칭 1 INNER JOIN 테이블 2 별칭 2 ON 별칭 1.xx = 별칭 2.xx;

SELECT e.ename, e.sal , d.dname  FROM emp e INNER JOIN dept d ON  e.deptno=d.deptno;

Natural: SELECT * FROM 테이블 1 별칭 1 NATURAL JOIN 테이블 2 별칭 2; 내부 조인으로 쿼리한 모든 레코드는

3외부 조인

Left 외부: SELECT * FROM Table 1 Alias ​​​​1 LEFT OUTER JOIN Table 2 Alias ​​​2 ON Alias ​​​​1.xx = Alias ​​​​2 조건을 충족합니다. xx;

왼쪽 테이블 레코드는 조건 충족 여부와 관계없이 쿼리되며, 오른쪽 테이블은 조건이 충족되어야만 검색할 수 있습니다. 조건에 맞지 않는 왼쪽 테이블의 레코드는 오른쪽 테이블에서 null이 됩니다.

SELECT e.ename, e.sal , d.dname  FROM emp e NATURAL JOIN dept d;

자연 왼쪽 외부: SELECT * FROM Table 1 Alias ​​1 NATURAL LEFT OUTER JOIN Table 2 Alias ​​2 ON Alias ​​1.xx = Alias ​​2.xx

오른쪽 외부: SELECT * FROM Table; 1 Alias ​​1 RIGHT OUTER JOIN Table 2 Alias ​​2 ON Alias ​​1.xx = Alias ​​2.xx

오른쪽 테이블의 레코드는 조건 충족 여부에 관계없이 쿼리됩니다. 왼쪽 테이블의 레코드는 조건을 만족하는 경우에만 검색할 수 있습니다. 조건을 충족하지 않는 오른쪽 테이블의 레코드는 왼쪽 테이블에서 null이 됩니다.

오른쪽 외부 자연: SELECT * FROM Table 1 Alias ​​1 NATURAL RIGHT OUTER JOIN Table 2 Alias ​​2 ON Alias ​​1.xx = Alias ​​2.xx

전체 링크: UNION을 사용하여 다음을 수행할 수 있습니다. 전체 조인을 완료합니다.

SELECT e.ename, e.sal , IFNULL(d.dname,'无部门') AS dname  FROM emp e LEFT OUTER JOIN dept d ON  e.deptno=d.deptno;

4.Subquery

쿼리에 쿼리가 있습니다.(선택 키워드 개수 확인)

1나타나는 위치

WHERE 이후에 조건으로 존재합니다.

FROM 이후에 테이블로 존재합니다(여러 행 및 여러 열)

②조건

단일 행 및 단일 열: SELECT * FROM table 1 별칭 1 WHERE 열 1 [=, >, 95ec6993dc754240360e28e0de8de30a=, <=, !=] (SELECT 열 FROM 테이블 2 별칭 2 WHERE 조건);

SELECT e.ename, e.sal , d.dname 
FROM emp e LEFT OUTER JOIN dept d 
ON e.deptno=d.deptno
UNION
SELECT e.ename, e.sal , d.dname 
FROM emp e RIGHT OUTER JOIN dept d 
ON e.deptno=d.deptno;

여러 행 및 단일 열: SELECT * FROM table 1 별칭 1 WHERE 열 1 [IN,ALL,ANY] (SELECT 열 FROM 테이블 2 별칭 2 WHERE 조건)

SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

단일 행 및 다중 열: SELECT * FROM table 1 alias 1 WHERE (Column 1, Column 2) IN (SELECT Column 1, Column 2 FROM Table 2 Alias ​​​​2 WHERE 조건)

SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job=&#39;经理&#39;) ;

다중 행 및 다중 열: SELECT * FROM Table 1 별칭 ​​1, (SELECT...) 테이블 2 별칭 ​​2 WHERE 조건 ;

위 내용은 MySQL의 제약 조건, 다중 테이블 쿼리 및 하위 쿼리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.