Skills/MySQL

2. MySQL 각종 연산 쿼리 - 사칙연산, 할인가격, 참/거짓 (초보자 무작정 따라하기)

웅셀 푸코 2022. 4. 16. 23:18
반응형

지난 1장에서 MySQL을 통해 데이터를 원하는 조건에 맞게, 혹은 전부를 추출하고 불러오는 과정을 거쳤다.
이번엔 MySQL에서 각종 연산을 어떻게 처리하는지 쿼리를 설계해보자.
기본적으로 +(더하기) -(빼기) *(곱하기) /(나누기) 연산 표기는 익숙하게 알고들 있을 것이다.


아래 과정을 저와 같이 따라하고 싶으시다면 아래 사이트에 접속하셔서 그대로 쿼리를 작성해보시면 됩니다!

https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_select_all 

 

MySQL Tryit Editor v1.0

WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, and Opera. If you use another browser you will still be able to use our Try SQL Editor, but a different version, usin

www.w3schools.com

 

1. 연산자를 활용해 연산하기

SELECT 문과 연산자를 이용해 기초적인 쿼리를 구성한 모습

2. 응용하기-1

예를들어 제품 A의 마진을 구하고 싶다면 제품실 판매가 - 제품 원가=마진이 될 것이다.

앞 서배운 연산자 쿼리 뒤에 AS '마진'을 붙여 쿼리를 완성해보자.

추출한 데이터의 항목 명이 '50000 - 25000'이 아닌 '마진'으로 표기되어 데이터 추출 시 가독성을 확보할 수 있겠다.

3. 응용하기-2

5명이 근무하는 소규모 사업장에서 매일 점식 식비가 총 5만 원이 나오고 이중 10%는 지원금을 받아 환급될 예정이다. 직원 한 명이 매달 지불해야 하는 인당 식비는 얼마일까? 그리고 결과 값에 '인당 직원 식비'라는 별명을 부여해주자.

학창 시절 배웠던 사칙연산 순서가 그대로 적용된다.

 

4. 나머지 구하기 (%, MOD)

10을 3으로 나눈 나머지는 1이고
20을 6으로 나눈 나머지는 2이다.
이를 MySQL에서 쿼리를 통해 구성할 때는 % 혹은 MOD를 사용한다.

그렇다면 당신이 A전자기기를 만드는 회사에서 데이터를 관리할 때, 20000개의 볼트를 가지고 있는데 한 제품을 만드는데 29개의 볼트가 소모된다. 이때 제품을 모두 만들고 남아있는 볼트의 개수를 추출해보자.

5. 문자열은 '0으로' 인식한다...하지만?

위와 같이 'ABC' '가나다' 같은 문자열은 숫자로 인식하지 않고 0으로 처리됨을 알 수 있다.
하지만 위 'ABC' 자리에 같은 문자열인 '1' 혹은 '100'등을 넣으면 어떻게 될까?

특이하게도 숫자로 인식됨을 확인할 수 있다. (알고는 있도록 하자.)

6. 알 잘 딱 연산자 활용하기
여러분들이 OrderDetails라는 테이블에서 OrderID와 ProductID의 합을 구하자고 한다.
지금까지 배운 것들을 활용해 아래와 같은 결과를 도출했다.

잘해놓고 뭐가 아쉬운지 본인만 모르는 직원의 예

회바회, 사바 사겠지만 일반적으로 A와 B의 합계 C좀 구해다 줘~라고 했을 때 분석을 하는 사람의 입장에서라면

위처럼 C만 냅다 모아서 갖다 드릴게 아니라 A + B = C를 한눈에 보기 쉽게 정리하여 보여주는 게 알아서 잘 딱 깔끔하고 센스 있게 일하는 방법이 아닐까? 두 번 일하기 싫다면 말이다.

​쿼리를 그대로 두되 한 줄만 추가해보자.

OrderID와 ProductID의 값을 각각 알 수 있어 인사이트 활용에 더 도움이 될 것이다.

AS 문을 활용해 위처럼 가독성을 높일 수도 있겠다 :)

쇼핑몰에서 원가, 반값, 25% 할인, 블랙프라이데이 가격(70% 할인) 시 가격을 불러올 수 있도록 응용한 쿼리 문이다. 단위를 달러로 표시하고 싶어 추가했다.

엑셀을 어느 정도 공부해 본 사람은 TRUE=1 FALSE=0으로 치환된다는 사실을 공부해 본 적이 있을 것이다.

MySQL에서 역시 True(참)는 1로, False(거짓)은 0으로 치환됨을 알고 있자.

또 다른 시각에서 바라보면, True(참)의 반대는 False(거짓)이기 때문에 1의 반대는 0이라고 해석할 수도 있겠다.

7. MySQL에서의 참과 거짓 (! 와 NOT)

프로그래밍에서 느낌표! 표시는 '반대'를 뜻한다.
그렇다면! True는? 참의 반대이므로 거짓이 될 것이고! False는 거짓의 반대이므로 참이 될 것이다.

NOT(아니다) 역시 MySQL에서는 느낌표! 와 같은 의미로 쓰인다.

Not 1은 참의 반대이므로 0(거짓)이 될 것이고, Not False는 거짓의 반대이므로 1(참)이 될 것이다.

쿼리문을 직접 추출하면서 확인해보자.

직접 하나하나 씩 타이핑해보면서 True(참)와 False(거짓), 1(참)과 0(거짓) Not과! 의 기능을 체득해보길 권장한다. (한 번도 해당 개념을 접해보지 못했다면 한 동안은 헷갈릴 가능성이 크다.)

그럼 다음과 같은 쿼리를 보면 어떤 생각이 드는가?

SELECT
0 = True,
1 = True,
0 = False,
1 = Fasle;

엥; 0은 False라고 했는데 0 = True는 False = True라고 했는데 말이 안 되는 거 아니야?라고 생각했다면
잘 생각한 것이다.

False = True가 아니므로 0 = True라는 쿼리는 '거짓'이라는 뜻이 된다. 거짓은 False 이므로 추출하면 '0'이라는 데이터가 도출될 것이다.

아래 결과 값을 보고 본인의 생각과 일치한 지 대조해보자.

8. 참/거짓 비교하기 ( IS와 IS NOT )

어렵게 생각하지 말고 영어 그대로 순서대로 해석하여 그 쿼리 자체가 참인지 거짓인지만 판단하면 된다.

1) True IS True (참은 참이다) = 말 그대로 참이므로 1(참)이 결괏값으로 도출된다.

2) True IS NOT False (참은 거짓이 아니다) = 이 말 역시 참이므로 1(참)이 결과값으로 도출된다.

3) False IS Fasle (거짓은 거짓이다) = 참이므로 1(참)이 결과값으로 도출된다.

4) False IS True (거짓은 참이다) = 거짓이므로 0(거짓)이 결과값으로 도출된다.

9. AND와 OR

하나의 식이 아니라 여러 개의 식을 참인지 거짓인지 판단해야 할 때가 있다.
쿼리를 실습하기 전에 미리 결론부터 짚고 넘어가자면,

A AND B는 And(그리고) 문이므로 A조건과 B조건을 '모두' 만족할 때만 '참'이 된다.

즉, A와 B조건 중 하나라도 거짓이 있으면 False(0)인 것이다.

반면에, A OR B는 A조건과 B조건 중 '하나만' 충족되어도 '참'이 된다.

위와 같이 2 + 3 = 6이라는 식은 틀렸지만, B조건인 2 * 3 = 6이 참이므로

OR문에서는 참(1)이 도출되는 것이다.

만약 저 OR자리에 AND 조건이 들어갔다면 A조건과 B조건을 모두 충족해야 참이므로

거짓(0)이 도출되었을 것이라 유추할 수 있겠다.

AND 자리에는 &&을, OR자리에는 ||로 명령어를 대체할 수 있다.

tip) ||를 알파벳 대문자 I나 소문자 l로 기입하여 오류를 호소하시는 분들이 있는데, 저 수직선 표시는

Shift + \ 키로 입력하면 된다.

이렇게 괄호()를 통해 여러 조건을 병행하여 데이터를 도출할 수도 있겠다.

위 커리는 OrderID가 10514이거나(OR) Quantity가 50인 데이터이면서(AND)

ProductID가 20인 데이터를 나타낸다.

10. =(같다)!=, <>(다르다) >(크다), <(작다)

다양한 연산자를 통해 참(True)과 거짓(False)을 서로 비교하며 최종적으로 참(1)인지 거짓(0)인지 값을 도출해 낼 수 있겠다. 시간이 될 때 여러 숫자와 연산자를 이용하여 연산자와 True/False (참/거짓=1/0) 개념에 익숙해지도록 하자.

알파벳의 경우 A가 가장 작은 단위, Z가 가장 큰 단위로 친다. A < Z = True
대소문자는 구분하지 않는다.

위와 같이 응용하여 제품 데이터를 불러와서 20보다 큰 값의 가격을 가진 제품은 비쌈(1=참)으로 체크할 수 있게 데이터를 불러올 수 있다.

11. 연산자: 사이에 있는 값 (BETWEEN A AND B)

A와 B사이에 있는 값을 비교하여 참인지 거짓 인디 도출하는 BETWEEN A AND B 쿼리이다.

위 쿼리에서는 5가 1과 10 사이에 있음의 참 거짓을 구분했을 때 '참'이 나오므로 1(참)이 결괏값으로 나왔다.

*만약 위 카레에서 1 AND 10이 아니라 10 AND 1처럼 큰 숫자가 앞으로 오면 다른 값이 도출되니 반드시 작은 숫자를 앞에 기입하도록 하자.

숫자 대신 문자열이 들어갔을 때와 Between 앞에 NOT이 붙었을 때도 마찬가지이다.

쿼리를 해석하면 Banana는 Apple와 camera사이에 있지 않다.라는 뜻이므로 거짓이다. 고로 0(FALSE)이라는 결과 값이 도출되는 것이다. (앞서 말했듯이 알파벳은 대소문자를 구분하지 않는다.)

12. 연산자: IN, NOT IN (사이에 있다, 사이에 없다)

어떠한 값이 IN 뒤에 오는 범주에 속하는지 참/거짓을 판단하는 구문이다.

1 + 2 IN (2, 3, 4)라는 쿼리는 곧, 1 + 2의 결과가 2, 3, 4 중에 있냐?라는 뜻이다.

참에 해당하므로 결과는 1(참)로 도출됨을 확인하였다.

만약 IN이 아니라 NOT IN을 대입했다면 "1+2는 2, 3, 4 중에 포함되지 않는다"는 쿼리이므로 거짓(0)이 도출된다.

앞서 우리는 OR문을 통해 A혹은 B혹은 C조건에 하나 이상 해당하면 그 데이터를 불러오는 쿼리를 만들어 보았다.

이 긴 쿼리를IN을 통해 위처럼 쉽게 구현할 수 있다.

'City'가 Torino, Paris, Madrid, Portland에 해당하는 데이터들을 불러올 때 OR문을 사용해 긴 문장의 쿼리를 작성할 필요가 없어졌다.

13. 패턴에 의한 참/거짓 판단 (Like)

이제 Like문을 활용해 패턴의 위치에 따른 일치 유무로 참 거짓을 판단하고자 한다.

우선 쿼리와 결괏값을 먼저 보고 설명을 보자.

1. HELLO라는 문자열과 LIKE 뒤에 오는 문자열과 비교하여 참 거짓을 판단한다.

2. H%는 'H로 시작하는 단어'로 해석한다.

3. % O는 'O로 끝나는 단어'로 해석한다.

4. H% O는 'H로 시작하고 O로 끝나는 단어로 해석한다.

5. % HELLO%는 문자열 사이에 'HELLO'라는 문자열이 포함되어있는 단어로 해석한다.

LIKE를 기준으로 좌변 문자열(HELLO)과 우변 문자열이 참인지 거짓인지 결과를 나타낸다고 볼 수 있다.

즉 방정식에서 x에 해당하는 미지수 롤 %로 표현했는데, 아래와 같은 경우는 어떨까?

비슷한 공식인데 마지막 세 개가 0(거짓)으로 도출되었다. % 대신에 _가 들어갔을 뿐인 것 같은데 왜 거짓으로 판단되는 걸까?

바로, H%는 H뒤에 몇 개의 문자가 오든 H로 시작하면 참으로 인지하지만, H_는 언더바( _ 모양 ) 개수까지 참 거짓을 판단하는 기준이 되기 때문이다.

즉, LIKE 문에서 _ 기호를 사용했을 때 'HELLO' LIKE 'H____'처럼 ELLO에 해당하는 언더바 _가 4개가 와야 참(1)으로 인식되는 것이다.

14. LIKE 문 현업에서 활용하기

8-1) 데이터베이스에서 Employees라는 테이블을 불러와 그 하위 항목 중 NOTE라는 항목에서 'economics'라는 단어가 '포함'되어 있는 데이터를 뽑고 싶다면 어떻게 해야 할까? 직접 쿼리를 작성해보고 아래 정답과 비교해보자.

8-2) Orderdetails라는 테이블에서 1025로 시작하는 '다섯 자릿수'의 OrderID를 가진 데이터를 출력하고자 할 때 쿼리를 짜 보고 아래 정답과 비교해보자.

2022.04.16 - [Skills/MySQL] - 1. MySQL 데이터 불러오기, 조건문, 주석, ORDER BY (초보자 무작정 따라 하기)

 

1. MySQL 데이터 불러오기, 조건문, 주석, ORDER BY (초보자 무작정 따라하기)

1. 원하는 데이터 불러오기 (전체) SELECT * FROM Customers; MySQL에서 SELECT는 "가져오다" 정도로 해석하면 용이할 듯하다. *​ 표시는 '모든 칼럼(행)'이라고 해석하면 되겠다. 즉 위 구문은 'Customers'라는.

michel-foucault.tistory.com

 

반응형