Deperecated/SQLD

SQLD - WHERE절

누알라리 2020. 2. 16. 22:20
1. WHERE 조건절 개요

- 사용자들은 자신이 원하는 자료만을 검색하기 위해서 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한할 수 있다.

- WHERE 절에는 두 개 이상의 테이블에 대한 조인 조건을 기술하거나 결과를 제한하기 위한 조건을 기술할 수도 있다.

- 현실의 데이터베이스는 많은 사용자나 프로그램들이 동시에 접속하여 다량의 트랜잭션을 발생하고 있다.

 

- WHERE 조건절을 사용하지 않고 필요 없는 많은 자료들을 데이터베이스로부터 요청하는 SQL 문장은 대량의 데이터를 검색하기 위해 데이터베이스가 설치되어 있는 서버의 CPU 나 MEMORY 와 같은 시스템 자원(Resources)들을 과다하게 사용한다.

- 많은 사용자들의 QUERY 에 대해 바로바로 처리를 해주지 못하게 되고, 또한 검색된 많은 자료들이 네트워크를 통 해서 전달됨으로써 문제점들을 발생시킨다.

 

- 이런 문제점을 방지하기 위해 WHERE 절에 조건이 없는 FTS(Full Table Scan) 문장은 SQL 튜닝의 1차적인 검토 대상이 된다. (FTS 가 무조건 나쁜 것은 아니며 병렬 처리 등을 이용해 유용하게 사용 하는 경우도 많다.)

 

- 기본적인 SQL 문장은 Oracle 의 경우 필수적으로 SELECT 절과 FROM 절로 이루어져 있다.

 

- SQL Server, Sybase 문장은 SELECT 목록에 상수, 변수 및 산술식(열 이름 없이)만 포함되는 경우는 FROM 절이 필요 없지만, 테이블의 칼럼이 사용된 경우는 FROM 절이 필요하다.

 

- WHERE 절은 조회하려는 데이터에 특정 조건을 부여할 목적으로 사용하기 때문에 FROM 절 뒤에 오게 된다.

SELECT (DISTINCT/ALL) 칼럼명 (ALIAS 명) FROM 테이블명 WHERE 조건식;

 

2. 연산자의 종류
  1. 비교 연산자 (부정 비교 연산자 포함)
  2. SQL 연산자 (부정 SQL 연산자 포함)
  3. 논리 연산자

3. 비교 연산자

= , > , >= , < , <=

 

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

2) 연산자로 나누기
1) 소속팀코드 = 삼성블루윙즈팀 코드(K02) 2) 소속팀코드 = 전남드래곤즈팀 코드(K07) 3) 포지션 = 미드필 더 코드(MF) 4) 키 >= 170 센티미터 5) 키 <= 180 센티미터

3) 예제 및 실행 결과
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 FROM PLAYER WHERE TEAM_ID = 'K02' ;

mysql> SELECT PLAYER_NAME, PLAYER_ID FROM PLAYER WHERE TEAM_ID = 'K07';
+-------------+-----------+
| PLAYER_NAME | PLAYER_ID |
+-------------+-----------+
| 유현지      | 1995124   |
| 이운재      | 1997035   |
| 기성용      | 1998753   |
| 박지성      | 2002007   |
| 이청용      | 2002010   |
+-------------+-----------+
5 rows in set (0.00 sec)

4. SQL 연산자

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

 

1) 문제

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


2) SQL 연산자로 나누기
1) 소속팀코드 IN('K02', 'K07')
2) 포지션 LIKE 'MF'
3) 키 BETWEEN 170 AND 180


3) 예제 및 실행 결과 

 SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 FROM PLAYER WHERE TEAM_ID IN ('K02','K07');

mysql> SELECT PLAYER_NAME, PLAYER_ID FROM PLAYER WHERE TEAM_ID IN('K07');
+-------------+-----------+
| PLAYER_NAME | PLAYER_ID |
+-------------+-----------+
| 유현지      | 1995124   |
| 이운재      | 1997035   |
| 기성용      | 1998753   |
| 박지성      | 2002007   |
| 이청용      | 2002010   |
+-------------+-----------+
5 rows in set (0.00 sec)

mysql> SELECT PLAYER_NAME, PLAYER_ID FROM PLAYER WHERE HEIGHT BETWEEN 300 AND 400;
+-------------+-----------+
| PLAYER_NAME | PLAYER_ID |
+-------------+-----------+
| 유현지      | 1995124   |
| 이운재      | 1997035   |
| 박지성      | 2002007   |
| 이청용      | 2002010   |
+-------------+-----------+
4 rows in set (0.00 sec)

mysql>

1. IN(list) 연산자

- 리스트 안에 괄호 중요

- 다중 리스트 매우 유용.

mysql> SELECT PLAYER_NAME, PLAYER_ID FROM PLAYER WHERE (TEAM_ID, HEIGHT) IN (('K07','400'));
+-------------+-----------+
| PLAYER_NAME | PLAYER_ID |
+-------------+-----------+
| 유현지      | 1995124   |
| 이운재      | 1997035   |
| 박지성      | 2002007   |
| 이청용      | 2002010   |
+-------------+-----------+
4 rows in set (0.00 sec)

 

2. LIKE 연산자

- LIKE 의 사전적 의미는 ‘~와 같다’이다. 따라서 위와 같은 경우라면 비교 연산자인 ‘=’을 사용해서 작성해도 같은 결과를 얻을 수 있을 것이다.

- 그러나 만약 “장”씨 성을 가진 선수들을 조회할 경 우는 어떻게 할까? 이런 문제를 해결하기 위해서 LIKE 연산자에서는 와일드카드(WildCard)를 사용 할 수 있다.

 

- 와일드카드(WildCard)란 한 개 혹은 0 개 이상의 문자를 대신해서 사용하기 위한 특수 문자를 의미하며, 이를 조합하여 사용하는 것도 가능하므로 SQL 문장에서 사용하는 스트링 (STRING) 값으로 용이하게 사용할 수 있다.

 

mysql> SELECT PLAYER_ID, TEAM_ID FROM PLAYER WHERE PLAYER_NAME LIKE '이%';
+-----------+---------+
| PLAYER_ID | TEAM_ID |
+-----------+---------+
| 1997035   | K07     |
| 2002010   | K07     |
+-----------+---------+
2 rows in set (0.00 sec)

3. BETWEEN a AND b

 

4. IS NULL 연산자

mysql> SELECT * FROM PLAYER;
+-----------+-------------+---------+---------------+------------+----------+----------+--------+---------+-----------+-------+--------+--------+
| PLAYER_ID | PLAYER_NAME | TEAM_ID | E_PLAYER_NAME | NICKNAME   | JOIN_YYY | POSITION | NATION | BACK_NO | BIRH_DATE | SOLAR | HEIGHT | WEIGHT |
+-----------+-------------+---------+---------------+------------+----------+----------+--------+---------+-----------+-------+--------+--------+
| 1995124   | 유현지      | K07     | NULL          | NULL       | NULL     | NULL     | NULL   |    NULL | NULL      | NULL  |    400 |   NULL |
| 1997035   | 이운재      | K07     | NULL          | NULL       | NULL     | NULL     | NULL   |    NULL | NULL      | NULL  |    400 |   NULL |
| 1998753   | 기성용      | K07     | NULL          | NULL       | NULL     | NULL     | NULL   |    NULL | NULL      | NULL  |   NULL |   NULL |
| 2002007   | 박지성      | K07     | NULL          | NULL       | NULL     | MF       | NULL   |       7 | NULL      | NULL  |    400 |     73 |
| 2002010   | 이청용      | K07     |               | BlueDragon | 2002     | MF       |        |      17 | NULL      | 1     |    400 |     67 |
+-----------+-------------+---------+---------------+------------+----------+----------+--------+---------+-----------+-------+--------+--------+
5 rows in set (0.00 sec)

mysql> SELECT PLAYER_NAME FROM PLAYER WHERE HEIGHT IS NULL;
+-------------+
| PLAYER_NAME |
+-------------+
| 기성용      |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT PLAYER_NAME FROM PLAYER WHERE HEIGHT IS NOT NULL;
+-------------+
| PLAYER_NAME |
+-------------+
| 유현지      |
| 이운재      |
| 박지성      |
| 이청용      |
+-------------+
4 rows in set (0.00 sec)

 

5. 논리 연산자

NOT, AND, OR

- 논리 연산자들 이 여러 개가 같이 사용되었을 때의 처리 우선순위는 ( ), NOT, AND, OR 의 순서대로 처리된다.

1) 문제
“소속이 삼성블루윙즈”인 조건과 “키가 170 센티미터 이상”인 조건을 연결해 보면 “

2) 예시
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 FROM PLAYER WHERE TEAM_ID = 'K02' AND HEIGHT >= 170;
mysql> SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID IN ('K07') OR NICKNAME IS NULL OR HEIGHT >= 300;
+-------------+
| PLAYER_NAME |
+-------------+
| 유현지      |
| 이운재      |
| 기성용      |
| 박지성      |
| 이청용      |
+-------------+
5 rows in set (0.00 sec)

 

6. 부정 연산자

!=, ^=, <> , NOT 칼럼명 = , NOT 칼럼명 > , NOT BETWEEN A AND B, NOT IN(list), IS NOT NULL

mysql> SELECT * FROM PLAYER;
+-----------+-------------+---------+---------------+------------+----------+----------+--------+---------+-----------+-------+--------+--------+
| PLAYER_ID | PLAYER_NAME | TEAM_ID | E_PLAYER_NAME | NICKNAME   | JOIN_YYY | POSITION | NATION | BACK_NO | BIRH_DATE | SOLAR | HEIGHT | WEIGHT |
+-----------+-------------+---------+---------------+------------+----------+----------+--------+---------+-----------+-------+--------+--------+
| 1995124   | 유현지      | K07     | NULL          | NULL       | NULL     | NULL     | NULL   |    NULL | NULL      | NULL  |    400 |   NULL |
| 1997035   | 이운재      | K07     | NULL          | NULL       | NULL     | NULL     | NULL   |    NULL | NULL      | NULL  |    400 |   NULL |
| 1998753   | 기성용      | K07     | NULL          | NULL       | NULL     | NULL     | NULL   |    NULL | NULL      | NULL  |   NULL |   NULL |
| 2002007   | 박지성      | K07     | NULL          | NULL       | NULL     | MF       | NULL   |       7 | NULL      | NULL  |    400 |     73 |
| 2002010   | 이청용      | K07     |               | BlueDragon | 2002     | MF       |        |      17 | NULL      | 1     |    400 |     67 |
+-----------+-------------+---------+---------------+------------+----------+----------+--------+---------+-----------+-------+--------+--------+
5 rows in set (0.00 sec)

mysql> SELECT PLAYER_NAME FROM PLAYER WHERE NICKNAME IS NOT NULL;
+-------------+
| PLAYER_NAME |
+-------------+
| 이청용      |
+-------------+
1 row in set (0.00 sec)

 

7. ROWNUM, TOP 사용

1. ROWNUM 

- Oracle의 ROWNUM은 칼럼과 비슷한 성격의 Pseudo Column 으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호이다.

- 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.

 

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

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1;

- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1;

 

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;

 

2. TOP 절

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

TOP (Expression) (PERCENT) (WITH TIES)
- Expression = 반환할 행의 수를 지정하는 숫자.
- PERcENT : 쿼리 결과 집합에서 처음 Expression의 행만 반환됨을 나타낸다.

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

- SELECT TOP(1) PLAYER_NAME FROM PLAYER;

 

N 행을 가져오고 싶을 때는

- SELECT TOP(N) PLAYER_NAME FROM PLAYER; 

 

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

'Deperecated > SQLD' 카테고리의 다른 글

SQLD - 함수(FUNCTION)  (0) 2020.02.17
SQLD - TCL  (0) 2020.02.16
SQLD - DML  (0) 2020.02.14
SQLD - DDL  (0) 2020.02.14