SQL SELECT, 제대로 사용하기 - where 조건절

2020. 6. 20. 01:40BACKEND/Database

안녕하세요.

지난 포스팅에서DML이 무엇인지, SELECT, INSERT, UPDATE, DELETE에 대해 알아보았습니다.

이번에는 SELECT문에 대한 다양한 필터링을 알아보도록 하겠습니다.

 

***************** INDEX *****************

 

[ 1장 ]

1. 조건 & 관계 연산자

2. BETWEEN...AND

3. IN

4. LIKE

 

[ 2장 ]

5. GROUP BY - HAVING

6. ORDER BY

7. DISTINCT

8. LIMIT

 

********************************************


 

지난 포스팅에서 SELECT문을 소개했습니다.

다시 한 번 볼까요❓ 

 

SELECT <select_columns>
FROM <table>
[ WHERE condition ]
[ GROUP BY <column_name | expr | position> ]
[ HAVING condition ]
[ ORDER BY <column_name | expr | position> ];

 

위와 같은 모습이었던 것, 기억하시나요❓ 

사실 SELECT ... FROM ... WHERE 만 기억하시는 분들이 더 많을 것 같아요.

가장 자주 사용하는 키워드이기 때문이죠.

 

오늘은 WHERE절에서 사용할 수 있는 조건문, GROUP BY - HAVING 절과 ORDER BY에 대해 알아볼 예정입니다.

 

 


 

첫 번째, 조건 & 관계 연산자

조건을 걸고 검색을 할 때, 조금 더 정확한 데이터를 뽑고 싶을 때가 있습니다.

그럴 때, 조건 & 관계 연산자를 사용하게 되는데요.

함께 살펴보도록 하겠습니다 〰️ 

 

 

✔️ 조건 연산자

 

조건 연산자는 =,<,>,<=,>=,<>,!=등이 있는데요.

 

TEST DATA 1

 

위의 [TEST DATA 1] 를 사용해서 테스트 해볼까요❓ 

 

지금부터 나이가 37세 이상인 사람을 추출해봅시다 〰️ 

 

SELECT * FROM user WHERE age >= 37;

 

위와 같이 입력하면 어떻게 될까요❓ 

 

 

간단하죠 〰️ 

조건 연산자는 모두 어렵지 않게 사용할 것 같아요.

 

 

✔️ 관계 연산자

 

그럼 이번엔 관계 연산자를 알아볼까요❓ 

관계 연산자에는 NOT,AND,OR등이 있습니다.

 

먼저 OR를 사용해볼까요❓ 

짧게 설명을 드리자면, 나이가 20세 미만이거나 37살 초과인 사람의 데이터를 뽑아내는 쿼리입니다.

 

SELECT * FROM user WHERE age > 37 OR age < 20;

 

위와 같은 쿼리문을 실행시키면 어떤 결과를 얻을 수 있을까요❓ 

아래와 같은 결과를 얻을 수 있습니다.

 

 

AND는 OR과 비슷하게 사용하면 돼서 별로 어려운 점은 없을 것 같아요.

 

 

자, 이번에는 관계 연산자 중에 NOT을 한 번 사용해볼까요❓ 

NOT은 조건 앞에 붙어 키워드 그대로 조건에 반하는 데이터를 뽑습니다.

아래는 나이가 39세가 아닌 사람들의 데이터를 뽑는 쿼리입니다.

 

SELECT * FROM user WHERE NOT age = 39;

 

위와 같은 쿼리를 실행하면 어떤 결과값이 나올까요❓ 

 

 

 

보면 id가 8인 데이터를 필터링해서 보여줍니다.

 

마지막으로 AND 연산자가 있을텐데요.

AND 연산자는 키워드가 알려주는대로 '~이고' 라는 뜻을 가지죠.

 

 

 

 

 

이번에는 조건 연산자나 관계 연산자 이외의 연산자를 알아보고자 합니다.

BETWEEN... AND 과 IN 연산자, 그리고 LIKE 연산자가 있습니다.

 

 

두 번째, BETWEEN...AND

먼저 BETWEEN...AND 연산자부터 보도록 할까요❓ 

BETWEEN...AND 는 데이터가 숫자로 구성되어 있어 연속적인 값 검색합니다.

 

[TEST DATA 1] 에서 나이가 20살 이상부터 30살 이하인 사람들을 한 번 추출해볼까요❓ 

 

SELECT * FROM MOCK_DATA WHERE age BETWEEN 20 AND 30;

 

이런 모양으로 보여집니다. WHERE 조건절에 적용시킬 column을 적고 숫자의 범위를 적어주죠.

그럼 아래와 같은 결과값을 보여줄 수 있습니다.

 

 

 

세 번째, IN 연산자

이 번엔 IN 연산자를 알아보겠습니다.

IN 연산자는 이산적인Discrete값 검색합니다.

WHERE 문의 긴 OR를 대체할 수 있죠.

 

데이터를 조금 추가해서 테스트를 해보겠습니다.

user 데이터에 user가 속한 국가 코드를 포함해보도록 하겠습니다.

  

TEST DATA 2

 

[TEST DATA 2] 에서 국적이 한국인 사람(KO)과 미국(US)인 사람을 골라내고 싶으면 어떻게 해야할까요❓ 

 

SELECT * FROM user WHERE country_code IN ("KO", "US");

/* AND를 사용했을 경우
SELECT * FROM user WHERE country_code = "KO" OR country_code = "US";
*/

 

위와 같이 특정 문자열이나 숫자만을 뽑아오고 싶을 때 사용할 수 있습니다.

조건이 많아지면 OR로는 길고 중복되는 스트링을 확인할 수 있습니다.

 

위의 쿼리문은 아래와 같은 결과값을 갖습니다.

 

 

country_code가 KO와 US인 데이터만 출력된 것을 확인하셨나요❓ 

 

 

 

네 번째, LIKE 연산자

이 번엔 LIKE 연산자를 알아보겠습니다.

LIKE 연산자는 조건을 가지고 유연하게 문자열의 내용 검색할 수 있습니다.

 

만약, 검색하고자 하는 문자열의 한 글자만 무관하게 검색하고 싶다면 ' _ ' 기호를 사용하면 됩니다.

예를 들어 한국인의 이름들 중에서 성과는 상관없이 '태현' 이라는 이름을 가진 사람을 검색하고 싶을 때 적절하죠

 

SELECT * FROM user WHERE name LIKE "_태현";

 

예를 들면 위와 같겠죠❓ 

 

혹은, 여러 문자열을 무시하고 검색하고 싶을 때엔 어떻게 해야할까요❓ 

이번엔 반대로 이름과는 상관없이 '박'씨 성을 가진 사람을 검색하고 싶을 때 어떻게 해야할까요❓ 

 

SELECT * FROM user WHERE name LIKE "박%";

 

위와 같이 입력하면 이름의 길이와 값에 상관없이 박씨 성을 가진 모든 사람을 검색해냅니다.

 

추가로, [TEST DATA 2] 에서 연습해봅시다.

이번에는 user 데이터 중에서 도메인이 .net으로 끝나는 사용자들을 검색해보겠습니다.

 

SELECT * FROM user WHERE email LIKE "%net";

 

위와 같은 쿼리문을 실행하면 아래와 같은 결과값을 얻을 수 있습니다.

 

 

많은 곳에 도움이 되겠죠 〰️

 

 

 

 

오늘은 정말 간단한 연산자들을 확인해보았습니다.

한 번 알아두면 그 때 그 때 찾아볼 수 있어서 일단 알아두면 큰 도움이 될 것 같아요 ❗️