DataBase 수업 20211018
Subquery
- 하나의 SQL 질의문 속에 다른 SQL 질의문이 포함되어 있는 형태
- EX) 'SCOTT' 이라는 사람의 월급보다 월급이 많은 사람의 이름 뽑기
SAL = 3000 (SELECT * FROM (emp) where ename='SCOTT' - SUBQUERY를 사용 = SELECT * FROM (칼럼) where 월급 > (select 월급 from (칼럼) where 이름 = 'SCOTT');
-
- Single-Row Query
- Subquery결과의 Row가 한 개일 경우
- single-row operator를 사용해야함. : = , > , >= , < , <= , <>
- Multy-Row Query
- Subquery의 결과의 Row가 둘 이상일 떄
- multy-Row에 대한 연산을 사용해야 함 . single-row operator는 사용하면 안됨.
- ex) ANY , IN , ALL, EXIST 등등
- SELECT ename,sal,deptno from emp where ename IN ( SELECT MIN(ename) from emp where group by deptno);
결과값
- Top-K Query
- ROWNUM: 질의의 결과에 가상으로 부여되는 Oracle의 pseudo column
- 질의가 끝난 후에 rownum 값이 부여되므로 from 절에 서브쿼리 조건을 넣으면 된다.
- ex)
DDL
- Create Table문 이용
- 테이블이름, 컬럼 이름, 데이터 타입 등 정의
Create Table book( bookno NUMBER (5), title VARCHAR2 (50), author VARCHAR2 (10), pubdate DATE )
- SubQuery를 이용해서 테이블 생성 가능
- SubQuery의 결과와 동일한 테이블이 생성
- 질의 결과 레코드들이 포함
- NOT NULL 제약 조건 만 상속됨
- EX)
-
Create Table empSALES AS (select * from emp where deptno = 30)
- Naming Rules
- 테이블 , 칼럼 등의 이름 명명 규칙
- 문자로 시작
- 30자 이내
- A-Z , a-z, _, $, #
- 같은 유저가 소유한 다른 Object의 이름과 겹치지 않아야 함
- 오라클 예약어는 사용할 수 없음
- 테이블 , 칼럼 등의 이름 명명 규칙
- Data type
- ALTER TABLE
- 칼럼 추가
- ALTER TABLE book ADD (pubs VARCHAR2(50));
- 칼럼 수정
- ALTER TABLE book MODIFY (title VARCHAR2(100));
- 칼럼 삭제
- ALTER TABLE book DROP author;
- 칼럼 추가
- DELETE
- 조건을 만족하는 레코드 삭제
- - 이름이 SCOTT인 사원 삭제법
- DELETE FROM EMP where ename= 'scott';
- 조건이 없으면 모든 레코드 삭제
- DELETE FROM EMP;
- SUBQUERY를 이용한 DELETE
- SALES 부서의 직원 삭제
- DELETE FROM EMP WHERE deptno = (delete deptno FROM dept where dname='SALES');
- SALES 부서의 직원 삭제
VIEW
- 보안강화
- 데이터 복잡성을 단순화
- 실제 테이블의 정의와 응용프로그램 분리
- 복잡한 질의 숨김
- CREATE[OR REPLACE] [FORCE | NO FORCE] VIEW view_name [(alias[,alias]...)] AS subquery[WITH READ ONLY] [ WITH CHECK OPTION [CONSTRAINT constraint]];;
예제 문제 2-5 :
답: select team_id 팀아이디, player_name 선수명 , position 위치, height 키 , weight 몸무게
from player_t
where position like 'MF%' and team_id like 'K02%' or team_id like 'K07%' and position like 'MF%'
예제 문제 2-6
답:select player_name 이름, position 위치, back_no 백넘버
from player_t
where team_id like 'K02%'
예제 2-7
키가 170센티미터 이상인 선수들을 출력하시오.
답:select * from player_t where height >= 170
예제 2-8
'K02' 또는 'K07' 팀에 소속되어 있는 선수들을 출력하시오 ( IN 문을 사용할 것)
답:select *
from player_t
where team_id in ('KO2','K07')
예제 2-9 포지션이 'MF' 인 선수들을 출력하세요
답:
SELECT *
from player_t
where position in 'MF'
예제 2-10
"고"씨 성을 가진 선수들의 정보를 출력하시오
답:
SELECT *
from player_t
where player_name like '고%'
예제 2-11
스탭들의 정보를 출력하세요 스텝들은 포지션 코드 T
답:
SELECT *
from player_t
where position like 'T%'
예제 2-12
키가 170 이상 180 이하 선수들을 출력하시오 BETWEEN ~ AND 문 사용
답:
SELECT *
from player_t
where height between 170 and 180
예제 2-13
키 정보가 입력되지 않은 선수들을 출력하세요 null 을 사용
답:
select *
from player_t
where height is NULL
예제 2-14
소속이 삼성블루윙즈팀 키가 170이상인 조건을 가진 선수들 정보 조회
답:
SELECT *
from player_t
where height >= 170 and team_id in 'K02'
예제 2-15
삼성블루윙즈 또는 전남드레곤즈 선수들중 포지션이 미드필더이고 키가 170이상 180미만 조건을 가진 선수들
답:
SELECT *
from player_t
where height between 170 and 180 and team_id in ('K02','K07')
예제 2-16
K-리그 선수들의 포지션별 평균 키
답:
select position , avg(height)
from player_t
group by position
예제 2-17
수원 삼성블루윙즈팀의 선수들의 포지션별 인원은 어떻게 되는가
답:
select position , count(player_name)
from player_t
group by position
예제 2-18
k-리그의 포지션별 키가 180센티미터 이상되는 선수중에서 가장 큰 키를 구하시오
답:
select position, MAX(height)
from player_t
where height >= 180
group by position
예제 2-19
포지션별 평균키를 구한다. 단 평균키가 180 센티미터 이상의 값만 출력하시오
답:
select position, avg(height)
from player_t
group by position
having avg(height) >= 180
예제 2-20
k-리그의 선수들 중에서 팀별 포지션별 평균키를 구하시오
답:
select position,team_id, avg(height)
from player_t
group by position,team_id
having avg(height) > 0
예제 2-21
선수들의 이름 포지션 백넘버를 출력하는데 선수들의 백넘버 순으로 출력하시오.
답:
select player_name 이름 , position 포지션, back_no 백넘버
from player_t
order by back_no
예제 2-22
select player_name 이름 , position 포지션, back_no 백넘버
from player_t
where not back_no is null
order by back_no desc
예제 2-23 선수 이름 다음 "선수" 가 붙도록 출력하시오
답:
select player_name ||' 선수' 선수명, position 포지션, back_no 백넘버
from player_t
예제 2-24 소속팀이 삼성블루위즈인 수원을 연고지로 하는 선수들중 포지션이 미드필드이고 키가 175 이상 185사이에 있는 선수들의 이름, 포지션, 백넘버를 출력하시오 그런데 선수들의 키가 큰 선수부터 출력하고 키가 같다면 백넘버가 작은 선수부터 출력하게 하시오.
답:
select player_name, position, back_no
from player_t
where height >175 and height < 185 and position like 'MF%' and team_id ='K02'
order by height desc, back_no
예제 2-25 포지션별로 평균키 값을 구한다.
단 출력은 평균키 값이 180이상만 출력하고 출력시 평균키 값이 높은 순으로 출력한다.
답:
select position, avg(height)
from player_t
group by position
having avg(height) > 180
order by avg(height) desc
예제 3-1
player_t의 team_id 와 team_t 테이블의 team_id 을 이용하여 다음과 같은 결과가 나오도록 SQL문 작성
select p.player_name, p.back_no, t.region_name, t.team_name
from player_t p, team_t t
where t.team_id = 'K05'
order by back_no
예제 3-2
team_t 테이블의 stadium_id 와 stadium_t 테이블의 stadium_id를 이용하여
다음과 같은 결과가 나오도록 SQL문을 작성하시오
답:
select t.region_name, t.team_name, s.stadium_name, s.seat_count
from stadium_t s, team_t t
where t.stadium_id = s.stadium_id
예제 3-3
포지션이 GK인 선수들의 선수명, 백넘버, 연고지명, 팀명을 출력 출력시 백넘버가 작은 값부터 출력
답:
SELECT p.player_name, p.back_no, t.region_name, t.team_name
from player_t p , team_t t
where p.position = 'GK'
and t.team_id = p.team_id
order by p.back_no
예제 3-4
사원 테이블에서 각 사원이 받고 있는 급여가 어느 등급에 속하는 급여등급인지 출력
답:
select e.ename, e.sal , s.grade
from salgrade s , emp e
where e.sal between s.losal and s.hisal
예제 3-5
k-리그 소속팀에서 사용하는 전용구장의 정보를 팀별로 알고 싶다.
하지만 특정 팀에 소속되지 않는 구장에 대한 정보도 출력되어야 한다.
답:
select t.region_name, t.team_name, s.stadium_name, s.seat_count
from team_t t, stadium_t s
where t.stadium_id (+) = s.stadium_id
order by s.stadium_id
예제 3-6
사원에 대한 정보와 그 사원을 담당하고 있는 관리자의 정보를 출력
답:
select e.empno, e.ename, e.job , e.mgr
from emp e
예제 3-7
선수들별로 홈그라운드 경기장이 어디인지 출력하시오
답:
select p.player_name , p.position, t.region_name, s.stadium_name
from player_t p, stadium_t s, team_t t
where s.hometeam_id = t.team_id
and t.team_id = p.team_id
예제 3-8
김남일 선수가 소속된 팀의 선수들에 대한 정보를 출력하시오
답:
select player_name, position, back_no
from player_t
where team_id = ( select team_id from player_t where player_name='김남일')
예제 3-9
선수들 중에 키가 평균키보다 작은 선수들의 정보를 출력하시오
답:
select player_name, position, back_no, height
from player_t
where height <= ( select avg(height) from player_t )
order by height
예제 3-10
소속팀 별 키가 가장 작은 사람들의 정보를 출력하시오
답:
select team_id, player_name, position, back_no, height
from player_t
where (team_id, height) in (select team_id,MIN(height) from player_t group by team_id)
order by team_id
예제 3-11
선수가 속해 있는 팀의 평균키보다 작은 선수들의 정보를 출력하시오
답:
select t.team_name, p.player_name, p.position, p.back_no, p.height
from player_t p, team_t t
where p.height < (select avg(s.height) from player_t s where s.team_id = p.team_id )
and t.team_id = p.team_id
order by player_name
예제 3-12
삼성블루윙즈의 평균키보다 작은 팀의 이름과 평균키를 출력하시오
답:
select p.team_id, t.team_name, avg(p.height)
from player_t p, team_t t
where p.team_id = t.team_id
group by p.team_id, t.team_name
having avg(p.height) < (select avg(height) from player_t where team_id = 'K02')
예제 3-13
포지션이 미드필더인 선수들의 소속팀명 및 선수의 정보를 출력하는데 FROM 절에 SUBQUERY를 사용해서 SQL문을 작성하시오.
답:
SELECT t.team_name, p.player_name, p.back_no
FROM (select team_id, player_name, back_no from player_t where position = 'MF')p, team_t t
where p.team_id = t.team_id
order by player_name
예제 3-14
선수들 중 키가 가장 작은 사람 10명 출력
답:
select player_name,rownum, position, back_no, height
from (select * from player_t where height is not null order by height desc )
where rownum < 11