mySQL

[mySQL]그룹에 관련된 명령어

로돌씨 2024. 4. 1. 18:42

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