섹션 3 2NF 하위 쿼리 연결

9397 단어 하위 쿼리연결
1. 외부 키
표 my_contacts(contact_id, phone, email,gender,interests),interests는 여러 개의 값을 가질 수 있고 1NF를 갖추지 않기 때문에interests를 하나의 표로 단독으로 사용할 수 있습니다.interests(interest_id,interest,contact_id),contact_id는'취미'가 누구의 것인지를 나타내는 데 사용되며, 그 값과 my--contacts의contact_id 일치.interests 테이블의contact_id열을 외부 키 (foreign key) 라고 합니다.
외부 키는 한 테이블의 줄이 다른 테이블의 줄과 대응하는지 확인하는 데 사용됩니다.메인 키는null이 될 수 없지만, 외부 키는null이 될 수 있으며, 외부 키가null일 때 부모 표의 줄이 대응하지 않음을 나타냅니다.외부 키의 값은 유일성이 없습니다.외부 키가 반드시 부모 표의 메인 키는 아니지만, 부모 표에서 유일해야 한다.외부 키를 삽입하는 값은 부모 테이블의 줄에 이미 표시된 값이어야 합니다 (완전성 참조).
CREARE TABLE interests (
    interest_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    interest VARCHAR(50) NOT NULL,
    contact_id INT NOT NULL,
    CONSTRAINT my_contacts_contact_id_fk   # 
    FOREIGN KEY(contact_id) REFERENCES my_contacts(contact_id)
);

외부 키 제약이 있을 때, 부모 테이블의 줄을 삭제하거나 값을 바꾸려고 할 때, 그 값이 다른 테이블의 외부 키라면 경고를 받을 것입니다.만약 정말 이런 조작이 필요하다면, 먼저 키를 제거하고 수정할 수 있다.
 
2. 표간 관계
표 사이의 관계는 세 가지가 있는데 그것이 바로 1대 1(흔하지 않음), 1대 다수, 다중이다.다중 대 다중의 경우, 테이블에 너무 많은 반복 그룹을 피하기 위해junctiontable를 사용할 수 있습니다.
       woman(woman_id,woman,shoes_is)、shoes(shoes_id,name)
       woman(woman_id,woman)、shoes(shoes_id,name,woman_id)
       woman(woman_id,woman)、shoes(shoes_id,name)、junctiontable(woman_id,shoes_id)
 
3, 조합 키, 의존, 2NF, 3NF
조합 키는 여러 개의 데이터 열로 구성된 메인 키로 조합 후 유일성을 가지고 메인 키의 역할을 한다.예를 들어 표의 어떤 두 열은 모두 메인 키가 아니지만 조합된 후에 메인 키가 된다.
의존: 열 x의 값이 바뀌면 열 y의 값이 바뀌어야 합니다. 열 y 함수 의존과 열 x를 T.y->T.x라고 합니다.예를 들어 이름 약어는 이름에 의존하고 도시는 국가에 의존한다.부분 함수 의존: T.y->T.x, 열 x는 다른 열 그룹과 주 키를 합성합니다.전달 함수 의존: 두 개의 비주 키열이 형성하는 함수 의존.2NF: 일부 함수 종속성이 없는 1NF 준수.만약 테이블에 인공 키가 있고 조합 키가 없다면 2NF에 부합된다.3NF: 2NF에 부합하고 전달 함수 의존이 없습니다.
 
4. AS
AS는 SELECT 조회의 내용을 새 표에 삽입할 수 있지만, 조회를 요구하는 열명은 표의 열명과 일치합니다.
CREATE TABLE profession
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
    profession VARCHAR(20);
);
INSERT INTO profession (profession)
    SELECT profession FROM my_contacts
    GROUP BY profession
    ORDER BY profession;

CREATE TABLE profession AS
    SELECT profession FROM my_contacts
    GROUP BY profession
    ORDER BY profession;
ALTER TABLE profession
ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST;
ADD PRIMARY KEY (id);

CREATE TABLE profession
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
    profession VARCHAR(20);
)AS
    SELECT profession FROM my_contacts
    GROUP BY profession
    ORDER BY profession;

AS는 검색에 처음 표시되는 열에서 AS를 받기만 하면 별칭을 지정할 수 있습니다.(이 경우 AS는 생략할 수 있습니다)
CREATE TABLE profession
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
    prof VARCHAR(20);
)AS
    SELECT profession AS prof FROM my_contacts
    GROUP BY prof
    ORDER BY prof;

   
 
5. 내부 연결
CROSS JOIN을 교차 연결하면 두 테이블의 모든 행을 곱한 다음 곱한 테이블에서 조회합니다.
표 toys(toy_id,toy), 30 줄 값과 표 boys(boy_id,boy), 40 줄 값이 있습니다.
SELECT t.toy b.boy FROM toys AS t CROSS JOIN boys AS b;
SELECT toys.toy ,boys.boy FROM toys ,boys;# 
SELECT *  FROM toys CROSS JOIN boys ;# 1200 ,4 , 

내부 연결의 형식은 다음과 같습니다.
SELECT somecolumns FROM table1 INNER JOIN table2 ON conditions;

표 toys(toy_id,toy)가 있고, 30줄 값과 표 boys(boy_id,boy,toy_id)가 있으며, 40줄 값이 있습니다.
SELECT boys.boy toys.toy 
FROM boys INNER JOIN toys 
ON boys.toy_id=toys.toy_id; # , 

SELECT boys.boy toys.toy 
FROM boys INNER JOIN toys 
ON boys.toy_id<>toys.toy_id
ORDER BY boys.boy; # , 

SELECT boys.boy toys.toy 
FROM boys NATURAL JOIN toys; # , , 

    
6. 하위 쿼리
하위 조회는 조회 중의 조회로 두 부분이 있는데 그것이 바로 내부 조회와 외부 조회이다.
SELECT mc.name,mc.phone,jc.title
FROM my_contacts AS mc NATURAL JOIN job_current AS jc 
WHERE jc.title IN ('Cook','Waiter','Web Designer');  # 

SELECT title FROM job_listings
GROUP BY title ORDER title;  # 
SELECT mc.name,mc.phone,jc.title
FROM my_contacts AS mc NATURAL JOIN job_current AS jc 
WHERE jc.title IN (SELECT title FROM job_listings); # IN\NOT IN, 
        # 

하위 질의의 구조는 다음과 같습니다.
SELECT some_columns
FROM table
WHERE column=(SELECT column FROM table);
SELECT name FROM my_contacts
WHERE zip_code=(SELECT zip_code FROM zip WHERE city='Menphis' AND state='TN');
        # 
SELECT name FROM my_contacts NATURAL JOIN zip
WHERE zip.city='Menphis' AND state='TN';

내 연락처 중에서 누가 돈을 가장 많이 벌었습니까?
SELECT mc.name,jc.salary
FROM my_contacts AS mc NATURAL JOIN job_current AS jc 
WHERE jc.salary=(SELECT MAX(jc.salary) FROM job_current jc);

서브쿼리는 SELECT 자구에 저장하여 선택한 값을 표시할 수 있으며, 이 경우 한 번에 한 개의 값만 되돌려받을 수 있습니다.
SELECT mc.name 
(SELECT state FROM zip WHERE mc.zip=zip.zip) AS state
FROM my_contacts mc;

비연관 서브쿼리: 서브쿼리가 독립적으로 실행될 수 있고 외부 쿼리의 결과를 인용하지 않습니다. 
앤디보다 월급이 많은 사람의 정보:
SELECT mc.name,jc.salary FROM my_contacts AS mc NATURAL JOIN job_current AS jc
WHERE jc.salary>
(SELECT jc.salary FROM my_contacts mc NATURAL JOIN job_current jc 
WHERE email='[email protected]');

관련 서브쿼리: 내부 쿼리의 해석은 외부 쿼리의 결과에 의존해야 한다.
 
연락처 중 세 가지 취미가 있는 사람의 정보:
SELECT mc.name FROM my_contacts AS mc 
WHERE 3=
(SELECT COUNT(*) FROM interets WHERE contact_id=mc.contact_id);

어떤 연락처가 아직 job_current 테이블에 나타납니다.
SELECT mc.name FROM my_contacts AS mc 
WHERE NOT EXIST
(SELECT COUNT(*) FROM job_current jc
WHERE mc.contact_id=jc.contact_id);

어떤 사람이 job_current에 나타나면 위의 NOT EXIST를 Exist로 바꾸면 됩니다.
 
7. 외부 연결
외부 연결은 어떤 테이블의 모든 줄을 되돌려주고 다른 테이블이 조건에 맞는 줄을 가진다.내부 연결은 의미 있는 줄로 되돌아갈 뿐이다.외부 연결은 다음 테이블에서 대응하지 않으면 NULL을 되돌려주고, 여러 값이 있으면 각 그룹에 맞는 값을 되돌려줍니다.
외부 연결을 하려면 왼쪽 표(첫 번째 표)를 표준으로 하고, 또 오른쪽 표를 표준으로 한다.
toys표에 값(1,dog), (2,cat)이 있습니다.boys 테이블에 값 (1, Lili, 1), (2, Xiaohong, 1)이 있으면 다음과 같습니다.
SELECT b.boy,t.toy 
FROM toys t LEFT OUTER JOIN boys b
ON t.toy_id=b.toy_id;

그러면 결과가 나옵니다. (Lili,dog), (Xiaohong,dog), (NULL,cat)
 
 
8. 자체 연결
자동 연결은 한 장의 시계를 두 개의 시계로 삼아 연결 조작을 한다.
SELECT p1.name,p2.name AS boss    # 
FROM personal p1 INNER JOIN personal p2
ON p1.id=p2.boss_id;

SELECT p.name,    # 
(SELECT name FROM personal WHERE p.boss_id=id )AS boss
FROM personal p;

 
 
9. UNION
SELECT title FROM job_current
UNION
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings
ORDER BY title;

검색 결과는 하나의 제목만 있습니다. 모든 검색에 나타나는 제목을 표시하고 반복적으로 한 번만 표시합니다.UNION을 UNION으로 변경하면 중복된 것도 표시됩니다.
CREATE TABLE job AS
SELECT title FROM job_current
UNION
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings
ORDER BY title;

유니온이 나오면 인터섹과 엑센트로 연합할 수 있다. 인터섹은 모든 조회 결과를 교차시키고, 엑센트는 이전 결과를 다음 결과로 줄인다는 뜻이다.
 
 
기타
SELECT name,rating FROM restaurant_rating
WHERE rating>ALL
(SELECT rating FROM restaurant_rating
WHERE name IN('Jack','Tom','Harry');

ALL보다 크면 컬렉션의 최대치보다 큰 모든 값을 나타냅니다.ALL보다 작으면 컬렉션의 최소값보다 작은 모든 값을 나타냅니다.
 
SOME와 ANY도 같은 용법이 있습니다. SOME와 ANY는 등가입니다.
SOME보다 크면 컬렉션의 최소값보다 큰 모든 값을 나타냅니다.SOME보다 작으면 컬렉션의 최대치보다 작은 모든 값을 나타냅니다.
여기에는 >=, <=도 사용할 수 있다.
   
MySQL에서 날짜를 지정할 수 있는 형식:
SELECT DATe_FORMAT(date,'%M %Y') FROM table;  # 

 
 
MySQL에서 임시 테이블을 만드는 것은 간단합니다. 테이블 앞에 temporary를 추가하면 됩니다.
CREATE TEMPORARY TABLE temp
(
    some_int INT;
    some_data VARCHAR(50);
);

CREATE TEMPORARY TABLE temp AS
SELECT *FROM table;

       
 
데이터 변환에 필요한 함수: CAST(column, TYPE)
SELECT CAST('2005-02-06' AS DATE);
SELECT CAST(2 AS DECIMAL);

CAST가 적용되지 않는 경우: 부동 소수점이 정수로 변환됩니다.TIME, Date, DATETIME, CHAR가 DECIMAL 또는 INTEGER로 변환됩니다. 
 
 
색인을 추가하면 여러 개의 테이블을 연결하고 데이터의 완전성을 강화할 수 있습니다.큰 테이블에서 색인은 조회 속도를 높일 수 있습니다. 색인을 추가하는 명령은 다음과 같습니다.
ALTER TABLE my_contacts
ADD INDEX (name);

 
현재 사용자, 현재 날짜, 현재 시간 보기:
SELECT CURRENT_USER;
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;

 
몇 가지 유용한 수학 함수:
SIN(x),ASIN(x),ABS(x),EXP(x),LN(x),LOG(x),LOG(x,y),SIGN(x),SQRT(x),POWER(x,y),PI(),RAND()
CEIL(x)보다 큰 최소 정수, ROUND(x)는 정수로 반올림, FORMAT(x, y)는 y비트 소수로 텍스트를 반올림,
ROUND(x, y) 반올림 보존 y 비트 소수점 숫자 얻기, MOD(x, y) x y 나머지, TRUNCATE(x, y) y 비트 소수점 자르기

좋은 웹페이지 즐겨찾기