다중 테이블 공동 쿼리
테이블 연결
여러 테이블의 필드를 쿼리해야 하는 경우 이는 테이블 조인을 사용하여 달성할 수 있습니다. 테이블 조인은 내부 조인과 외부 조인으로 구분됩니다.
1. 내부 조인: 두 테이블의 필드가 연결 관계를 갖고 연결 관계가 일치하는 레코드들을 결합하여 레코드 세트를 구성하는 조인입니다.
2. 외부 조인: 일치하지 않는 다른 레코드가 선택되며 외부 왼쪽 조인과 외부 오른쪽 조인으로 구분됩니다.
실험을 배우기 전, 모두를 위한 시뮬레이션 데이터 테이블 2개를 준비했습니다.
1. 사용자 정보가 저장되는 User 테이블
2. 사용자가 구매한 제품은 무엇입니까?
사용자 테이블 생성문
CREATE TABLE IF NOT EXISTS user ( uid int(11) NOT NULL, username varchar(30) NOT NULL, password char(32) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS order_goods ( oid int(11) NOT NULL, uid int(11) NOT NULL, name varchar(50) NOT NULL, buytime int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
사용자 테이블 데이터는 다음과 같습니다.
참고: 위의 order_goods 테이블에서 uid는 사용자 테이블의 uid 필드를 나타냅니다. 위 표에서 oid가 있는 데이터 행은 1이고 uid가 있는 사용자는 10입니다. 사용자 테이블에 uid 10을 가진 사용자의 경우: Gao Xiaofeng. 사용자가 Apple 마우스를 구입했습니다. 구매 시간 buytime은 유닉스 타임스탬프입니다.
내부 조인
참고: 다음 예에서 from 테이블은 테이블 별칭을 사용합니다.
테이블 이름이 너무 길어서 작성할 때마다 실수하기 쉽습니다. 축약된 영어 문자열을 사용하여 표를 직접 따라갈 수 있습니다. 이전에 필드를 연결할 때는 약어 string.field를 사용하세요.
mysql> select u.uid ,u.username as username,o.oid,o.uid,o.name as shopname from user u,order_goods o where u.uid = o.uid; +-----+-----------+-----+-----+---------------+ | uid | username | oid | uid | shopname | +-----+-----------+-----+-----+---------------+ | 10 | 高小峰 | 1 | 10 | 苹果鼠标 | | 3 | 李文凯 | 2 | 3 | iphone 12s | | 12 | 李小超 | 3 | 12 | 雪碧 | | 15 | 佟小刚 | 4 | 15 | | | 3 | 李文凯 | 5 | 3 | iphone 键盘 | +-----+-----------+-----+-----+---------------+ 5 rows in set (0.00 sec)
기본문법2:
결과는 기본문법1과 일치합니다.
mysql> select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid; +-----+-----------+-----+-----+---------------+ | uid | username | oid | uid | shopname | +-----+-----------+-----+-----+---------------+ | 10 | 高小峰 | 1 | 10 | 苹果鼠标 | | 3 | 李文凯 | 2 | 3 | iphone 12s | | 12 | 李小超 | 3 | 12 | 雪碧 | | 15 | 佟小刚 | 4 | 15 | | | 3 | 李文凯 | 5 | 3 | iphone 键盘 | +-----+-----------+-----+-----+---------------+ 5 rows in set (0.00 sec)
외부 조인
외부 조인은 왼쪽 조인과 오른쪽 링크로 구분되며, 구체적인 정의는 다음과 같습니다. 다음과 같습니다.
왼쪽 조인: 왼쪽 테이블의 모든 레코드, 오른쪽 테이블의 레코드와 일치하지 않는 레코드까지 포함
mysql> select * from user left join order_goods on user.uid = order_goods.uid; +-----+-----------+------------+------+------+---------------+-----------+ | uid | username | password | oid | uid | name | buytime | +-----+-----------+------------+------+------+---------------+-----------+ | 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 | | 3 | 李文凯 | 1235531 | 2 | 3 | iphone 12s | 123121241 | | 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 | | 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 | | 3 | 李文凯 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 | | 1 | 景甜 | 123456 | NULL | NULL | NULL | NULL | | 2 | 王小二 | 245667 | NULL | NULL | NULL | NULL | | 4 | 井柏然 | 123455 | NULL | NULL | NULL | NULL | | 5 | 范冰冰 | 5abcwa | NULL | NULL | NULL | NULL | | 6 | 黄晓明 | abcdeef | NULL | NULL | NULL | NULL | | 7 | anglebaby | caption | NULL | NULL | NULL | NULL | | 8 | TFBOYS | abcdwww | NULL | NULL | NULL | NULL | | 9 | 安小超 | 12tfddwd | NULL | NULL | NULL | NULL | | 11 | 李小强 | 323fxfvdvd | NULL | NULL | NULL | NULL | | 13 | 韩小平 | 121rcfwrfq | NULL | NULL | NULL | NULL | | 14 | 宋小康 | 123123tcsd | NULL | NULL | NULL | NULL | +-----+-----------+------------+------+------+---------------+-----------+ 16 rows in set (0.00 sec)
오른쪽 조인: 오른쪽 테이블의 모든 레코드, 오른쪽 테이블의 레코드 포함 오른쪽 테이블
mysql> select * from user right join order_goods on user.uid = order_goods.uid; +------+-----------+----------+-----+-----+---------------+-----------+ | uid | username | password | oid | uid | name | buytime | +------+-----------+----------+-----+-----+---------------+-----------+ | 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 | | 3 | 李文凯 | 1235531 | 2 | 3 | iphone 12s | 123121241 | | 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 | | 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 | | 3 | 李文凯 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 | +------+-----------+----------+-----+-----+---------------+-----------+ 5 rows in set (0.00 sec)
Subquery
에 일치하는 레코드가 없습니다.때때로 쿼리할 때 필수 조건이 다른 select 문의 결과인 경우가 있는데, 이 경우 하위 쿼리를 사용해야 합니다. 하위 쿼리에 사용되는 키워드에는 in, not in, =, !=, 존재함, 존재하지 않음 등이 포함됩니다.
예 1:
mysql> select * from user where uid in (1,3,4); +-----+-----------+----------+ | uid | username | password | +-----+-----------+----------+ | 1 | 景甜 | 123456 | | 3 | 李文凯 | 1235531 | | 4 | 井柏然 | 123455 | +-----+-----------+----------+ 3 rows in set (0.00 sec)
예 2:
mysql> select * from user where uid in (select uid from order_goods); +-----+-----------+----------+ | uid | username | password | +-----+-----------+----------+ | 10 | 高小峰 | 3124qwqw | | 3 | 李文凯 | 1235531 | | 12 | 李小超 | 311aqqee | | 15 | 佟小刚 | 3cxvdfs | +-----+-----------+----------+ 4 rows in set (0.00 sec)rrree
레코드 유니온
Union 및 Union All 키워드를 사용하여 특정 쿼리 조건에 따라 두 테이블의 데이터를 쿼리한 후 결과를 병합하여 표시합니다. 둘의 주요 차이점은 결과를 직접 병합한다는 점이며, 유니온은 모두 유니온한 후 결과에 대해 별도의 작업을 수행하고 중복된 레코드를 제거한 결과입니다.