공대생의 개발 일기장

MYSQL 몰랐던, 햇갈렸던 부분 정리 본문

데이터베이스/MYSQL

MYSQL 몰랐던, 햇갈렸던 부분 정리

SeoKyung 2024. 3. 17. 03:42

** 상시 수정 & 추가중

** 이론적인 부분은 책에 필기, 여기는 코드적인 부분이나 책에 넣기 애매한 내용 정리 

** oracle과 상통한 부분이 있기 때문에 SQLD에서 공부했던 내용과 유사. 기본적인 것들은 비슷하니 잊어먹었다면 책 살펴보기

 

https://www.inflearn.com/course/%EC%96%84%EC%BD%94-%EB%A7%88%EC%9D%B4%EC%97%90%EC%8A%A4%ED%81%90%EC%97%98/dashboard

 

갖고노는 MySQL 데이터베이스 by 얄코 강의 - 인프런

비전공자도 이해할 수 있는 MySQL! 빠른 설명으로 필수개념만 훑은 뒤 사이트의 예제들과 함께 MySQL을 ‘갖고 놀면서’ 손으로 익힐 수 있도록 만든 강좌입니다., 빠르게 배우고, 손으로 익히고! 

www.inflearn.com

 

학부에서 MYSQL을 다뤘지만 강의를 통해 몰랐거나 햇갈렸던 부분 다시 정리.

 

1. 상수(여기서는 1)나 문장('Hello') 그리고 NULL은 모든 튜플이 그 값들로 채워서 출력된다. (튜플의 개수는 A의 개수)

또한, 1, Hello, NULL이 각 속성의 이름으로 정해진다.

SELECT
  A(속성), 1, 'Hello', NULL
FROM Customers;

 

2. LIMIT {가져올 개수} or LIMIT{건너뛸 개수, 가져올 개수}

SELECT * FROM A
LIMIT 30, 10;

 

3. 사칙연산의 결과도 출력가능. 문자열에 사칙연산을 하면 문자열을 0으로 인식!(아래 출력 결과는 3)

단, 숫자로 이루어진 문자열은 자동으로 숫자로 변환하여 연산

SELECT 'A' + 3; 
-- 3

SELECT '1' + 3; 
-- 4

 

4. MYSQL에서도 TRUE, FALSE는 각각 1, 0으로 출력, SELECT문에서도 AND(&&), OR(||)의 연산자도 사용가능(WHERE뿐만 아니라)

 

5. MYSQL의 기본 사칙연산자는 대소문자 구분 XXXX

 

6. CONCAT_WS('string', ...) : 무언가를 string으로 이어 붙임

SELECT CONCAT_WS('-', 2024, 03, 17, 'AM')
-- 2024-03-17-AM

 

7. LEFT, RIGHT('string', 출력개수)

SELECT
  LEFT('ABCDEFG', 3), -- 왼쪽에서 3개
  RIGHT('ABCDEFG', 3); -- 오른쪽에서 3개

 

8. LENGTH는 바이트 길이, CHAR_LENGTH는 문자 길이 즉, 한글을 기준으로 LENGTH은 한글 한 글자면 3, CHAR_LENGTH는 1을 출력

 

9. INSTR('string', 'string2') string에서 string2의  첫 위치 반환, 없다면 0으로 반환.

SELECT
  INSTR('ABCDE', 'ABC'), -- 1
  INSTR('ABCDE', 'BCDE'), -- 2
  INSTR('ABCDE', 'C'), -- 3
  INSTR('ABCDE', 'DE'), -- 4
  INSTR('ABCDE', 'F'); -- 0

 

10. CAST(A AS B), CONVERT(A, B): A를 B 자료형으로 변환

 

11. 시간/날짜 관련 함수

  1. CURRENT_DATE / CURDATE : 현재 날짜 반환
  2. CURRENT_TIME / CURTIME : 현재 시간 반환
  3. CURRENT_TIMESTAMP / NOW : 현재 시간과 날짜 반환
  4. DATE, TIME : 각각 문자열에 따라 날짜, 시간 생성
  5. YEAR : 주어진 DATETIME값의 년도 반환
  6. MONTHNAME : 영문으로 월 반환
  7. MONTH : 월 반환
  8. WEEKDAY : 요일값 반환(단, 월요일이 0이다.)
  9. DAYNAME : 요일명 반환
  10. DAYOFMONTH, DAY : 일 반환
  11. HOUR : 시 반환
  12. MINUTE : 분 반환
  13. SECOND : 초 반환
  14. ADDDATE, DATE_ADD : 시간/날짜 더하기
  15. SUBDATE, DATE_SUB : 시간/날짜 빼기
  16. DATE_DIFF, TIME_DIFF(date1, date2) : 각각 두 시간/날짜 간 일수, 시간 차
  17. LAST_DAT(date) : 해당 달의 마지막 날짜
  18. DATE_FORMAT : 시간/날짜를 지정한 형식으로 반환
  19. STR_TO_DATE(A, B) : A를 B형식으로 해석하여 시간/날짜 생성 (여기서 B는 18번과 같은 형식, A는 그냥 시간)
  20. ** 날짜 형식들(18번, 19번에서 사용)
%Y 년도 4자리
%y 년도 2자리
%M 월 영문
%m 월 숫자
%D 일 영문(1st, 2nd, 3rd...)
%d%e 일 숫자 (01 ~ 31)
%T hh:mm:ss
%r hh:mm:ss AM/PM
%H%k 시 (~23)
%h%l 시 (~12)
%i
%S%s
%p AM/PM

 

 

SELECT CURDATE(), CURTIME(), NOW();


SELECT
  DATE('2024-03-17') = DATE('2024-03-17'),
  TIME('1:2:3') = TIME('01:02:03');
 -- 둘 다 TRUE 반환
 
 
 SELECT
  Date,
  YEAR(Date) AS YEAR,
  MONTHNAME(Date) AS MONTHNAME,
  MONTH(Date) AS MONTH,
  WEEKDAY(Date) AS WEEKDAY,
  DAYNAME(Date) AS DAYNAME,
  DAY(Date) AS DAY
FROM A;


SELECT 
  ADDDATE('2024-03-17', INTERVAL 1 YEAR),
  ADDDATE('2024-03-17', INTERVAL -2 MONTH),
  ADDDATE('2024-03-17', INTERVAL 3 WEEK),
  ADDDATE('2024-03-17', INTERVAL -4 DAY),
  ADDDATE('2024-03-17', INTERVAL -5 MINUTE),
  ADDDATE('2024-03-17 03:30:12', INTERVAL 6 SECOND);

 

12. IF(setence)는 TRUE or FALSE 반환. 

 

13. Oracle에서 NVL함수는 MYSQL에서는 IFNULL // CASE문은 Oracle과 동일

 

14. ~ALL : 서브쿼리의 모든 결과에 대해 ~하다.

 

15. ~ANY : 서브쿼리의 하나 이상의 결과에 대해 ~하다.

 

16. JOIN ~ ON을 여러번 사용도 가능. ON 조건에서 사칙연산을 이용해서도 가능하다!

SELECT
  E1.EmployeeID,
  E2.EmployeeID, 
FROM Employees E1 JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID;

 

17. JOIN이 양옆으로 붙인거라면, UNION, UNION ALL은 위 아래로 붙이기(그렇기 때문에 값이 다른건 통일 해줘야함)

 

18. TABLE 생성시 PK에 AUTO_INCREMENT를 거의 대부분 사용.

 

19. 제약조건에서 UNSIGNED는 양수만 가능.

 

20. 햇갈리는 자료형 정리

https://www.youtube.com/watch?v=NmraFRrusD8

 

21. DELETE와 달리 TRUNCATE는 테이블을 삭제하는 것 뿐 아니라 테이블 자체를 초기화(pk의 번호가 1번부터 시작함)

 

22. 외래키 제약은 모두 부모테이블을 시점으로!

23. 내용 수정이 가능한 VIEW

  1. 집계함수 사용하지 않음
  2. GROUP BY 사용하지 않음
  3. UNION, DISTINCT 사용하지 않음
  4. SELECT절에 서브쿼리 없음
  5. WHERE절에 서브쿼리가 FROM절의 테이블 참조하지 않음
  6. JOIN은 INNER JOIN만 가능함.

조건이 많지만 어느정도 예상 가능한 범위에서만 내용 수정이 가능하다는 말. 집계함수로 묶는다거나 해버리면 그 이전의 상태를 확인할 수 없기 때문에 수정하기 어려움, 다른 서브쿼리에 대한 절도 마찬가지. 다만, JOIN에 대한 것은 조금 햇갈릴 수 있는데 이건 그냥 외우자.

 

24. 사용자 생성 예시

CREATE USER '사용자명'@'접속위치' IDENTIFIED BY '비밀번호';

즉, USER1이 사용자명이고, 접속위치는 ip주소, 비밀번호는 비밀번호다.