>  기사  >  데이터 베이스  >  MySql에서 연결 쿼리 문제를 해결하는 방법

MySql에서 연결 쿼리 문제를 해결하는 방법

WBOY
WBOY앞으로
2023-05-26 20:48:401265검색

    연결 쿼리

    다중 테이블 연결 쿼리를 수행할 때 필드가 속한 테이블을 지정해야 쿼리 효율성을 높일 수 있습니다. 각 테이블에서 필드를 검색합니다

    • e 필드 이름: emp 테이블의 특정 필드를 나타냅니다

    • emp: 테이블의 별칭 메커니즘, as를 생략하고 다음과 같이 직접 쓸 수 있습니다. emp e

    • 연결 쿼리: 교차 테이블 쿼리라고도 하며, 이는 필수입니다. 여러 테이블을 연결하여 데이터를 함께 쿼리합니다.

    • emp 테이블과 dept 테이블을 결합하여 데이터를 쿼리하고, emp 테이블에서 직원 이름을 가져오고, dept 테이블에서 부서 이름을 가져옵니다

    참고: 연결 쿼리를 수행할 때 반드시 연결 쿼리를 수행하세요. 데카르트 곱 현상을 피하기 위해 관련 조건을 작성해야 합니다

    조인 쿼리

    문법 시대에 따른 분류

    SQL92:1992년에 등장한 문법

    • sql92의 단점: 구조가 명확하지 않고 테이블의 연결 조건, 조건이 이후 단계의 추가 필터링을 위해 모두 where

    SQL99 뒤에 배치됩니다. 1999년에 등장한 구문(키 학습)

    • sql99 장점: 테이블 연결 조건 및 쿼리 조건부 분리, 추가 필터링이 필요한 경우 연결 후 계속해서 어디에 추가하면 여러 테이블을 연결할 때 더 명확해집니다

    테이블 연결 방식에 따른 분류

    내부 조인: 등호 조인, 비등호 조인 값 조인, 셀프 조인 , 내부는 생략 가능하며 일반적으로 추가되지 않습니다

    • 테이블 A 내부 조인 연결 조건에 대한 테이블 B

    외부 조인: 왼쪽 외부 조인(왼쪽 조인), 오른쪽 외부 조인(오른쪽 조인), 외부 가능 일반적으로 추가하지 않음 add

    • 테이블 A 왼쪽 외부 조인 테이블 B 연관 조건

    • 테이블 B 오른쪽 외부 조인 테이블 A 연관 조건

    • 왼쪽 조인은 왼쪽 테이블을 기준으로 하고 테이블과 비교해야 합니다. 오른쪽에는 왼쪽 테이블과 동일한 부등식이 표시되고, 오른쪽 테이블에는 조건을 충족하는 부등식이 표시되고, 조건을 충족하지 않는 부등식은 표시되지 않습니다. (오른쪽 조인은 정반대입니다.) )

    • 왼쪽 조인으로 완료할 수 있는 기능은 오른쪽 조인으로 확실히 완료할 수 있습니다

    완전 조인, 연결된 두 테이블은 모두 메인 테이블이므로 쿼리할 수 있습니다

    데카르트 곱 현상

    쿼리를 위해 두 개의 테이블을 연결하고 연결 조건을 지정하지 않은 경우 쿼리 결과의 최종 개수는 두 개의 테이블 항목이 됩니다. 숫자의 곱, 이 현상을 데카르트 곱 현상이라고 합니다(데카르트가 발견한 수학적 현상입니다)

    데카르트 곱 현상 방지: 여러 테이블 연결 시 연결 조건을 추가하고, 이 조건에 맞는 기록 레코드는 걸러냈습니다.

    • 매칭 과정에서 일치 횟수는 줄지 않았지만, 최종 쿼리 결과의 개수는 줄어들었습니다. 연결 조건에 따라 필터링되었습니다

    • 데카르트 곱 현상을 통해 테이블 ​​연결 수가 많을수록 효율성이 떨어진다는 결론을 내릴 수 있습니다. 테이블 연결 수를 피하십시오

    등가 조인. of Inner Joins

    조건이 동일하므로 동등 조인(동일 조건을 조인하는 데이터)이라고 합니다

    각 직원이 위치한 부서 이름을 쿼리하여 직원 이름과 부서를 표시합니다

    emp e 및 dept d 테이블이 연결되어 있는 경우 연결 조건은 다음과 같습니다. e.deptno = d.deptno

    	--sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面
    
    	select 
    		e.ename,d.dname
    	from
    		emp e, dept d
    	where
    		e.deptno = d.deptno;
    		
    	--sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where		
    	select 
    		e.ename,d.dname
    	from
    		emp e
    	--inner可以省略(带着inner可读性更好)
    	(inner) join
    		dept d
    	on
    		e.deptno = d.deptno;

    Inner Join self-join

    테이블 연결이 하나뿐이므로 구체적인 쿼리 방법은 하나의 테이블을 두 테이블로 처리하여 스스로 연결하는 것입니다. 이므로 self-join이 됩니다

    직원의 상위 리더를 조회하려면 직원 이름과 해당 리더 이름을 표시해야 합니다

    하나의 테이블은 두 개의 Zhang 테이블로 취급되며, emp e는 직원 테이블을 나타내고, emp m은 리더 테이블도 나타냅니다

    연결 조건: e.mgr = m.empno 직원의 리더 번호 = 리더의 직원 번호

    --SQL92
    select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;
    
    --SQL99
    select 
    	a.ename as '员工名', b.ename as '领导名'
    from
    	emp e
    join
    	emp m
    on
    	e.mgr = m.empno;

    내부 조인의 비동등 조인

    연결 조건은 등가 관계가 아니기 때문에 비등가접속이라고 합니다

    연봉이 2000보다 큰 사원 정보를 표시하고, 그것이 속한 부서명을 표시합니다

    --采用 SQL92 语法
    select 
    	e.ename, e.sal, d.dname 
    from 
    	emp e, dept d 
    where 
    	e.deptno=d.deptno and e.sal > 2000;
    	
    --采用 SQL99 语法
    select 
    	e.ename, e.sal, d.dname 
    from 
    	emp e 
    (inner) join 
    	dept d 
    on 
    	e.deptno=d.deptno 
    where 
    	e.sal>2000;

    각 사원의 급여 등급을 알아내어 사원 이름을 표시하도록 요구합니다. , 급여, 급여 등급

    select 
    	e.ename, e.sal, s.grade
    from
    	emp e
    (inner) join
    	salgrade s
    on
    	e.sal between s.losal and s.hisal;

    외부 조인

    외부 조인: 외부 조인에서는 두 테이블을 연결하여 1차 및 2차 관계를 생성하며, 주 쿼리는 기본 테이블의 데이터이고 보조 테이블은 쿼리됩니다. 즉, 상대방이 내 메인 테이블과 일치하는 레코드가 없으면 기본 상대는 null이고 외부 키워드는 생략할 수 있습니다.

    • 오른쪽 외부 조인: 오른쪽이 있는 것이 오른쪽입니다. 외부 조인, 즉 조인 키워드 오른쪽에 있는 테이블이 기본 테이블로 간주되어 주로 이 테이블의 모든 데이터를 쿼리하고 연관

    • 왼쪽 외부 조인을 사용하여 왼쪽에 있는 테이블을 쿼리합니다. with left t는 왼쪽 외부 조인으로, 조인 키워드의 왼쪽에 있는 테이블을 본다는 의미입니다. 메인 테이블은 이 테이블의 모든 데이터를 쿼리하고 연관을 사용하여 오른쪽에 있는 테이블을 쿼리하는 것입니다

    * *참고: 오른쪽 조인에는 왼쪽 조인이 있고 왼쪽 조인에는 오른쪽 조인이 있습니다. 연결 작성 방법**

    查询每个员工的上级领导,要求显示所有员工的名字和领导名 , 如果某个员工没有领导 , 那么该员工也必须显示出来

    --左连接
    select 
    	a.ename as '员工名', b.ename as '领导名'
    from
    	emp a
    left (outer) join
    	emp b
    on
    	a.mgr = b.empno; 
    
    --右连接
    select 
    	a.ename as '员工名', b.ename as '领导名'
    from
    	emp b
    right (outer) join
    	emp a
    on
    	a.mgr = b.empno;

    内连接和外连接的特点

    内连接:A表和B表连接,A和B两张表没有主次关系是平等的 , 查询时只是将能够匹配上连接条件的数据查询出来 , 即如果没有匹配的就查询不出来 , inner关键字可以省略

    外连接: 在外连接当中,两张表连接产生了主次关系 , 主要查询的是主表的数据 , 捎带着关联查询次表 , 即如果对方没有记录和我主表匹配 , 那么默认对方是null , outer关键字可以省略

    注意: 区分内外连接的办法是通过 right 和 left 关键字 , 不是通过 inner 和 outer 因为它们都可以省略 , 并且外连接的查询结果条数一定是大于等于内连接的查询结果条数

    显示员工信息,并显示所属的部门名称

    select 
    	e.ename,d.dname
    from
    	emp e
    join
    	dept d
    on
    	e.deptno = d.deptno;

    MySql에서 연결 쿼리 문제를 해결하는 방법

    显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来

    --外连接(右外连接)
    select 
    	e.ename,d.dname
    from
    	emp e 
    --outer是可以省略的,带着可读性强
    --right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表
    right (outer) join 
    	dept d
    on
    	e.deptno = d.deptno;
    
    
    --外连接(左外连接)
    select 
    	e.ename,d.dname
    from
    	dept d 
    --outer是可以省略的,带着可读性强
    left (outer) join 
    	emp e
    on
    	e.deptno = d.deptno;

    MySql에서 연결 쿼리 문제를 해결하는 방법

    多表连接

    一条SQL中内连接和外连接可以混合 , 都可以出现

    --表示一: a 和 b 进行内连接 , a 和 c 进行内连接 , a 和 d 进行右外连接(推荐)
    
    --表示二: a 和 b 的内连接结果去内连接 c 的结果再去右外连接 d
    select 
    	...
    from
    	a
    join
    	b
    on
    	a和b的连接条件
    join
    	c
    on
    	a和c的连接条件
    right join
    	d
    on
    	a和d的连接条件

    找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级

    	select 
    		e.ename,e.sal,d.dname,s.grade
    	from
    		emp e
    	join
    		dept d
    	on 
    		e.deptno = d.deptno
    	join
    		salgrade s
    	on
    		e.sal between s.losal and s.hisal;

    查询结果

    	+--------+---------+------------+-------+
    	| ename  | sal     | dname      | grade |
    	+--------+---------+------------+-------+
    	| SMITH  |  800.00 | RESEARCH   |     1 |
    	| ALLEN  | 1600.00 | SALES      |     3 |
    	| WARD   | 1250.00 | SALES      |     2 |
    	| JONES  | 2975.00 | RESEARCH   |     4 |
    	| MARTIN | 1250.00 | SALES      |     2 |
    	| BLAKE  | 2850.00 | SALES      |     4 |
    	| CLARK  | 2450.00 | ACCOUNTING |     4 |
    	| SCOTT  | 3000.00 | RESEARCH   |     4 |
    	| KING   | 5000.00 | ACCOUNTING |     5 |
    	| TURNER | 1500.00 | SALES      |     3 |
    	| ADAMS  | 1100.00 | RESEARCH   |     1 |
    	| JAMES  |  950.00 | SALES      |     1 |
    	| FORD   | 3000.00 | RESEARCH   |     4 |
    	| MILLER | 1300.00 | ACCOUNTING |     2 |
    	+--------+---------+------------+-------+

    找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级

    	select 
    		e.ename,e.sal,d.dname,s.grade,l.ename
    	from
    		emp e
    	join
    		dept d
    	on 
    		e.deptno = d.deptno
    	join
    		salgrade s
    	on
    		e.sal between s.losal and s.hisal
    	left join
    		emp l
    	on
    		e.mgr = l.empno;

    查询结果

    	+--------+---------+------------+-------+-------+
    	| ename  | sal     | dname      | grade | ename |
    	+--------+---------+------------+-------+-------+
    	| SMITH  |  800.00 | RESEARCH   |     1 | FORD  |
    	| ALLEN  | 1600.00 | SALES      |     3 | BLAKE |
    	| WARD   | 1250.00 | SALES      |     2 | BLAKE |
    	| JONES  | 2975.00 | RESEARCH   |     4 | KING  |
    	| MARTIN | 1250.00 | SALES      |     2 | BLAKE |
    	| BLAKE  | 2850.00 | SALES      |     4 | KING  |
    	| CLARK  | 2450.00 | ACCOUNTING |     4 | KING  |
    	| SCOTT  | 3000.00 | RESEARCH   |     4 | JONES |
    	| KING   | 5000.00 | ACCOUNTING |     5 | NULL  |
    	| TURNER | 1500.00 | SALES      |     3 | BLAKE |
    	| ADAMS  | 1100.00 | RESEARCH   |     1 | SCOTT |
    	| JAMES  |  950.00 | SALES      |     1 | BLAKE |
    	| FORD   | 3000.00 | RESEARCH   |     4 | JONES |
    	| MILLER | 1300.00 | ACCOUNTING |     2 | CLARK |
    	+--------+---------+------------+-------+-------+

    위 내용은 MySql에서 연결 쿼리 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제