UNION / JOIN
-- SET OPERATOR --
-- 두 개 이상의 select 한 결과를 합치거나 하는
-- 집합 형태의 결과물로 조회하는 명령어
-- 합집합 --
-- UNION
-- 두 개 이상의 SELECT한 결과 (result set)를 구하는 명령어
-- 만약 중복이 있을 경우 중복되는 결과는 1 번만 보여준다.
-- UNION ALL
-- 두 개 이상의select 한 결과 (result set) 를 구하는 명령어 .
-- 만약 중복이 있을 경우 중복되는내용도 그대로 조회한다.
-- UNION --
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY
FROM EMPLOYEE e
WHERE DEPT_CODE = 'D5'
UNION
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY
FROM EMPLOYEE e
WHERE SALARY > 3000000;
-- 컬럼의 갯수가 서로 같아야 함.
-> 출력문
EMP_ID|EMP_NAME|DEPT_CODE|SALARY |
------+--------+---------+-------+
206 |박나라 |D5 |1800000|
207 |하이유 |D5 |2200000|
208 |김해술 |D5 |2500000|
209 |심봉선 |D5 |3500000|
210 |윤은해 |D5 |2000000|
215 |대북혼 |D5 |3760000|
200 |선동일 |D9 |8000000|
201 |송종기 |D9 |6000000|
202 |노옹철 |D9 |3700000|
204 |유재식 |D6 |3400000|
205 |정중하 |D6 |3900000|
217 |전지연 |D1 |3660000|
-- union all
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY
FROM EMPLOYEE e
WHERE DEPT_CODE = 'D5'
UNION all
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY
FROM EMPLOYEE e
WHERE SALARY > 3000000;
->
EMP_ID|EMP_NAME|DEPT_CODE|SALARY |
------+--------+---------+-------+
206 |박나라 |D5 |1800000|
207 |하이유 |D5 |2200000|
208 |김해술 |D5 |2500000|
209 |심봉선 |D5 |3500000|
210 |윤은해 |D5 |2000000|
215 |대북혼 |D5 |3760000|
200 |선동일 |D9 |8000000|
201 |송종기 |D9 |6000000|
202 |노옹철 |D9 |3700000|
204 |유재식 |D6 |3400000|
205 |정중하 |D6 |3900000|
209 |심봉선 |D5 |3500000|
215 |대북혼 |D5 |3760000|
217 |전지연 |D1 |3660000|
-- join --
-- 두 개 이상의 테이블을 하나로 합쳐 사용하는 명령 구문
-- 만약에 'j6' 라는 직급을 가진사원들의 정보와 근무 부서명이 궁금하다 .
select EMP_ID ,JOB_CODE ,DEPT_CODE
from EMPLOYEE e
WHERE JOB_CODE = 'j6' ;
SELECT DEPT_ID , DEPT_TITLE
from DEPARTMENT
WHERE DEPT_ID in ('d1' , 'd8') ;
-- join 활용
-- 두 개의 테이블 (EMPLOYEE , DEPARTMENT) 에서 공통 컬럼
SELECT EMP_ID, EMP_NAME, DEPT_CODE,DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
-- 두 개의 테이블에서 공통 컬럼의 이름이 같은 경우
select EMP_ID , EMP_NAME , JOB_CODE , JOB_name
FROM EMPLOYEE
join JOB using(JOB_code);
select EMP_ID , EMP_NAME , JOB.JOB_CODE , JOB_NAME
FROM EMPLOYEE
join job on(EMPLOYEE.JOB_CODE = JOB.JOB_CODE);
-- 실습 --
-- employee 테이블의 직원 급여 정보와
-- sal_ grade 의 급여 등급을 합쳐서
-- 사번 , 사원명 , 급여동급 , 등급기준 최소급여 , 최대급여를 조회
SELECT * from SAL_GRADE;
SELECT * from EMPLOYEE ;
-- 공통은 sal_level
select emp_id , emp_name , SAL_LEVEL , min_sal , max_sal
from EMPLOYEE
join SAL_GRADE using(SAL_level);
-> 출력값
emp_id|emp_name|SAL_LEVEL|min_sal|max_sal |
------+--------+---------+-------+--------+
200 |선동일 |S1 |6000000|10000000|
201 |송종기 |S1 |6000000|10000000|
202 |노옹철 |S4 |3000000| 3999999|
203 |송은희 |S5 |2000000| 2999999|
204 |유재식 |S4 |3000000| 3999999|
205 |정중앙 |S4 |3000000| 3999999|
206 |박나라 |S6 |1000000| 1999999|
207 |하이유 |S5 |2000000| 2999999|
208 |김해술 |S5 |2000000| 2999999|
209 |심봉선 |S4 |3000000| 3999999|
210 |윤은해 |S5 |2000000| 2999999|
211 |전형돈 |S5 |2000000| 2999999|
212 |장쯔위 |S5 |2000000| 2999999|
213 |하동운 |S5 |2000000| 2999999|
214 |방명수 |S6 |1000000| 1999999|
215 |대북혼 |S4 |3000000| 3999999|
216 |차태연 |S5 |2000000| 2999999|
217 |전지연 |S4 |3000000| 3999999|
218 |이오리 |S5 |2000000| 2999999|
219 |임시환 |S6 |1000000| 1999999|
220 |이중석 |S5 |2000000| 2999999|
221 |유하진 |S5 |2000000| 2999999|
222 |이태림 |S5 |2000000| 2999999|
500 |박영석 |S4 |3000000| 3999999|
600 |박잉석 |S3 |4000000| 4999999|
-- 실습 2. --
-- department 테이블의 위치 정보와
-- location 테이블을 조인하여
-- 각 부서별 근무지 위치를 조회
-- 부서코드 , 부서명 , 근무지 코드 , 근무지 위치
SELECT * from DEPARTMENT d;
select * from LOCATION l ;
SELECT dept_id,dept_title , LOCAL_CODE , LOCAL_NAME
from DEPARTMENT
join LOCATION on(LOCAL_CODE=LOCAL_CODE);
-> 출력값
dept_id|dept_title|LOCAL_CODE|LOCAL_NAME|
-------+----------+----------+----------+
D1 |인사관리부 |L5 |EU |
D1 |인사관리부 |L4 |AMERICA |
D1 |인사관리부 |L3 |ASIA3 |
D1 |인사관리부 |L2 |ASIA2 |
D1 |인사관리부 |L1 |ASIA1 |
D2 |회계관리부 |L5 |EU |
D2 |회계관리부 |L4 |AMERICA |
D2 |회계관리부 |L3 |ASIA3 |
D2 |회계관리부 |L2 |ASIA2 |
D2 |회계관리부 |L1 |ASIA1 |
D3 |마케팅부 |L5 |EU |
D3 |마케팅부 |L4 |AMERICA |
D3 |마케팅부 |L3 |ASIA3 |
D3 |마케팅부 |L2 |ASIA2 |
D3 |마케팅부 |L1 |ASIA1 |
D4 |국내영업부 |L5 |EU |
D4 |국내영업부 |L4 |AMERICA |
D4 |국내영업부 |L3 |ASIA3 |
D4 |국내영업부 |L2 |ASIA2 |
D4 |국내영업부 |L1 |ASIA1 |
D5 |해외영업1부 |L5 |EU |
D5 |해외영업1부 |L4 |AMERICA |
D5 |해외영업1부 |L3 |ASIA3 |
D5 |해외영업1부 |L2 |ASIA2 |
D5 |해외영업1부 |L1 |ASIA1 |
D6 |해외영업2부 |L5 |EU |
D6 |해외영업2부 |L4 |AMERICA |
D6 |해외영업2부 |L3 |ASIA3 |
D6 |해외영업2부 |L2 |ASIA2 |
D6 |해외영업2부 |L1 |ASIA1 |
D7 |해외영업3부 |L5 |EU |
D7 |해외영업3부 |L4 |AMERICA |
D7 |해외영업3부 |L3 |ASIA3 |
D7 |해외영업3부 |L2 |ASIA2 |
D7 |해외영업3부 |L1 |ASIA1 |
D8 |기술지원부 |L5 |EU |
D8 |기술지원부 |L4 |AMERICA |
D8 |기술지원부 |L3 |ASIA3 |
D8 |기술지원부 |L2 |ASIA2 |
D8 |기술지원부 |L1 |ASIA1 |
D9 |총무부 |L5 |EU |
D9 |총무부 |L4 |AMERICA |
D9 |총무부 |L3 |ASIA3 |
D9 |총무부 |L2 |ASIA2 |
D9 |총무부 |L1 |ASIA1 |
INNER JOIN / LEFT JOIN / RIGHT JOIN / 다중 JOIN
-- INNER JOIN / LEFT JOIN / RIGHT JOIN
-- INNER : ON 과 함께 사용 . 조건에 만족하는 데이터만 선택
-- LEFT : 첫번째 테이블을 기준으로 두번째 테이블을 조합
-- 조건에 맞지않는 경우에는 첫번째 테이블의 필드값은 그대로 유지 . 두번째 테이블은 모두 null 로 표시
-- RIGHT : LEFT JOIN 의 반대 .
select DISTINCT dept_code , dept_title
from EMPLOYEE e
inner join DEPARTMENT on(DEPT_CODE = dept_id);
SELECT DISTINCT dept_code,dept_title
from EMPLOYEE , DEPARTMENT
WHERE DEPT_CODE = dept_id ;
->출력값
dept_code|dept_title|
---------+----------+
D9 |총무부 |
D6 |해외영업2부 |
D5 |해외영업1부 |
D8 |기술지원부 |
D1 |인사관리부 |
D2 |회계관리부 |
-- LEFT JOIN --
SELECT DEPT_CODE , EMP_NAME , DEPT_TITLE
FROM EMPLOYEE e
LEFT JOIN DEPARTMENT ON(DEPT_CODE=DEPT_ID);
->
DEPT_CODE|EMP_NAME|DEPT_TITLE|
---------+--------+----------+
D9 |선동일 |총무부 |
D9 |송종기 |총무부 |
D9 |노옹철 |총무부 |
D6 |송은희 |해외영업2부 |
D6 |유재식 |해외영업2부 |
D6 |정중앙 |해외영업2부 |
D5 |박나라 |해외영업1부 |
D5 |하이유 |해외영업1부 |
D5 |김해술 |해외영업1부 |
D5 |심봉선 |해외영업1부 |
D5 |윤은해 |해외영업1부 |
D8 |전형돈 |기술지원부 |
D8 |장쯔위 |기술지원부 |
|하동운 | |
D1 |방명수 |인사관리부 |
D5 |대북혼 |해외영업1부 |
D1 |차태연 |인사관리부 |
D1 |전지연 |인사관리부 |
|이오리 | |
D2 |임시환 |회계관리부 |
D2 |이중석 |회계관리부 |
D2 |유하진 |회계관리부 |
D8 |이태림 |기술지원부 |
D1 |박영석 |인사관리부 |
D1 |박잉석 |인사관리부 |
-- RIGHT JOIN --
select dept_code , dept_ID
from EMPLOYEE e
RIGHT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
-- INNER / OUTER(REFT,RIGHT)
-- ON() 안에 컬럼 뿐만 아니라 계산식 , 함수식, and , or 등의 표현식 사용가능
select emp_name , dept_code , salary , E.SAL_LEVEL
from EMPLOYEE E
join SAL_GRADE S on(SALARY between MIN_SAL and MAX_SAL);
-- self join --
-- 자기 자신을 조인 , 한 테이블의 정보 중 값 비교가 필요한 정보들을 계산 조회하는 방식
-- 직원의 정보와 직원을 관리하는 매니저의 정보를 조회
SELECT *FROM EMPLOYEE ;
SELECT e.emp_id "사번" ,
e.emp_name "사원명",
e.manager_id "관리자 사번",
m.emp_name "관리자명"
from EMPLOYEE e
join EMPLOYEE m on(e.MANAGER_ID = m.EMP_ID);
-- 매니저 아이디가 null 인사람은 사라졌음
->
사번 |사원명|관리자 사번|관리자명|
---+---+------+----+
201|송종기|200 |선동일 |
202|노옹철|201 |송종기 |
203|송은희|204 |유재식 |
204|유재식|200 |선동일 |
205|정중앙|204 |유재식 |
206|박나라|207 |하이유 |
207|하이유|200 |선동일 |
208|김해술|207 |하이유 |
209|심봉선|207 |하이유 |
210|윤은해|207 |하이유 |
211|전형돈|200 |선동일 |
212|장쯔위|211 |전형돈 |
214|방명수|200 |선동일 |
216|차태연|214 |방명수 |
217|전지연|214 |방명수 |
500|박영석|200 |선동일 |
600|박잉석|200 |선동일 |
-- 다중 join --
-- 여러 개의 테이블을 join 하는 것
-- 일반 조인과 선언방식은 같으나 , 앞서 조인한 결과를 기준으로
-- 나중에 조인하는 테이블을 연결 짓는다 .
-- 조인 순서에 주의.
select emp_name , dept_title , local_name
from EMPLOYEE e
join DEPARTMENT d on(DEPT_CODE=dept_id)
join LOCATION on(location_id = LOCAL_CODE);
-- DEPARTMENT 를 조인시키니 로케이션이 함께 조회되어서 로케이션도 조인 가능함
-- 실습 3
-- 한국 (ko) , 일본( jp) 에 근무하는 직원들의 정보
-- 사원명 , 부서명 , 지역명 ,국가명
-- employee , department , location , national
SELECT * from DEPARTMENT d ;
SELECT * from LOCATION l ;
SELECT * from NATIONAL ;
select EMP_NAME 사원명, dept_title 부서명, local_name 지역명, national_name 국가명
from EMPLOYEE e
join DEPARTMENT on (DEPT_CODE=dept_id)
join LOCATION l on (LOCAL_CODE = location_id)
join NATIONAL n on (l.NATIONAL_CODE = n.NATIONAL_CODE)
where national_name in('한국' , '일본');
->
사원명|부서명 |지역명 |국가명
---+------+-----+---+
선동일|총무부 |ASIA1|한국 |
송종기|총무부 |ASIA1|한국 |
노옹철|총무부 |ASIA1|한국 |
박나라|해외영업1부|ASIA2|일본 |
하이유|해외영업1부|ASIA2|일본 |
김해술|해외영업1부|ASIA2|일본 |
심봉선|해외영업1부|ASIA2|일본 |
윤은해|해외영업1부|ASIA2|일본 |
방명수|인사관리부 |ASIA1|한국 |
대북혼|해외영업1부|ASIA2|일본 |
차태연|인사관리부 |ASIA1|한국 |
전지연|인사관리부 |ASIA1|한국 |
임시환|회계관리부 |ASIA1|한국 |
이중석|회계관리부 |ASIA1|한국 |
유하진|회계관리부 |ASIA1|한국 |
박영석|인사관리부 |ASIA1|한국 |
박잉석|인사관리부 |ASIA1|한국 |
서브쿼리 / 랭크함수
-- sub query --
-- 주가 되는 메인쿼리안에서
-- 조건이나 검색을 위한 또 하나의 쿼리를 추가하는 기법
-- 단일 행 서브쿼리 : 결과 값이 1개 나오는 서브쿼리
-- ex) 최소 급여를 받는 사원의 정보 조회
SELECT min(salary)
from EMPLOYEE e;
SELECT *
from EMPLOYEE e
where SALARY = (select min(salary)from EMPLOYEE);
->
EMP_ID|EMP_NAME|EMP_NO |EMAIL |PHONE |DEPT_CODE|JOB_CODE|SAL_LEVEL|SALARY |BONUS|MANAGER_ID|HIRE_DATE |ENT_DATE|ENT_YN|
------+--------+--------------+--------------+-----------+---------+--------+---------+-------+-----+----------+----------+--------+------+
214 |방명수 |860705-1313513|bang_ms@ or.kr|01074127545|D1 |J7 |S6 |1380000| |200 |2010-04-04| |N
-- 다중 행 서브쿼리
-- 결과 값이 여러줄 나오는 서브쿼리
SELECT min(salary)
from EMPLOYEE e
group by JOB_CODE ;
SELECT *
from EMPLOYEE
where SALARY in (select min(SALARY)from EMPLOYEE e group by JOB_CODE );
->
EMP_ID|EMP_NAME|EMP_NO |EMAIL |PHONE |DEPT_CODE|JOB_CODE|SAL_LEVEL|SALARY |BONUS|MANAGER_ID|HIRE_DATE |ENT_DATE|ENT_YN|
------+--------+--------------+--------------+-----------+---------+--------+---------+-------+-----+----------+----------+--------+------+
200 |선동일 |621230-1985634|sun_di@ or.kr |01099546325|D9 |J1 |S1 |8000000| 0.3| |1990-02-06| |N |
202 |노옹철 |861015-1356452|no_hc@ or.kr |01066656263|D9 |J2 |S4 |3700000| |201 |2001-01-01| |N |
204 |유재식 |660508-1342154|yoo_js@ or.kr |01099999129|D6 |J3 |S4 |3400000| 0.2|200 |2000-12-29| |N |
207 |하이유 |690402-2040612|ha_iy@ or.kr |01036654488|D5 |J5 |S5 |2200000| 0.1|200 |1994-07-07| |N |
210 |윤은해 |650505-2356985|youn_eh@ or.kr|0179964233 |D5 |J7 |S5 |2000000| |207 |2001-02-03| |N |
211 |전형돈 |830807-1121321|jun_hd@ or.kr |01044432222|D8 |J6 |S5 |2000000| |200 |2012-12-12| |N |
214 |방명수 |860705-1313513|bang_ms@ or.kr|01074127545|D1 |J7 |S6 |1380000| |200 |2010-04-04| |N |
219 |임시환 |660712-1212123|im_sw@ or.kr | |D2 |J4 |S6 |1550000| | |1999-09-09| |N |
-- 다중 행 다중 열 서브쿼리
SELECT job_code , min(salary)
from EMPLOYEE e
group by JOB_CODE ;
SELECT *
from EMPLOYEE
where (job_code,SALARY) in (select job_code,min(salary)
from EMPLOYEE
group by JOB_CODE);
-- 서브 쿼리의 사용 위치
-- select , from , where , group by , habing , order by , join
-- dml : insert, update , delete
-- ddl : vreate table , create view ...
-- inline view(인라인 뷰)
-- from 위치에 사용되는 서브쿼리
-- 테이블을 테이블명으로 직접 조회를 하는 대신
-- 서브쿼리의 결과 ( result set )을 활용하여 데이터 조회
-- 기존의 테이블을 대처한다
select EMP_ID ,EMP_NAME , DEPT_TITLE , JOB_NAME
from EMPLOYEE
join DEPARTMENT on (DEPT_CODE = DEPT_ID)
join JOB on(EMPLOYEE.JOB_CODE = JOB.JOB_CODE);
select *
FROM(SELECT EMP_ID ,EMP_NAME , DEPT_TITLE , JOB_NAME
from EMPLOYEE
join DEPARTMENT on (DEPT_CODE = DEPT_ID)
join JOB on(EMPLOYEE.JOB_CODE = JOB.JOB_CODE)) A;
->
EMP_ID|EMP_NAME|DEPT_TITLE|JOB_NAME|
------+--------+----------+--------+
200 |선동일 |총무부 |대표 |
201 |송종기 |총무부 |부사장 |
202 |노옹철 |총무부 |부사장 |
203 |송은희 |해외영업2부 |차장 |
204 |유재식 |해외영업2부 |부장 |
205 |정중앙 |해외영업2부 |부장 |
206 |박나라 |해외영업1부 |사원 |
207 |하이유 |해외영업1부 |과장 |
208 |김해술 |해외영업1부 |과장 |
209 |심봉선 |해외영업1부 |부장 |
210 |윤은해 |해외영업1부 |사원 |
211 |전형돈 |기술지원부 |대리 |
212 |장쯔위 |기술지원부 |대리 |
214 |방명수 |인사관리부 |사원 |
215 |대북혼 |해외영업1부 |과장 |
216 |차태연 |인사관리부 |대리 |
217 |전지연 |인사관리부 |대리 |
219 |임시환 |회계관리부 |차장 |
220 |이중석 |회계관리부 |차장 |
221 |유하진 |회계관리부 |차장 |
222 |이태림 |기술지원부 |대리 |
500 |박영석 |인사관리부 |사원 |
600 |박잉석 |인사관리부 |사원 |
-- RANK() 함수 / DENSE_RANK() 함수
-- RANK() : 동일한 순번이 있을 경우 이후 순번은 이전과 동일한 순번의
-- 개수 만큼 건너뛰고 번호를 매기는 함수
-- 1
-- 2
-- 2
-- 4
-- 월급 순위 상위 3명만 조회
-- SELECT EMP_NAME,
-- SALARY,
-- RANK () OVER(ORDER BY SALARY DESC) 순위
-- from EMPLOYEE ;
SELECT *
FROM(EMP_NAME,
SALARY,
RANK () OVER(ORDER BY SALARY DESC) 순위
from EMPLOYEE) A
WHERE 순위 < 4;
->EMP_NAME|SALARY |순위|
--------+-------+--+
선동일 |8000000| 1|
송종기 |6000000| 2|
박잉석 |4000000| 3|
-- where 이 셀렉트보다 먼저 계산하기때문에셀렉트구문을 프롬안에 넣어서 순위를 계산
-- DENSE_RANK () : 동일한 순번이 있을 경우 이후 순번에는 영향을 미치지않는 함수
-- 1
-- 2
-- 2
-- 3
SELECT EMP_NAME,
SALARY,
DENSE_RANK () OVER(ORDER BY SALARY DESC) 순위
from EMPLOYEE ;
-- ROW_NUMBER() : 동일 순번은 무시 , 그냥 넘버링
SELECT EMP_NAME,
SALARY,
ROW_NUMBER() OVER(ORDER BY SALARY DESC) 순위
from EMPLOYEE ;
-- 실습 4.
-- 부서 별 급여 합계가 전체 부서 급여 총합의
-- 20 % 보다 많은 부서의
-- 부서명과 부서별 급여 합계를 조회
SELECT SUM(SALARY) * 0.2
FROM EMPLOYEE ;
-- 급여 총합의 20 % 구해놓기
->
SUM(SALARY) * 0.2|
-----------------+
15439248.0|
-- 인라인 뷰(하나의 테이블로 봄)
SELECT DEPT_CODE , SUM(SALARY) SUMSAL
FROM EMPLOYEE
GROUP BY DEPT_CODE;
-- 부서별 급여 합계
->
DEPT_CODE|SUMSAL |
---------+--------+
D9 |17700000|
D6 |10100000|
D5 |15760000|
D8 | 6986240|
| 5210000|
D1 |14920000|
D2 | 6520000|
SELECT *
FROM (SELECT DEPT_CODE , SUM(SALARY) SUMSAL
FROM EMPLOYEE
GROUP BY DEPT_CODE) A
WHERE SUMSAL > (SELECT SUM(SALARY)*0.2 FROM EMPLOYEE );
->
DEPT_CODE|SUMSAL |
---------+--------+
D9 |17700000|
D5 |15760000|
상호연관쿼리 / 스칼라 서브쿼리 / CREATE
-- 상호 연관 쿼리 : 상관쿼리
-- 일반적으로 서브쿼리는 서브쿼리대로 , 메인쿼리는 서브쿼리의 결과만 받아서 실행되는 방식
-- 메인쿼리가 사용하는 컬럼값 , 계산식 등을 서브쿼리에 적용. 서브쿼리 실행시 메인쿼리의 값도 함께 사용하는 방식
-- 사원의 직급에 따른 급여 평균보다 많이 받는 사원 정보 조회
-- 잡코드의 평균을 구하고 사원의 정보 구해야함
SELECT job_code , TRUNCATE(avg(salary), -3)
from EMPLOYEE
group by JOB_CODE ;
->
job_code|TRUNCATE(avg(salary), -3)|
--------+-------------------------+
J1 | 8000000|
J2 | 4850000|
J4 | 2330000|
J3 | 3600000|
J7 | 2528000|
J5 | 2820000|
J6 | 2624000|
SELECT EMP_ID , EMP_NAME , JOB_CODE , SALARY
FROM EMPLOYEE E
WHERE SALARY > (
SELECT AVG(SALARY)
FROM EMPLOYEE E2
WHERE E.JOB_CODE = E2.JOB_CODE
->
EMP_ID|EMP_NAME|JOB_CODE|SALARY |
------+--------+--------+-------+
201 |송종기 |J2 |6000000|
203 |송은희 |J4 |2800000|
205 |정중앙 |J3 |3900000|
215 |대북혼 |J5 |3760000|
216 |차태연 |J6 |2780000|
217 |전지연 |J6 |3660000|
218 |이오리 |J7 |2890000|
220 |이중석 |J4 |2490000|
221 |유하진 |J4 |2480000|
500 |박영석 |J7 |3100000|
600 |박잉석 |J7 |4000000|
);
-- 스칼라 서브쿼리 : 상관쿼리 + 단일행( 보통 select 에 많이 사용하며 select list 라고도 부른다.)
-- 모든 사원의 사번 , 사원명 , 관리자 사번, 관리자 명을 조회 .
-- 관리자가 없을 경우 '없음'이라고 표시
SELECT EMP_ID,
EMP_NAME,
MANAGER_ID,
ifnull((select EMP_NAME FROM EMPLOYEE M WHERE E.MANAGER_ID = M.EMP_ID),'없음') 관리자이름
FROM EMPLOYEE E;
->
EMP_ID|EMP_NAME|MANAGER_ID|관리자이름|
------+--------+----------+-----+
200 |선동일 | |없음 |
201 |송종기 |200 |선동일 |
202 |노옹철 |201 |송종기 |
203 |송은희 |204 |유재식 |
204 |유재식 |200 |선동일 |
205 |정중앙 |204 |유재식 |
206 |박나라 |207 |하이유 |
207 |하이유 |200 |선동일 |
208 |김해술 |207 |하이유 |
209 |심봉선 |207 |하이유 |
210 |윤은해 |207 |하이유 |
211 |전형돈 |200 |선동일 |
212 |장쯔위 |211 |전형돈 |
213 |하동운 | |없음 |
214 |방명수 |200 |선동일 |
215 |대북혼 | |없음 |
216 |차태연 |214 |방명수 |
217 |전지연 |214 |방명수 |
218 |이오리 | |없음 |
219 |임시환 | |없음 |
220 |이중석 | |없음 |
221 |유하진 | |없음 |
222 |이태림 |100 |없음 |
500 |박영석 |200 |선동일 |
600 |박잉석 |200 |선동일 |
-- ddl: CREATE
/*
* CREAT : 데이터베이스의 객체를 생성하는 DDL ( DATABASE, TABLE , VIEW...)
* [사용 형식]
* CREATE 객체종류 객체명(관련 내용)
*
* -- 테이블 생성 시
* CREATE TABLE TEST(
* 컬럼명 자료형(길이) 제약조건
* );
*
* 제약조건 : 테이블에 데이터를 저장하고자 할때 지켜야하는 규칙
* NOT NULL -> NULL값을 허용하지않는다.(필수 입력 사항)
* UNIQUE -> 중복 값을 허용하지 않는다.
* CHECK -> 지정한 입력 사항 외에는 받지 못하게 하는 조건
* PRIMARY KEY -> (NOT NULL + UNIQUE)
* 테이블 내에서 해당 행(ROW)를 인식할수있는 고유한 값 .
* 테이블에서 단 1개만 설정 가능
* FOREIGN KEY -> 다른 테이블에서 지정한 값을 연결지어서 참조로 가져오는
* 데이터를 지정하는 제약조건
*
*
*/
-- 테이블 생성 --
-- 테이블 : 데이터를 저장하기위한 틀 ,2차원 표 형태로 데이터들을 담을 수 있는 객체.
drop table member; -- 테이블 삭제
CREATE TABLE MEMBER(
MEMBER_NO INT,
MEMBER_ID VARCHAR(20),
MEMBER_PWD VARCHAR(30),
MEMBER_NAME VARCHAR(15) COMMENT '회원이름'
);
SELECT * FROM MEMBER;
-- ROW(열) 는 없지만 컬럼(행)들은 잘 만들어짐
SHOW FULL COLUMNS FROM MEMBER;
SELECT TABLE_NAME , TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'MEMBER';
-- 테이블 정보 수정 (주석 달기)
ALTER TABLE MEMBER COMMENT = '회원';
ALTER TABLE MEMBER MODIFY MEMBER_NO INT COMMENT '회원번호';
SHOW FULL COLUMNS FROM MEMBER;
'mySQL' 카테고리의 다른 글
[mySQL] FOREIGN KEY /삭제 옵션 / IUD (0) | 2024.04.07 |
---|---|
[mySQL]연산자 , 함수 (0) | 2024.03.29 |
[mySQL] 데이터베이스 (0) | 2024.03.24 |