본문 바로가기
Oracle SQL/기초 SQL

SQL SELECT문으로 이것저것 다 해보기(2) / 비교연산자

by 호두빵 2021. 5. 26.

앞서 1편에서는 테이블에 있는 값만 우리가 쏙쏙 골라서 빼왔다면 이번에는 조건을 걸어서 빼오는 것을 연습해보겠습니다. 자바에서는 ~하는 것을 찾을 때 IF문을 썼는데요 오라클 SQL에서는 WHERE 조건절을 사용합니다!  

 

SELECT 
FROM 
WHERE 조건절 

 

기본 형식은 위와 같습니다. 그런데 우리가 조건절을 쓸 때 , ~인 것만 찾아주세요. 이렇게만 쓰지 않죠? ~보다 크거나 작거나 ~이거나 아니거나 등등 여러가지 조건을 넣어야합니다. 그런 경우에 비교연산자를 사용합니다. 

 

비교연산자(> < >= <= = != <>)

NULL / IS NULL / IS NOT NULL / AND / OR

 

위를 천천히 한 번 살펴보면 자바에서와 다른 것들이 보일 것입니다. 첫번째로 비교연산자 가운데 =이 있는데요. 자바에서는 == 요렇게 두 번 썼는데 SQL에서는 한 번만 써줘도 됩니다. 또 <>이라는 것이 등장하는데 이것은 같지 않다는 뜻입니다. 그러면 !=이랑 똑같은 거 아닌가요? 싶을 수 있는데 사실상 오라클 내에서는 동작하는 기능이 동일합니다. 다만 <>이 등장하게 된 이유는 느낌표(!) 가 옛날 키보드에는 없던 시절이 있어서 그 기능을 활용하게끔 하기 위해서 ~보다 작고, ~보다 크다는 즉 같지 않다는 <>을 쓰게끔 하였다고 합니다. 그러나 오라클 내에서는 그냥 같은 거라고 생각하고 쓰면 되겠습니다. 또한 자바에서는 &&로 썼던 게 SQL에서는 AND가 되었고, ||가 OR이 되었네요~

--Julia를 찾아라~~
SELECT first_name, last_name FROM employees WHERE first_name = 'Julia';

--급여가 $9000 이상인 사원을 구해라~~
SELECT first_name, salary FROM employees WHERE salary>=9000;

--이름이 Shanta보다 더 큰 이름
SELECT first_name FROM employees WHERE first_name>'Shanta';

--이름의 첫 스펠링이 J보다 큰 이름
SELECT first_name FROM employees WHERE first_name>'J';

--매니저가 없는 사원 누구야?!
SELECT first_name FROM employees WHERE manager_id IS NULL;

어렵지 않은 예제들이므로 굳이 해석을 달지는 않겠습니다. 다만 네번째 문장에 이름의 첫 스펠링이 J보다 뒤에 있는 철자로 시작하는 이름을 구하려고 할 때, 막상 실행해보면 Julia, Jennifer 등 J로 시작하는 이름들도 포함되어 있는 것을 확인하고 뭐야? 할 수도 있습니다. 그런데 생각해보면 우리가 조건을 준 건 단 한 글자이죠. 만약 직원들 가운데 J라는 이름을 가진 사람이 있다면 이 사람의 이름은 J로 시작함에도 불구하고 우리가 준 조건절에 걸려서 출력이 되지 않을 것입니다. 그러나 사람의 이름은 보통 한글자보다는 길기 때문에 결과값에 J가 포함된 이름들이 나오는 것입니다. 만약 정말 J로 시작하는 이름이 절대 안 나왔으면 좋겠다 하시는 분들은 first_name>'Jz'; 로 하시거나 J의 다음 철자인 K를 활용하여 J로 시작하는 이름이 안 나오게 할 수 있겠습니다. 

 

1. AND, OR 

--이름이 Shanta이거나 Steven인 사람 
SELECT first_name FROM employees WHERE first_name = 'Shanta' OR first_name = 'Steven';

--이름 John, 월급은 5000이상
SELECT first_name, salary FROM employees WHERE first_name = 'John' AND salary>=5000;

2. ALL(=AND), ANY(=OR)

--ALL(=AND), ANY(=OR)
SELECT * FROM employees WHERE first_name = ALL('Julia', 'John'); --안 된다구~~
SELECT * FROM employees WHERE first_name = ANY('Julia', 'John');

--급여가 8000불, 3200불, 6000불을 받는 사람을 뽑을 때
SELECT first_name, salary FROM employees WHERE salary = ANY(8000,3200,6000);

위에서 ALL은 AND와 같은 기능이기 때문에 맨 첫 줄처럼 입력을 하면 Julia이면서 John인 사람은 없기 때문에 에러가 납니다. 두 이름을 가진 사람들을 구하고 싶다면 두 번째 줄 처럼 ANY를 써야겠죠? 아무나 데리고 와봐~ 하는 것처럼 ANY( ) 괄호 안에 들어간 값은, 그 중 하나만 해당이 된다면 출력이 되게 됩니다. 

 

3. IN, NOT IN

--IN, NOT IN

SELECT first_name, salary FROM employees WHERE salary IN(8000,3200,6000);

--8000불, 3200불, 6000불 안 받는 사람 구하기 
SELECT first_name, salary FROM employees WHERE salary NOT IN(8000,3200,6000);

--이름이 Julia이거나 John인 사람
SELECT first_name FROM employees WHERE first_name IN('Julia', 'John');

IN은 위에서 봤던 ANY와 비슷한 것 같습니다. 그러나 유심히 보시면 ANY 앞에는 비교연산자가 들어가있고, IN 앞에는 아무것도 붙어있지 않은 것이 보이시죠? ANY 앞에는 무조건 <,>,>=,<=,=,!= 이게 들어가야 합니다. 그리고 그 다음에는 서브쿼리가 나와야 합니다. 예를 들어서 첫번째를 뜯어보겠습니다. 이것은 월급이 8000불인 사람도, 3200불인 사람도, 6000불인 사람도 다 나오게 해~ 이것입니다. 그러나 ANY를 쓴 경우를 한 번 봐볼까요?

 

SELECT first_name, salary FROM employees WHERE salary = ANY(8000,3200,6000);

 

이것은 salary = 8000 OR salary = 3200 OR salary = 6000; 을 함축해서 쓴 거나 마찬가지라고 보시면 됩니다. 즉 ANY는 값을 주고 비교해서 갖고 오는 것이며 IN은 이미 정해진 값을 그대로 가져오는 것이라고 보면 되겠네요! 

 

더불어 NOT IN을 통해서 여집합 또한 구할 수 있다는 특징이 있습니다. 8000불, 3200불, 6000불 받는 사람 빼고 모두 모여~ 할 수 있는 것이지요. 

 

4. BETWEEN, NOT BETWEEN

--BETWEEN 범위 연산자

--급여가 3200보다 크고 9000보다 작다
SELECT first_name, salary FROM employees WHERE salary BETWEEN 3200 AND 9000;

--급여가 3200보다 작고 9000보다 크다 
SELECT first_name, salary FROM employees WHERE salary NOT BETWEEN 3200 AND 9000;

우리가 3200불과 9000불을 기준으로 삼아서 소득이 이 범위 안에 속하는 사람을 먼저 구해보고, 그렇지 않은 사람을 구한다고 가정해봅시다. 그런 경우에는 BETWEEN을 써서 간단하게 해결할 수 있습니다. 여기서 주의해야할 점은 BETWEEN은 기준값을 포함해서 결과값을 내주고, NOT BETWEEN은 포함하지 않는다는 점입니다. 즉, 만약 A씨가 3200만원을 받는다고 가정하면 1번에서는 포함이 되겠지만 2번에서는 포함이 되지 않습니다. 어찌보면 당연한 것이겠죠? 만약 1번에도 나오고, 2번에도 나오면 NOT BETWEEN을 쓰는 의미가 없을 테니까요? 그러나 헷갈리기 쉬우니 확실하게 알아두고 넘어가야겠습니다. 

 

5. LIKE

--LIKE (자바에서의 contains)

SELECT first_name FROM employees WHERE first_name LIKE 'G_ra_d'; 
-- _는 문자 하나를 대표함(글자수는 무조건 하나)

SELECT first_name FROM employees WHERE first_name LIKE 'K%y'; 
-- %는 모든 문자를 대표함 (글자수 제한 x)

SELECT first_name FROM employees WHERE first_name LIKE '%a%'; 
-- 이름에 a가 포함만 되어있으면 다 나오게 함 

--2006년에 입사한 사람 모두
SELECT first_name, hire_date FROM employees WHERE hire_date>='06/01/01' AND hire_date<='06/12/31';
SELECT first_name, hire_date FROM employees WHERE hire_date LIKE '06%';

--전화번호가 590으로 시작하는 사람
SELECT first_name, phone_number FROM employees WHERE phone_number LIKE '590%';

LIKE는 자바에서 contains를 썼던 것과 동일한 기능입니다. 주로 ~로 시작할때, ~가 포함되는 문자를 찾을 때 쓰는데 여기서 알아둬야 할 것은 %와 _의 차이입니다. 먼저 _는 단 한 글자만을 표시합니다. 즉 만약 우리가 _를 활용해서 우리가 Jacob이라는 사람을 찾고 싶다면 LIKE 'J_cob'; 이렇게 써야한다는 것입니다. LIKE 'J_'이렇게 써버리면 J로 시작하는 두 글자의 이름을 찾는 셈이 되어버립니다. 반면에 %는 모든 문자를 대표하기 때문에 글자수에 제한이 없고 더 광범위하게 찾는 것이 가능해집니다!