데이터베이스 basic sql

김태희·2일 전
0

데이터베이스

목록 보기
3/3

2.2 basic sql


기본 문법

SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
  • 중복 제거 하지 않는 게 디폴트 → DISTINCT를 써서 중복 제거한다

Q1. 103번 보트를 예약한 적이 있는 선원의 이름 구하기

SELECT S.sname
FROM Sailors S, Reserves R
WHERE S.sid=R.sid AND R.bid=103

Q4. 적어도 한 개의 배를 예약한 선원의 id

SELECT S.sid
FROM Sailors S, Reserves R
WHERE S.sid=R.sid
  • DISTINCT 넣어야 중복제거 됨
  • S.sname 해도 되는데 동명이인일 수도 있으니까 sid랑 sname을 같이 뽑는 게 좋을 듯
WHERE S.sname LIKE ‘B_%B’

↑ 여기 다시 보기

Q5. 빨간색이나 초록색 배를 예약한 선원의 id

SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND (B.color=‘red’ OR B.color=‘
green’)
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘red’
UNION
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘
green’

Q6. 빨간색과 초록색 배를 모두 예약한 선원의 id

SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘red’
INTERSECT
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘
green’

중첩 쿼리

Q1. 103번 보트를 예약한 사람의 이름

SELECT S.sname
FROM Sailors S
WHERE S.sid IN (SELECT R.sid     #IN은 앞이 뒤의 원소인지 아닌지 체크해주는 역할
								FROM Reserves R
								WHERE R.bid=103)
SELECT S.sname
FROM Sailors S
WHERE EXISTS (SELECT *
							FROM Reserves R
							WHERE R.bid=103 AND S.sid=R.sid)
  • 103번 예약 안 한 사람 할려면 NOT IN 하면 됨
    • 빨간색 보트를예약하지 않은 선원의 이름
      SELECT S.sname
      FROM Sailors S
      WHERE S.sid (NOT) IN (SELECT R.sid
      											FROM Reserves R
      											WHERE R.bid IN ( SELECT B.bid
      																			 FROM Boats B
      																		   WHERE B.color =‘red’)
  • Horatio 라는 이름의 선원들 중 적어도 한 명보다 등급이 높은 선원 찾기
    SELECT *
    FROM Sailors S
    WHERE S.rating > ANY (SELECT S2.rating
    											FROM Sailors S2
    											WHERE S2.sname=‘Horatio’)

Q6. 빨간색과 초록색 배를 모두 예약한 선원의 id

SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
			AND S.sid IN (SELECT S2.sid
										FROM Sailors S2, Boats B2, Reserves R2
										WHERE S2.sid=R2.sid AND R2.bid=B2.bid
													AND B2.color=‘green’)

Q9. 모든 배를 예약한 선원의 이름

SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS
		((SELECT B.bid
			FROM Boats B)
		 EXCEPT
			(SELECT R.bid
			 FROM Reserves R
			 WHERE R.sid=S.sid))
SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS (SELECT B.bid
									FROM Boats B
									WHERE NOT EXISTS (SELECT R.bid
																		FROM Reserves R
																		WHERE R.bid=B.bid
																							AND R.sid=S.sid))

집계함수

  • count()
  • sum()
  • avg()
  • max()
  • min()

선원들의 숫자

SELECT COUNT (*)
FROM Sailors S

등급이 10인 선원의 평균 나이

SELECT AVG ( DISTINCT S.age)
FROM Sailors S
WHERE S.rating=10

Group By 와 HAVING

SELECT   [DISTINCT] target-list
FROM     relation-list
WHERE    qualification
GROUP BY grouping-list
HAVING   group-qualification
  • 나이가 18살 이상인 선원 중에서, rating 별로 그룹화하고, 각 그룹에서 선원의 최소 나이와 rating을 출력 (단, 그룹 내 데이터가 2개 이상인 경우만)
    SELECT S.rating, MIN (S.age)
    FROM Sailors S
    WHERE S.age >= 18
    GROUP BY S.rating
    HAVING COUNT (*) > 1  # 그룹화에 대한 조건

Null Values

  • rating > 8
    • 이거의 진리값을 모르니까 True도 False도 아닌 Unknown
      • (셀렉션 조건은 True만 통과시킴)
  • T OR U = T; F OR U = U; F AND xx = F; U AND (T or U) = U
  • 웬만한 거 null값 무시함
    • AVG/SUM/MIN/MAX
    • Count(attr)
  • null 값 무시 안 하는 거
    • COUNT(*)

OUTER JOIN

  • 모든 데이터를 포함한다

  • 매칭 되는 게 없는 건 null로

    • cf) inner join은 매칭 되는 게 없으면 그냥 제외시켰음
  • in == exists

  • not in != not exists

profile
내 벨로그

0개의 댓글