gugigugi92 2023. 2. 28. 18:32

트랜잭션 활용

빨간 밑줄친 아이콘을 클릭하면 

커밋과 롤백을 유동적으로 활용할 수 있어

수정된 테이블을 원상복구하는데에 

용이하다

 

*DB 실습

/*PLAYER 테이블에서 TEAM_ID가 'K01'인 선수 이름을 다른 이름으로 바꾸기*/
UPDATE PLAYER 
SET PLAYER_NAME = '송태섭'
WHERE TEAM_ID ='K01';
SELECT * FROM PLAYER WHERE TEAM_ID ='K01';

/*PLAYER 테이블에서 POSITION이 MF인 선수 삭제하기*/
DELETE FROM PLAYER WHERE "POSITION" = 'MF';
SELECT * FROM PLAYER WHERE "POSITION" = 'MF';

/*PLAYER 테이블에서 HEIGHT가 180이상인 선수 삭제하기*/
DELETE PLAYER WHERE HEIGHT >=180;
SELECT * FROM PLAYER WHERE HEIGHT>= 180;

/*PLAYER 테이블에서 POSITION이 NULL인 선수*/
SELECT * FROM PLAYER WHERE "POSITION" IS NULL;
/*PLAYER 테이블에서 POSITION이 NULL이 아닌 선수*/
SELECT * FROM PLAYER WHERE NOT "POSITION" IS NULL;
SELECT * FROM PLAYER WHERE "POSITION" IS NOT NULL;

 


/*AS(ALIAS): 별칭
SELECT 절과 FROM절에서 사용할 수 잇다
선수 이름과 생일 조회, 컬럼명을 별칭으로 변경하여 출력해준다 AS는 생략가능*/
SELECT PLAYER_NAME AS 선수이름, BIRTH_DATE 선수생일 FROM PLAYER;
SELECT * FROM PLAYER ;

출력결과 : PLAYER_NAME->선수이름, BIRTH_DATE -> 선수 생일로 바뀌었다


/*CONCATENAION: 연결, ||*/
SELECT PLAYER_NAME || '님의 영어 이름은'|| E_PLAYER_NAME 자기소개 FROM PLAYER;

출력결과


LIKE

    포함된 문자열 값을 찾고, 문자의 개수도 제한을 주 수 있다.
    WHERE [컬럼명] LIKE '서식';  
    %:모든 것
     _:글자 수  
       예)
            '%A' : A로 끝나는 모든 것
            'A%' : A로 시작하는 모든것
            '%A% : A가 포함된 모든 것
            'A__': A로 시작하는 세글자
            '_A' : A로 끝나는 두글자

 

 

/*'천마'로 끝나는 팀 이름 조회*/
SELECT TEAM_ID, TEAM_NAME FROM TEAM
WHERE  TEAM_NAME LIKE '%천마';

출력결과

/*LIKE 실습*/
/*PLAYER 테이블로 김씨 찾기*/
SELECT PLAYER_NAME FROM PLAYER 
WHERE PLAYER_NAME LIKE '김%';

/*PLAYER 테이블로 김씨 외 자 찾기*/
SELECT PLAYER_NAME FROM PLAYER 
WHERE PLAYER_NAME LIKE '김_';

/*PLAYER 테이블로 김씨와 이씨 찾기*/
SELECT PLAYER_NAME  FROM PLAYER 
WHERE PLAYER_NAME LIKE '김%' OR PLAYER_NAME LIKE '이%';

/*PLAYER 테이블로 이씨가 아닌 사람 찾기*/
SELECT PLAYER_NAME FROM PLAYER 
WHERE NOT PLAYER_NAME LIKE '이%';

 집계 함수 : 결과 행 1개
          ※주의사항: NULL은 포함시키지 않는다, WHERE절에서 사용불가
              평균 : AVG()
              최대값 : MAX()
              최소값 : MIN()
              총합 : SUM()
              개수 : COUNT()

 

SELECT AVG(HEIGHT),MAX(HEIGHT),MIN(HEIGHT),SUM(HEIGHT),COUNT(HEIGHT) FROM PLAYER p ;

출력결과


정렬
         ORDER BY 컬럼명, ... ASC: 오름차순
         ORDER BY 컬럼명, ... DESC: 내림차순

/*오름차순 ASC는 생략가능*/
SELECT * FROM PLAYER p ORDER BY HEIGHT ;

 

출력결과

/*내림차순*/
/*키가 큰사람 먼저 내림차순 같은 키면 몸무게 내림차순*/
SELECT * FROM PLAYER p ORDER BY
HEIGHT DESC, WEIGHT DESC;

 

출력결과



  GROUP BY: ~별 ㅁㅁ ex) 포지션 별 평균 키
               WHERE 절이 GROUP BY보다 먼저 실행되기 때문에
               WHERE절에서 우선적으로 처리할 조건식을 작성해야 효율적이다
              묶기 전에는 WHERE절, 묶고 나서는 HAVING절을 사용하여 적절히 문제를 해결할 줄 알아야한다. 
   

/*GROUP BY POSITION이면 POSITION 을 필수로 SELECT */
SELECT "POSITION", AVG(HEIGHT)  FROM PLAYER p
/*NULL 삭제  */
WHERE "POSITION" IS NOT NULL
GROUP BY "POSITION";

출력결과

 

/*PLAYER 테이블에서 몸무게가 80이상인 선수들의 평균 키가 180이상인 포지션 검색*/
SELECT "POSITION",AVG(WEIGHT),MIN(WEIGHT) FROM PLAYER
WHERE WEIGHT >=80 
GROUP BY "POSITION"
HAVING AVG(HEIGHT)>=180;

 

 

출력결과

 

 

/*EMPLOYEES 테이블에서 JOB_ID별 평균 SALARY가 10000미만인 JOB_ID 검색*/
SELECT JOB_ID,AVG(SALARY) FROM EMPLOYEES e 
GROUP BY JOB_ID 
HAVING AVG(SALARY)<10000
ORDER BY AVG(SALARY);

출력결과


 SUB QUERY
           FROM 절: IN LINE VIEW
           SELECT절: SCALAR
           WHERE절: SUB QUERY  

/*PLAYER 테이블에서 전체 평균 키와 포지션별 평균 키 구하기*/
SELECT "POSITION", AVG(HEIGHT), (SELECT AVG(HEIGHT) FROM PLAYER)
FROM PLAYER
WHERE "POSITION" IS NOT NULL 
GROUP BY "POSITION";

출력결과

 

SELECT * FROM PLAYER WHERE TEAM_ID ='K01'
/*+*/
SELECT * FROM PLAYER WHERE "POSITION" ='GK';

SELECT * FROM 
(
SELECT PLAYER_NAME,"POSITION" FROM PLAYER p  WHERE TEAM_ID ='K01'
) 
PLAYER WHERE "POSITION" ='GK';

출력결과

 

/*PLAYER 테이블에서 평균 몸무게보다 더 많이 나가는 선수들 검색*/
SELECT WEIGHT, PLAYER_NAME FROM PLAYER p 
WHERE WEIGHT > (SELECT AVG(WEIGHT) FROM PLAYER p2 );

출력결과


/*PLAYER 테이블에서 정남일 선수가 소속된 팀의 선수들 조회 */
SELECT * FROM PLAYER;

SELECT PLAYER_NAME, TEAM_ID  FROM PLAYER
WHERE TEAM_ID = (SELECT TEAM_ID FROM PLAYER WHERE PLAYER_NAME = '정남일');

출력결과

/*PLAYER 테이블에서 평균 키보다 작은 선수 검색, 조회 결과가 맞는지 검사까지 한번에 하기*/
SELECT HEIGHT ,PLAYER_NAME,(SELECT AVG(HEIGHT) FROM PLAYER ) FROM PLAYER 
WHERE HEIGHT < (SELECT AVG(HEIGHT) FROM PLAYER) ;

출력결과

/*SCHEDULE 테이블에서 경기 일정이 20120501 ~ 20120502 사이에 있는 경기장 정보 조회*/
SELECT * FROM SCHEDULE 
WHERE SCHE_DATE >= '20120501' AND SCHE_DATE <='20120502';

출력결과

UPDATE PLAYER 
SET NICKNAME  = (SELECT NICKNAME  FROM PLAYER  WHERE PLAYER_NAME = '정태민')
WHERE NICKNAME IS NULL;

SELECT * FROM PLAYER WHERE NICKNAME = '킹카';

출력결과

SELECT * FROM EMPLOYEES e ;
UPDATE EMPLOYEES 
SET SALARY = SALARY *1.2
WHERE SALARY < (SELECT AVG(SALARY) FROM EMPLOYEES e );
SELECT  SALARY FROM EMPLOYEES e ORDER BY SALARY  ;

출력결과(인상전)
출력결과(인상후)

 

/*PLAYER 테이블에서 평균 키보다 큰 선수들을 삭제*/
SELECT PLAYER_NAME,HEIGHT,(SELECT AVG(HEIGHT) FROM PLAYER p)  FROM PLAYER;
DELETE FROM PLAYER 
WHERE HEIGHT > (SELECT AVG(HEIGHT) FROM PLAYER p) ;
SELECT PLAYER_NAME,HEIGHT,(SELECT AVG(HEIGHT) FROM PLAYER p)  FROM PLAYER;

출력결과(변경전)
출력결과(변경후): 179 이상이 사라지고 평균값이 낮아짐