참고
https://velog.io/@ryu_log/Mac%EC%97%90-MariaDB-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
마리아디비 다운 / 맥은 홈브루로만 가능

** 마리아디비 스타트!
brew services start mariadb
brew services stop mariadb
brew services list
로 검색.
iterm에서 들어갈 때
brew services start mariadb로 들어가서
mysql -u root -p // 로그인..?
그리고 비밀번호 ㅊㅕ !!!
참고
https://aws.amazon.com/ko/compare/the-difference-between-mariadb-vs-mysql/
** 문법은 거의 유사하지만 몇가지 차이점이 있다.
Database - 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보의 집합, 저장소
얘 자체는 주머니, 여기에 정보들을 집어넣고 원하는 걸 찾아 꺼내는 등의!!!
각종 기능들을 넣어서 자판기!! 처럼 만들면
데이터관리 시스템이 된다!
하나의 소프트웨어! 수정 삭제 등등 기능가능
엑셀과 비슷한 형식으로 데이터를 저장 / 일정한 규칙이 있음
일정한 양식이 있기 때문에 읽기 좋음
표 형태의 데이터베이스에 정보를 넣고 빼고 조작하고 사용하는데 사용되는 게 '구조화 질의 언어' sql!
이것은 프로그래밍 언어인가? 용도가 한정되어 있음.
자바 파이썬처럼 다양한 활용이 가능한 '범용 프로그래밍 언어' 보다는 html처럼 특정 사용처에서 쓰이는 '도메인 특화 언어' 에 가까움
고유값을 주고 연결시켜!
그럼 효율적이고 간단해짐.
근데 보기가 어렵잖아. 어케?
관계형은 - join이라는 기능을 사용함
join으로 분리된 애들을 이어주는 기능
하나의 사용법을 알고나면 다른 oracle sql 등등~ 금방 익힐 수 있음!
select * from 000 : 컬럼의 모든 내용 보기
-- : 주석 달기 // 컴퓨터는 실행하지 않고, 사람만 봐라~
* : 테이블의 모든 컬럼
원하는 컬럼만 보기 : select 컬럼명 from 테이블
원하는 컬럼이 여러개일 경우 : selelct 컬럼명, 컬럼명, 컬럼명 form 테이블
(특정조건) 컬럼 + 컬럼이 아닌 것들 : select CustomerName, 1, 'Hello', Null
// 왜 헬로에만 따옴표 들어가? 문자열은 ''안에 ~
원하는 행을 조건문으로 선택해서 가져오기 : select * from 테이블명 WHERE 컬럼 = ?;
// where : 조건에서 사용!
위의 것을 특정 컬럼만 가져오기 : select 컬럼명, 컬럼명 from 테이블명 where 컬럼명 = ? ;
where은 조건을 걸 때 사용하는데, = 뿐만아니라 >,<, <= 와 같은 부등호도 가능!
where에서 city = 'London' or Country = 'Mexico'와 같은 or 사용도 가능
select, from, where 이런 구문 대소문자 상관 없음
문장이 길어져서 행을 나누는 것도 상관없음! ; <- 이걸 기준으로 실행
Oder by : 원하는 순서대로 가져오기
- ASC : 오름차순, 기본
- DESC : 내림차순
// select from 테이블명 oderby 컬럼명 DESC 이런식.
// 두가지 기준도 가능 우선순위를 앞에
// select from 테이블명 oderby 우선순위 컬럼명 ASC, 차순위 컬럼명 DESC; 이런식.
원하는 만큼만 가져오기 : Limit
- select * from 테이블명 Limit 10;
-리미트 뒤에 숫자를 두개 넣으면 앞에는 시작 숫자부터 뒤에는 몇개까지
내가 원하는 컬럼명으로 데이터 가져오기 : Alias
- Select CustomerId AS ID, CustomerName AS Name From Customers;
// 그럼 컬럼명이 변해요 !!
// 한글은 잘 안먹히지만 '' 일단 여기 안에 넣어봐
주어진 값을 가지고 특정 값을 계산해내는데 쓰이는 도구들
+,-,*,/
%, Mod 나머지
SELECT 1 + 2;
SELECT 5 - 2.5 AS DIFFERENCE;
SELECT 3 * (2 + 4) / 2, 'Hello';
SELECT 10 % 3;
등과 같이 바로 바로 표현 가능
문자열에 더하면?
자바스크립트는 3도 문자열로 인식
mysql은 문자열은 0으로 인식함!
SELECT 'ABC' + 3;
SELECT 'ABC' * 3;
SELECT '1' + '002' * 3;
-- **숫자로 구성된 문자열은 숫자로 자동인식**
그런데, 문자열이 숫자면은!!!! 숫자로 자동인식함. 미스테리 ~ mysql 특징이야
SELECT OrderID + ProductID FROM OrderDetails;
SELECT ProductName, Price / 2 AS HalfPrice FROM Products;
이런식으로 활용 가능.
SELECT TRUE IS TRUE;
SELECT TRUE IS NOT FALSE;
SELECT '1' + '002' * 3;
SELECT (TRUE IS FALSE) IS NOT TRUE;
SELECT !TRUE, NOT 1, !FALSE, NOT FALSE;
SELECT TRUE AND FALSE, TRUE OR FALSE;
SELECT 2 + 3 = 6 OR 2 * 3 = 6;
SELECT * FROM Orders
WHERE
CustomerId = 15 AND EmployeeId = 4;
SELECT * FROM Products
WHERE
ProductName = 'Tofu' OR CategoryId = 8;
SELECT * FROM OrderDetails
WHERE
ProductId = 20
AND (OrderId = 10514 OR Quantity = 50);
AND, && : 양쪽이 모두 트루일때만 트루
or, || : 한쪽이 트루면 트루
- where 뒤에 true를 붙이면 특정 조건을 만족하는 것이 와야해

SELECT 1 = 1, !(1 <> 1), NOT (1 < 2), 1 > 0 IS NOT FALSE;
이런식으로 활용해보자
SELECT 'A' = 'A', 'A' != 'B', 'A' < 'B', 'A' > 'B';
문자열에서도 가능!
문자열의 대소비교는 문자열 순서대로!!
대소문자 구분 하지 않아용
- Between 0 and 0 : 두 값 사이에 있음
not Between 0 and 0 : 두 값 사이가 아닌 곳에 있음
SELECT FROM OrderDetails WHERE ProductID BETWEEN 1 AND 4;
SELECT FROM Customers WHERE CustomerName BETWEEN 'b' AND 'c';
in : 괄호 안의 값들 가운데 있음
not in : 가운데 없음
SELECT 1 + 2 IN (2, 3, 4)
SELECT 'Hello' IN (1, TRUE, 'hello')
SELECT * FROM Customers WHERE City IN ('Torino', 'Paris', 'Portland', 'Madrid')
Like '...%...' : 0~N개 문자를 가진 패턴
Like '..._...' : _갯수만큼의 문자를 가진 패턴
SELECT
'HELLO' LIKE 'hel%',
'HELLO' LIKE 'H%',
'HELLO' LIKE 'H%O', -- H로 시작해서 O로 끝난다
'HELLO' LIKE '%O',
'HELLO' LIKE '%HELLO%',
'HELLO' LIKE '%H',
'HELLO' LIKE 'L%'
SELECT
'HELLO' LIKE 'HEL',
'HELLO' LIKE 'h_O',
'HELLO' LIKE 'HE_LO',
'HELLO' LIKE '_',
'HELLO' LIKE 'HELLO',
'HELLO' LIKE 'HEL',
'HELLO' LIKE 'H_O'
SELECT * FROM Employees WHERE Notes LIKE '%economics%'
SELECT * FROM OrderDetails WHERE OrderID LIKE '1025_'
더많은 친구들을 원한다면!
mysql operator를 검색!
1. 숫자를 다루는 함수들
ABS : 절대값
- SELECT ABS(1), ABS(-1), ABS(3 - 10);
- SELECT * FROM OrderDetails WHERE ABS(Quantity - 10) < 5;
Greatest : (괄호안에서) 가장 큰 값
Least : (괄호안에서) 가장 작은 값
- SELECT GREATEST(1, 2, 3), LEAST(1, 2, 3, 4, 5);
- SELECT OrderDetailID, ProductID, Quantity,
GREATEST(OrderDetailID, ProductID, Quantity),
LEAST(OrderDetailID, ProductID, Quantity) FROM OrderDetails;
** 위에건 괄호안에서 가장 이었다면, 아래건 컬럼 기준 여러행들 중(조건에 따라 집계된 값 중)! // 그룹함수, 집계함수
max : 가장 큰 값
min : 가장 작은 값
count : 갯수 (null 값 제외)
sum : 총합
avg : 평균 값
SELECT MAX(Quantity), MIN(Quantity), COUNT(Quantity), SUM(Quantity), AVG(Quantity) FROM OrderDetails WHERE OrderDetailID BETWEEN 20 AND 30;
POW(A,B), POWER(A,B) : A를 B만큼 제곱
SQRT : 제곱근
- SELECT Price, POW(Price, 1/2) FROM Products WHERE SQRT(Price) < 4;
TRUNCATE(N,n) : N을 소숫점 n자리 까지 선택
- SELECT Price FROM Products WHERE TRUNCATE(Price, 0) = 12;
더 많은 것들은. 따로 가서 공부
https://dev.mysql.com/doc/refman/8.0/en/numeric-functions.html
2. 문자열 관련 함수
SUBSTR, SUBSTRING : 주어진 값에 따라 문자열 자름
- SELECT SUBSTR('ABCDEFG', 3), SUBSTR('ABCDEFG', 3, 2), SUBSTR('ABCDEFG', -4), SUBSTR('ABCDEFG', -4, 2);
LEFT : 왼쪽부터 n글자
- SELECT LEFT('ABCDEFG', 3), RIGHT('ABCDEFG', 3);
right : 오른쪽부터 n글자
Length : 문자열의 바이트 길이(언어 등에 따라 다름)
char_length, chanracer_lenght : 문자열의 문자 길이
- SELECT
LENGTH('안녕하세요'), -- 15
CHAR_LENGTH('안녕하세요'), -- 5
CHARACTER_LENGTH('안녕하세요'); -- 5
TRIM : 양쪽 공백제거
LTRIM : 왼쪽 공백제거
RTRIM : 오른쪽 공백제거
- SELECT
CONCAT('|', ' HELLO ', '|'),
CONCAT('|', LTRIM(' HELLO '), '|'),
CONCAT('|', RTRIM(' HELLO '), '|'),
CONCAT('|', TRIM(' HELLO '), '|');
LPAD(S,N,P) : S가 N글자 될 때까지 P를 이어 붙임
RPAD(S,N,P) : S가 N글자 될 때까지 P를 이어 붙임
- SELECT
LPAD('ABC', 5, '-'),
RPAD('ABC', 5, '-');
REPLACE(S,A,B) : s중 a를 b로 변경
- SELECT REPLACE('맥도날드에서 맥도날드 햄버거를 먹었다.', '맥도날드', '버거킹'); // 버거킹에서 버거킹 햄버거를 먹었다로 변경됨
INSTR(S,s) : S중 s의 첫 위치 반환, 없을시 0
- SELECT
INSTR('ABCDE', 'ABC'),
INSTR('ABCDE', 'BCDE'),
INSTR('ABCDE', 'C'),
INSTR('ABCDE', 'DE'),
INSTR('ABCDE', 'F');
// 1,2,3,0,0 이 나옴, 어디서부터 포함됐는지 첫번째 위치 알려줌
CAST(A AS T) : A를 T 자료형으로 변환
CONVERT(A,T) : A를 T 자료형으로 변환
- SELECT
'01' = '1',
CAST('01' AS DECIMAL) = CAST('1' AS DECIMAL);
3. 시간 / 날짜 관련 함수

주어진 시간으로부터 이 값을 뽑아냄
hour : 주어진 datetime의 시 반환
minute : 주어진 datetime의 분 반환
second : 주어진 datetime의 초 반환
- SELECT
HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
ADDDATE, DATE_ADD : 시간/날짜 더하기
SUBDATE, DATE_SUB : 시간/날짜 빼기
- SELECT
ADDDATE('2021-06-20', INTERVAL 1 YEAR),
ADDDATE('2021-06-20', INTERVAL -2 MONTH),
ADDDATE('2021-06-20', INTERVAL 3 WEEK),
ADDDATE('2021-06-20', INTERVAL -4 DAY),
ADDDATE('2021-06-20', INTERVAL -5 MINUTE),
ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND);
이런식으로 계산도 가능
주어진 권한 변경할때 사용(쿠폰 등)!!
DATE_DIFF : 두시간/날짜간 일수차
TIME_DIFF : 두시간/날짜간 시간차
- SELECT
OrderDate,
NOW(),
DATEDIFF(OrderDate, NOW())
FROM Orders;
// 각각 띄우고, 마지막 datediff로 차이써주기 (괄호안에 비교대상 넣기)
Last_DAY : 해당 달의 마지막 날짜
- SELECT
OrderDate,
LAST_DAY(OrderDate),
DAY(LAST_DAY(OrderDate)),
DATEDIFF(LAST_DAY(OrderDate), OrderDate)
FROM Orders;

if(조건, T, F) : 조건이 참이라면 T, 거짓이면 F 반환
- SELECT IF (1 > 2, '1는 2보다 크다.', '1은 2보다 작다.');
보다 복잡한 조건은 case문을 사용
- SELECT
CASE
WHEN -1 > 0 THEN '-1은 양수다.'
WHEN -1 = 0 THEN '-1은 0이다.'
ELSE '-1은 음수다.'
END;
IFNULL(A,B) : A가 NULL일 시 B출력
- SELECT
IFNULL('A', 'B'),
IFNULL(NULL, 'B');

필터링!! (조건문)
Having - 그룹화된 데이터 걸러내기
SELECT
Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;
// 근데 이제까지는 웨얼에다 했는데. 왜 지금은 갑자기 해빙?
// where은 그룹하기 전 데이터, having은 그룹 후 집계에 사용합니다.
SELECT
COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;
DISTINCT : 중복된 값들을 제거합니다.
// 그룹바이와 달리 집계함수가 사용되지 않음
// 그룹바이와 달리 정렬하지 않으므로 더 빠름
// 카운트랑 같이 못 써 !!
// 오더바이 붙여서 수동으로 정렬은 가능
// 필요에 따라서 그룹바이와 디스팅트 함께 활용가능
- SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;