[논리 연산자]
- AND
- OR
- NOT
- BETWEEN 조건 값이 범위 안에 존재
- IN 조건 값이 목록에 있으면 TRUE
- LIKE 조건 값이 패턴에 맞으면 TRUE
[논리 연산자 우선 순위]
DBMS 마다 논리 연산자 우선순위가 조금씩 다르다는 것을 검색해보며 알 수 있었다.
따라서 괄호를 평소에 잘 사용해서 쿼리가 읽기 편하도록, 오해가 없도록 하자.
출처 : 솜씨제이, "[MySQL] 논리 연산자 우선 순위", tistory, OCT 1, 2018, https://still.tistory.com/194
가독성을 위해 코드 결과는 제시하지 않았다.
[AND]
- 28살이고 가수인 사람
SELECT * FROM celab
WHERE age = 28 and job_title = '가수';
- 남자이고, 나이가 40보다 크며, YG엔터테이먼트를 소속사로 갖는 사람을 이름 역순으로 출력
SELECT * FROM celab
WHERE sex='M' and age > 40 and AGENCY = 'YG엔터테이먼트'
ORDER BY name DESC;
[OR]
- .나이가 29세 보다 작고 여자 이거나, 나이가 30세 보다 크고 남자인 데이터를 나이와 성별 순으로 정렬하여 검색
SELECT * FROM celab
WHERE (age<29 AND sex='F') OR ( age>30 AND sex = 'M' )
ORDER BY age, sex;
AND 가 연산 우선순위가 높기 때문에 괄호는 안써줘도 좋지만 써주는게 좋은 습관이라고 한다.
- 나무엑터스 소속사 또는 YG엔터테이먼트 소속사이면서 나이가 30세보다 적은 데이터 검색
SELECT * FROM celeb
WHERE ( agency='나무엑터스' OR agency='YG엔터테이먼트' ) AND age<30;
[NOT]
- 소속사가 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 >= 19900101 AND NOT sex='F') OR (birthday<19790101 AND NOT agency='안테나');
[BETWEEN]
- 생년 월일이 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);
BETWEEN '1980-01-01' AND '1995-12-31'
이라고도 쓸 수 있다.
- 아이디가 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]
- 소속사가 나무엑터스, 안테나, 올림엔터테이먼트가 아니면서, 성별이 여자이거나 또는 나이가 45세 이상인 데이터
SELECT * FROM celeb
WHERE ( NOT agency IN ('나무엑터스', '안테나', '울림엔터테이먼트')) AND
( sex = 'F' OR age >= 45 );
[LIKE]
- 소속사 이름이 'YG엔터테이먼트' 인 사람
SELECT * FROM celeb
WHERE agency LIKE 'YG엔터테이먼트';
- 'YG'로 시작하는 소속사 이름을 가진 사람 검색
SELECT * FROM celeb
WHERE agency LIKE 'YG%';
- '엔터테이먼트'로 끝나는 소속사 이름 검색
SELECT * FROM celeb
WHERE agency LIKE '%엔터테이먼트';
- 직업명에 '가수'가 포함된 데이터 검색
SELECT * FROM celeb
WHERE job_title LIKE '%가수%';
- 소속사 이름에 두번째 이름이 G 인 데이터 검색
SELECT * FROM celeb
WHERE agency LIKE '_G%';
- 직업이 '가'로 시작하고 최소 3글자 이상인 데이터 검색
SELECT * FROM celeb
WHERE job_title LIKE '가__%';
- 직업이 '영'으로 시작하고 '모델'로 끝나는 데이터 검색
SELECT * FROM celeb
WHERE job_title LIKE '영%모델';
- 직업이 '영화배우' 와 '텔런트'를 병행하는 데이터 검색
SELECT * FROM celeb
WHERE job_title LIKE '%영화배우%' AND job_title LIKE '%텔런트%';
- 직업이 하나 이상이며, '영화배우' 와 '텔런트'를 하지 않는 데이터 검색
SELECT * FROM celeb
WHERE job_title LIKE '%,%' AND
NOT ( job_title LIKE '%영화배우%' OR job_title LIKE '%텔런트%');
- 이름이 두글자인 데이터 검색
SELECT * FROM celeb
WHERE name LIKE '__';
p.s. 날짜 표현 관련
셋 중 어떤 형태여도 상관 없는 듯 하다.
'sql' 카테고리의 다른 글
[mysql] JOIN , SELF JOIN (0) | 2022.06.25 |
---|---|
[mysql] UNION (0) | 2022.06.25 |
[mysql] 비교 연산자 (0) | 2022.06.24 |
[mysql] ORDER BY (0) | 2022.06.24 |
[mysql] 테이블의 value 수정과 삭제 ( UPDATE SET, DELETE FROM ) (0) | 2022.06.24 |