부트캠프(DB)

부트캠프 27일차 (DDL,DML,VIEW,사용자관리)

동곤일상 2025. 3. 11. 17:48
반응형

1) DDL

1-1) DROP 

1-2) truncate

2)DML

2-1) insert

2-2)update

2-3) delete

 

3) DDL _DML정리

 

4)view

4-1)creat view

4-2)view의 join

4-3) drop view

4-4) inlin view

 

5) 사용자관리

 

6)

 


2025.03.10 - [부트캠프(DB)] - 부트캠프 26일차(서브쿼리 , DDL)

 

부트캠프 26일차(서브쿼리 , DDL)

1)subquery1-1) 단일행 subquery1-2)복수행 subquery1-3) 다중컬럼 subquery1-4)상호연관 subquery1-5) inline view subquery 2)DDL(데이터정의어)2-1)자료형 ( mariaDB)2-2)DDL 특징2-3) create 2-4)alter1)ALTER 컬럼 수정 1-1)컬럼 추

ddkk1120.tistory.com

위의 DDL 내용과 이어짐

 

 

1) @@ DDL @@

 

1-1) drop 

USER information_schema;
-- information_schema 선택
SELECT * FROM TABLE_CONSTRAINTS
WHERE TABLE_NAME = "professor_101";


/*
	drop명령어 : 객체 제거
*/

-- 제약조건 제거
-- 기본키 제거
USE gdjdb;

ALTER TABLE professor_101 DROP FOREIGN KEY professor_101_ibfk_1;
ALTER TABLE professor_101 DROP FOREIGN KEY professor_101_ibfk_2;
ALTER TABLE professor_101 DROP PRIMARY KEY; 

DESC professor_101;


SHOW TABLES;
DESC test1;

DROP TABLE test1; #test1 테이블 삭제

 

1-2) truncate

truncate와 delete의 차이

 

자동commit을 끄고 delete로 레코드를 지웠다가 rollback 해보자

SELECT * FROM professor_101;
SET autocommit = FALSE; -- 자동 commit 안함
SET autocommit = TRUE; -- 자동commit 사용 
select @@autocommit; -- 0:off   1: on

DELETE FROM professor_101; #테이블의 레코드지우기
ROLLBACK; # 롤백
SELECT * FROM professor_101; #원상복구

 

자동commit을 끄고 truncate로 레코드를 지웠다가 rollback 해보자

(DDL은 transaction 처리가 되지 않는다)

/*
	truncate : 테이블과 데이터분리
*/

-- truncate로 데이터제거 'rollback 불가능'
TRUNCATE TABLE professor_101;
SELECT * FROM professor_101;
ROLLBACK; # truncate는 복구가안돼
SELECT * FROM professor_101; #복구안됨

 


2) @@ DML (데이터조작어)@@

DML : date Manipulation launguage : 데이터 조작어


insert : 데이터추가
update : 데이터수정 , 변경
delete : 데이터 삭제
select : 데이터 조회

CRUD : create read update delete
transaction 처리 가능 : commit , rollback 가능


2-1)insert


insert : 데이터 추가
insert into 테이블명[(컬럼명1 , 컬럼명2,...)]  values(값1,값2,...)
-> 컬럼명의 갯수 , 값의 갯수가 동일해야함
컬럼명1 <= 값1
컬럼명2 <= 값2

컬럼명 부분을구현하지않는다면
스키마순서대로 값을 입력 넣어야함

컬럼명을 구현해야하는 경우
1. 모든컬럼의값을 입력하지않아도되는경우
2. 스키마의순서를 모를때
3.DB구조의 변경이자주발생시 컬럼명을 기술하는것이 안전

 

사용예시

 

일단 autocommit을 꺼준다

set autocommit = FALSE;
SELECT @@autocommit; -- 0 : off      1 : on

 

insert는 transaction 처리 가능!

SELECT * FROM depttest1; -- 변경 전
-- depttest1 테이블의 90번 특반팀  추가할것임
INSERT INTO depttest1 (deptno , dname) VALUES (90,'특판팀');
SELECT * FROM depttest1; -- 추가 후
ROLLBACK; -- 롤백 ( autocommit off상태여야가능)
SELECT * FROM depttest1; -- 롤백 후

추가 전
추가 후

 

롤백 후


commit 후에 rollback 실행시

INSERT INTO depttest1 VALUES(91,'특판1팀',NULL);
SELECT * FROM depttest1;
COMMIT;
ROLLBACK;

commit을 했다면 rollback을 해도 추가전으로 돌아가지않음

 


문제

-- depttest1 테이블에 70,총무부,레코드추가  -- 컬럼명 생략
-- depttest1 테이블에 80,인사부 레코드추가하기 -- 컬럼명기술

INSERT INTO depttest1 VALUES (70,'총무부',NULL);
INSERT INTO depttest1 (deptno , dname , loc) VALUES (80,'인사부',NULL);
SELECT * FROM depttest1;

commit을 한다면 테이블에 영구저장되는것이고

rollback을 한다면 원상복구


여러개의 레코드를 한번에  추가하기

 

-- depttest2 테이블 사용
-- (91, 특판1팀)   (50,운용팀,울산)  (70,총무부,울산)
-- (80 , 인사부, 서울) (100,경영부 , 부산)

SELECT * FROM depttest2;
INSERT INTO depttest2 VALUES
(91, '특판1팀',NULL) ,(50,'운용팀','울산') ,
 (70,'총무부','울산'),(80 ,' 인사부',' 서울'), (100,'경영부' , '부산');
 COMMIT;
SELECT * FROM depttest2;

추가 전
추가 후


기존테이블을 이용해 데이터추가하기

컬럼의 순서 , 자료형 등 모두같아야 가능한 방법

 -- 기존테이블을 이용해 데이터추가하기
SELECT * FROM depttest3;
#depttest2의 내용들을 depttest3에 삽입
INSERT INTO depttest3 SELECT * FROM depttest2;

 

추가전
추가 후

 

-- professor_101테이블(빈테이블) 내용을 추가

SELECT * from professor_101;

INSERT INTO professor_101 (NO,NAME,deptno,POSITION,majorname)
SELECT p.no , p.name , p.deptno , p.position , m.name majorname
FROM professor p JOIN major m
WHERE p.deptno = m.code
AND p.deptno = 101; #순서와 갯수 자료형 모두 잘맞추자
/*
	컬럼부분의 갯수(삽입대상)와 select에서 조회(삽입자)되느 컬럼의갯수 동일
*/

SELECT * FROM professor_101;

-- INSERT INTO professor_101 컬럼갯수가맞지않아 오류발생함
-- SELECT * FROM professor p , major m
-- WHERE p.deptno = m.code
-- AND p.deptno = 101;

 

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

 


test3 테이블(레코드X)에 student의 3학년정보만을 넣어봐라

 

-- test3 테이블에 3학년학생의 정보를 저장
SELECT * FROM test3;

INSERT INTO test3 
SELECT s.studno , s.NAME , s.birthday #test3의 컬럼과맞춰줌
FROM student s
WHERE s.grade=3; 
COMMIT;

          ↓  ↓  ↓  ↓  ↓  ↓

 


2-2) update

update : 데이터의내용을 변경하는 명령어

update 테이블명 set 컬럼1=값1 , 컬럼2=값2....
[where 조건문] => 없는경우 모든레코드값 변경
있는경우 조건문의결과가참인레코드만

 

 

예시

-- emp 테이블에서 사원직급인경우 보너스10만원(+10)인상하기
-- 보너스가 없는경우 : 10만원으로변경

SELECT * FROM emp ;
SELECT * FROM emp WHERE job='사원';
UPDATE emp SET bonus = ifnull(bonus,0)+10 
						#bonus가null이라면0으로치환
WHERE job='사원'; # 이게없다면 사원뿐만아닌 모든직급의보너스가올라감

#정상적으로됐다면
COMMIT;

 

 

예시2

-- professor 테이블
-- 이상미교수와 같은 직급의 교수 중 급여가350이하인 교수의급여 10% 인상

#이상미교수와 같은직급의 교수 조회해보기
SELECT NAME , position,salary FROM professor WHERE POSITION 
IN ( SELECT position FROM professor WHERE NAME='이상미');
# 이복영 , 조황섭 , 송승환


#update문작성
UPDATE professor SET salary = salary*1.1
WHERE position in( SELECT position FROM professor WHERE NAME='이상미')
AND salary <= 350;

↓              ↓                      ↓

350이하의 교수들 10% 인상

 

혹여나 where문을 빠트리거나했다면

당황하지말고 rollback을 해보자 ( autocommit이 꼭 꺼져있어야함)


문제

#문제
  보너스가 없는 시간강사의 보너스를 조교슈의 평균보너스의 50%로 세팅

SELECT NAME , POSITION , bonus FROM professor WHERE POSITION='시간강사';
SELECT NAME , POSITION , avg(bonus) FROM professor WHERE POSITION='조교수';


UPDATE professor SET  bonus = (SELECT AVG(bonus)/2 FROM professor WHERE POSITION='조교수')#서브쿼리
WHERE position='시간강사' AND bonus IS NULL;

 

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

 

 


문제2)

지도교수 없는 학생의 지도교수를 이용학생의 지도교수로변경해주자

#지도교수없는학생과 이용학생 조회해보기
SELECT NAME , profno  FROM student s WHERE s.profno IS NULL OR NAME='이용';

UPDATE student SET profno = (SELECT profno FROM student WHERE NAME='이용')
WHERE profno IS NULL; #지도교수없는학생만 업뎃


#이용학생의 지도교수와같은 학생들 조회(확인용)
SELECT NAME , profno 
FROM student
WHERE profno  IN (SELECT profno FROM student WHERE NAME='이용');

변경 전

 

변경 후 ( 처음과같은 방식으로 조회하면 안됨)

이용과 같은 지도교수를 가진 학생들만 뽑아보자)

 


문제3)

-- 교수 중 김옥남 교수와 같은 직급의 교수급여를 101학과의 평균급여로변경
-- 소수점이하는 반올림해 정수로저장

#김옥남과 같은 직급교수급여 확인
SELECT POSITION ,name, salary ,deptno
FROM professor p
WHERE POSITION in (SELECT POSITION FROM professor where NAME='김옥남');

#101학과의 평균급여확인
SELECT AVG(salary) FROM professor WHERE deptno=101;
#482.333

UPDATE professor SET salary = (SELECT round(AVG(salary)) FROM professor WHERE deptno=101)
WHERE POSITION in (SELECT POSITION FROM professor where NAME='김옥남');
# where조건문에 김옥남과 같은 직급의 사람들만 select되게 함
# set salary= deptno가101인 교수들의 평균급여를 소수점이하는 반올림(round)

ROLLBACK; -- 다시돌려놓으려면 rollback

김옥남과 같은직급교수들
101학과의 평균급여
업데이트 후

 


2-3) delete

delete : 레코드삭제

delete from 테이블명
[where 조건문 ] : 조건문의결과가 참인 레코드만 삭제

 

예시1)

SELECT * FROM depttest1;
-- depttest1의 모든 레코드삭제해보자

DELETE FROM depttest1; -- where조건문이없으므로모든레코드삭제

SELECT * FROM depttest1;

삭제전
where조건문없이 삭제 시도시 항상경고문 뜰것임

삭제 후

 

 


예시2)

depttest2 테이블에서 부서명에 '기'문자있는 부서삭제

SELECT * FROM depttest2;

DELETE FROM depttest2 
WHERE  dname like'%기%';

삭제전

 

삭제후

 


예제3)

-- 교수 중 김옥남교수와 같은 부서의 교수정보제거

SELECT NAME , deptno FROM professor 
 WHERE  deptno IN(SELECT deptno FROM professor WHERE NAME='김옥남');
 
 DELETE FROM professor 
 WHERE deptno in(SELECT deptno FROM professor WHERE NAME='김옥남');

삭제 전
삭제 후

 

 


3)DDL _DML 정리

  SQL의 종류
 
  DDL : 데이터정의어 . Data definition Language
     create , alter , drop , truncate
  , select(R)
  rollback이 불가능 하단 뜻 
  DDL문을 사용하면 모든문장이 commit되버림.
  (rollback할게있다면 DDL문 사용전에 하자)

DML : 데이터조작어 , data manupulation language
insert(C) , select(R), update(U) , delete(D) 
transaction 처리가능(rollback,commit실행가능0
autocommit이 아닌환경에서 rollback , commit실행가능
autocommit=false || true 로 껐다켰다 할수있다
select @@autocommit으로 확인가능(0:off  1:on)

TCL : transaction control language :트랙잭션 제어언어
  commit , rollback

DCL : 데이터제어어 : data control language : DB관리자의언어
grant : 사용자에게 DB권한 부여
revoke : 사용자에게 부여했던 권한 회수(제거)

 

 


4) @@ view @@

 

view : 가상테이블
물리적으로 메모리할당X , 
테이블처럼 join, subquery등 가능


4-1) create view

#OR REPLACE : 뷰를 수정할 때 DROP 없이 수정이 가능하다. 

create [or replace] view 뷰명  as ....

-- 2학년 학생의 학번 이름 키 몸무게를 가진 뷰(v_stu2) 생성
CREATE or replace VIEW v_stu2 
AS SELECT studno , NAME , height , weight 
FROM student
WHERE grade=2;

SELECT * FROM v_stu2;

-- 232001 , 홍길동 ,2,170 , 80,hongkd 학생테이블에 추가
-- 242001 , 김삿갓 ,1, 160 , 70,kimsk 학생테이블에 추가해보자
INSERT INTO student(studno , NAME , grade,height , weight,id,jumin) VALUES
(232001,'홍길동',2,170,80,'hongkd',123542) ,(242001,'김삿갓',1,160,70,'kimsk',533535);

ROLLBACK;
SELECT * FROM v_stu2;

student테이블 insert전의 view

 

student테이블을 변경했는데

view도 그에맞게 변하는것을 확인 가능

(view는 student를 참조하고있다)

 

student테이블insert 후의 view

 

 

information_schema에서 만든 뷰를 조회해보자

USE information_schema;

SELECT v.VIEW_DEFINITION FROM views v
WHERE TABLE_NAME = 'v_stu2'; 
#gdjdb에서만든 v_stu2 뷰를
# information_schema의 view 에서 출력할수있음


#조회 결과를 복사 붙여넣기 하면 다음과같이나옴
select `gdjdb`.`student`.`studno` AS `studno`,
`gdjdb`.`student`.`name` AS `NAME`,
`gdjdb`.`student`.`height` AS `height`,
`gdjdb`.`student`.`weight` AS `weight`
 from `gdjdb`.`student`
  where `gdjdb`.`student`.`grade` = 2;

 

복사 후 결과를  실행

 

 


view 생성

-- 2학년 학생의 학번 이름 국어 영어 수학값을 가지는 v_score2 뷰 생성
USE gdjdb;

CREATE OR REPLACE view v_score2
AS SELECT s.studno, s.name , m.kor ,m.eng,m.math
FROM student s JOIN score m
ON s.studno = m.studno
WHERE grade = 2;
--  create or replace : 생성또는변경

SELECT * FROM v_score2;

 


4-2) view의 JOIN

SELECT v1.* , v2.height , v2.weight
FROM v_score2 v1 , v_stu2 v2
WHERE v1.studno = v2.studno;
# view의 조인도가능함

(두개의 view 모두 student의 2학년의 정보로 만든 view)


view 와 테이블의 조합

v_score2 뷰와 student 테이블을 이용해 학번,이름,점수들,학년,지도교수번호출력

(해당 뷰는 student 2학년의 학번,이름 ,키 , 몸무게 정보가 들어있음)

SELECT v.* , s.grade , s.profno
FROM v_score2 v , student s
WHERE v.studno = s.studno;

 

v_score2 뷰와 student 테이블을 이용해 학번,이름,점수들,학년,지도교수번호,지도교수명출력

SELECT v.* , s.grade , s.profno , p.name
FROM v_score2 v , (student s LEFT join professor p ON  s.profno = p.no) #지도교수가null인경우를 대비해서!
WHERE v.studno = s.studno


4-3) DROP view

 

DROP (DDL)

transaction처리가안되므로

rollback 불가능

DROP VIEW v_stu2; # v_stu2 뷰 삭제 ( rollback불가능)
SELECT * FROM v_stu2; #조회안됨

 


4-4) inline view

 

inline 뷰 : 뷰의이름이없고 일회성으로사용되는 뷰
select구문의 from절에 사용되는 subqeuery
반드시 별명을 설정!!!!

(성능은 좋지않음)

 

-- 학생의 학번,이름,학년,키 ,몸무게,학년의평균키 , 평균 몸무게 조회
-- select절에서의 subquery
SELECT studno , NAME , grade , height , weight ,
(SELECT AVG(height) FROM student WHERE s.grade=grade)학년평균키,
(SELECT AVG(weight) FROM student WHERE s.grade=grade)학년평균몸무게
FROM student s;

-- inline뷰 활용
SELECT studno , NAME , s.grade, height , weight, avg_h 평균키, avg_w 평균몸무게
FROM student s , 
(SELECT grade , AVG(height) avg_h ,AVG(weight) avg_w  FROM student GROUP BY grade)a
WHERE s.grade = a.grade;


문제)

사원테이블에서 사원번호 , 사원명 , 직급 , 부서코드 , 부서명 , 부서별평균급여
-- 부서별 평균보너스( 보너스없으면 0원으로처리)

SELECT e.empno , e.ename , e.job ,e.deptno ,d.dname 부서명 ,e.salary, avg_s 부서평균급여, avg_b 보너스평균
FROM emp e , dept d , 
(SELECT deptno,AVG(salary) avg_s ,AVG(IFNULL(bonus,0)) avg_b FROM emp  GROUP BY deptno)a

WHERE e.deptno = d.deptno AND a.deptno = e.deptno
ORDER BY d.dname;


5) 사용자관리 (grant )

-- 데이터베이스 생성
CREATE DATABASE mariadb ;

#DB목록 조회
SHOW DATABASES;

#테이블목록조회
SHOW TABLES;

-- 사용자 생성 
USE mariadb;
CREATE USER test1;

-- 비밀번호 설정
SET PASSWORD FOR 'test1'=PASSWORD("pass1");

비밀번호설정 후 밑에 사진과같은 cmd창을 찾아 (시작->모두->mariaDB 폴더)

mysql -u test1 -p 로  새로만든관리자 test1으로 접근

test1로 연결하는 과정

 

-- 권한부여(mariaDB에 다음과같은 권한을 test1에게줌)

grant select,insert,update,delete,create,drop,create VIEW 
on mariadb.* to 'test1'@'%';

 

정상적으로 create , select 등이 되는것을 확인

 

alter는 권한을 주지않았으므로 불가능!

 

-- alter 권한까지 부여

GRANT ALTER ON mariadb.* TO 'test1'@'%';
flush PRIVILEGES; #강제 flush

 

 

alter 정상적 작동확인


-- 권한조회

USE information_schema;
SELECT * FROM USER_PRIVILEGES WHERE grantee LIKE '%test1%';

 


#===================================================
-- 권한 회수 : revoke

REVOKE ALL PRIVILEGES ON mariadb.* FROM test1@'%';

권한 삭제 했으므로 mariadb접근불가능


-- test1 사용자 삭제
DROP USER 'test1'@'%';
#mysql -u test1 -p 로접근해보자
# -u : user , -p: password

 

아예 삭제해버려서 로그인조차되지않음

 


6 예제)

-- 1. 테이블 test11를 생성하기. 
--    컬럼은 정수형인 no 가 기본키로 
--    name 문자형 20자리
--    tel 문자형 20 자리
--   addr 문자형 100자리로 기본값을 서울시 금천구로 설정하기
CREATE TABLE test11 (
NAME CHAR(20),
tel CHAR(20),
addr CHAR(100) DEFAULT '서울시금천구');

desc test11;

#2.교수 테이블로 부터 102 학과 교수들의 번호, 이름, 학과코드, 급여, 보너스, 직급만을 컬럼으로
#가지는 professor_102 테이블을 생성하기
CREATE TABLE professor_102
AS SELECT  p.no , p.name , p.deptno , p.salary  , p.bonus , p.`position`
FROM professor  p
WHERE p.deptno=102;

SELECT * FROM professor_102;


#3. 교수 테이블에서 이상미교수와 같은 직급의 교수를 퇴직시키기


DELETE FROM professor 
WHERE POSITION = (SELECT POSITION FROM professor WHERE NAME='이상미');

SET autocommit = FALSE;
SELECT @@autocommit; 

#4.교수번호,교수이름,직급, 학과코드,학과명 컬럼을 가진 테이블 professor_201을 생성하여
#201학과에 속한 교수들의 정보를 저장하기
CREATE TABLE professor_201
 AS SELECT p.no , p.name , p.position , p.deptno , m.name '학과명'
FROM professor p JOIN major m ON p.deptno = m.code
WHERE p.deptno = 201;

SELECT * FROM professor_201;


-- 5. 사원테이블에 사원번호:3001, 이름:홍길동, 직책:사외이사, 
--   급여:100, 부서:10, 입사일:오늘인 레코드 등록하기 -> 컬럼명 지정
SELECT * FROM emp;
INSERT INTO emp (empno,ename,job,salary,deptno,hiredate)VALUES
(3001,'홍길동','사외이사',100,10,NOW());

COMMIT;


-- 6. 사원테이블에 사원번호:3002, 이름:홍길동, 직책:사외이사, 
--   급여:100, 부서:10, 입사일:오늘인 레코드 등록하기 -> 컬럼명 지정안함

SELECT * FROM emp;
# emp테이블을 조회해서 컬럼의순서에 주의하자

INSERT INTO emp VALUES
(3002,'홍길동','사외이사',NULL,NULL,NOW(),100,null,10);
#제약조건이없으므로 빈 컬럼들은 다null로 채워줬음( 순서주의!)


-- 7. student 테이블과 같은 컬럼을 가진 테이블 stud_male 테이블 생성하기.
--     student 데이터 중 남학생 정보만 stud_male 테이블에 저장하기
--    성별은 주민번호를 기준으로 한다.
SELECT * FROM student;
CREATE TABLE stud_male 
AS SELECT * FROM student WHERE SUBSTR(jumin,7,1) IN (1,3); 
#테이블확인
SELECT name,jumin, SUBSTR(jumin,7,1)'주민번호7번째' FROM stud_male; 

-- 8.  2학년 학생의 학번,이름, 국어,영어,수학 값을 가지는 score2 테이블 생성하기

SELECT * FROM socre;

CREATE TABLE score2
SELECT  s.studno , s.`name` , c.kor ,c.math , c.eng 
FROM student s JOIN score c 
ON s.studno = c.studno;


-- 9. 박인숙 교수와 같은 조건으로 오늘 입사한 이몽룡 교수 추가하기
--    교수번호 : 6003,이름:이몽룡,입사일:오늘,id:monglee
--    나머지 부분은 박인숙 교수 정보와 같다.
SELECT * FROM professor;

INSERT INTO professor (NO, NAME, hiredate, id, POSITION, salary, bonus, deptno, email, URL)
SELECT 6003, '이몽룡', NOW(), 'monglee', POSITION, salary, bonus, deptno, email, URL
FROM professor
WHERE NAME = '박인숙';

-- 확인용
SELECT * FROM professor;

-- 10. major 테이블에서 code값이 200 이상인 데이터만 major2에 데이터 추가하기

SELECT * FROM major2; 

create table major2 
as SELECT * FROM  major WHERE CODE>=200;

-- 11. major 테이블에서  major2 테이블에 공과대학에 속한 학과 정보만 추가하기
SELECT * FROM major;

INSERT into major2 
SELECT * 
FROM major m1 
 WHERE m1.part IN (SELECT m2.code FROM major m2 WHERE m2.name='공과대학');
 
 SELECT * from major2; 
 
-- 12. 이영국 직원과 같은 직급의 직원의 급여는 
--    박진택 직원의 같은 부서의 평균급여의 80%로 변경하고, 보너스는 현재 보너스보다 15%를 인상하여 변경하기
SELECT AVG(salary) FROM emp e WHERE e.deptno IN (SELECT deptno FROM emp WHERE eNAME='이영국'); #평균급여 680 * 0.8 = 544
SELECT * from emp;

UPDATE emp SET  salary = (SELECT AVG(salary) FROM emp e WHERE e.deptno IN (SELECT deptno FROM emp WHERE eNAME='이영국'))*0.8 , bonus = bonus*1.15
WHERE  job  IN (SELECT job FROM emp WHERE eNAME='이영국');


-- 13. student 테이블과 같은 컬럼과, 학생 중 남학생의 정보만을 가지는  v_stud_male 뷰 생성하기.
--    성별은 주민번호를 기준으로 한다.
CREATE OR REPLACE  VIEW v_stud_male
AS SELECT * FROM student WHERE SUBSTR(jumin,7,1)IN(1,3); #남자는 주민번호7번쨰가  1,3 중에하나임

SELECT NAME ,SUBSTR(jumin,7,1)  FROM v_stud_male; 

-- 14.  교수번호,이름,부서코드,부서명,자기부서의 최대급여,최소급여,,평균급여, 최대보너스,최소보너스, 평균보너스 조회하기
--       보너스가 없으면 0으로 처리한다.

SELECT * FROM major;
SELECT * FROM professor;
USE dong;

SELECT p.no, p.name  , p.deptno , m.`name` ,
 (SELECT MAX(salary) fROM professor p2 where p2.deptno = p.deptno)  최대급여,
(SELECT min(salary) fROM professor p2  WHERE p.deptno = p2.deptno)  최소급여  ,
(SELECT max(IFNULL(bonus,0)) fROM professor p2 WHERE p.deptno = p2.deptno)   최대보너스,
(SELECT min(IFNULL(bonus,0)) fROM professor p2  WHERE p.deptno = p2.deptno)  최소보너스,
(SELECT AVG(IFNULL(bonus,0)) fROM professor p2 WHERE p.deptno = p2.deptno)  평균보너스
FROM professor p JOIN major m
WHERE p.deptno = m.code
ORDER BY m.name;