MySQL 연구 노트 ------ 연결 쿼리

//------------연결 쿼리 요약----------//

1. 의미

  여러 테이블의 필드가 쿼리에 포함되는 경우 다중 테이블 조인이 필요합니다.

SELECT 字段1,字段2
FROM 表1,表2,...;

  데카르트 곱: 여러 테이블을 쿼리할 때 유효한 연결 조건이 추가되지 않아 여러 테이블의 모든 행이 완전히 연결됩니다.

  해결 방법: 유효한 조인 조건을 추가하세요.

2. 분류

   연령별로 분류:

   sql92:
        동등
        비동등
        자체 조인

        일부 외부 조인도 지원합니다(oracle, sqlserver의 경우 mysql은 지원하지 않음).

   sql99 [권장 사용]
        내부 조인
            동등
            비동등
            자체 조인
        외부 조인
            왼쪽 외부
            오른쪽 외부
            모든 외부 (mysql에서는 지원되지 않음)
        교차 조인

세 번째, SQL92 구문

1. 등가접속

(1) 문법

SELECT 查询列表
FROM 表1 别名,表2 别名
WHERE 表1.key=表2.key
【AND 筛选条件】
【GROUP BY 分组字段】
【HAVING 分组后的筛选】
【ORDER BY 排序字段】

(2) 특징

        ① 일반적으로 테이블에 별칭을 부여함
        ② 여러 테이블의 순서를 바꿀 수 있음
        ③ n 개의 테이블을 연결하려면 최소한 n-1 개의 연결 조건이 필요함
        ④ 등가 연결의 결과는 여러 테이블의 교차가 됨 ;

(3) 사례

사례 1: 여신 이름과 해당 남성 신 이름을 쿼리합니다.

SELECT NAME,boyName

FROM boys,beauty

WHERE beauty.boyfriend_id = boys.id;

사례 2: 사원명 및 해당 부서명 조회

SELECT last_name,department_name

FROM employees,departments

WHERE employees.department_id=departments.department_id;

사례 3: 사원명, 직무번호, 직무명 조회

#起别名的好处
/*
①提高语句的简洁度
②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
*/

#方式一
SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`;

#方式二
SELECT e.last_name,e.job_id,j.job_title
FROM jobs j,employees e
WHERE e.`job_id`=j.`job_id`;

사례 4: 보너스 --- 플러스 필터를 사용하여 직원 이름 및 부서 이름 쿼리

SELECT last_name,department_name,commission_pct
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;

사례 5: 도시 이름의 두 번째 문자가 o인 부서 이름과 도시 이름을 쿼리합니다. ------ 플러스 필터

SELECT department_name,city
FROM departments d,locations l
WHERE d.`location_id` = l.`location_id`
AND city LIKE '_o%';

사례 6: 각 도시의 부서 수 쿼리--- 그룹화 추가

SELECT COUNT(*) 个数,city

FROM departments d,locations l

WHERE d.`location_id`=l.`location_id`

GROUP BY city;

사례 7: 부서별 상여금 및 최저 급여------ 와 그룹화를 포함 하여 각 부서의 부서명 및 부서장 번호를 쿼리합니다.

SELECT department_name,d.`manager_id`,MIN(salary)

FROM departments d,employees e

WHERE d.`department_id`=e.`department_id`

AND commission_pct IS NOT NULL

GROUP BY department_name,d.`manager_id`;

사례 8: 직종별 명칭과 직원 수를 조회하고, 직원 수 내림차순으로 정렬 ------ + 정렬

SELECT job_title,COUNT(*)

FROM employees e,jobs j

WHERE e.`job_id`=j.`job_id`

GROUP BY job_title

ORDER BY COUNT(*) DESC;

 사례 9: 직원 이름, 부서 이름, 도시 쿼리 --- 세 개의 테이블 연결

SELECT last_name,department_name,city

FROM employees e,departments d,locations l

WHERE e.`department_id`=d.`department_id`

AND d.`location_id`=l.`location_id`

AND city LIKE 's%'

ORDER BY department_name DESC;

2. 비동등 접속

(1) 문법

SELECT 查询列表
FROM 表1 别名,表2 别名
WHERE 非等值的连接条件
【AND 筛选条件】
【GROUP BY 分组字段】
【HAVING 分组后的筛选】
【ORDER BY 排序字段】

(2) 사례 

사례 1: 직원의 급여 및 급여 수준 쿼리

SELECT salary,grade_level

FROM employees e,job_grades g

WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`

AND g.`grade_level`='A';

3. 자체 연결

(1) 문법

SELECT 查询列表
FROM 表 别名1,表 别名2
WHERE 等值的连接条件
【AND 筛选条件】
【GROUP BY 分组字段】
【HAVING 分组后的筛选】
【ORDER BY 排序字段】

(2) 사례 

사례 1: 직원의 이름과 상사의 이름을 쿼리합니다.

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name

FROM employees e,employees m

WHERE e.`manager_id`=m.`employee_id`;

4, SQL99 구문

1. 내부 연결

(1) 문법

SELECT 查询列表
FROM 表1 别名
【INNER】 JOIN 表2 别名 ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后的筛选
ORDER BY 排序列表
LIMIT 子句;

(2) 특징

        ① 테이블의 순서는 바뀔 수 있다.
        ② 내부 조인의 결과 = 여러 테이블의 교차점
        ③ n-테이블 연결에는 최소한 n-1개의 연결 조건이 필요하다

(3) 분류

        Equijoin
        비동등
        조인 셀프 조인

(4) 케이스

        1) 등가접속

사례 1: 사원명, 부서명 조회

SELECT last_name,department_name

FROM departments d

JOIN  employees e

ON e.`department_id` = d.`department_id`;

사례 2: 이름에 e가 포함된 사원 이름 및 직종 이름을 쿼리합니다(필터 추가).

SELECT last_name,job_title

FROM employees e

INNER JOIN jobs j

ON e.`job_id`=  j.`job_id`

WHERE e.`last_name` LIKE '%e%';

사례 3: 부서 수가 3보다 큰 도시명과 부서 수를 쿼리합니다(그룹 추가 + 필터).

#①查询每个城市的部门个数

#②在①结果上筛选满足条件的

SELECT city,COUNT(*) 部门个数

FROM departments d

INNER JOIN locations l

ON d.`location_id`=l.`location_id`

GROUP BY city

HAVING COUNT(*)>3;

사례 4: 사원수가 3개보다 많은 부서명과 사원수가 어느 부서인지 조회하고 내림차순으로 정렬(정렬 추가)

#①查询每个部门的员工个数

SELECT COUNT(*),department_name

FROM employees e

JOIN departments d

ON e.`department_id`=d.`department_id`

GROUP BY department_name


#②在①结果上筛选员工个数>3的记录,并排序

SELECT COUNT(*) 个数,department_name

FROM employees e

INNER JOIN departments d

ON e.`department_id`=d.`department_id`

GROUP BY department_name

HAVING COUNT(*)>3

ORDER BY COUNT(*) DESC;

 사례 5: 사원명, 부서명, 직위명, 부서명 내림차순 조회(테이블 연결 3개 추가)

SELECT last_name,department_name,job_title

FROM employees e

INNER JOIN departments d ON e.`department_id`=d.`department_id`

INNER JOIN jobs j ON e.`job_id` = j.`job_id`

ORDER BY department_name DESC;

        2) 비동등 접속

사례 1: 직원의 급여 수준 쿼리

SELECT salary,grade_level

FROM employees e

JOIN job_grades g

ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

사례 2: 급여 수준 > 20을 쿼리하고 급여 수준을 기준으로 내림차순으로 정렬

SELECT COUNT(*),grade_level

FROM employees e

JOIN job_grades g

ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`

GROUP BY grade_level

HAVING COUNT(*)>20

ORDER BY grade_level DESC;

         3) 셀프 조인

사례 1: 직원의 이름과 상사의 이름을 쿼리합니다.

 SELECT e.last_name,m.last_name

 FROM employees e

 JOIN employees m

 ON e.`manager_id`= m.`employee_id`;

사례 2: 이름에 상사의 이름인 k 문자가 포함된 직원의 이름을 쿼리합니다.

SELECT e.last_name,m.last_name

FROM employees e

JOIN employees m

ON e.`manager_id`= m.`employee_id`

WHERE e.`last_name` LIKE '%k%';

2. 외부 연결

(1) 문법

SELECT 查询列表
FROM 表1 别名
LEFT|RIGHT|FULL【OUTER】 JOIN 表2 别名 ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后的筛选
ORDER BY 排序列表
LIMIT 子句;

(2) 특징

        ①쿼리 결과 = 메인 테이블의 모든 행, 슬레이브 테이블이 일치하면 일치하는 행을 표시하고, 슬레이브 테이블에서 일치하지 않으면 NULL을 표시합니다.

        ②LEFT JOIN의 왼쪽이 메인 테이블, RIGHT JOIN의 오른쪽이 메인 테이블, FULL JOIN의
            양쪽이 메인 테이블, FULL JOIN의 양쪽이 메인 테이블입니다.

        ③ 일반적으로 교차 부분을 제외하고 일치하지 않는 나머지 행을 쿼리하는 데 사용됩니다.

(3) 사례

사례 1: 직원이 없는 부서 쿼리

 #左外

 SELECT d.*,e.employee_id

 FROM departments d

 LEFT OUTER JOIN employees e

 ON d.`department_id` = e.`department_id`

 WHERE e.`employee_id` IS NULL;



 #右外

 SELECT d.*,e.employee_id

 FROM employees e

 RIGHT OUTER JOIN departments d

 ON d.`department_id` = e.`department_id`

 WHERE e.`employee_id` IS NULL;

3. 교차 연결

(1) 문법

SELECT 查询列表
FROM 表1 别名
CROSS JOIN 表2 别名;

(1) 특징

        데카르트 곱과 유사합니다.
 
 
 
 
 
 
 

추천

출처blog.csdn.net/weixin_47156401/article/details/131927925