# 4. 자격증/SQLD

SQLD 자격증 # SQL 기본(과목2)_WHERE 절

둥굴둥굴둥굴레차 2021. 11. 11. 20:51

5. WHERE 

  • 사용자들은 자신이 원하는 자료만을 검색하기 위해서 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한
  • WHERE 절에 조건이 없는 FTS(Full Table Scan) 문장은 SQL 튜닝의 1차적인 검토 대상이 된다.
    (FTS가 무조건 나쁜 것은 아니며 병렬 처리 등을 이용해 유용하게 사용하는 경우도 많다.)

 

연산자의 종류

 

 

 

예제

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

 

1) 소속팀이 삼성블루윙즈 OR 소속팀이 전남드래곤즈 

2) AND 포지션이 미드필더 

3) AND 키는 170 센티미터 이상 

4) AND 키는 180 센티미터 이하


잘못된 쿼리

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;

 

(괄호가 누락됨으로서 OR 논리 연산자보다 AND 논리 연산자를 먼저 실행)

 

선수이름 포지션 백넘버  

 -------- ------ ------ ----

  김성환     DF     5   183

  가비       MF    10   177

  강대희     MF    26   174

  고종수     MF    22   176

  고창현     MF     8   170

  정기범     MF    28   173

  정동현     MF    25   175

  정두현     MF     4   175

  정준       MF    44   170

  정진우     DF     7   179

  데니스     FW    11   176

                   

  66개의 행 선택

 

 

올바른 쿼리

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;

 

선수이름 포지션 백넘버  

 -------- ------ ------ ----

  가비       MF    10   177

  강대희     MF    26   174

  고종수     MF    22   176

  고창현     MF     8   170

  정기범     MF    28   173

  정동현     MF    25   175

  정두현     MF     4   175

  정준       MF    44   170

  오규찬     MF    24   178

  윤원일     MF    45   176

  김동욱     MF    40   176

                   

  33개의 행 선택

 

실행 결과의 내용을 보면 포지션이 미드필더(MF: MidFielder)가 아닌 선수들의 명단이 출력되었다원하는 데이터는 삼성블루윙즈이거나 전남드래곤즈 중 포지션이 미드필더(MF: Midfielder)인 선수들에 대한 자료만 요청했는데 포지션이 DF나 FW인 선수가 같이 출력된 것이다

 

예제에서 소속팀 코드가 삼성블루윙즈(K02) 이거나 전남드래곤즈(K07)”라는 조건을 만족하고 포지션이 미드필더(MF)”인 조건을 동시에 만족해야 하는데위의 SQL 문장에서는 괄호가 누락됨으로서 OR 논리 연산자보다 AND 논리 연산자를 먼저 실행하기 때문에 잘못된 결과를 나타낸 것이다

 

논리 연산자 처리 우선순위

  1. ( )
  2. NOT
  3. AND
  4. OR 

 

ROWNUM, TOP 사용

(1) ROWNUM

WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.

 

1건의 행만 가져오고 싶을 때는

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1;

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1;

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <2;

두 건 이상의 행을 가져오고 싶을 때는 ROWNUM = N; 처럼 사용할 수 없으며

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM

 

추가적인 ROWNUM의 용도로는 테이블 내의 고유한 키나 인덱스 값을 만들 수 있다.

- UPDATE MY_TABLE SET COLUMN1 = ROWNUM;

 

(2) TOP

결과 집합으로 출력되는 행의 수를 제한할 수 있다.

TOP (Expression) / PERCENT/ WITH TIES

- Expression : 반환할 행의 수를 지정하는 숫자이다.

- PERCENT : 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨을 나타낸다.

- WITH TIES : ORDER BY 절이 지정된 경우에만 사용할 수 있으며, TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.

 

한 건의 행만 가져오고 싶을 때는

- SELECT TOP(1) PLAYER_NAME FROM PLAYER;

 

두 건 이상의 행을 가져오고 싶을 때는

- SELECT TOP(N) PLAYER_NAME FROM PLAYER;