MySQL 에서 join 문장의 기본 사용 튜 토리 얼 과 필드 가 성능 에 미 치 는 영향

4413 단어 MySQLjoin
join 문장의 기본 사용
SQL(MySQL)JOIN 은 두 개 이상 의 표 의 필드 간 의 관계 에 따라 이 표 에서 데 이 터 를 얻 는 데 사 용 됩 니 다.
JOIN 은 보통 ON 키워드 와 함께 사용 하 는데 기본 문법 은 다음 과 같 습 니 다.
... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
table 1 은 보통 왼쪽 표 라 고 부 르 고 table 2 는 오른쪽 표 라 고 부른다.ON 키 워드 는 결과 집합 에서 원 하 는 줄 을 제한 하 는 일치 조건 을 설정 하 는 데 사 용 됩 니 다.다른 조건 을 지정 할 필요 가 있 으 면 뒤 에는 WHERE 조건 이나 LIMIT 를 더 해 반환 수 등 을 제한 할 수 있다.
다음은 가장 흔히 볼 수 있 는 두 표 연결 로 MySQL JOIN 의 용법 을 설명 하고,다 표 JOIN 에 대해 서 는'MySQL JOIN 다 표'를 참조 하 시기 바 랍 니 다.
MySQL 조인 분류
JOIN 은 기능 에 따라 크게 다음 과 같은 세 가지 로 나 뉜 다.
  • INNER JOIN(내부 연결):두 표 에 연결 이 일치 하 는 관 계 를 기록 합 니 다
  • LEFT JOIN(왼쪽 연결):왼쪽 표(table 1)의 완전 기록 을 얻 습 니 다.즉,오른쪽 표(table 2)는 일치 하 는 기록 이 없습니다
  • Right JOIN(오른쪽 연결):LEFT JOIN 과 반대로 오른쪽 표(table 2)의 완전 기록 을 얻 었 습 니 다.즉,왼쪽 표(table 1)는 일치 하 는 기록 이 없습니다
  • MySQL FULL JOIN 에 대한 모든 연결
    MySQL 은 SQL 표준 에 있 는 FULL JOIN(전체 연결)을 제공 하지 않 았 습 니 다.서로 대응 하 는 기록 이 있 든 없 든 두 개의 표 기록 을 모두 꺼 냅 니 다.이 문 제 를 해결 하려 면 UNION 키 워드 를 사용 하여 LEFT JOIN 과 Right JOIN 을 통합 하여 FULL JOIN 을 모 의 하 는 목적 을 달성 할 수 있 습 니 다.
    MySQL INNER JOIN
    INNER JOIN 은 두 표 에 연결 이 일치 하 는 관 계 를 기록 하 는 데 사 용 됩 니 다.다음은 두 개의 원시 데이터 테이블 입 니 다.
    20151216104417019.png (366×317)
    article 표 에 있 는 글 의 소속 사용 자 는 uid 라 는 필드 를 통 해 user 표 와 연 결 됩 니 다.관찰 데 이 터 를 통 해 uid=3 사용자 에 게 아무런 글 도 발표 하지 않 았 음 을 알 수 있 습 니 다.한편,글 에서 id=4 는 uid 표 에서 해당 하 는 기록 을 찾 을 수 없습니다.
    우 리 는 사용 한 글 과 사용자 가 일일이 대응 하 는 데 이 터 를 열거 합 니 다.
    SELECT...INNER JOIN...ON 문 구 는 다음 과 같 습 니 다.
    
    SELECT article.aid,article.title,user.username FROM article INNER JOIN user ON article.uid = user.uid
    
    검색 결 과 를 다음 과 같이 되 돌려 줍 니 다.
    20151216104447947.png (273×126)
    INNER JOIN 에 대해 다음 SQL 문장 과 같 습 니 다.
    
    SELECT article.aid,article.title,user.username FROM article,user WHERE article.uid = user.uid
    
    CROSS JOIN
    CROSS JOIN 은 교차 연결 입 니 다.ON 조건 이 지정 되 지 않 은 상태 에서:
    
    SELECT article.aid,article.title,user.username FROM article CROSS JOIN user
    
    결 과 는 연 결 된 두 개의 데이터 시트 의 곱,즉 피리 칼 적 이다.
    실제로 MySQL 에 서 는(MySQL 에 만 한정)CROSS JOIN 과 INNER JOIN 의 표현 이 같 았 고,ON 조건 을 지정 하지 않 고 얻 은 결 과 는 모두 피리 칼 적 이 었 으 며,반대로 두 표 가 완전히 일치 하 는 결 과 를 얻 었 다.
    INNER JOIN 과 CROSS JOIN 은 INNER 또는 CROSS 키 워드 를 생략 할 수 있 기 때문에 다음 SQL 효 과 는 같 습 니 다.
    평판 보기 인쇄?
    
    ... FROM table1 INNER JOIN table2
    
    ... FROM table1 CROSS JOIN table2
    
    ... FROM table1 JOIN table2
    
    
    join 의 필드 문자 집합 인 코딩 이 성능 에 미 치 는 영향
    먼저 예제 코드 를 살 펴 보 겠 습 니 다.
    utf-8 인 코딩 표 t1:
    
    CREATE TABLE IF NOT EXISTS `t1` (
     `name` varchar(50) NOT NULL DEFAULT '',
     KEY `name` (`name`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    데 이 터 를 마음대로 삽입 하면 수량 이 많 고 뒤의 실험 결과 가 더욱 뚜렷 하 며 게 으 름 을 피 우 며 무 작위 문자열 삽입 문 구 를 구성 합 니 다.
    
    insert into t1(name) 
    select concat(
    char(round((rand())*25)+97),
    char(round((rand())*25)+65),
    char(round((rand())*25)+65),
    char(round((rand())*25)+97),
    char(round((rand())*25)+65),
    char(round((rand())*25)+65),
    char(round((rand())*25)+97),
    char(round((rand())*25)+65)
    )
    
    기록 을 삽입 할 때마다 익숙 한 스 크 립 트(python,phop,셸 등)로 순환 을 쓰 고 만 번 이상 실행 합 니 다.
    이 시 계 를 새 표 t2 로 복사 하여 일부 데 이 터 를 삭제 하고 1000 개 정도 면 됩 니 다.(phpMyAdmin 추천)
    t2 를 t3 로 복사 하고 필드 를 gb 2312 인 코딩 으로 변경 합 니 다.
    left join 문 구 를 사용 하여 문 구 를 쓰 고 t2/t3 이 t1 보다 어떤 기록 이 적 었 는 지 알 아 냅 니 다.
    문장 은 매우 간단 하 다.다음 과 같다.
    
    SELECT SQL_NO_CACHE t1.name, t2.name
    FROM t1
    LEFT JOIN t2 ON t1.name = t2.name
    WHERE t2.name IS NULL 
    LIMIT 0 , 30
    
    SQL 가입 주의NO_CACHE,my sql 캐 시 를 사용 하지 않 습 니 다.
    인 코딩 이 일치 하 는 t2 표를 먼저 보고 phpMyAdmin 에서 실행 한 결과:
    줄 0-29 보이 기(1,129 합계,조회 소모 0.0010 초)
    평균 소모 시간 은 대략 0.0010 초 이다.
    
    SELECT SQL_NO_CACHE t1.name, t3.name
    FROM t1
    LEFT JOIN t3 ON t1.name = t3.name
    WHERE t2.name IS NULL 
    LIMIT 0 , 30
    
    phpMyAdmin 실행 결과:
    줄 0-29 보이 기(30 합계,조회 비용 0.1871 초)
    두 개 수량 급 차이!
    검색 어 설명:
    20151216104614308.png (697×497)

    좋은 웹페이지 즐겨찾기