[SQLD] 2과목 1장 SQL 기본

노희진·2021년 9월 4일
0

SQLD

목록 보기
3/5
post-thumbnail

1. 1장 1절 관계형 데이터베이스 개요

1) 데이터베이스

  • 현실세계와 데이터 베이스 관계

  • 데이터베이스 활용

2) SQL

  • 종류

3) table

👉 데이터를 저장흐는 객체로서 관계형 데이터베이스의 기본 단위이다.
👉 모든 자료는 테이블에 등록이 되고 테이블로 부터 원하는 자료를 꺼내올 수 있다.
👉 테이블은 어느 특정한 주제와 목적으로 만들어지는 일종의 집합이다.

  • 구조

  • 관계

4) ERD

👉 테비블 간 서로의 상관관계를 그림을 도식화한 것이다.
👉 구성요소는 개체, 관계, 속성이다.

2. 1장 2절 DDL

1) 중요 데이터 유형

char에서는 문자열을 비교할 때 공백을 채워서 비교한다. 하지만, varchar 유형에서는 맨 처음 부터 한 문자씩 비교하고 공백도 하나의 문자로 취급하므로 끝의 공백이 다르면 다른 문자오 판단한다.

2) 테이블 생성 규칙

👉 객체를 의미할 수 있는 적절한 이름 사용하며 가능한 단수형을 권고한다.
👉 테이블명과 칼럼명은 반드시 문자로 시작해야한다.
👉 A-Z, a-z, 0-9, _, $, # 문자만 허용한다.

3) 제약조건

4) CREATE TABLE

👉 CTAS(Create Table ~ As Select) : select 문장을 이용해서 테이블을 생성한다. 칼럼별로 데이터 유형을 재정의하지 않아도 된다는 장점이 있다.

create table team_temp
as select * from team;

5) ALTER TABLE

① add column

👉 새로운 칼럼을 추가한다.
👉 새롭게 추가된 칼럼은 테이블의 마지막 칼럼이 되며 칼럼의 위치를 지정할 수는 없다.

alter table 테이블명
add (추가할 칼럼명);

② drop column

👉 한번에 하나의 칼럼만 삭제 가능하며, 한번 삭제한 칼럼은 복구가 불가능하다.
👉 칼럼 삭제 후 최소하나 이상의 칼럼이 테이블에 존재해야 한다.

alter table 테이블명
drop column (추가할 칼럼명);

③ modify column

👉 칼럼의 데이터 유형, 디폴트 값, not null 제약 조건에 대한 변경을 포함할 수 있다.

alter table 테이블명
modify (칼럼명1 데이터 유형 [default 식] [not null],
	칼럼명2 데이터 유형 ...);

④ rename column

👉 칼럼명이 변경되면, 해당 칼럼과 관계된 제약조건에 대해서도 자동으로 변경된다.
👉 일부 DBMS(oracle 등)에서만 지원하는 기능이다.

alter table 테이블명
rename column 변경해야 할 칼럼명 to 새로운 칼럼명;

⑤ drop constraint

👉 테이블 생성시 부여했던 제약조건을 삭제한다.

alter table 테이블명
drop  constraint 제약조건명;

⑥ add constraint

👉 테이블 생성이후에 필요에 의해서 제약조건을 추가할 수 있다.

alter table 테이블명
add  constraint 제약조건명 (칼럼명);

6) RENAME TABLE

👉 테이블의 이름을 변경한다.

rename 변경전 테이블명 to 변경후 칼럼명;

7) DROP TABLE

👉 테이블을 잘못만들었거나 더이상 필요없을 경우 해당 테이블을 석제한다.

drop table 테이블명 [cascade constraint];

8) TRUNCATE TABLE

👉 테이블 자체가 삭제되는 것이 아니고, 해당 테이블에 들어있던 모든 행들이 제거되고 저장 공간을 재사용 가능하도록 해제된다.
👉 테이블 구조를 완전히 삭제하기 위해서는 drop table을 실행해야 한다.
👉 정상적인 복구가 불가능하다.

truncate table 테이블명;

3. 1장 3절 DML

1) INSERT

👉 한번에 한 건만 입력된다.

insert into 테이블명 (column_list) -- 1
values (column_list에 넣을 value_list);

insert into 테이블명 -- 2
values (column_list에 넣을 value_list);

① 일부 칼럼만 입력

👉 칼럼의 순서는 테이블의 칼럼순서와 매치할 필요는 없으며, 정의하지 않은 칼럼은 디폴트로 NULL 값이 입력된다.

② 전체 데이터 입력

👉 column_list를 언급하지 않아도 되지만, 칼럼의 순서대로 빠짐없이 데이터가 입력되어야 한다.

2) UPDATE

update 테이블명
set 수정되어야 할 칼럼명 = 수정되기를 원하는 새로운 값;

👉 where 절을 사용하지 않으면 전체 데이터가 수정된다.

3) DELETE

delete (from) 삭제를 원하는 정보가 있는 테이블명;

👉 where 절을 사용하지 않으면 전체 데이터가 삭제된다.

4) SELECT

👉 조회하기를 원하는 칼럼명을 select 다음에 ,로 구분하여 나열하고, from 다음에 해당 칼럼이 존재하는 테이블명을 입력하여 실행시킨다.

select (all/distinct) 보고싶은 칼럼명, 보고싶은 칼럼명, ...
from 해당 컬럼들이 있는 테이블명;

👉 all : 중복된 데이터가 있어도 모두 출력한다. (기본값)
👉 distinct : 중복된 데이터가 있는 경우 1건으로 처리해서 출력한다.
👉 * : 모든 칼럼 정보를 보고 싶을 경우 사용한다.

  • alias(별명) : 칼럼명 바로 뒤에 별명을 부여하여 사용할 수 있다. (as 키워드는 옵션)

  • 산술 연산자

  • 합성 연산자
    👉 분자와 분자를 연결하는 연산자
    👉 oracle : ||
    👉 SQL server : +
    👉 공통 : concat(문자1, 문자2)

5) DUAL 테이블

👉 사용자 테이블이 필요 없는 SQL 문장의 경우에도 필수적으로 DUAL이라는 테이블을 from절에 지정한다.
👉 DUMMY라는 문자열 유형 칼럼에 'X'라는 값이 들어있는 행을 1건 포함하고 있다.

4. 1장 4절 TCL

1) 트랜잭션

👉 데이터베이스의 논리적 연산단위
👉 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작
👉 하나의 트랜잭션에는 하나이상의 SQL문장이 포함된다.
👉 분할할 수 없는 최소의 단위이므로 전부 적용(all)하거나 전부 취소(nothing)한다.

  • 특성
    1. 원자성 : 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전형 실행되지 않은 상태로 남아 있어야 한다. (all or nothing)
    2. 일관성 : 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못 되어있지 않다면 트랜잭션이 실행된 이후에고 데이터베이스의 내용에 잘못이 있으면 안된다.
    3. 고립성 : 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.
    4. 지속성 : 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.

2) commit

👉 변경된 데이터를 데이터베이스에 영구적으로 반영한다.
👉 insert, update, delete 문장 사용 후에 일련의 변경작업이 완료되었음을 데이터베이스에 알려 주기 위해 사용한다.

  • commit 이후의 데이터 상태

    1. 데이터에 대한 변경사항이 데이터베이스에 반영된다.
    2. 이전 데이터는 영원히 잃어버리게 된다.(별도 로그 보관시 복구가능)
    3. 모든 사용자는 결과를 볼 수 있다.
    4. 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 행을 조작할 수 있게 된다.
  • 자동 커밋이 발생하는 경우

    1. create, alter, drop, rename truncate 등 DDL 문장을 실행하면 그 전후 시점에 자동으로 커밋된 다. 즉, DML문장 이후에 커밋이 없어도 DDL 문장이 실행되면 DDL 수행 전에 자동으로 커밋된다.
    2. 데이터베이스를 정상적으로 접속 종료하면 트랜잭션이 자동 커밋된다.
    3. 어플리케이션의 이상 종료로 데이터베이스와의 접속이 단절되었을 때는 트랜잭션이 자동으로 롤백된다.

3) rollback

👉 변경된 데이터가 문제가 있으므로 변경 전 데이터로 복귀한다.
👉 테이블 내 입력한 데이터나 수정한 데이터, 삭제한 데이터에 대하여 commit 이전에는 변경사항을 취소할 수 있도록하는 기능이다.

  • rollback 이후의 데이터 상태
    1. 데이터에 대한 변경사항은 취소된다.
    2. 이전 데이터는 다시 재저장된다.
    3. 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 행을 조작할 수 있게 된다.

4) savepoint

👉 데이터 변경을 사전에 지정한 저장점까지만 롤백한다.
👉 현 시점에서 미리 지정한 savepoint(저장점)까지 트랜잭션의 일부만 롤백할 수 있다.
👉 복수의 저장점을 정의할 수 있으며, 동일 이름으로 저장점을 정의했을 때는 나중에 정의한 저장점이 유효하다.

저장점 A로 되돌리고 나서 다시 B와 같이 미래 방향으로 되돌릴 수는 없다. 일단 특정 저장점까지 롤백하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문이다. 즉, rollback to A를 실행한 시점에서 저장점 A 이후에 정의한 저장점 B는 존재하지 않는다.
저장점 지정없이 rollback을 실행했을 경우 반영 안된 모든 변경 사항을 취소하고 트랜잭션의 시작위치로 되돌아간다.

5) commit과 rollback 사용 효과

  1. 논리적으로 연관된 작업을 그룹핑하여 처리 가능
  2. 영구적인 변경을 하기 전에 데이터의 변경사항 확인 가능
  3. 데이터 무결성 보장

5. 1장 5절 WHERE절

👉 사용자들이 원하는 자료만을 검색하기 위해 자료들을 제한하여 표시하는 역할을 한다.
👉 조회하려는 데이터에 특정조전을 부여할 목적으로 사용하기 때문에 from절 뒤에 오게 된다.

  • 연산자 종류

  • 연산자 우선순위
    괄호() > NOT > 비교 > AND > OR (왼쪽이 1순위)

  • 주의사항

    1. char 변수나 varchar2와 같은 문자형 타입을 가진 칼럼을 특정 값과 비교하기 위해서는 인용부호(큰따옴표, 장은따옴표)로 묶어서 비교처리를 해야한다.
    2. numeric과 같은 숫자형 형태의 값은 인용부호를 사용하지 않는다.

📌 예제) 소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들이어야 하고, 포지션이 미드필더(MF)이어야한다. 키는 170cm이상 180cm이하여야한다.

select player_name, position, back_no, height
from player
where (team_id = 'K02' or team_id = 'K07') -- 괄호가 없다면 잘못된 결과가 나옴
and position = 'MF'
and height >= 170
and height <= 180;

select player_name, position, back_no, height
from player
where team_id in('K02', 'K07') -- 논리연산자 or을 sql연산자 in으로 변경가능함
and position = 'MF'
and height between 170 and 180; -- 비교연산자 >=, <= 조건을 sql연산자 between조건으로 변경가능함

1) IN

📌 예제) 사원 테비을에서 job이 manager이면서 20번 부서에 속하거나, job이 clerk이면서 30번 부서에 속하는 사원의 정보를 in 연산자의 다중이리스트를 이용해 출력한다.

select ename, job, deptno
from emp
where (job, deptno) in (('manager', 20), ('clerk', 30))

2) Like

  • 와일드 카드 종류
    1. % : 0개 이상의 어떤 문자를 의미한다. ex) like '장%'
    2. 1개인 단일 문자를 의미한다. ex) like '_F%'

3) Is Null

  • NULL
    👉 아직 정의되지 않은 미지의 값, 현재 알 수 없는 값
    👉 공백이나 0과는 다른 값이다. (공백은 하나의 문자, 0은 숫자)
    👉 null 값과의 수치 연산은 null 값을 리턴한다.
    👉 null 값과의 비교 연산은 거짓(false)를 리턴한다.
    👉 null 값의 비교 연산은 is null, is not null이라는 정해진 문구를 사용해야 제대로 된 결과를 얻을 수 있다.

📌 예제)

select player_name, position, back_no, height
from player
where position = null; -- 원하는 결과를 출력할 수 없다.

select player_name, position, back_no, height
from player
where position is null;

4) 부정 연산자

📌 예제) 소속팀이 삼성블루윙즈 소속인 선수들 중에서 포지션이 미드필더(MF)가 아니고 키는 175cm이상 185cm이하가 아닌 선수들의 자료를 찾는다.

select player_name, position, back_no, height
from player
where team_id = 'K02'
and not position = 'MF'
and not height between 175 and 185;

📌 예제) 국적 칼럼의 경우 내국인들은 별도 데이터를 입력하지 않았다.(NULL) 국적 칼럼이 NULL이 아닌 선수와 국적을 표시한다. (결과적으로 외국인 데이터 출력)

select player_name, nation
from player
where nation is null;

5) ROWNUM/TOP

① ROWNUM

👉 oracle의 rownum은 pseudo column(유사칼럼, 사용자가 아닌 시스템이 관리하는)으로 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을때 사용할 수 있다.

-- 한 건의 행만 가져올 때
select player_name from player where rownum = 1; 
select player_name from player where rownum <= 1; 
select player_name from player where rownum < 2; 

-- 두 건아상의 N행을 가져올 때
select player_name from player where rownum = N; 
select player_name from player where rownum <= N; 
select player_name from player where rownum < N+1; 

② TOP

👉 SQL server는 top절을 사용하여 결과 집합으로 출력되는 행 수를 제한할 수 있다.

TOP(expression) -- expression : 반환할 행의 수 지정

-- 한 건의 행만 가져올 때
select top(1) player_name from player;

-- 두 건아상의 N행을 가져올 때
select top(N) player_name from player;

6. 1장 6절 함수(Function)

(단일행 함수 -> 6절, 집계함수 -> 7절, 그룹함수 -> 2장 5절, 윈도우 함수 -> 2장 6절, 사용자 정의함수 -> 2장 8절)

👉 일반적으로 함수는 입력되는 값이 많아도 출력은 하나만 된다는 M:1관계를 가진다. (사용자 정의함수의 경우 출력을 여러개 값이 나오게 할 수도 있다.)
👉 단일행 함수의 경우 단일 행 내에있는 하나의 값 또는 여러 값이 입력 인수로 표현될 수 있다.
👉 단일행 함수는 각각의 행에 대한 조작결과를 리턴한다.
👉 단일행 함수의 경우 select, where, order by절에 사용 가능하다.
👉 특별한 제약이 없다면 함수의 인자로 함수를 사용하는 함수의 중첩이 가능하다.

1) 문자형 함수

👉 문자를 입력하면 문자나 숫자 값을 반환한다.

  • 사용 예시

2) 숫자형 함수

👉 숫자를 입력하면 숫자 값을 반환한다.

  • 사용 예시

3) 날짜형 함수

👉 date 타입의 값을 연산한다.

📌 예제) 사원 테이블의 입사일자에서 년, 월, 일 데이터를 각각 출력한다.

-- oracle 함수
select ename, hiredate, 
	extract(year from hiredate) 입사년도,
	extract(month from hiredate) 입사월,
        extract(date from hiredate) 입사일
from emp;

select ename, hiredate, 
	to_number(to_char(hiredate, 'YYYY')) 입사년도,
	to_number(to_char(hiredate, 'MM')) 입사월,
        to_number(to_char(hiredate, 'DD')) 입사일
from emp;

-- SQL server 함수
select ename, hiredate, 
	datepart(year, hiredate) 입사년도,
	datepart(month, hiredate) 입사월,
        datepart(date, hiredate) 입사일
from emp;

select ename, hiredate, 
	year(hiredate) 입사년도,
	month(hiredate) 입사월,
        date(hiredate) 입사일
from emp;

4) 변환형 함수

👉 문자, 숫자, 날짜형 값의 데이터 타입을 반환한다.
👉 특정 데이터 타입을 다양한 형식으로 출력하고 싶을 경우에 사용되는 함수이다.

  • 명시적 데이터 유형 변환 : 데이터 변환형 함수로 데이터 유형을 변환하도롣 명시해 주는 경우

📌 예제)

select to_char(sysdate, 'YYYY/MM/DD'),
       to_char('YYY. MON, DAY')
from dual;
  • 암시적 데이터 유형 변환 : 데이터베이스가 자동으로 데이터 유형을 변환하여 계산하는 경우
    👉 인덱스 미사용으로 인한 성능저하가 발생할 수 있다.
    👉 자동적으로 데이터베이스가 계산하지 않는 경우가 있어 에러를 발생할 수 있으므로 명시적인 데이터 유형 변환 방법을 사용하는 것이 바람직하다.

5) case 표현

👉 if-then-else 논리와 유사한 방식으로 표현식을 작성해서 SQL비교 연산 기능을 보완하는 역할을 한다.

📌 예제)

select ename,
	case when sal > 2000 then sal
             else 2000 
        end revised_salary
from emp;

① simple_case expression

👉 조건이 맞으면 조건 내의 then절을 수행하고 조건이 맞지 않으면 else절을 수행한다.
👉 case 다음에 바로 조건이 사용되는 칼럼이나 표현식을 표시한다.
👉 EQUI 조건만 사용한다면 searched_case_expression보다 간단하게 사용할 수 있는 장점이 있다.
👉 oracle의 decode함수와 기능면에서 동일하다.

📌 예제)

SELECT LOC,
    CASE LOC -- simple_case_expression
        WHEN 'NEW YORK' THEN 'EAST'
        WHEN 'BOSTON' THEN 'EAST'
        WHEN 'CHICAGO' THEN 'CENTER'
        WHEN 'DALLAS' THEN 'CENTER'
        ELSE 'ETC'
    END as AREA
FROM dept;

② searched_case_expression

👉 조건이 맞으면 조건 내의 then절을 수행하고 조건이 맞지 않으면 else절을 수행한다.
👉 case 다음에는 칼럼이나 표현식을 표시하지 않고 다음 when절에서 EQUI(=) 조건 포함 여러 조건(>, >=, <, <=)을 이용한 조건절을 사용할 수 있다.
👉 simple_case expression보다 훨씬 다양한 조건을 적용할 수 있는 장점이 있다.

📌 예제)

select ename, 
    case when sal >= 3000 then 'HIGH' -- searched_case_expression
         when sal >= 1000 then 'MID'
         else 'LOW'
    end as salary_code
from emp;

③ case 중첩

👉 case 표현은 함수의 성질을 가지고 있으므로 다른 함수 처럼 중첩해서 사용할 수 있다.

📌 예제) 사원 정보에서 급여가 2000이상이면 보너스를 1000으로, 1000이상이면 5000으로, 1000미만이면 0으로 계산한다.

select ename, sal, 
    case when sal >= 2000 then 1000 
         else  (case when sal >= 1000 then 500
                    else 0 
                end)
    end as bonus
from emp;

6) NULL 관련 함수

👉 NULL을 처리하기 위한 함수

  • NULL과 공집합
select * from emp where 1=2; -- 결과없음(공집합)
select count(*) from emp where ename LIKE 'KING'; -- 1
select count(*) from emp where ename='JSC'; -- 0
select max(mgr) from emp where ename='KING'; -- NULL
select max(mgr) from emp where ename='JSC'; -- NULL

SELECT NVL(mgr, 9999) mgr FROM emp WHERE ename = 'JSC'; -- 결과없음(공집합)
SELECT NVL(max(mgr), 9999) mgr FROM emp WHERE ename = 'JSC'; -- 9999

① NVL / ISNULL (표현식1, 표현식2)

👉 표현식1의 결과값이 NULL이면 표현식2의 값을 출력한다.
👉 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다.

📌 예제) 선수 테이블에서 성남 일화천마(k08) 소속 선수의 이름과 포지션을 출력하는데 포지션이 없는 경우는 '없음'으로 표시한다.

SELECT player_name, position, NVL(position, '없음')
FROM player 
WHERE team_id = 'K08';

select player_name, position,
    case when position is null then '없음'
        else position
        end as 포지션
from player
where team_id = 'K08';

② NULLIF (표현식1, 표현식2)

👉 표현식1이 표현식2와 같으면 NULL을, 같지않으면 표현식1을 리턴한다.
👉 특정 값을 NULL로 대체하는 경우에 유용하게 사용할 수 있다.

📌 예제) 사원 테이블에서 MGR과 7698이 같으면 NULL을 표시하고, 같지 않으면 MGR을 표시한다.

select ename, empno, mgr, nullif(mgr, 7698) 
from emp;

select ename, empno, mgr, 
    case when mgr = 7698 then null
         else mgr
    end nuif
from emp;

③ COALESCE (표현식1, 표현식2, ...)

👉 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다.
👉 모든 표현식이 NULL이라면 NULL을 리턴한다.

📌 예제) 사원 테이블에서 커미션을 1차 선택값으로, 급여를 2차 선택값으로 선택하되 두 칼럼 모두 NULL인 경우는 NULL로 표시한다.

select ename, comm, sal, coalesce(comm, sal) coal 
from emp;

select ename, comm, sal, 
    case when comm is not null then comm
         else (case when sal is not null then sal
                    else null
               end)
    end coal
from emp;

7. 1장 7절 GROUP BY, HAVING절

1) 집계함수

👉 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다.
👉 select, having, order by 절에서 사용할 수 있다.
👉 테이블의 전체 집게를 위해 group by절 없이도 집계함수를 사용할 수 있다.
👉 그룹에 대한 정보를 제공하므로 주로 숫자 유형에 사용되지만, max, min, count 함수는 문자, 날짜 유형에도 적용이 가능한 함수이다.
👉 집계함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.

📌 예제)

SELECT count(*) 인원수, count(height),
    max(height), min(height), round(avg(height), 2)
FROM player;

2) GROUP BY절

👉 FROM절과 WHERE절 뒤에 오며 GROUP BY절은 행들을 소그룹화한다.
👉 칼럼 ALIAS명을 사용할 수 없다.

📌 예제) 포지션별 최대키, 최소키, 평균키를 출력한다.

SELECT position 포지션, count(*) 인원수, count(height),
    max(height), min(height), round(avg(height), 2)
FROM player
group by position;

3) HAVING절

👉 where절과 비슷하지만 group by절에 의해 만들어진 소그룹에 대한 조건이 적용된다.

📌 예제) HAVING절을 이용해 평균키가 180cm이상인 정보만 표시한다.

SELECT position 포지션, count(*) 인원수, count(height),
    max(height), min(height), round(avg(height), 2)
FROM player
group by position
having avg(height) >= 180
order by position;

4) case 표현을 활용항 월별 데이터 집계

📌 예제)

select ename, deptno, extract(month from hiredate), sal from emp;

select deptno,
       avg(case month when 1 then sal end) M01,
       avg(case month when 2 then sal end) M02,
       avg(case month when 3 then sal end) M03,
       avg(case month when 4 then sal end) M04,
       avg(case month when 5 then sal end) M05,
       avg(case month when 6 then sal end) M06,
       avg(case month when 7 then sal end) M07,
       avg(case month when 8 then sal end) M08,
       avg(case month when 9 then sal end) M09,
       avg(case month when 10 then sal end) M10,
       avg(case month when 11 then sal end) M11,
       avg(case month when 12 then sal end) M12
from (select ename, deptno, extract(month from hiredate) month, sal from emp)
group by deptno;

5) 집계함수와 NULL 처리

👉 다중행 함수는 입력 값으로 전체 건수가 null 값인 경우만 함수의 결과가 null이 나오고 전체 건수에서 일부만 null인 경우는 null인 행을 다중 행 함수의 대상에서 제외한다.
👉 null의 특성으로 자동적으로 연산에서 빠지는데 불필요하게 NUL/ISNULL 함수를 사용해 0으로 변환시켜 데이터 건수만큼의 연산이 일어나게 하는 것은 시스템 자원을 낭비하는 일이다.
👉 case 표현 사용시 else절을 생략하게 되면 default 값이 null이다. 같은 결과를 얻을 수 있다면 가능한 else절의 상수값을 지정하지 않거나 else절을 작성하지 않도록 한다.

📌 예제)

select team_id,
	nvl(sum(case position when 'FW' then 1 end), 0) FW,
	nvl(sum(case position when 'MW' then 1 end), 0) MW,
	nvl(sum(case position when 'DW' then 1 end), 0) DW,
	nvl(sum(case position when 'GK' then 1 end), 0) GK,
	nvl(sum(1), 0) sum
from player
group by team_id;

8. 1장 8절 ORDER BY절

👉 SQL문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는데 사용한다.
👉 칼럼명 대신에 alias명이나 칼럼 순서를 나타내는 정수도 사용가능하다. (혼용도 가능)
👉 별도로 정렬 방식을 지정하지 않으면 기본적으로 오름차순이 적용되며, SQL문장의 제일 마지막에 위치한다.
👉 oracle은 null값을 가장 큰 값으로 취급하지만, SQL server는 최소값으로 간주한다.

  • asc : 조회한 데이터를 오름차순으로 정렬한다. (생략 가능)
  • desc : 조회한 데이터를 내림차순으로 정렬한다.

📌 예제) 키가 큰 순서대로, 키가 같은 경우 백넘버 순으로 정렬하는데 키가 null인 데이터는 제외한다.

select player_name, position, back_no, height from player
where height is not null
order by height desc, back_no asc;

1) select 문장 실행 순서

  1. 발췌 대상 테이블을 참조한다.(from)
  2. 발췌 대상 데이터가 아닌 것은 제거한다.(where)
  3. 행들을 소그룹화한다.(group by)
  4. 그룹핑된 값의 조건에 맞는 것만을 출력한다.(having)
  5. 데이터 값을 출력/계산한다.(select)
  6. 데이터를 정렬한다.(order by)

👉 from절에 정의되지 않은 테이블의 칼럼을 where, group by, having, select, order by절에서 사용하면 에러가 발생한다.
👉 order by절에는 select 목록에 나타나지 않은 문자형 항목이 포함될 수 있다.
👉 인라인 뷰에서 미정의된 칼럼은 메인쿼리에서 사용할 수 없다.
👉 group by 이후 소그룹화가 진행된 상황에서 수행 절인 select절이나 order by절에서 개별 데이터를 사용하는 경우 에러가 발생한다.

2) Top N 쿼리

👉 oracle의 경우 order by절과 where절의 rownum 조건을 같이 사용하는 경우 정렬이 완료된 데이터의 일부가 출력되는 것이 아니라 데이터의 일부가 먼저 추출된 후 데이터에 대한 정렬 작업이 일어나므로 원하는 데이터를 얻지 못할 수 있다.

📌 예제) 사원 테이블에서 급여가 높은 3명을 내림차순으로 출력한다.

SELECT ename, sal
FROM emp
WHERE rownum < 4
order by sal desc; -- 정렬보다 먼저 rownum이 실행됨

SELECT * 
FROM(SELECT ename, sal FROM emp
        order by sal desc)
WHERE rownum < 4;

👉 SQL server에서 top조건을 사용하게 되면 별도 처리 없이 관련 oeder by절의 데이터 정렬 후 원하는 일부 데이터만 쉽게 출력할 수 있다.

📌 예제) 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력한다.

select top(2) ename, sal
from emp
order by sal desc;

📌 예제) 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원이 있으면 같이 출력한다.

select top(2) with ties
	ename, sal
from emp
order by sal desc;

9. 1장 9절 조인(JOIN)

👉 두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 조회하는 것이다.
👉 PK, FK의 관계가 없어도 논리적인 값들의 연관성만으로 조인이 성립 가능하다.
👉 단 두개의 집합 간에서만 조인이 일어난다.
👉 조인에 참여하는 대상 테이블이 N개 라고 했을때, N개의 케이블로 부터 필요한 데이터를 조회하기 위해 필요한 조인 조건은 N-1개 이상이 필요하다.

1) EQUI JOIN

👉 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법이다.
👉 대부분 PK, FK관계를 기반으로 한다.
👉 고전적인 조인 조건은 where절에 기술하게 되는데 EQUI JOIN은 '='연산자를 사용해서 표현한다.

  • 형식
select 테이블1.칼럼명, 케이블2.칼럼명, ...
from 테이블1, 테이블2
where 테이블1.칼럼명1 = 테이블2.칼럼명2;

📌 예제) 선수 테이블과 팀 테이블 조인

select player.player_name, player.back_no, player.team_id, 
team.team_name, team.region_name
from player, team
where player.team_id = team.team_id;
  • table alias : 여러 테이블을 사용하는 조인을 이용하는 경우 매우 유용하게 사용할 수 있다. 테이블에 대한 alias를 적용해서 SQL 문장을 작성했을 경우, where절과 select절에는 테이블명이 아닌 alias를 사용해야한다.

📌 예제) where절에 포지션이 골기퍼인 선수들에 대한 데이터만을 백넘버 순으로 출력한다.

select p.player_name, p.back_no, p.team_id, 
t.team_name, t.region_name
from player p , team t
where p.team_id = t.team_id
and p.position = 'GK'
order by p.back_no;
  • 3개 이상 테이블 조인

📌 예제) 선수명, 포지션과 선수들이 소속해 있는 팀명 및 연고지와 구장명을 출력한다. 세개의 테이블에 대한 조인이므로 where절에 2개의 조인 조건이 들어있다.

select P.player_name 선수명, P.position 포지션,
       T.team_name 팀명, T.region_name 연고지, 
       S.stadium_name 구장명
from player P, team T, stadium S
where P.team_id = T.team_id
AND T.stadium_id = S.stadium_id
order by 선수명;

2) Non EQUI JOIN

👉 '='연산자가 아닌 다른(between, >, >=, <, <= 등) 연산자들을 사용하여 조인을 수행하는 것이다.
👉 데이터 모델에 따라서 Non EQUI JOIN이 불가능한 경우도 있다.

📌 예제)

SELECT ename, sal, grade
FROM emp, salgrade
WHERE sal >= losal and sal < hisal;

select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;

📄출처 : 덕성여대 wiset SQLD 자격증 특강 강의자료

0개의 댓글