[sql] mariaDB / mysql 기초

이유은·2023년 11월 20일

[Sql]

목록 보기
2/5

참고
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 // 로그인..?
그리고 비밀번호 ㅊㅕ !!!


MariaDb와 mySql의 차이

참고
https://aws.amazon.com/ko/compare/the-difference-between-mariadb-vs-mysql/

  • mysql의 업그레이드 버전 -> 마리아디비
  • 사용방법은 유사 !!
  • 마리아디비가 더 안정적이고 업데이트 활발
  • 내용이 넘 어렵다.. 위에 읽어보세요..

** 문법은 거의 유사하지만 몇가지 차이점이 있다.

https://norimoon.com/entry/MariaDB-vs-MySQL-문법-차이
참고!!


Database - 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보의 집합, 저장소

얘 자체는 주머니, 여기에 정보들을 집어넣고 원하는 걸 찾아 꺼내는 등의!!!
각종 기능들을 넣어서 자판기!! 처럼 만들면

DBMS (database management system)

데이터관리 시스템이 된다!

하나의 소프트웨어! 수정 삭제 등등 기능가능

SQL

엑셀과 비슷한 형식으로 데이터를 저장 / 일정한 규칙이 있음
일정한 양식이 있기 때문에 읽기 좋음
표 형태의 데이터베이스에 정보를 넣고 빼고 조작하고 사용하는데 사용되는 게 '구조화 질의 언어' sql!
이것은 프로그래밍 언어인가? 용도가 한정되어 있음.
자바 파이썬처럼 다양한 활용이 가능한 '범용 프로그래밍 언어' 보다는 html처럼 특정 사용처에서 쓰이는 '도메인 특화 언어' 에 가까움

RDBMS = relational / 관계형 데이터베이스 관리 시스템

고유값을 주고 연결시켜!
그럼 효율적이고 간단해짐.
근데 보기가 어렵잖아. 어케?
관계형은 - join이라는 기능을 사용함
join으로 분리된 애들을 이어주는 기능

하나의 사용법을 알고나면 다른 oracle sql 등등~ 금방 익힐 수 있음!


🎈 mySQL 사용법

  • 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;
  • is : 양쪽이 모두 트루 또는 폴스
  • is not : 한쪽이 트루, 한쪽은 폴스
  • 참인것은 1 거짓은 0으로 변환돼서 나타남
  • ! < 앞에 붙으면 반대가 됨
  • not 역시 반대로 그리고 스페이스 붙여줘야함
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를 붙이면 특정 조건을 만족하는 것이 와야해



https://www.yalco.kr/@sql/1-2/

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. 숫자를 다루는 함수들

  • round : 반올림
    - SELECT ROUND(0.5), CEIL(0.4), FLOOR(0.6);
    - SELECT Price, ROUND(price), CEIL(price), FLOOR(price) FROM Products;
  • ceil : 올림
  • floor : 내림
  • 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;


2. 문자열 관련 함수

  • UCASE, UPPER : 모두 대문자로
  • LCASE, LOWER : 모두 소문자로
    - SELECT UCASE(CustomerName), LCASE(ContactName) FROM Customers;
  • CONCAT(...) : 괄호안의 내용 이어 붙임
    - SELECT CONCAT('HELLO', ' ', 'THIS IS ', 2021)
    - SELECT CONCAT('O-ID: ', OrderID) FROM Orders;
  • CONCAT_WS(S, ...) : 괄호안의 내용 S로 이어붙임
    - SELECT CONCAT_WS('-', 2021, 8, 15, 'AM')
    - SELECT CONCAT_WS(' ', FirstName, LastName) AS FullName
    FROM Employees;
  • 문자열 더하기 !!
  • 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. 시간 / 날짜 관련 함수

  • current_Date, curdate : 현재 날짜 반환
  • current_time, curtime : 현재 시간 반환
  • current_timestamp, now : 현재시간과 날짜 반환
    - SELECT CURDATE(), CURTIME(), NOW();
    • 함수이기 때문에 빈괄호라도 입력해줘야함!
  • Date : 문자열에 따라 날짜 생성
  • time : 문자열에 따라 시간 생성
    - SELECT
    '2021-6-1' = '2021-06-01',
    DATE('2021-6-1') = DATE('2021-06-01'),
    '1:2:3' = '01:02:03',
    TIME('1:2:3') = TIME('01:02:03');
    // 이걸 보면 맨 첫줄은 , 우리 개념으론 같은 날짜지만 인식못함, 문자열로 인식
    // 두번째줄처럼 date()안에 넣으면, 날짜로 인식!! , 시간역시 마찬가지

  • 주어진 시간으로부터 이 값을 뽑아냄

  • 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;



  • 주어진 시간/날짜를 지정한 형식으로 반환

  • SELECT
    DATE_FORMAT(NOW(), '%M %D, %Y %T'),
    DATE_FORMAT(NOW(), '%y-%m-%d %h:%i:%s %p'),
    DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %s초');

  • STR_TO_DATE(S,F) : S를 F형식으로 해석하여 시간/날짜 생성
    - SELECT
    OrderDate,
    DATEDIFF(
    STR_TO_DATE('1997-01-01 13:24:35', '%Y-%m-%d %T'),
    OrderDate
    ),
    TIMEDIFF(
    STR_TO_DATE('1997-01-01 13:24:35', '%Y-%m-%d %T'),
    STR_TO_DATE(CONCAT(OrderDate, ' ', '00:00:00'), '%Y-%m-%d %T')
    )
    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');


🎈조건에 따라 그룹으로 묶기

  • Group By : 테이블의 특정행을 그 안의 겹치지 않는 값으로 분류해줌
    - SELECT CategoryID FROM Products
    GROUP BY CategoryID;

  • 전체를 다 합친 값이 마지막에 추가됨
  • 필터링!! (조건문)

  • 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;

profile
우당탕코딩

0개의 댓글