MySQL 에서 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 은 기능 에 따라 크게 다음 과 같은 세 가지 로 나 뉜 다.
MySQL 은 SQL 표준 에 있 는 FULL JOIN(전체 연결)을 제공 하지 않 았 습 니 다.서로 대응 하 는 기록 이 있 든 없 든 두 개의 표 기록 을 모두 꺼 냅 니 다.이 문 제 를 해결 하려 면 UNION 키 워드 를 사용 하여 LEFT JOIN 과 Right JOIN 을 통합 하여 FULL JOIN 을 모 의 하 는 목적 을 달성 할 수 있 습 니 다.
MySQL INNER JOIN
INNER JOIN 은 두 표 에 연결 이 일치 하 는 관 계 를 기록 하 는 데 사 용 됩 니 다.다음은 두 개의 원시 데이터 테이블 입 니 다.
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
검색 결 과 를 다음 과 같이 되 돌려 줍 니 다.INNER JOIN 에 대해 다음 SQL 문장 과 같 습 니 다.
SELECT article.aid,article.title,user.username FROM article,user WHERE article.uid = user.uid
CROSS JOINCROSS 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 초)
두 개 수량 급 차이!
검색 어 설명:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.