추석맞이/ MySQL 공부 Chapter 1 - ⓵

flobeeee·2021년 9월 18일
0

강의

목록 보기
5/14
post-thumbnail

Chapter 1. SELECT 기초

🧐 0. Intro

공부계기

개발자로 취업한 지 3개월차.
데이터베이스에서 sql을 자주 쓰지만, 주로 SELECT문만 사용한다.
가끔 다른 명령어를 써야하면 구글링을 해야만 하는게 귀찮았다.
sql에 대한 경험을 더 해야겠다고 생각했다.
그래서 추석을 맞이해 MySQL 강의를 듣겠다고 결심했다 !

명령어는 아래처럼 마크다운을 사용했고, 그 아래에 어떤 명령어인지 해석을 썼다.
처음보거나 나에게 중요하게 다가오는 명령어는 굵은 문자로 표시했다.

ex)

SELECT



🧐 1. SELECT 전반기능

- SELECT

SELECT * FROM Customers;

Customers라는 테이블의 모든 컬럼을 가져오기

SELECT CustomerName, Address, City FROM Customers;

Customers라는 테이블의 CuntomerName, Address, City 컬럼만 가져오기

SELECT CustomerName, 1, 'hello', null FROM Customers;

이 명령어를 쓰면 아래처럼 CustomerName, 1, hello, null 이 차례대로 나온다.
(처음본다.. ! 어디에 쓰는걸까? 🧐)


- WHERE

SELECT * FROM Orders
WHERE EmployeeID = 3;

Orders테이블에서 EmployeeID가 3인 데이터만 가져오기

SELECT CustomerID, EmployeeID FROM Orders
WHERE EmployeeID = 3;

Orders테이블에서 EmployeeID가 3인 테이터를 CuntomerID, EmployeeID 컬럼만 보여주기

SELECT * FROM OrderDetails
WHERE Quantity < 5;

OrderDetails테이블에서 Quantity가 5 미만인 데이터만 가져오기


- ORDER BY

SELECT * FROM Customers
ORDER BY ContactName;

Customers테이블을 ContactName기준으로 오름차순(기본)으로 정렬하기. (ASC 생략)

SELECT * FROM Customers
ORDER BY ContactName DESC;

Customers테이블을 ContactName기준으로 내림차순으로 정렬하기.

SELECT * FROM OrderDetails
ORDER BY ProductID ASC, Quantity DESC;

OrderDetails테이블을 ProductID는 오름차순, 같은 ProductID끼리는 Quantity 내림차순으로 가져오기
(이렇게 정렬을 두개 사용하는 것도 처음 해본다 🧐)

SELECT * FROM OrderDetails
ORDER BY Quantity DESC, ProductID ASC;

바로 위 명령어에서 ORDER BY 순서를 바꿔보았다.
Quantity 내림차순으로 정렬 되었고, Quantity 값이 같은 경우 ProductID가 오름차순으로 정렬됐다. (존잼)


- LIMIT

SELECT * FROM Customers
LIMIT 10;

91개의 데이터가 있는 Customers테이블에서 10개만 가져오기

SELECT * FROM Customers
LIMIT 0, 10;

LIMIT에 숫자를 두 개 쓸 경우, 0개를 건너뛰고 10개를 보여달라는 뜻이다.
바로 위 명령어와 결과가 같다.

SELECT * FROM Customers
LIMIT 30, 10;

30개의 데이터를 건너뛰고 그 다음 데이터부터 10개 가져오기 (굉장히 유용해보인다..!🧐)
주로 페이징을 나눌 때 사용한다고 한다.
예전 프로젝트에서는 sequelizeORM으로 limit, offset으로 제어했었다.
현재 사용하는 노드 프레임워크인 아도니스는 페이지네이션을 지원해줘서 이런 sql명령문을 사용할 일이 없었다.


- AS

SELECT
CustomerID AS ID,
CustomerName AS NAME,
ADDRESS AS ADDR
FROM Customers;

Customers테이블에 있는 컬럼을 내가 원하는 컬럼명으로 변경해서 가져오기
처음 sql을 배울 때 공부한 내용이지만, 실제로 많이 사용하지 않았다.
테이블을 JOIN할 때 활용해야겠다.

SELECT
CustomerID AS '아이디',
CustomerName AS '고객명',
City AS '도시',
Country AS '국가'
FROM Customers
WHERE
City = 'London' OR Country = 'Mexico'
ORDER BY CustomerName
LIMIT 0, 5;

배운 걸 모두 활용해보기 !
Customers테이블에서
CunsomerID, CustomerName, City, Country를 아이디, 고객명, 도시, 국가로 컬럼명 변경하고
도시가 London이거나 나라가 Mexico인 경우를 아이디 오름차순으로 정렬하여 5개만 가져오기

와우 손쉽게 긴 sql문을 어렵지 않게 해석해낼 수 있어서 뿌듯했다.
이제 원하는 결과는 어떤 것이든 가지고 올 수 있을 것 같은 자신감이 생겼다.
MySQL을 곧 지배할 수 있을 것이다.


🧐 2. 각종 연산자들

- 사칙연산

SELECT 1 + 2;

3이 출력된다. (오.. 계산기 기능도 있구나..)
1 + 2 가 컬럼명으로, 값이 3으로나온다.

SELECT 5 - 2.5 AS DIFFERENCE;

5 - 2.5인 컬럼명이 DIFFERENCE로 변경해서 가져온다.

SELECT 3 * (2 + 4) / 2, 'Hello';

3 * (2 + 4) / 2 의 컬럼과 그 결과 값, Hello 컬럼과 텍스트 가져오기

SELECT 3 * (2 + 4) / 2 AS Number, 'Hello' AS Text;

바로 위 명령어의 값은 그대로 두고, 컬럼명만 Number, Text로 변경해서 가져오기

SELECT 10 % 3;

1을 출력한다.

SELECT 'ABC' + 3;

문자열과 숫자를 더하는 경우, MySQL은 문자열을 0으로 인식해서 3만 출력한다.
자바스크립트의 경우, 'ABC3'을 출력한다.

SELECT 'ABC' * 3;

0을 출력한다.

SELECT '1' + '002' * 3;

숫자로 구성된 문자열은 자동으로 숫자로 인식하여 7을 출력한다.
이 부분은 w3schools에서 에러가 나서 MySQL Workbench에서 확인했다.

SELECT
OrderID, ProductID, OrderID + ProductID
FROM OrderDetails;

이제 사칙연산이 가능하니 값들을 더한 결과를 가져올 수 있다.
OrderDetails테이블에서 OrderID, ProductID를 더한 값을 가져오기

SELECT
ProductName, Price,
Price / 2 AS HalfPrice,
Price * 2 AS DoublePrice,
Price * 0.75 AS SalePrice
FROM Products;

Products테이블에서 Product, Price는 그대로 가져오고 Price의 절반값, 두배값, 할인값을 각각 가져오기


- TRUE, FALSE

SELECT TRUE, FALSE;

TRUE, FALSE 컬럼명으로 값 가져오기
가끔 0이 TRUE인지 1인지 헷갈렸는데, 이제 직접 확인해보면서 익숙해져야겠다.

SELECT 0 = TRUE, 1 = TRUE, 0 = FALSE, 1 = FALSE;

0, 0, 1, 1 이 출력된다.
이 명령어도 w3schools에서 에러가 떠서, MySQLWorkbench에서 확인했다.
앞으로 아래 화면이 나오면 에러 때문이라고 생각해주길 바란다.

SELECT 0 = TRUE, 1 = TRUE, 0 = FALSE, 1 = FALSE;

0, 1, 1, 0을 출력한다.
MySQL에서 0은 FALSE고, 1은 TRUE다.
0 = TRUE // 거짓(0)
1 = TRUE // 참(1)
0 = FALSE // 참(1)
1 = FALSE // 거짓(0)

SELECT * FROM Customers WHERE TRUE;

Customers테이블의 모든 행을 가져온다.

SELECT * FROM Customers WHERE FALSE;

Customers테이블에서 아무것도 가져오지 않는다. ( 결과가 없다. )

WHERE에서 참거짓을 이용한 조건으로 데이터를 가져온다는 것을 알 수 있다.

SELECT * FROM Customers WHERE City = 'Berlin';

City가 Berlin인가요 에서 참인 데이터만 가져온다는 뜻이다.

SELECT TRUE IS TRUE;

IS 는 = 과 같은 역할이다.
1을 출력한다. (참)

SELECT TRUE IS NOT FALSE;

1을 출력한다. (참)

SELECT (TRUE IS FALSE) IS NOT TRUE;

수학처럼 괄호먼저 계산하면 된다.
(거짓) 은 참이 아니다 // 1을 출력한다.(참)

SELECT TRUE AND FALSE, TRUE OR FALSE;

프로그래밍 언어와 똑같이 작동한다.
AND 연산자와 OR 연산자이다.
0(거짓), 1(참)을 출력한다.


- AND, OR 연산자

SELECT 2 + 3 = 6 OR 2 * 3 = 6;

2 + 3 = 6 이 아니고, 2 * 3 = 6 이다.
OR연산자이므로 조건 중 하나만 충족해도 참이다.
1을 출력한다.(참)
AND연산자면 둘다 참이 되어야 참이므로 0을 출력한다.

SELECT * FROM Orders
WHERE
CustomerId = 20 AND EmployeeId = 4;

Orders테이블에서 CustomerId가 20 이고, EmployeeId가 4인 데이터만 가져오기
OR을 사용하면 훨씬 더 많은 데이터를 가져온다.

SELECT * FROM OrderDetails
WHERE
ProductId = 40
AND (OrderId = 10514 OR Quantity = 50);

OrderDetails테이블에서 ProductId가 40 이고,
OrderId가 10514이거나 Quantity가 50인 데이터를 가져오기 (40 조건은 필수조건이다)
괄호를 풀면 전혀다른 값을 가져온다.


- =, <> 연산자

SELECT 1 = 1, !(1 <> 1), NOT (1 < 2), 1 > 0 IS NOT FALSE;

1, 1, 0, 1 을 출력한다.
1 = 1 // 참(1)
1<>1 // 1은 1이 아니다라서 거짓(0)이다.
!(0) // !는 반대이기 때문에 1을 출력한다.
NOT (1 < 2) // 괄호 안이 참인데 앞에 NOT가 붙어서 거짓(0)을 출력한다.
1 > 0 IS NOT FALSE // 0보다 1이 큰건 참이고 NOT FALSE도 참이니까 참(1)을 출력한다.

SELECT 'A' = 'A', 'A' != 'B', 'A' < 'B', 'A' > 'B';

1, 1, 1, 0을 출력한다.

SELECT 'A' = 'a';

1을 출력한다.
MySQL은 대소문자를 구분하지 않는다. (이 부분에 대해 블로깅을 했었다.)
참고 : sql / LIKE '%_T' 는 _T로 끝나는 데이터만 찾지 않는다.

SELECT
ProductName, Price,
Price > 20 AS EXPENSIVE
FROM Products;

Products테이블에서 ProductName, Price, EXPENSIVE (Price가 20보다 큰지) 컬럼을 가져오기
WHERE절이면 조건에 맞는 데이터만 가져왔을텐데
SELECT절에 있으면 TRUE, FALSE를 보여준다.

SELECT
ProductName, Price,
NOT Price > 20 AS CHEAP
FROM Products;

가격이 20보다 아래면 CHEAP 컬럼으로 0 혹은 1을 출력한다.


- BETWEEN A AND B

SELECT 5 BETWEEN 1 AND 10;

5는 1 과 10 사이에 있다 // 참(1)
BETWEEN 작은숫자 AND 큰숫자로 써야한다.

SELECT 'banana' NOT BETWEEN 'Apple' AND 'camera';

A, B, C 순서로 판단하기 때문에
NOT가 들어가서 거짓(0)을 출력한다.

SELECT * FROM OrderDetails
WHERE ProductID BETWEEN 1 AND 4;

OrderDetails테이블에서 ProductID가 1부터 4까지인 데이터를 내보낸다.

SELECT * FROM Customers
WHERE CustomerName BETWEEN 'B' AND 'C';

Customers테이블에서 CustomerName이 B부터 C까지의 문자열인 데이터를 내보낸다.


- IN

SELECT 1 + 2 IN (2, 3, 4)

1 + 2는 3인데, 괄호안에 3이 있으므로 참(1)을 출력한다.

SELECT 'Hello' IN (1, TRUE, 'hello')

대소문자 구분을 안해서 참(1)을 출력한다.

SELECT * FROM Customers
WHERE City IN ('Torino', 'Paris', 'Portland', 'Madrid')

Customers테이블에서 City가 Torino, Paris, Portland, Madrid에 속하는 결과 모두 가져오기


- %

SELECT
'HELLO' LIKE 'hel%',
'HELLO' LIKE 'H%',
'HELLO' LIKE 'H%O',
'HELLO' LIKE '%O',
'HELLO' LIKE '%HELLO%',
'HELLO' LIKE '%H',
'HELLO' LIKE 'L%'

%는 0~N개의 문자열을 의미한다.
'HELLO' LIKE 'hel%',
'HELLO' LIKE 'H%',
'HELLO' LIKE 'H%O',
'HELLO' LIKE '%O',
'HELLO' LIKE '%HELLO%',
은 모두 참(1)을 출력하고,

'HELLO' LIKE '%H',
'HELLO' LIKE 'L%'
는 H로 끝나는 문자열, L로 시작하는 문자열이기 때문에 거짓(0)을 출력한다.


- _

SELECT
'HELLO' LIKE 'HEL__',
'HELLO' LIKE 'h ___ O',
'HELLO' LIKE 'HE_LO',
'HELLO' LIKE '_____',
'HELLO' LIKE '_HELLO',
'HELLO' LIKE 'HEL_',
'HELLO' LIKE 'H_O'

_는 한개의 문자열을 뜻한다.

'HELLO' LIKE 'HEL__',
'HELLO' LIKE 'h ___ O',
'HELLO' LIKE 'HE_LO',
'HELLO' LIKE '_____',
는 글자수가 5개이기 때문에 참(1)이고

'HELLO' LIKE 'HEL_',
'HELLO' LIKE 'H_O'
는 글자수가 4개, 3개라서 거짓(0)이다.

SELECT * FROM Employees
WHERE Notes LIKE '%economics%'

Employees테이블에서 Notes에 economics단어가 들어있는 데이터를 가져온다.

SELECT * FROM OrderDetails
WHERE OrderID LIKE '1025_'

OrderDetails테이블에서 OrderID가 1025로 시작하고 5글자인 데이터를 가져온다.


더 많은 operator : mysql 공식문서

profile
기록하는 백엔드 개발자

1개의 댓글

comment-user-thumbnail
2022년 2월 1일

복습완료

답글 달기