04. SQL 검색 조건 지정하기

1. 04강 검색 조건 지정하기

1
SELECT 열1, 열2 FROM 테이블명 WHERE 조건식 

통상적인 데이터베이스의 테이블에는 저장된 행이 많을 것이다. 화면에 표시하여 데이터를 확인할 수 있는데, 한번에 볼 수 있는 데이터양은 한정되어 있다. 화면에 표시할 때는 행이나
열을 선택하여 데이터베이스에서 데이터를 읽어오는, 다시 말해 '검색’이 빈번하게 일어난다. 행을 선택할 때는 WHERE 구를 사용하여, 열을 선택할 때는 SELECT 구를 사용한다.

1.1. SELECT 구에서 열 지정하기

데이터를 선택할 때는 열이나 행을 한정한다. SELECT 명령어 *를 사용해서 sample 테이블의 모든 열을 취득했다. 열을 한정하기 위해서는 * 부분에 열명을 지정한다.

1
SELECT 열1, 열2 FROM 테이블명

열을 위의 구문처럼 콤마(,)를 이용하여 구분 지으며 여러 개를 지정할 수 있다. 지정한 열만 결과값으로 표시된다.

1
SELECT FROM sample; // ERROR

위와 같이 열을 전혀 지정하지 않으면 구문 에러가 발생한다. 또한 테이블에 존재하지 않는 열을 지정해도 에러가 발생한다. 열 지정 순서는 임의로 정할 수 있다.
테이블에서 열이 정의된 순서와 동일한 순으로 지정할 필요는 없다. 결과는 지정한 열의 순서대로 표시된다. 동일한 열을 중복해서 지정해도 무관하다.

1.2. WHERE 구에서 행 지정하기

테이블의 열은 많아야 몇십 개 정도지만 행은 열에 비해 훨씬 많을 수 있다. 데이터베이스의 규모에 따라 다르지만 일반적으로 수백 건에서 대규모의 경우 수천만 건의 행에 달하는 경우도 있다.
이처럼 많은 행 속에서 필요한 데이터만 검색하기 위해서는 WHERE 구를 사용한다.

WHERE 구는 FROM 구의 뒤에 표기한다. 예약어 ‘WHERE’ 뒤에 검색 조건을 표기한다. 조건에 일치하는 행만 SELECT의 결과로 반환된다.

1.2.1. WHERE 구로 행 추출

1
SELECT 열 FROM 테이블명 WHERE 조건식

1.2.2. 구의 순서와 생략

SQL에서는 구의 순서가 정해져 있어 바꿔서 적을 수 없다. FROM 구 뒤에 WHERE 구를 표기한다. 예를들어 'SELECT 구 -> WHERE 구 -> FROM 구’의 순으로 적으면 에러가 발생한다.
구에는 WHERE 구를 생략한 경우는 테이블 내의 모든 행이 검색 대상이 된다.

1.2.3. WHERE 구

조건식은 ‘열과 연산자, 상수로 구성되는 식’ 이다. WHERE 구로 행만 추출하지만 SELECT 구로 열 지정을 동시에 할 수도 있다. 구체적인 예는 아래와 같다.

1
SELECT * FROM sample;
no name birthday address
1 박준용 1976-10-18 대구광역시 수성구
2 김재진 NULL 대구광역시 동구
3 홍길동 NULL 서울특별시 마포구
1
SELECT * FROM sample WHERE no = 2;
no name birthday address
2 김재진 NULL 대구광역시 동구

1.2.4. 조건식

'no = 2’은 ‘np’ ‘=’ '2’의 세 개 항목으로 나눌 수 있다. 첫 번째 항목인 'no’는 열 이름이다. 두 번째 항목 '='는 연산자이다. 연산자란 어떤 계산을 할지 지정하는 것으로 보통 기호로
표기한다. =의 경우, 좌우로 2개 항목이 필요한 '이항 연산자’에 해당하며 일반적으로 많이 쓰이는 기호이다. = 연산자를 기준으로 좌변과 우변의 항목을 비교하고, 서로 같은 값이면 참을,
다른 값이면 거짓을 반환한다. no = 2의 조건식에서 no 열 값이 2인 행은 참이되며 1이나 3인 행은 거짓이 된다. 조건식을 만족한 (참) 행만 결괏값으로 반환된다.
= 연산자는 비교한 결괏값이 참인지 거짓인지를 반환하므로 '비교 연산자’라 부른다.

1.2.5. 값이 서로 다른 경우 ‘<>’

비교 연산자는 = 외에도 존재한다. 조건식에서 사용하는 연산자를 바꾸거나 복수의 연산자를 조합하면 복잡한 조건식을 만들 수 있다. 검색 조건으로 <> 연산자를 사용하는 예를 살펴보자.

1
SELECT * FROM sample;
no name birthday address
1 박준용 1976-10-18 대구광역시 수성구
2 김재진 NULL 대구광역시 동구
3 홍길동 NULL 서울특별시 마포구
1
SELECT * FROM sample WHERE no <> 2; // WHERE 구로 no 열 값이 2가 아닌 행만 추출
no name birthday address
1 박준용 1976-10-18 대구광역시 수성구
3 홍길동 NULL 서울특별시 마포구

이전의 조건식에서 연산자를 = 에서 <>로 바꾸었다. = 연산자가 서로 같은 값인지를 비교하는 연산자인데 반해, <> 연산자는 서로 다른 값인지를 비교하는 연산자이다. 여기서는 no 열 값이 2가 아닐 경우
참이 되므로, 값이 1과 3인 행이 화면에 표시되었다. 이와 같이 WHERE 구에서 지정한 조건식에 따라 복수의 행이 반환되는 경우도 있다. 반드시 하나의 행만 반환되는 것은 아니다. 조건식에 일치하는 행이
전혀 없는 경우에는 아무것도 반환되지 않는다.

1.3. 문자열형의 상수

이번에는 name 열을 사용해 동일한 조건으로 검색해본다.

1
SELECT * FROM sample;
no name birthday address
1 박준용 1976-10-18 대구광역시 수성구
2 김재진 NULL 대구광역시 동구
3 홍길동 NULL 서울특별시 마포구
1
SELECT * FROM sample WHERE name = '박준용'; // WHERE 구로 name 열 값이 '박준용'인 행만 검색
no name birthday address
1 박준용 1976-10-18 대구광역시 수성구

no 열이 수치형 열인 반면에, name 열은 문자열 형이다. 수치형 조건식의 경우 비교할 숫자를 그대로 조건식에 표기한다. 하지만 문자열형을 비교할 경우는 '박준용’처럼 싱글쿼트(’’)로 둘러싸 표기해야한다. 날짜시간형의 경우에도 싱글쿼트로 둘러싸 표기한다. 이때 연월일을 하이픈(-)으로 구분한다. 시간은 시분초를 콜론(:)으로 구분하여 표기한다. 문자열형의 열과 비교하기 위해서는 조건으로 지정할 값도 그 자료형에 맞춰 지정해야 한다. 한편 자료형에 맞게 표기한 상수값을 '리터럴(literal)'이라 부른다. 문자열 리터럴은 싱글쿼트로 둘러싸 표기한다.

1.4. NULL값 검색

'검색’이라고는 해도 조건식을 표기하는 것뿐이므로 간단하다. 하지만 NULL 값을 검색할 경우에는 주의해야 한다. 앞에서 배운방식대로 NULL 조건을 추가하여 조회해보자.

1
SELECT * FROM sample;
no name birthday address
1 박준용 1976-10-18 대구광역시 수성구
2 김재진 NULL 대구광역시 동구
3 홍길동 NULL 서울특별시 마포구
1
SELECT * FROM sample WHERE birthday = NULL; 
no name birthday address

birthday 열 값이 NULL인 행이 있지만 birthday = NULL과 같은 조건식으로는 검색할 수 없었다. 즉, = 연산자로 NULL을 검색할 수 없다!

1.4.1. IS NULL

NULL 값을 검색할 때는 = 연산자가 아닌 'IS NULL’을 사용해야 한다. IS NULL은 술어로 연산자의 한 종류로 생각하라.

birthday IS NULL 과 같이 사용하면 원하는 조회가 가능하다.

1
SELECT * FROM sample WHERE birthday **IS NULL**; 
no name birthday address
2 김재진 NULL 대구광역시 동구
3 홍길동 NULL 서울특별시 마포구

이제 NULL 값에 해당하는 행이 표시되었다. 반대로 NULL 값이 아닌 행을 검색하고 싶다면 IS NOT NULL을 사용하면 된다.

1.5. 비교 연산자

= 연산자와 <> 연산자, IS NULL로 검색하는 방법에 관해 알아봤다. WHERE 구로 지정하는 조건식은 참고 거짓을 반환하는 비교 연산자나 술어를 사용해서 표기할 수 있다. SQL에서는 많은 연산자 술어를 사용할 수 있다. 여기에서는 대표적인 비교 연산자에 어떤 것이 있는지를 소개한다.


  • =연산자
    좌변과 우변의 값이 같을 경우 참이 된다.
  • <> 연산자
    좌변과 우변의 값이 같지 않을 경우 참이 된다.
  • 연산자
    좌변의 값이 우변의 값보다 클 경우 참이 된다. 같거나 작을 경우는 거짓이 된다.

  • =연산자
    좌변의 값이 우변의 값보다 크거나 같을 경우 참이 된다. 작을 경우는 거짓이 된다.

  • <연산자
    좌변의 값이 우변의 값보다 작을 경우 참이 된다. 같거나 클 경우는 거짓이 된다.
  • <=연산자
    좌변의 값이 우변의 값보다 작거나 같은 경우 참이 된다. 클 경우는 거짓이 된다.

< 연산자와 > 연산자는 대소관계를 비교하는 연산자이지만 =을 붙임으로써 서로 값이 같은 경우도 비교할 수 있다. =은 < 과 >의 뒤에 붙인다. <= 나 >=와 같이 사용해야 한다. 또한 <, >와 = 사이에 스페이스를 넣으면 <(또는 >)와 = 로 연산자가 두 개라고 판단하여 에러가 난다.