TigerCow.Door


안녕하세요. 문범우입니다.

이번 포스팅에서도 SELECT 문을 기반으로 한 심화적인 내용에 대해서 알아보겠습니다.

LIKE 연산자와 ORDER BY, TOP(n) 등에 대해서 함께 알아보도록 하겠습니다.



1. LIKE


만약, 다음과 같은 조건에 대한 데이터를 조회하려면 어떻게 해야 할까요?


"이씨 성인 사람의 데이터를 조회하라."

"이름에 '범'이 들어가는 사람의 데이터를 조회하라"


우리가 이전에 배운 내용들로 쉽게 할 수 있을까요?

위와 같이 정확하게 어떤 값인지 모르지만 검색이 필요한 경우가 있을 것입니다.

우리는 이럴때 검색을 용이하게 하기 위해서 와일드카드를 사용합니다.

와일드카드로는 '%'와 '_' 두 개의 특수 문자가 존재하는데 각각의 의미하는 바는 다음과 같습니다.


% : 문자가 없거나, 한개이상의 어떠한 문자도 대치함. 즉 0~무한대의 글자가 될 수 있음.

_ : 어떠한 문자가 와도 되지만 단 한글자를 의미함.


설명이 대략적으로 이해가 가시나요?

아래 예제 쿼리들을 통해 확인해보도록 합시다.


먼저, 이름의 성이 '이'씨인 사람들을 찾아보도록 합니다.


SELECT * FROM employee

WHERE empName LIKE '이%';



위와 같이 이름의 첫글자가 '이'로 시작되는 데이터들이 조회되었습니다.

그럼 이번엔 이름에 '범'이 들어가는 데이터를 조회해보도록 합시다.


SELECT * FROM employee

WHERE empName LIKE '%범%';



위와 같이 이름에 '범'이 들어가는 모든 데이터가 조회되었습니다.

그런데 이름의 가운데 글자가 '범'인 사람의 데이터를 조회하고 싶을 때는 어떻게 할까요?

위에서 사용된 '%' 말고, '_'를 사용하면 됩니다.


SELECT * FROM employee

WHERE empName LIKE '_범_';



이렇게 언더바(_) 와일드카드는 무조건 그 자리에 한글자의 문자가 존재해야 합니다.

하지만 퍼센트(%) 와일드카드는 0 ~ 무한대 글자를 포함하기 때문에 와일드카드 위치에 문자가 없어도 되고, 여러 문자가 있어도 되는 것이죠.


언더바와 퍼센트 와일드 카드의 차이점을 한번 더 확인해보도록 하죠.


SELECT * FROM employee

WHERE empName LIKE '장%';



SELECT * FROM employee

WHERE empName LIKE '장_';



언더바와 퍼센트의 차이를 아시겠나요?


또한 LIKE 연산자는 NOT을 붙여서 반대의 의미로도 사용할 수 있습니다.


예를 들어, 이름에 '우'가 들어가지 않는 사람들의 데이터를 조회하고자 한다면 다음과 같이 할 수 있습니다.


SELECT * FROM employee

WHERE empName NOT LIKE '%우%';





2. IS NULL / IS NOT NULL


이번에는 NULL 체크시에 자주 사용되는 IS NULL / IS NOT NULL에 대해서 알아보겠습니다.

IS NULL / IS NOT NULL 은 간단하니 바로 예제 쿼리를 보고 확인해보도록 하겠습니다.


SELECT * FROM employee

WHERE manager IS NULL;



위와 같이 사용됩니다.

또한 주로는 아래와 같이 특정 칼럼값이 NULL이 아닌 데이터들만 조회하는데 주로 사용됩니다.


SELECT * FROM employee

WHERE commission IS NOT NULL;





3. ORDER BY


이번에 배워볼 구문은 ORDER BY 로써, 정렬을 하는데 사용하는 것 입니다.

만약 salary 값의 오름차순으로 데이터를 정렬해서 보여달라고 할 땐 어떻게 할까요?

아래 쿼리와 같이 ORDER BY 를 사용하고 어떤 컬럼을 기준으로 할지 함께 적어주면 됩니다.


SELECT * FROM employee

ORDER BY salary ASC;



이때 ASC는 오름차순을 뜻하며, 내림차순은 DESC 입니다.

만약 둘 중 아무것도 적어주지 않으면  기본적으로 오름차순 정렬이 됩니다.


그런데 결과를 보시면 첫번째와 두번째행의 salary가 250으로 같습니다.

추가적으로 이럴경우에는 empNo의 내림차순으로 정렬하고 싶어한다면 어떻게 할까요?

다음과 같이 이전의 쿼리에서 ORDER BY 뒤에 두번째로 정렬할 기준은 무엇인지 함께 적어주면 됩니다.


SELECT * FROM employee

ORDER BY salary ASC, empNo DESC;





4. TOP(n)


이번 포스팅에서 마지막으로 알아볼 것은 TOP(n) 입니다. 

TOP(n)은 결과 데이터의 상위 n개만 보여주라는 명령어입니다.

이는 MS SQL Server에서의 특징인데, 다른 데이터베이스에서는 LIMIT등으로 표현되고는 합니다.

TOP은 이전과 다르게 FROM 이후에 적어주는 것이 아니라 다음 쿼리와 같이 SELECT 뒤에 적어줍니다.


SELECT TOP 4 * FROM employee

ORDER BY salary;



위와 같이 TOP 뒤에 오는 숫자는 괄호로 묶지 않아도 괜찮습니다.


그런데 기존의 데이터를 보면 salary가 300인 사람은 2명입니다.

위의 쿼리와 같이 결과를 확인하면 salary가 300으로 동점인 2명 중 한명만 출력되고 있는 것인데, 만약 위와 같이 동점이 존재할 때, 모든 동점자를 함께 출력하려면 TOP n 뒤에 WITH TIES 옵션을 같이 붙여주면 됩니다.


SELECT TOP 4 WITH TIES * FROM employee

ORDER BY salary;



위와 같이 salary가 300으로 동점인 2명이 함께 출력되는 것을 확인하실 수 있습니다.

또한 TOP 구문에서는 단순히 정수를 사용하는 것이 아니라 전체 데이터의 퍼센트만큼 출력할 행의 수를 지정할 수 있습니다. 

예를 들어 전체 데이터의 10퍼센트에 해당하는 개수의 데이터만 조회하고 싶다면 다음과 같이 TOP n 뒤에 PERCENT 옵션을 붙여주면 됩니다.


SELECT TOP 10 PERCENT * FROM employee

ORDER BY empNo;




이렇게 해서 LIKE연산자를 비롯해 ORDER BY, TOP n 등에 대해서 알아보았습니다.

다음 포스팅에서는 집계함수(sum, max, min, avg 등)에 대해서 알아보며 동시에 GROUP BY, HAVING 절에 대해서도 함께 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요. 문범우입니다.

지난 글에서 기초적인 SELECT문을 통해 데이터를 조회하는 방법에 대해서 알아보았습니다.

이번 포스팅에서는 SELECT문에 WHERE절을 추가하여 특정 조건에 부합하는 데이터들만 조회하는 방법에 대해서 알아보도록 하겠습니다.


데이터베이스 및 테이블들은 지난 글에서 만든 샘플데이터를 그대로 이용합니다. 해당 샘플 데이터가 없는 분들은 아래 글에서 쿼리를 통해 샘플데이터를 생성하고 진행해주세요.


[MS SQL Server] #5_SELECT문 기초



1. WHERE문 기초


먼저 아래와 같은 기본 SELECT문을 통해서 employee 테이블의 모든 데이터를 조회해보도록 합시다.


SELECT * FROM employee;


그런데 만약 위와 같이 모든 정보를 얻고 싶은 것이 아니라, job의 값이 '사원'인 데이터에 대해서만 조회하고 싶을 때는 어떻게 할까요?

또는 salary가 500 이상인 데이터만 조회하고 싶을 때는 어떻게 해야 할까요?


이와 같이 테이블에서 특정 조건에 부합하는 데이터만 조회하고 싶을 때 사용하는 것이 WHERE절 입니다.


그럼 바로 WHERE절을 사용해보도록 합시다.

먼저 job이 사원인 데이터만 조회하는 쿼리는 다음과 같습니다.


SELECT * FROM employee

WHERE job = '사원';



위의 결과와 같이 job이 '사원'인 데이터만 조회되었습니다.


그럼 같은 방법으로 salary가 500 이상인 데이터도 조회해보도록 합시다.


SELECT * FROM employee

WHERE salary >= 500;



위와 같이 salary가 500이상인 데이터만 조회되었습니다.


WHERE 절에서 사용되는 기본적인 연산자는 다음과 같습니다.


대소를 비교할 때 사용되는 >, <, >=, <= 와 같은 것들이 있으며,

같음을 나타내는 = 와 서로 다름을 나타내는 != 또는 <>이 있습니다.


그런데 여러개의 조건을 함께 사용해야 하는 경우는 어떻게 해야할까요?



2. 논리연산자(and / or)의 사용


여러개의 조건을 함께 사용해야 한다는 것은 다음과 같은 상황일 것 입니다.


'사장' 직급이 아니면서, salary가 500 이상인 데이터에 대해서 조회하시오. 또는

commission을 포함한 연봉이 5500만원 이하이거나 '사원' 직급인 데이터를 조회하시오.


이러한 경우는 어떻게 할까요?

바로 여러개의 조건을 동시에 사용하면 되는데, 이럴 때 사용하는 것이 논리 연산자 입니다.

and 논리 연산자는 좌,우측의 조건을 동시에 만족해야 할 때 사용되며,

or 논리 연산자는 좌,우측의 조건중 하나만 만족하면 될 때 사용합니다.


그럼 바로 쿼리문으로 확인해보도록 하겠습니다.

'사장' 직급이 아니면서, salary가 500 이상인 데이터에 대해서 조회하는 쿼리는 다음과 같습니다.


SELECT * FROM employee

WHERE job != '사장'

AND salary >= 500;



위와 같이 우리가 기대한 결과가 잘 나온 것을 확인할 수 있습니다.


그럼 이번에는 OR연산자를 이용해보도록 합시다.

commission을 포함한 연봉이 5500만원 이하이거나 '사원' 직급인 데이터를 조회하는 쿼리는 다음과 같습니다.


SELECT * FROM employee

WHERE (salary * 12) + isnull(commission,0) <= 5500

OR job = '사원';



위의 쿼리에서는 지난 시간에 배운 isnull() 함수를 이용하여 연봉을 계산하고 해당 값을 WHERE절 에서 그대로 사용하였습니다.

위와 같이 WHERE절에서 연산도 가능하니 참고하시기를 바랍니다.



3. BETWEEN A AND B


이번에 배워볼 것은 위와 같이 WHERE절에서 사용되는 BETWEEN A AND B 구문입니다.

만약 salary가 300이상 500이하인 데이터에 대해서 조회하려면 어떻게 해야할까요?

우리가 위에서 배운 내용대로라면, 아래와 같은 쿼리가 될 것입니다.


SELECT * FROM employee

WHERE salary >= 300

AND salary <= 500;


하지만 BETWEEN A AND B 구문을 이용하면 다음과 같이 쿼리를 작성하면 됩니다.


SELECT * FROM employee

WHERE salary BETWEEN 300 AND 500;



실제로 같은 결과를 가져오지만 이전의 쿼리보다 보다 간결하고 직관적임을 알 수 있습니다.



4. IN


마지막으로 배워볼 구문은 IN입니다.

만약 salary가 300, 400, 500, 600인 데이터를 조회하려면 어떻게 해야할까요?

이전의 학습을 기반으로 쿼리를 작성해보면 다음과 같습니다.


SELECT * FROM employee

WHERE salary = 300

OR salary = 400

OR salary = 500

OR salary = 600;


하지만 IN 구문을 이용하면 다음과 같이 쿼리를 작성할 수 있습니다.


SELECT * FROM employee

WHERE salary IN (300,400,500,600);



IN구문을 활용함으로써 OR을 통한 이전의 쿼리보다 더 간결하고 직관적임을 알 수 있습니다.



이번 포스팅에서는 WHERE 절을 이용해서 조건에 부합하는 데이터 조회방법에 대해서 알아보았습니다.

사실 WHERE절 없이 SELECT를 활용하는 경우보다는 WHERE절을 통해 원하는 데이터만 조회할 때가 더 많다고 생각됩니다. 따라서 위에 나온 쿼리문들 이외에도 다양하게 시도해보고 쿼리문을 만들어보시길 바랍니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요