//------------연결 쿼리 요약----------//
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) 특징
데카르트 곱과 유사합니다.