AND / OR / NOT으로 조건식 나혼자만 레벨업
저희가 하나만 조건 걸어서 데이터 출력하는 것으로 머무르지 않을거잖아요? 가끔은 여러 조건, 요구에 맞춰서 데이터를 출력해야하는 상황이 옵니다.
예를들어서 시군구명은 ‘강릉시’이고 총층수는 ‘6’층이며 건물용도명은 ‘호텔’ 인 데이터를 뽑고싶습니다.
그렇다면 조건식이 2개 이상 필요한 경우 조건식 2개를 AND, OR, NOT을 붙여서 연결해줄 수 있는데요.
SELECT * FROM 강원도_관광숙박업_현황
WHERE 시군구명 = '강릉시' AND 총층수 = 6 AND 건물용도 = '호텔';
AND는 모든 조건이 전부 맞으면 ~ 이라는 뜻입니다.
그래서 위코드를 실행하면 강릉시이고 호텔 용도로 6층인 것을 출력해줍니다.
SELECT * FROM 강원도_관광숙박업_현황
WHERE 시군구명 = '강릉시' OR 총층수 = 6 OR 건물용도 = '호텔';
OR은 하나만 맞아도 ~ 라는 뜻입니다.
SELECT * FROM 강원도_관광숙박업_현황
WHERE NOT 시군구명 = '강릉시';
NOT 은 머게요?
한창 영어공부를 열심히하고 계신 우병씨에게 묻겠습니다.
3
2
1
늦었습니다. ‘제외’라는 뜻입니다.
이렇게 쿼리는 명령문이 기본적인 영어기때문에 초딩을 데려와도 잘합니다.
SELECT * FROM 강원도_관광숙박업_현황
WHERE (시군구명 = '강릉시' OR 총층수 = 6) AND 건물용도명 = '호텔';
이렇게 괄호같은거 쳐도 됩니다. 일반적으로 수학공식처럼 괄호 안에 조건식을 먼저 계산합니다.
시군구가 ‘강릉시’이거나 총층수가 6인 데이터 중에서 건물용도가 ‘호텔’인 데이터를 출력하겠네염
ㄱ
ㅜ
ㄷ
IN 문법을 쓰면 OR 여러개 필요없음
눈물에 졸작을 하던 중 우뱅씨가 저한테 ‘님아 시군구명이 강릉시인거랑, 속초시인거랑, 홍천시인 데이터 ㅃㄹㅃㄹ 급함급함’이라고 카톡이 왔습니다.
쿼리에 하나씩 OR OR 적어가면 아무래도 시간이 오래 걸리겠죠?
그래서 IN이라는 것을 쓰는 방법이 있습니다.
SELECT * FROM 강원도_관광숙박업_현황
WHERE 시군구명 IN ('강릉시', '속초시', '홍천시');
컬럼명 IN (값1, 값2, …) 쓰면 컬럼명 중 값1, 2 등 만족하는 행을 전부 출력합니다.
쉽게말하면 그냥 같은 컬럼에서 OR 연산자가 여러개 필요하면? IN()문법을 사용하면 짧아진다 정도로 알면 될 것 같습니다.
시군구명 = '속초시' AND 총층수 = 7
다만 이렇게 다른 컬럼이면 IN으로 축약 못합니다.
- OR보다 IN이 훠어어어얼씬 처리속도가 빠릅니다.
- IN 쓰면 ()안에 쿼리 또 쓸 수 있는데 이건 서브쿼리라고하고 나중에 더 자세히 알아보겠습니다.
WHERE 총정리
- SELECT FROM 뒤에 WHERE 조건식을 붙여서 필터링할 수 있고
- 조건식란엔 > / < / = / != / >= / <= 전부 이용가능하고
- 조건식 여러개가 필요하면 AND OR 이런걸로 이어붙일 수 있고
- 괄호로 AND OR 사용한 부분을 묶을 수도 있고
- OR 조건식 여러개 필요하면 IN () 사용해도 될 때가 있습니다.
??? : 저는 쿼리는 다 알겠는데 왜 실제로는 코드를 못짤까여?
답은 간단합니다. 저같은 경우도 ‘쿼리’에 아마 집중을해서 막상 안짜지는 것 같습니다. 그래서 우선 코드를 짜기 전에
- 무슨 데이터를 출력하고 싶은지? 요구사항은 무엇인지? 한글로 적어봅니다.
- 그다음에 적어본 정리를 통하여 SQL그대로 번역해줍니다.
오늘 배운거 1일 후에 까먹지만 직접 쿼리 작성해서 7일 후에 까먹기로 늘려보는 실습
1. 총층수가 5이하인 것들을 출력해서 사업장명 가나다 순으로 정렬해보기
SELECT * FROM 강원도_관광숙박업_현황 강관현황
WHERE 총층수 <= 5
ORDER BY 사업장명;
ORDER BY를 왜 가장 나중에 쓰냐?
필터링하고 정렬해야지 정렬하고 필터링하는 것은 이상하기 때문
야무지네용
2. 지상층수가 4미만인 것과 8초과인 데이터만 출력해보기
SELECT * FROM 강원도_관광숙박업_현황 강관현황
WHERE 지상층수 < 4 OR 지상층수 > 8;
혹은
WHERE 지상층수 NOT BETWEEN 4 AND 8;
이런 거 써도 될 듯 요
ㄴ ㅑ ㄴ ㅑ ㄱ
ㅁ ㅁ ㅜ
3. 시군구명이 ‘양양시’가 아닌 것들 중 지하층수가 2인 것들만 출력해보기
SELECT * FROM 강원도_관광숙박업_현황 강관현황
WHERE NOT 시군구명 = '양양시' AND 지하층수 = 2;
4. 관광숙박업상세명이 ‘관광호텔업’, ‘호스텔업’, ‘휴양콘도미니엄업’이 아닌 것만 출력해보기
SELECT * FROM 강원도_관광숙박업_현황 강관현황
WHERE NOT 관광숙박업상세명 IN ('관광호텔업', '호스텔업', '휴양콘도미니엄업');
LIKE, %, _ 연산자로 간단하게 검색가능
WHERE 조건식 자리에는 = > < 이런거 넣을 수 있다고 했는데
LIKE도 넣을 수 있습니다. 이거 요물입니다. 쓰면 원하는 단어 검색이 가능합니다.
특정 단어가 들어가있는지 검색하려면 LIKE
저희는 도로명전체주소 컬럼에 ‘설악산’이 포함된 주소들을 찾으려고 합니다. 어떻게 해야할까요?
SELECT * FROM 강원도_관광숙박업_현황
WHERE 도로명전체주소 LIKE '%설악산%';
%기호는 아무 글자라는 뜻입니다. 전문용어로 와일드카드라고합니다.
그래서 위처럼 작성하면 ‘아무글자 + 설악산 + 아무글자’ 가 일치하는 행을 전부 찾아줍니다.
진짜네염;;;
%말고 _도 있음
%이것 말고 _도 아무글자를 뜻합니다.
차이점은
%이건 아무글자이며 글자 수 제한이 없지만
_이건 아무글자 1개를 뜻합니다. __이건 두개
그래서 정확한 글자수까지 집요하게 파고들고 싶다? 그러면 ‘_’ 써줍니다.
하지만 좋다고 %를 남발하면 성능저하가 일어날 수 있습니다.
사칙연산, OR, AND를 쓸 수 있을때 되도록 사용합시다.
%쓰면 인덱스 활용을 많이 못해서 찾을때 오래 걸리는데 index는 나중에 배워보도록 하겠습니다.
1. 도로명전체주소가 강원도로시작해 해안로가 끼어있는 것을 출력하려면?
SELECT * FROM 강원도_관광숙박업_현황
WHERE 도로명전체주소 LIKE '강원도%해안로%';
2. 위처럼 강원도가 들어가있거나 해안로가 들어가있는 모든 데이터를 출력해봅시다.
SELECT * FROM 강원도_관광숙박업_현황
WHERE 도로명전체주소 LIKE '강원도%' OR 도로명전체주소 LIKE '%해안로%';
필터링절1 OR/AND 필터링절2 정도로 생각하면 될 것같습니다.
3. 동해시는 들어가있지만, 동해대로는 들어가있지 않은 데이터를 출력해봅시다.
SELECT * FROM 강원도_관광숙박업_현황
WHERE 도로명전체주소 LIKE '%동해시%' AND NOT 도로명전체주소 LIKE '%동해대로%';
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
서브쿼리 뽀개기 (0) | 2024.02.19 |
---|---|
푸바오가 알려주는 컬럼 출력시 사칙연산 & 문자를 다루는 함수 (0) | 2024.02.19 |
국가 권력급 집계함수로 통계내기 (0) | 2024.02.19 |
데이터 출력하고 정렬 & 필터륑 (1) | 2024.02.07 |
DB 시작 (0) | 2024.02.07 |