메뉴 건너뛰기

bysql.net

제5절_WHERE_절

2011.09.21 21:57

실천하자 조회 수:7023

5. WHERE 절

  • 사용자들은 자신이 원하는 자료만을 검색하기 위해서 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한
  • WHERE 절에 조건이 없는 FTS(Full Table Scan) 문장은 SQL 튜닝의 1차적인 검토 대상이 된다.

  (FTS가 무조건 나쁜 것은 아니며 병렬 처리 등을 이용해 유용하게 사용하는 경우도 많다.)

  • WHERE 절의 JOIN 조건에 대해서는 1장 9절에서 설명하고 FROM 절의 JOIN에 대해서는 2장 1절에서 설명


    ※ 참고

SQL Server, Sybase 문장은 SELECT 목록에 상수, 변수 및 산술식(열 이름 없이)만 포함되는 경우는 FROM 절이 필요 없지만, 

테이블의 칼럼이 사용된 경우는 FROM 절이 필요

(Oracle 에선 From 절이 필수, 테이블 컬럼이 사용되지 않는 경우 DUAL 이용)



연산자의 종류


문자 유형간의 비교 조건



연산자의 우선순위

연산자의 우선순위를 살펴보면 다음과 같다.

- 괄호로 묶은 연산이 제일 먼저 연산 처리된다.

- 연산자들 중에는 부정 연산자(NOT)가 먼저 처리되고,

- 비교 연산자(=,>,>=,<,<=), SQL 비교 연산자(BETWEEN a AND b, IN (list), LIKE, IS NULL)가 처리되고,

- 논리 연산자 중에서는 AND, OR의 순으로 처리된다.

만일 이러한 연산에 있어서 연산자들의 우선순위를 염두에 두지 않고 WHERE 절을 작성한다면 테이블에서 자기가 원하는 자료를 찾지 못하거나, 혹은 틀린 자료인지도 모른 채 사용할 수도 있다. 실수하기 쉬운 비교 연산자와 논리 연산자의 경우 괄호를 사용해서 우선순위를 표시하는 것을 권고함


예제

소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들이어야 하고, 포지션이 미드필더(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;

 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;

 실행

결과

 선수이름 포지션 백넘버  키

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

  김성환     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개의 행 선택

 선수이름 포지션 백넘버  키

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

  가비       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 논리 연산자를 먼저 실행하기 때문에 잘못된 결과를 나타낸 것이다. 논리 연산자들이 여러 개가 같이 사용되었을 때의 처리 우선순위는 ( ), NOT, AND, OR의 순서대로 처리된다.



ROWNUM, TOP 사용


  • ROWNUM

Oracle의 ROWNUM은 칼럼과 비슷한 성격의 Pseudo Column으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호이며, 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.

건의 행만 가져오고 싶을 때는 - 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 행을 가져오고 싶을 때는 ROWNUM = N; 처럼 사용할 수 없으며 - SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N; 이나 - SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM

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

  • TOP 절

SQL Server는 TOP 절을 사용하여 결과 집합으로 출력되는 행의 수를 제한할 수 있다. TOP 절의 표현식은 다음과 같다.

TOP (Expression) / PERCENT/ WITH TIES

- Expression : 반환할 행의 수를 지정하는 숫자이다. - PERCENT : 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨을 나타낸다. - WITH TIES : ORDER BY 절이 지정된 경우에만 사용할 수 있으며, TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.

한 건의 행만 가져오고 싶을 때는 - SELECT TOP(1) PLAYER_NAME FROM PLAYER; 처럼 사용할 수 있다.

두 건 이상의 N 행을 가져오고 싶을 때는 - SELECT TOP(N) PLAYER_NAME FROM PLAYER; 처럼 출력되는 행의 개수를 지정할 수 있다.

SQL 문장에서 ORDER BY 절이 사용되지 않으면 Oracle의 ROWNUM과 SQL Server의 TOP 절은 같은 기능을 하지만, ORDER BY 절이 같이 사용되면 기능의 차이가 발생한다. 이 부분은 1장 8절 ORDER BY 절에서 설명하도록 한다.




   ※ 자료출처 : DBguide.Net

http://www.dbguide.net/db.db?cmd=view&boardUid=148193&boardConfigUid=9&categoryUid=216&boardIdx=134&boardStep=1


  • SQL 개발자 자격증 (bysql.net 2011년 2차 스터디)
  • 작성자: 위충환 (실천하자)
  • 최초작성일: 2011년 09월 21 일
  • 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
  • 문서의 잘못된 점이나 질문사항은 본 문서에 댓글로 남겨주세요. ^^