Logical Operators (논리연산자)
AND 조건을 모두 만족 True
OR 조건 중 하나라도 만족 True
NOT 조건 불만족 True
BETWEEN 조건값이 범위 내 True
IN 조건값이 목록에 있으면 True
LIKE 조건값이 패턴에 맞으면 True - 문자열에서 사용함
Select ~ from name where A and B and C
-> A,B,C 조건이 다 맞아야 검색 대상이 된다.
↓ 예시)select * from celeb where age= 29 and sex = 'f';
select * from celeb where age>40 and sex = 'M' order by age desc;
↓ 문제) celeb 테이블에서 성별이 남자고 소속사가 YG인 데이터를 소속사 순으로 정렬하여 조회.
↓ 문제) celeb 테이블에서 나이가 30세 이상이고 성별이 남자인 데이터를 나이순스로 정렬하여 조회
Select ~ from name where A or B or C
-> A,B,C 조건중에서 하나라도 맞으면 검색 대상이 된다.
예시) 소속사가 YG이거나 나무인 데이터중에서 나이가 30보다 작은 데이터를 가져오는 쿼리
select * from celeb where agency = 'YG엔터' OR agency = '나무액터스' and age < 30;
상기 쿼리문은 오류가 발생함. 이유는 and가 우선순위가 높기 때문에 agency = '나무액터스' and age < 30;
이렇게 조건이 묶이게 된다. 그래서 아래와 같은 결과가 생김
올바른 쿼리문
select * from celeb where (agency = 'YG엔터' OR agency = '나무액터스') and age < 30;
↓ 예시) 나이가 29세보다 작고 여자이거나 나이가 30세보다 크고 남자인 나이와 성별로 정렬하여 조회
select * from celeb where (age < 29 and sex = 'F') OR (age > 30 and sex = 'M') order by age, sex;
문제 1 ) 소속사가 YG거나 안테나인 데이터를 소속사순으로 조회
select * from celeb where agency = 'YG엔터' OR agency=‘안테’나 order by agency;
문제 2 ) 남자이면서 YG거나 나이가 30보다 작은 데이터를 나이 , 소속사 순서순으로 조회
select * from celeb where(sex='m' and agency='YG엔터') OR age < 30 order by age, agency;
문제3) 아이디가 홀수면서 성별이 남자거나, 아이디가 짝수면서 소속사가 YG인 데이터를 나이순으로 조회 /
select * from celeb where (id%2=1 and sex='m') OR (id%2=0 and agency='YG엔터') order by age;
홀수와 짝수를 구분하는 연산자는 산술연산자로 "%", 나머지가 0이면 짝수, 1이면 홀수
조건에 맞지 않는 것이 True
Select ~ from name where NOT a
-> a가 아닌 대상이 검색 된다
성별이 여자가 아닌 데이터
select * from celeb where not sex=‘f’;
↓ 예시) 소속사가 YG면서 남자가 아니거나 직업이 가수면서 소속사가 YG가 아닌 데이터
select * from celeb where (agency = 'YG엔터' and not sex='m') OR (job_title='가수' and not agency = 'YG엔터');
↓ 예시) 생일이 1990 이후면서 여자가 아니거나 , 생일이 1979이전이면서 소속사가 안테나가 아닌 데이터 검색
select * from celeb where (birthday > 19891231 AND NOT sex='f') OR (birthday<19800101 AND NOT agency = '안테나');
조건이 두개나 그 이상이게 되면 하나씩 묶어서 필터링해보고 맞으면 나머지 조건들을 OR로 묶는 연습을 해봅시다!!
↓ 문제 1 ) 테이블에서 소속사가 YG가아니고 나이가 40세 이하인 데이터를 이름순으로 조회
select * from celeb where NOT agency = 'YG엔터' AND age <= 40 order by name;
↓ 문제2) 테이블에서 성별이 남자가 아니거나 나이가 30세 이상이 데이터를 나이의 역순으로 조회
select * from celeb where NOT sex = 'm' OR age >= 30 order by age desc;
↓ 문제3) 테이블에서 직업이 가수가 아니면서 성별이 여자이거나 나이가 40보다 작지않으면서 아이디가 홀수인 데이터select * from celeb where ((NOT job_title = '가수') AND sex = 'f') OR (age>40 AND (id%2=1));
조건값 사이에 있으면 True
Select ~ from name where age BETWEEN a AND b
-> a와 b사이 값이 검색
예시) 생년월일이 1980에서 1995 사이가 아니면서 여자이거나
소속사가 YG이면서 나이가 20에서 45세가 아닌 데이터
select * from celeb where ((NOT birthday BETWEEN 19800101 AND 19951231) AND sex='f') OR (agency = 'YG엔터' AND NOT age BETWEEN 20 AND 45);
길어서 헷갈린다.. Where 칼럼명 BETWEEN 범위 AND 범위
↓ 문제1) 나이가 30에서 60세 이고 성별이 남자인 데이터를 나이순으로 조회
select * from celeb where age BETWEEN 30 AND 60 AND sex = 'm';
↓ 문제2) 나이가 30에서 60세가 아니거나 YG소속인 데이터를 나이의 역순으로 조회
select * from celeb where( NOT age BETWEEN 30 AND 60) OR agency = 'YG엔터' order by age desc;
↓ 문제3) 아이디가 1에서 5사이면서 성별이 여자이거나 아이디가 홀수이면서 성별이 남자이면서 나이가 20에서 30사이인 데이터 조회
select * from celeb where id BETWEEN 1 AND 5 AND sex='f' OR (id%2=1 AND sex='m' AND age BETWEEN 20 AND 30);
목록안에 조건이 존재할 경우 True
select * from celeb where agency IN ('울림엔터', '안테나');
OR문이랑 기능이 유사함
예시) 소속사가 나무, 안테나 , 울림이 아니면서 , 성별이 여자이거나 나이가 45세 이상인 데이터
select * from celeb where agency NOT IN('나무액터스','안테나','울림엔터') AND (sex = 'f' OR age >= 45);
조건이 많아 질수록 괄호 간의 관계를 파악해야함. 그리고 애매하거나 정확하지 않으면 단위별로 잘라서 검증하는 편이 정확하다.
문제1) 아이유, 이미주, 유재석, 송강 중에서 소속사가 나무인 데이터를 조회
select * from celeb where name IN('아이유','이미주','유재석','송강') AND agency = '나무액터스';
문제2) 소속사가 안테나, YG 중 하나가 아니고 성별이 여자인 데이터를 조회
select * from celeb where agency NOT IN('안테나','YG엔터') AND sex = 'f';
문제3) 아이유, 송강, 강동원, 차승원 중에서 YG가 아니거나 나이가 40에서 50사이인 사람을 조회
select * from celeb where name IN('아이유', '송강', '강동원', '차승원') AND (agency != 'YG엔터' OR age BETWEEN 40 AND 50) ;
1 . 특정 단어로 시작하는 데이터 검색
select * from celeb where agency LIKE ‘YG%’;
2 . 특정 단어로 끝나는 데이터 검색
select * from celeb where agency LIKE ‘%엔터’;
특정 단어로 구성된 데이터 검색
select * from celeb where agency LIKE ‘%YG%’;
특정 단어로 시작하는 데이터 검색
select * from celeb where agency LIKE ‘YG%’;
5 . 몇번째 글자가 특정단어가 들어간 데이터 검색
select * from celeb where agency LIKE ‘_G%’;
-> 이 예시에서는 두번째 글자가 G 로 시작..
6 . 특정 단어로 시작하고 최소 몇글자 이상인 데이터 검색
select * from celeb where job_title LIKE ‘가_%’;
-> 이 예시에서는 가 로 시작하는 최소 두글자 단어
select * from celeb where job_title LIKE ‘영%델’;
문제1) 직업중에 가수가 포함되어 있고, 성이 이씨인 데이터 조회
select * from celeb where job_title LIKE '%가수%' AND name LIKE '이%';
문제2) 성별이 남자이거나 직업명이 ‘탤런트’로 끝나면서 최소 5글자 이상인 데이터
select * from celeb where sex='m' OR job_title LIKE '%__탤런트' ;
문제3) 이름이 두글지인 데이터를 조회
select * from celeb where name LIKE '__' ;
문제4) 나이가 30세 이상 50세 이하면서 개그맨이 아닌 데이터
select * from celeb where (age BETWEEN 30 AND 50) AND job_title NOT LIKE'%개그맨%';
또한 NOT 위치가 Job 앞에 있어도 동일한 결과가 나오는걸 확인했다.
문제 4를 해보면서 NOT이 두번들어가면 오류가 날까 아니면 정반대의 결과가 나올까 궁금했다…
결과는 .. !
문제5) 아이유, 이미주, 유재석, 송강 중에서 소속사 이름이 나무로 시작하는 데이터
select * from celeb where name IN ('아이유', '이미주', '유재석','송강') AND agency LIKE '%나무%';
문제6) 아이유, 이미주, 송강, 이수현 중에 가수만 직업으로 가졌거나, 가수를 병행하지 않고 탤런트를 하는 사람을 조회
select * from celeb where name IN ('아이유', '이미주', '송강','이수현') AND (job_title LIKE '가수' OR (job_title NOT LIKE '%가수%' AND job_title LIKE '%탤런트%'));
문제 6번의 경우는 4명의 연예인 중에서 가수만 하거나, 가수를 안하고 탤러트하는 사람을 조회하는 것이므로 IN 과 그외 필터들을 AND 해야 4명 이외에 다른 이름을 안볼 수 있다.