좋습니다.
3. SELECT로 특정 데이터 추출하기 본문
* WHERE 조건과 비교 연산자
- 원하는 행 (ROW)만 얻으려면 다음과 같이 SELECT문에 WHERE절을 추가하여 조건을 제시해야함
SELECT [column1,column2]
FROM table
WHERE 조건절;
조건절의 구성
WHERE column >= 3000;
컬럼명 연산자 비교대상값
* 비교연산자
연산자 |
의미 |
예제 |
= |
같다 |
SELECT NAME, AGE, PHONE FROM PROFILE WHERE AGE = 28; |
>, < |
보다크다, 보다작다 |
SELECT NAME, AGE, PHONE FROM PROFILE WHERE AGE > 28; |
>=, <= |
보다 크거나 작다 보다 작거나 크다 |
SELECT NAME, AGE, PHONE FROM PROFILE WHERE AGE >= 28; |
<>, !=, ^= |
다르다 |
SELECT NAME, AGE, PHONE FROM PROFILE WHERE AGE <> 28; |
Q. 나이가 18살 이하인 사람의 이름,나이,휴대폰번호를 출력하는 SQL문을 작성해보자.
Table : PROFILE
Column : 이름 - NAME
나이 - AGE
휴대폰번호 - PHONE
* 문자 데이터 조회
- 이름이 ANNE인 사람의 NAME, AGE, PHONE을 출력
SELECT NAME, AGE, PHONE
FROM PROFILE
WHERE NAME = 'ANNE'
- SQL에서 문자열이나 날짜는 반드시 단일따옴표 안에 표시해야함
- SQL문에 사용되는 키워드인 SELECT나 FROM이나 WHERE등은 대소문자를 구별하지 않지만
테이블 내에 저장된 데이터값은 대소문자를 구분하므로 WHERE NAME = 'anne' 와 같이
기술하면 이름이 ANNE인 사람을 찾을수가 없다.
Q. 이름이 STEVE인 사람의 이름, 나이, 핸드폰번호를 출력하는 SQL문을 작성해보자.
테이블명 |
유형 |
칼럼명 |
PROFILE |
이름 |
NAME |
나이 |
AGE | |
핸드폰번호 |
PHONE |
* 날짜 데이터 조회
- 날짜는 문자열과 마찬가지로 단일 따옴표 안에 기술해야함
1989년 5월 18일 이후 출생한 사람을 출력하는 예제
SELECT *
FROM PROFILE
WHERE BIRTHDAY >= '1989/05/18'
* 논리 연산자
연산자 |
의미 |
AND |
두 가지 조건을 모두 만족해야만 검색할 수 있다. SELECT * FROM PROFILE WHERE AGE = 18 AND NAME = 'ANNE' |
OR |
두 가지 조건 중 한가지만 만족하더라도 검색할 수 있다. SELECT * FROM PROFILE WHERE AGE = 18 OR NAME = 'STEVE' |
NOT |
조건에 만족하지 못하는 것만 검색한다. SELECT * FROM PROFILE WHERE NOT AGE = 18 |
* BETWEEN AND 와 NOT BETWEEN AND
- PROFILE 테이블에서 나이가 15세이상 19세이하인 사람의 정보를 출력하려고 하면?
SELECT *
FROM PROFILE
WHERE AGE >= 15 AND AGE <=19 ;
로 표현할 수 있다.
하지만, 오라클에서는 특정 범위의 값을 조회하기 위해 BETWEEN AND 연산자를 사용해서
출력할 수 있다.
SELECT *
FROM PROFILE
WHERE AGE BETWEEN 15 AND 19 ;
- PROFILE 테이블에서 나이가 15세 미만이거나 19세 초과인 사람의 정보를 출력하려고 하면?
SELECT *
FROM PROFILE
WHERE AGE < 15 OR AGE > 19 ;
로 표현가능하지만 NOT BETWEEN AND로 표현할 수 있다.
SELECT *
FROM PROFILE
WHERE AGE NOT BETWEEN 15 AND 19 ;
- BETWEEN AND 연산자는 숫자형 뿐만 아니라 문자형,날짜형에도 사용가능
단, 값을 단일 따옴표로 둘러야 한다.
태어난 해가 1989년인 사람들의 정보를 출력하는 예제
SELECT *
FROM PROFILE
WHERE BIRTHDAY BETWEEN '1989/01/01' AND '1989/12/31' ;
* IN 연산자
- PROFILE 테이블에서 나이가 13살 이거나 15살이거나 19살인 사람을 검색하기 위한 쿼리문을 작성하면?
SELECT *
FROM PROFILE
WHERE AGE = 13 OR AGE = 15 OR AGE = 19 ;
위 예제를 보면 OR연산자로 묶인 비교 연산자 내의 컬럼이 AGE로 동일하다.
동일한 필드가 여러개의 값 중에 하나인 경우인지를 살펴보기 위해서
비교연산자와 OR 연산자를 사용하여 복잡하게 쿼리문을 작성하지 않고
IN연산자를 사용하여 간단하게 표현할 수 있다.
SELECT *
FROM PROFILE
WHERE AGE IN (13, 15, 19) ;
위 IN연산자를 사용한 예제와 OR연산자를 사용한 예제는 결과가 동일하다.
만일 13살, 15살, 19살이 아닌 사람을 검색하려면
NOT IN으로 대체하면 된다.
SELECT *
FROM PROFILE
WHERE AGE NOT IN (13, 15, 19) ;
* LIKE 연산자와 와일드카드
- LIKE 연산자는 검색하고자 하는 값을 정확히 모를 경우에도 검색이 가능하도록 하기위해
와일드카드와 함께 사용하여 원하는 내용을 검색하도록 한다.
형식 |
Column_name LIKE pattern (와일드카드) |
- LIKE 다음에 오는 pattern을 기술해야 하는데 pattern에는 두가지 와일드카드가 사용된다.
와일드카드 |
의미 |
% |
문자가 없거나, 하나 이상의 문자가 어떤 값이 와도 상관없다. |
_ |
하나의 문자가 어떤 값이 와도 상관없다. |
- 와일드카드 ( % ) 사용하기
PROFILE 테이블에서 찾으려는 이름이 A로 시작하는 것은 알지만 그 뒤의 문자는 모를경우
WHERE NAME = 'A' 로 검색을 시도하면 검색이 불가능 하다.
이는 'A' 한 글자에 대한 검색이기 때문이다.
이처럼 검색하고자 하는 값을 정확히 모를 경우 와일드카드인 %를 사용한다.
SELECT *
FROM PROFILE
WHERE NAME LIKE 'A%' ;
위 예제의 경우 LIKE 'A%' 로 인해 A로 시작하는 이름중 A뒤로 몇글자가 와도 상관없다는 의미가 된다.
반대로 WHERE NAME LIKE '%A' 는 마지막 글자가 A
WHERE NAME LIKE '%A%' 는 중간에 포함된 문자들중 A가 있는것을 검색한다.
- 와일드카드 ( _ ) 사용하기
_ (under score) 역시 %와 마찬가지로 어떤 문자가 오든 상관없다는 의미로 사용된다.
하지만 차이점은 %는 몇개의 문자가 와도 상관없지만 _ 는 한 문자에 대해서 와일드카드 역할을 한다.
SELECT *
FROM PROFILE
WHERE NAME LIKE 'A_' ;
위 예제는 A로 시작하는 두글자의 이름을 가진 사람의 정보를 찾는다.
SELECT *
FROM PROFILE
WHERE NAME LIKE '_A%' ;
이런식으로 사용하게되면 이름의 두번째 글자가 A인 사람의 정보를 찾는다.
- LIKE 연산자 역시 NOT LIKE 로 사용하게 되면 LIKE의 부정의 의미로 사용된다.
SELECT *
FROM PROFILE
WHERE NAME NOT LIKE '%S%' ;
위 예제는 이름의 S를 포함하지 않는 사람의 정보를 찾는다.
* NULL
- NULL의 정의
1. 0 (zero) 가 아니다.
2. 빈 공간도 아니다.
3. 미확정 (해당사항없음), 알수없는 (Unknown)값을 의미한다.
4. 어떤 값인지 알 수 없지만 어떤 값이 존재하고 있다.
5. ? 혹은 ∞ 의 의미이므로 연산, 할당, 비교가 불가능하다.
- 만약 PROFILE 테이블에서 휴대폰번호를 검색할때 휴대폰이 없어서 값이 NULL인 사람을 검색한다면?
SELECT *
FROM PROFILE
WHERE PHONE = NULL ;
만약 위처럼 한다면 선택된 레코드가 없다고 나온다.
즉, NULL의 경우 연산이 불가능하므로 = 연산자로 판단할 수 없기 때문이다.
- IS NULL / IS NOT NULL
어떤 컬럼의 NULL값을 검색해야 할때는 = 대신 IS NULL 연산자를 사용해야 한다.
형식 |
Column IS NULL ; |
그럼 이제 위 예제인 휴대폰이 없어 값이 NULL인 사람을 검색해보자.
SELECT *
FROM PROFILE
WHERE PHONE IS NULL ;
이번에는 휴대폰을 가지고 있는 사람을 검색해보자. (PHONE 칼럼의 값이 NULL이 아닌사람)
SELECT *
FROM PROFILE
WHERE PHONE IS NOT NULL ;
* 정렬을 위한 ORDER BY
- 정렬 방식에는 오름차순 (ascending), 내림차순 (descending) 이 있다.
|
ASC (오름차순) |
DESC (내림차순) |
숫자 |
작은 값부터 정렬 |
큰 값부터 정렬 |
문자 |
사전 순서로 정렬 |
사전 반대 순서로 정렬 |
날짜 |
빠른 날짜 순서로 정렬 |
늦은 날짜 순서로 정렬 |
NULL |
가장 마지막에 나온다. |
가장 먼저 나온다. |
- 오름차순 (ASC)
오름차순은 작은값부터 큰값으로 정렬하는 것을 의미한다.
다음은 PROFILE 테이블에서 생년월일을 기준으로 오름차순 정렬한 예제이다.
SELECT *
FROM PROFILE
ORDER BY BIRTHDAY ASC ;
// 만약 ASC를 생략한 경우 ORDER BY는 디폴트가 ASC로 지정되어 있기 때문에 오름차순이 된다.
- 내림차순 (DESC)
내림차순은 반대로 큰값부터 작은 값으로 정렬한다.
SELECT *
FROM PROFILE
ORDER BY BIRTHDAY DESC ;
// 위 같은 경우 BIRTHDAY는 날짜형이라는 가정하에 늦은 날짜 순으로 정렬된다.
즉 생년월일 이므로 생년월일이 가장 늦은, 나이가 어린 사람에서 많은사람 순으로 정렬된다.
- ORDER BY 에서 정렬방식에 여러가지 조건 제시
만약 나이가 많은 사람부터 적은 사람 순으로 출력하면서, 만일 생년월일이 같을 경우
이름의 철자가 빠른사람 순으로 정렬해볼수 있다.
SELECT *
FROM PROFILE
ORDER BY BIRTHDAY ASC, NAME ASC ;
// 콤마 ( , )로 구분한다. (and 연산자 X)
'공부 > ORACLE' 카테고리의 다른 글
6. 오라클 SQL 조인 (0) | 2016.07.16 |
---|---|
5. 오라클 SQL - 그룹 함수 (0) | 2016.07.15 |
4. SQL 의 주요 함수 (0) | 2016.07.07 |
2. SQL의 기본 (0) | 2016.07.06 |
1. 데이터베이스의 개념 (0) | 2016.07.05 |