| 연산자 우선 순위 | 연산자 |
|---|---|
| 1 | 괄호 ( ) |
| 2 | NOT 연산자 |
| 3 | 비교연산자 |
| 4 | AND 연산자 |
| 5 | OR 연산자 |
-- 비교연산자
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; -- 짝수
-- 논리연산자
AND -- 조건을 모두 만족하는 경우 TRUE
OR -- 하나의 조건이라도 만족하는 경우 TRUE
NOT -- 조건을 만족하지 않는 경우 TRUE
BETWEEN -- 조건값이 범위 사이에 있으면 TRUE
IN -- 조건값이 목록에 있으면 TRUE
LIKE -- 조건값이 패턴에 맞으면 TRUE
-- 비교, 논리, 홀짝, 정렬 믹스 예제
-- 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 |
+----+-----------+------------+------+------+----------------+------------+
-- 생일이 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 |
+----+-----------+------------+------+------+--------------+-----------+
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;
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 |
+----+----------+------------+------+------+----------------+------------+
-- 예제) 소속사가 나무,안테나, 울림엔터테인먼트가 아니면서, 성별이 여자거나 나이가 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 |
+----+----------+------------+------+------+----------------+----------+
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 |
+----+--------+------------+------+------+----------------+------------+
-- 결론 : 요구사항을 면밀히 분석해서 논리연산자를 잘 쓰자!