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;
↓ ↓ ↓
혹여나 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
2-3) delete
delete : 레코드삭제
delete from 테이블명
[where 조건문 ] : 조건문의결과가 참인 레코드만 삭제
예시1)
SELECT * FROM depttest1;
-- depttest1의 모든 레코드삭제해보자
DELETE FROM depttest1; -- where조건문이없으므로모든레코드삭제
SELECT * FROM depttest1;
삭제 후
예시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'@'%';
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;
'부트캠프(DB)' 카테고리의 다른 글
부트캠프28일차 (JDBC) (0) | 2025.03.12 |
---|---|
부트캠프 26일차(서브쿼리 , DDL) (0) | 2025.03.10 |
부트캠프 25일차 (join (0) | 2025.03.07 |
부트캠프24일차 ( 조건함수 , 그룹함수) (1) | 2025.03.06 |
부트캠프23일차 (집합연산자 함수 날짜) (1) | 2025.03.05 |