SQL 6, 7, 8, 9, 10

이재훈·2024년 2월 5일
1

Zerobase_DA3_SQL

목록 보기
4/16

Logical Operators (논리연산자)

AND 조건을 모두 만족 True
OR 조건 중 하나라도 만족 True
NOT 조건 불만족 True
BETWEEN 조건값이 범위 내 True
IN 조건값이 목록에 있으면 True
LIKE 조건값이 패턴에 맞으면 True - 문자열에서 사용함

AND 문법

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세 이상이고 성별이 남자인 데이터를 나이순스로 정렬하여 조회

OR 문법

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이면 홀수

NOT 문법

조건에 맞지 않는 것이 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));

BETWEEN 문법

조건값 사이에 있으면 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);

IN 문법

목록안에 조건이 존재할 경우 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) ;

LIKE 문법

1 . 특정 단어로 시작하는 데이터 검색
select * from celeb where agency LIKE ‘YG%’;

2 . 특정 단어로 끝나는 데이터 검색
select * from celeb where agency LIKE ‘%엔터’;

  1. 특정 단어로 구성된 데이터 검색
    select * from celeb where agency LIKE ‘%YG%’;

  2. 특정 단어로 시작하는 데이터 검색
    select * from celeb where agency LIKE ‘YG%’;

5 . 몇번째 글자가 특정단어가 들어간 데이터 검색
select * from celeb where agency LIKE ‘_G%’;
-> 이 예시에서는 두번째 글자가 G 로 시작..

6 . 특정 단어로 시작하고 최소 몇글자 이상인 데이터 검색
select * from celeb where job_title LIKE ‘가_%’;
-> 이 예시에서는 가 로 시작하는 최소 두글자 단어

  1. 특정 글자로 시작, 특정 글자로 끝나는 데이터 검색
    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명 이외에 다른 이름을 안볼 수 있다.

profile
💻 To be a Data analyst

0개의 댓글