[SQLD] 2-5. WHERE
2021. 10. 29. 21:27ㆍCertificate`/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은 같은 기능
- 사용되면 기능의 차이 발생