SQL - 비교연산자, 논리연산자, 홀수 짝수

Bean·2024년 2월 9일

Data

목록 보기
4/14
연산자 우선 순위연산자
1괄호 ( )
2NOT 연산자
3비교연산자
4AND 연산자
5OR 연산자

비교연산자

-- 비교연산자
A = B  -- A와 B가 같다
A > B  -- A가 B보다 크다(초과)
A < B  -- A가 B보다 작다(미만)
A >= B -- A가 B보다 크거나 같다(이상)
A <= B -- A가 B보다 작거나 같다(이하)
A <> B -- A가 B보다 크거나 작다(같지않다)
A != B -- A와 B가 같지 않다

홀수 짝수 구하기

-- 홀수 짝수 구하기
select * from myDB where (ID % 2) = 1; -- 홀수
select * from myDB where (ID % 2) = 0; -- 짝수
  • (ID % 2) --> 여기서 ID는 이름을 가진 컬럼으로 데이터타입이 int
  • 여기에 2를 나누고 나머지 값이 1로 떨어지면 홀수, 0일 때 짝수
    ex) ID값이 1일때 1 % 2 = 0.5 --> 나머지 값이 0으로 떨어지지 않음 = 홀수
    ex) ID값이 2일때 2 % 2 = 1 --> 나머지 값이 0 = 짝수
    ex) ID값이 3일때 3 % 2 = 1.5 --> 나머지 값을 반올림해서 보지 않고 1로 남은 것으로 간주



논리연산자

-- 논리연산자
AND     -- 조건을 모두 만족하는 경우 TRUE
OR      -- 하나의 조건이라도 만족하는 경우 TRUE
NOT     -- 조건을 만족하지 않는 경우 TRUE
BETWEEN -- 조건값이 범위 사이에 있으면 TRUE
IN      -- 조건값이 목록에 있으면 TRUE
LIKE    -- 조건값이 패턴에 맞으면 TRUE

AND, OR

  • AND 와 OR 중 AND가 우선 연산된다
  • 논리 연산이 두 개 이상 들어가는 경우 ( )괄호로 묶으면 가독성을 높일 수 있다
-- 비교, 논리, 홀짝, 정렬 믹스 예제
-- ID값이 홀수면서 나이가 29세 이하거나 직업이 가수인 여자 데이터를 ID 오름차순 조회
-- myTable에 데이터가 있다고 가정
select * from myTable 
where (ID % 2 = 1 and age < 29) or (job_title = 'singer' and sex = 'F') 
order by ID ASC;
+----+-----------+------------+------+------+----------------+------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY     |
+----+-----------+------------+------+------+----------------+------------+
|  1 | IU        | 1993-05-16 |   29 | F    | singer         | EDAM ent   |
|  2 | MIJU      | 1994-09-23 |   28 | F    | singer         | WOOLIM ent |
|  3 | SONG KANG | 1994-04-23 |   28 | M    | talent         | NAMOO ent  |
|  7 | SOOHYEON  | 1999-05-04 |   23 | F    | singer         | YG ent     |
+----+-----------+------------+------+------+----------------+------------+

NOT

  • 조건을 만족하지 않는 경우 TRUE
-- 생일이 1990년 이후이며 여자가 아니거나 생일이 1979년 이전이면서 소속사가 안테나가 아닌 데이터를 검색
-- celeb 이라는 테이블과 데이터가 있다고 가정
select * from celeb
where (birthday > 19891231 and NOT sex = 'F') or
(birthday < 19800101 and NOT agency = '안테나 ent');
+----+-----------+------------+------+------+--------------+-----------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE    | AGENCY    |
+----+-----------+------------+------+------+--------------+-----------+
|  3 | SONG KANG | 1994-04-23 |   28 | M    | talent       | NAMOO ent |
|  6 | SEUNGWON  | 1970-06-07 |   48 | M    | actor, model | YG ent    |
+----+-----------+------------+------+------+--------------+-----------+

BETWEEN

  • BETWEEN A AND B --> A와 B를 포함한 범위 사이를 조회할 수 있다
select column1, column2, ...
from tablename
where columnName BETWEEN A AND B;
-- 예제) 나이가 20세 이상 40세 이하의 데이터를 조회 (테이블과 데이터가 있다고 가정)

-- BETWEEN 연산자를 사용했을 때
select * from myTable
where age BETWEEN 20 AND 40;

-- AND 연산자만 사용했을 떄
select * from myTable
where age >= 20 and age <= 40;
-- NOT과 BETWEEN을 붙일 때 주의하자!
-- 예제) 나이가 20세 이상 40세 이하가 아닌 데이터를 조회
select * from myTable
where NOT age BETWEEN 20 AND 40;

IN

  • 목록 안에 조건이 존재하는 경우 TRUE
select *
from tablename
where columnName IN (value1,vlaue2,...);
-- 예제) myTable에서 나이가 28세, 48세 중 하나인 데이터 검색

-- IN 연산자를 사용했을 때
select *
from myTable
where age IN (28, 48);

-- OR 연산자만 사용했을 때
select *
from myTable
where age = 28 or age = 48;

주의사항

  • 문제의 조건을 잘 분리해서 보고 체크하는 습관이 중요하다
    --> 조건을 잘못 분리하면 결과가 달라진다(아래 예제 참고)
-- 예제) 소속사가 나무,안테나, 울림엔터테인먼트가 아니면서, 성별이 여자거나 나이가 45세 이상인 데이터 검색
mysql> select *
    -> from celeb
    -> where NOT agency IN ('namoo ent','antena ent','woolim ent') AND
    -> sex = 'F' or age >= 45;
 -- 원치 않는 조건의 결과값도 같이 조회(ID 5,7번)
+----+----------+------------+------+------+----------------+------------+
| ID | NAME     | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY     |
+----+----------+------------+------+------+----------------+------------+
|  1 | IU       | 1993-05-16 |   29 | F    | singer, talent | EDAM ent   |
|  5 | JAESEOK  | 1972-08-14 |   50 | M    | mc, comedian   | ANTENA ent |
|  6 | SEUNGWON | 1970-06-07 |   48 | M    | actor, model   | YG ent     |
|  7 | SOOHYEON | 1999-05-04 |   23 | F    | singer         | YG ent     |
+----+----------+------------+------+------+----------------+------------+
  • 위는 in에 있는 소속사가 아닌 여자 or 나이가 45세 이상인 사람을 불러온 것을 알 수 있다
  • 그래서 in에 있는 소속사를 불러오지 않아야 되지만 45세 이상이라는 조건이 맞아 ID 5와 같은 데이터가 조회되었다

-- 예제) 소속사가 나무,안테나, 울림엔터테인먼트가 아니면서, 성별이 여자거나 나이가 45세 이상인 데이터 검색
mysql> from celeb
    -> select *
    -> where NOT agency IN ('namoo ent','antena ent','woolim ent') AND
    ->(sex = 'f' or age >= 45);
-- +----+----------+------------+------+------+----------------+----------+
| ID | NAME     | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY   |
+----+----------+------------+------+------+----------------+----------+
|  1 | IU       | 1993-05-16 |   29 | F    | singer, talent | EDAM ent |
|  6 | SEUNGWON | 1970-06-07 |   48 | M    | actor, model   | YG ent   |
|  7 | SOOHYEON | 1999-05-04 |   23 | F    | singer         | YG ent   |
+----+----------+------------+------+------+----------------+----------+
  • in에 있는 소속사를 제외하면서 성별이 여자거나 45세 이상인 데이터가 필요했는데 알맞게 조회된 것을 확인할 수 있다

LIKE

  • 조건 값이 패턴에 있으면 TRUE
  • 공백도 포함해서 반환
select *
from myTable
where columnName LIKE pettern;

(예제)

-- (1)'YG'로 시작하는 소속사 이름을 가진 데이터 검색
select * from celeb
where agency LIKE 'YG%';
-- (2) 'Ent'로 끝나는 소속사 이름을 가진 데이터 검색
select * from celeb
where agency LIKE '%Ent';
-- (3) 자격증 명에 '기능'이 포함된 데이터를 검색
select * from license
where name LIKE '%기능%';
-- (4) 소속사 이름의 두번째 글자가 G인 데이터 검색
select * from celeb
where agency LIKE '_G%';
-- (5) 직업명이 '가'로 시작하고 최소 두글자 이상인 데이터 검색
select * from celeb
where job_title LIKE '가_%';
-- (6) 직업명이 가수, 모델 두 단어를 포함하고 있는 데이터 검색
-- celeb 테이블에 직업명은 '모델, 가수'와 같이 두 직업을 포함하고 있는 데이터가 있다고 가정
-- '가수, 모델', '모델, 가수'처럼 순서 상관없이 조회할 수 있음
select * from celeb
where job_title LIKE '%모델%' and job_title LIKE '%가수%';
-- (7) 직업명 패턴 '가수, 배우'처럼 직업이 하나 이상인 데이터 검색
select * from celeb
where job_title LIKE '%,%';
-- (8) 가수 혹은 모델이 아닌 데이터 검색
select * from celeb
where NOT (job_title LIKE '%가수%' or job_title LIKE '%모델%');

실수목록

-- (요구사항) 직업이 영화배우나 개그맨이 아닌 데이터 검색
-- (나의 입력 오류는 아래와 같다)
SELECT * FROM CELEB
WHERE NOT (JOB_TITLE LIKE '%COMEDIAN%' AND JOB_TITLE LIKE '%ACTOR%');
-- 결과 중 일부
|  5 | 유재석 | 1972-08-14 |   50 | M    | mc, comedian   | ANTENA ent |
|  6 | 차승원 | 1970-06-07 |   48 | M    | actor, model   | YG ent     |
-- where 절의 and문 요구사항처럼 comedian 과 actor가 같이 묶여있는 데이터가 없음 
-- 결과물에 계속 comedian과 actor가 도출된 이유는 조건문 중 하나라도 포함되어 있으면 리턴한 것으로 보임
-- 테이블과 같은 결과물을 보고 싶다면 or 조건문을 넣어줬어야 함

-- 	↓수정↓
SELECT * FROM CELEB
WHERE NOT (JOB_TITLE LIKE '%COMEDIAN%' or JOB_TITLE LIKE '%ACTOR%');
-- 결과
+----+--------+------------+------+------+----------------+------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY     |
+----+--------+------------+------+------+----------------+------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | singer, talent | EDAM ent   |
|  2 | 이미주 | 1994-09-23 |   28 | F    | singer         | WOOLIM ent |
|  3 | 송강   | 1994-04-23 |   28 | M    | talent         | NAMOO ent  |
|  7 | 이수현 | 1999-05-04 |   23 | F    | singer         | YG ent     |
+----+--------+------------+------+------+----------------+------------+
-- 결론 : 요구사항을 면밀히 분석해서 논리연산자를 잘 쓰자!
profile
시리즈별로 봐주시길

0개의 댓글