-> 블로그 이전

[SQLD] 2-5. WHERE

2021. 10. 29. 21:27Certificate`/SQLD

WHERE (조건)

연산자 종류

구분 연산자
비교 연산자 =, >, >=, <, <=
SQL 연산자 BETWEEN a AND b, IN (list), LIKE '비교문자열', IS NULL
논리 연산자 AND, OR, NOT
부정 비교 연산자 !=, ^=, <>, NOT 컬럼명 =, NOT 컬럼명 >
부정 SQL 연산자 NOT BETWEEN a AND b, NOT IN (list), IS NOT NULL

 

연산자 우선순위

연산 우선순위 연산자
1 괄호 ()
2 NOT 연산자
3 비교 연산자, SQL 비교 연산자
4 AND
5 OR

 

비교 연산자 (=, >, >=, <, <=)

SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE POSITION='MF' AND HEIGHT >= 185;
ORDER BY HEIGHT DESC;

 

※ 문자 유형 비교 방법

구분 비교 방법
양쪽 모두 CHAR 유형 ● 길이가 서로 다른 CHAR형이면 작은쪽에 SPACE를 추가해서 길이를 같게 하고 비교
● 서로 다른 문자가 나올 때까지 비교
● 달라진 첫 번째 문자의 값에 따라 결정
● BLACK의 수만 다르면 서로 같은값
한 쪽이 VARCHAR 유형 ● 서로 다른 문자가 나올 때까지 비교
● 길이가 다르면 짧은 것이 끝날 때까지만 비교하고, 길이가 긴 것이 크다고 판단
● 길이가 같고 다른 것이 없다면 같다고 판단
● VARCHAR는 NOT NULL까지 길이를 말한다
상수값과 비교 ● 상수 쪽을 변수 타입과 동일하게 바꾸고 비교
● 변수 쪽이 CHAR 유형이면, CHAR 유형 타입의 경우를 적용
● 변수 쪽이 VARCHAR 유형이면, VARCHAR 유형 타입의 경우를 적용

 

SQL 연산자

연산자
BETWEEN a AND b
IN (list)
LIKE '비교문자열'
IS NULL

 

≫ BETWEEN a AND b

- 값 ≥ a AND 값 ≤ b

SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE (HEIGHT BETWEEN 170 AND 180) AND (WEIGHT >= 80)
ORDER BY HEIGHT DESC, WEIGHT DESC;

 

≫ IN (list)

- 리스트에 있는 값 중, 어느 하나라도 일치하면 된다

SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE (TEAM_ID IN('K02','K07')) AND (HEIGHT >= 185)
ORDER BY TEAM_ID, HEIGHT DESC;

 

≫ LIKE '비교 문자열'

- 비교 문자열과 형태가 일치하면 된다

SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE (POSITION LIKE 'MF') AND (PLAYER_NAME LIKE '김%') AND (HEIGHT >= 185)
ORDER BY TEAM_ID, HEIGHT DESC;

 

≫ IS NULL

- NULL 값인 경우

SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE POSITION IS NULL
ORDER BY 선수이름;

 

논리 연산자 (AND OR NOT)

≫ AND

- 둘 다 참 -> 결과는 참

SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE TEAM_ID = 'K02' AND HEIGHT >=185
ORDER BY HEIGHT DESC;

 

≫ OR

- 둘 중 하나만 참 -> 결과는 참

SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07') AND (POSITION='DF') AND (HEIGHT BETWEEN 170 AND 180)
ORDER BY TEAM_ID, HEIGHT DESC;

 

≫ NOT

- 반대되는 결과

SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE (NOT TEAM_ID ='K07') AND HEIGHT >= 191
ORDER BY TEAM_ID, HEIGHT DESC;

 

부정 연산자

종류 연산자
부정 논리 연산자 !=, ^=, <>, NOT 컬럼명 =, NOT 컬럼명 >
부정 SQL 연산자 NOT BETWEEN a AND b, NOT IN (list), IS NOT NULL
SELECT PLAYER_NAME 선수이름, TEAM_ID 소속팀, POSITION 포지션, NATION 국적, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE TEAM_ID != 'K02' AND POSITION ^= 'FW' AND (HEIGHT NOT BETWEEN 185 AND 210) AND (NATION IS NOT NULL)
ORDER BY TEAM_ID, HEIGHT DESC;

 

ROWNUM(Oracle) / TOP(SQL Server)

≫ ROWNUM (Pseudo Column)

- Oracle에서 사용

- 각 행에 대해 임시로 부여되는 일련번호

- 테이블이나 집합에서 원하는 만큼 행을 가져오고 싶을 때 WHERE절에서 사용

- 1행 가져오려면 ROWNUM=1, ROWNUM<2, ROWNUM<=1

- 두 건 이상의 행 가져오러면 ROWNUM <= N

- 먼저 ROWNUM을 통해서 행을 가져오고 그 다음에 ORDER BY 절이 실행된다

SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER
WHERE POSITION='MF' AND HEIGHT >= 185 AND ROWNUM<=3
ORDER BY HEIGHT DESC;

 

※ 테이블 내의 고유한 키나 인덱스 값 만들기

UPDATE MY_TABLE
SET COLUMN1 = ROWNUM;

 

≫ TOP

- SQL Server에서 사용

- 결과 집합으로 출력되는 행의 수 제한

TOP (Expression) [PERCENT] [WITH TIES];

- Expression : 반환할 행의 수 지정

- PERCENT : 처음 Expression%의 행만 반환

- WITH TIES

  • ORDER BY 절이 지정된 경우에만 사용가능
  • TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정

※ 1건의 행 가져오기

SELECT TOP(1) PLAYER_NAME
FROM PLAYER;

 

※ 2건 이상의 행 가져오기

SELECT TOP(N) PLAYER_NAME
FROM PLAYER;

 

 

※ SQL 문에서의 ORDER BY 사용

- 사용되지 않으면 ROWNUM과 TOP은 같은 기능

- 사용되면 기능의 차이 발생