집 >데이터 베이스 >MySQL 튜토리얼 >mysql 왼쪽, 오른쪽, 내부 조인
왼쪽과 오른쪽 연결
완전 곱셈 방법(매우 비효율적)
mysql> select * from test10; +------+-------+ | id | sname | +------+-------+ | 1 | 云彩 | | 2 | 月亮 | | 3 | 星星 | +------+-------+
3행 세트(0.00초)
mysql> select * from test11; +--------+-------+ | cat_id | cname | +--------+-------+ | 95 | 猴子 | | 96 | 老虎 | +--------+-------+
2행 in set (0.00 초)
데이터베이스에 두 개의 테이블*을 구현한 효과
mysql> select * from test10,test11; +------+-------+--------+-------+ | id | sname | cat_id | cname | +------+-------+--------+-------+ | 1 | 云彩 | 95 | 猴子 | | 1 | 云彩 | 96 | 老虎 | | 2 | 月亮 | 95 | 猴子 | | 2 | 月亮 | 96 | 老虎 | | 3 | 星星 | 95 | 猴子 | | 3 | 星星 | 96 | 老虎 | +------+-------+--------+-------+
6 행 in set (0.03 초)
분석:
test10 3개 요소가 있는 집합으로 처리
test11 2개 요소가 있는 집합으로 처리
test10*test11 6개 요소가 있는 새 집합 가져오기
두 테이블의 행 수 곱하기
열에 두 개 각 테이블의 열 수 추가(반복 가능)
열 이름이 중복된 여러 테이블을 쿼리할 경우 어떤 테이블을 얻었는지 명확하게 표시해야 합니다.
mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category limit 3; +----------+--------+--------------------+--------+----------+ | goods_id | cat_id | goods_name | cat_id | cat_name | +----------+--------+--------------------+--------+----------+ | 1 | 4 | KD876 | 1 | 手机类型 | | 4 | 8 | htcN85原装充电器 | 1 | 手机类型 | | 3 | 8 | 诺基亚原装5800耳机 | 1 | 手机类型 | +----------+--------+--------------------+--------+----------+
동일한 구조 테이블 생성 [이전 테이블 이름]과 같은 테이블 [새 테이블 이름] 생성
상품과 같은 테이블 미니굿즈 생성;
테이블 내용 일부 복사
mysql> insert into minigoods -> select * from goods limit 3;
의미 있는 2개 가져오기 해당 minigoods.cat_id=category.cat_id
mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category where minigoods.cat_id=category.cat_id ; +----------+--------+--------------------+--------+----------+ | goods_id | cat_id | goods_name | cat_id | cat_name | +----------+--------+--------------------+--------+----------+ | 1 | 4 | KD876 | 4 | 3G手机 | | 4 | 8 | htcN85原装充电器 | 8 | 耳机 | | 3 | 8 | 诺基亚原装5800耳机 | 8 | 耳机 | +----------+--------+--------------------+--------+----------+
세트의 3개 행(0.00초)
왼쪽 조인 구문
테이블이 켜져 있습니다. 왼쪽, 움직이지 않음
테이블 b가 오른쪽에 있음, 이동
테이블 a와 테이블 b가 a에 필요한 b 행을 필터링하기 위해 관계(직접 설정)를 전달합니다
왼쪽 조인 b on [조건] --- -조건이 true이면 b의 행을 꺼냅니다.
a left Join b on [조건] 결과 집합도 테이블로 간주할 수 있습니다(테이블로 가정). c), 다시 쿼리할 수 있습니다.
mysql> select goods_id,goods_name,cat_name -> from -> (minigoods left join category on minigoods.cat_id=category.cat_id); +----------+--------------------+----------+ | goods_id | goods_name | cat_name | +----------+--------------------+----------+ | 1 | KD876 | 3G手机 | | 4 | htcN85原装充电器 | 耳机 | | 3 | 诺基亚原装5800耳机 | 耳机 | +----------+--------------------+----------+
[minigoods는 minigoods.cat_id=category.cat_id의 카테고리에 C 테이블로 가입함]
확인: 여전히 where 및를 사용할 수 있습니다. 다른 필터링 조건은 나중에
mysql> select goods_id,goods_name,cat_name from (minigoods left join category on minigoods.cat_id=category.cat_id ) where 1 order by goods_id desc limit 2; +----------+--------------------+----------+ | goods_id | goods_name | cat_name | +----------+--------------------+----------+ | 4 | htcN85原装充电器 | 耳机 | | 3 | 诺基亚原装5800耳机 | 耳机 | +----------+--------------------+----------+
2행 세트(0.00초)
여러 테이블을 남겨두고 조인할 수 있습니다. 즉, 결과를 테이블로 처리합니다.
하나의 테이블로 취급
{{a left join b on [条件]} left join c on [条件]} mysql> select goods.goods_id,goods.goods_name,goods.cat_id,cat_name -> from -> minigoods left join category on minigoods.cat_id=category.cat_id -> left join goods on minigoods.cat_id=4 limit 4; +----------+--------------------+--------+----------+ | goods_id | goods_name | cat_id | cat_name | +----------+--------------------+--------+----------+ | 1 | KD876 | 4 | 3G手机 | | 4 | htcN85原装充电器 | 8 | 3G手机 | | 3 | 诺基亚原装5800耳机 | 8 | 3G手机 | | 5 | 索爱原装M2卡读卡器 | 11 | 3G手机 | +----------+--------------------+--------+----------+
왼쪽 조인과 오른쪽 조인의 차이점 ============================ ====================== ============================ =====================
왼쪽 조인 b on은 쿼리할 때 a를 기반으로 하는 쿼리를 의미합니다
오른쪽 조인 b on은 쿼리 기반을 의미합니다. on b 쿼리 시
a left 조인 b on은 b right 조인 a와 동일합니다(모든 쿼리는 a를 기반으로 함)
팁: 포팅 호환성 및 이해 측면에서 항상 왼쪽 조인을 사용하여 구현
create table boy( bname varchar(20), other char(1) )engine myisam charset utf8; insert into boy values ('屌丝','A'), ('李四','B'), ('王五','C'), ('高富帅','D'), ('郑七','E');
create table girl( gname varchar(20), other char(1) )engine myisam charset utf8; insert into girl values ('空姐','B'), ('大S','C'), ('阿娇','D'), ('张柏芝','D'), ('林黛玉','E'), ('宝钗','F');
모든 남자 배우자 제거(왼쪽 연결)
select boy.*,girl.* from boy left join girl on boy.other=girl.other; +--------+-------+--------+-------+ | bname | other | gname | other | +--------+-------+--------+-------+ | 屌丝 | A | NULL | NULL | | 李四 | B | 空姐 | B | | 王五 | C | 大S | C | | 高富帅 | D | 阿娇 | D | | 高富帅 | D | 张柏芝 | D | | 郑七 | E | 林黛玉 | E | +--------+-------+--------+-------+
모든 여자 배우자 제거(왼쪽 연결)
mysql> select girl.*,boy.* from -> girl left join boy on -> boy.other=girl.other; +--------+-------+--------+-------+ | gname | other | bname | other | +--------+-------+--------+-------+ | 空姐 | B | 李四 | B | | 大S | C | 王五 | C | | 阿娇 | D | 高富帅 | D | | 张柏芝 | D | 高富帅 | D | | 林黛玉 | E | 郑七 | E | | 宝钗 | F | NULL | NULL | +--------+-------+--------+-------+
여자 배우자 모두 꺼내기(오른쪽 연결, 위 왼쪽 조인은 일관됨)
mysql> select girl.* ,boy.* from -> boy right join girl on -> boy.other=girl.other; +--------+-------+--------+-------+ | gname | other | bname | other | +--------+-------+--------+-------+ | 空姐 | B | 李四 | B | | 大S | C | 王五 | C | | 阿娇 | D | 高富帅 | D | | 张柏芝 | D | 高富帅 | D | | 林黛玉 | E | 郑七 | E | | 宝钗 | F | NULL | NULL | +--------+-------+--------+-------+
내부 조인========== ======================== ========================== ======================== ===============
배우자를 데리고 나가세요
select girl.*,boy.* from boy inner join girl on boy.other=girl.other; +--------+-------+--------+-------+ | gname | other | bname | other | +--------+-------+--------+-------+ | 空姐 | B | 李四 | B | | 大S | C | 王五 | C | | 阿娇 | D | 高富帅 | D | | 张柏芝 | D | 高富帅 | D | | 林黛玉 | E | 郑七 | E | +--------+-------+--------+-------+
내부 조인은 왼쪽과 오른쪽 조인의 교차입니다
(외부 연결은 왼쪽과 오른쪽 연결의 합집합으로 mysql에서는 지원되지 않습니다).
노조 구현 왼쪽 가입 신청 ========================== ============ ================================================== =============
create table match_t( match_id int primary key auto_increment, host_team_id int, guest_team_id int, match_result varchar(20), match_time date )engine myisam charset utf8; insert into match_t values (1,1,2,'2:0','2006-05-21'), (2,2,3,'1:2','2006-06-21'), (3,3,1,'2:5','2006-07-21'), (4,1,1,'3:2','2006-08-21'); create table team_t( team_id int primary key auto_increment, team_name varchar(20) )engine myisam charset utf8; insert into team_t values (1,'恒大'), (2,'国安'), (3,'申花'), (4,'大连'); mysql> select * from match_t; +----------+--------------+---------------+--------------+------------+ | match_id | host_team_id | guest_team_id | match_result | match_time | +----------+--------------+---------------+--------------+------------+ | 1 | 1 | 2 | 2:0 | 2006-05-21 | | 2 | 2 | 3 | 1:2 | 2006-06-21 | | 3 | 3 | 1 | 2:5 | 2006-07-21 | | 4 | 4 | 1 | 3:2 | 2006-08-21 | +----------+--------------+---------------+--------------+------------+ mysql> select * from team_t; +---------+-----------+ | team_id | team_name | +---------+-----------+ | 1 | 恒大 | | 2 | 国安 | | 3 | 申花 | | 4 | 大连 | +---------+-----------+
기법: 친절과 베풂은 또 다른 이름을 나타낸다
2006년 -06~21일 이후 전투를 바꾼다 테이블에서 팀명
select host_t.team_name,guest_t.team_name,match_result,match_time from match_t left join (team_t as host_t) on match_t.host_team_id=host_t.team_id left join (team_t as guest_t) on match_t.guest_team_id=guest_t.team_id where match_time>='2006-06-21'; +--------------+-----------+---------------+-----------+--------------+------------+ | host_team_id | team_name | guest_team_id | team_name | match_result | match_time | +--------------+-----------+---------------+-----------+--------------+------------+ | 1 | 恒大 | 2 | 国安 | 2:0 | 2006-05-21 | | 2 | 国安 | 3 | 申花 | 1:2 | 2006-06-21 | | 3 | 申花 | 1 | 恒大 | 2:5 | 2006-07-21 | | 4 | 大连 | 1 | 恒大 | 3:2 | 2006-08-21 | +--------------+-----------+---------------+-----------+--------------+------------+
위는 mysql 좌, 우, 내부 연결 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요. )!