공부계기
개발자로 취업한 지 3개월차.
데이터베이스에서 sql을 자주 쓰지만, 주로 SELECT문만 사용한다.
가끔 다른 명령어를 써야하면 구글링을 해야만 하는게 귀찮았다.
sql에 대한 경험을 더 해야겠다고 생각했다.
그래서 추석을 맞이해 MySQL 강의를 듣겠다고 결심했다 !
명령어는 아래처럼 마크다운을 사용했고, 그 아래에 어떤 명령어인지 해석을 썼다.
처음보거나 나에게 중요하게 다가오는 명령어는 굵은 문자로 표시했다.
ex)
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 이 차례대로 나온다.
(처음본다.. ! 어디에 쓰는걸까? 🧐)
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 미만인 데이터만 가져오기
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가 오름차순으로 정렬됐다. (존잼)
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명령문을 사용할 일이 없었다.
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을 곧 지배할 수 있을 것이다.
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의 절반값, 두배값, 할인값을 각각 가져오기
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(참)을 출력한다.
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을 출력한다.
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까지의 문자열인 데이터를 내보낸다.
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 공식문서
복습완료