2023.11.17 4일차 회고

  • 4일차 공부

- 전날 수업내용 복습

- DML - SELECT 공부 및 실습

- DDL, DML - 전체 실습

- 타입(data type) - 숫자타입 공부 및 실습

- 타입(data type) - 문자타입 공부 및 실습

- ENUM 타입, DATATIME 타입 실습

- 비교연산자, 논리연산자 공부 및 실습

- 검색 패턴 공부 및 실습

- 타입 변환(함수) 공부 및 실습

 

데이터 베이스 SQL 쿼리에 대한 감을 조금씩 잡아 가는 것 같다. 이론만 공부하는게 아니라 실습도 같이 진행해서 조금 더 원활하게 이해가 되는것 같다. SQL과 JAVA는 개념은 이해되는 수준으로 한번만 제대로 보고 다음으로는 문제 많이 풀면서 실력을 빨리 올리는 게 중요하다고 한다. 그래서 프로그래머스에서 SQL, JAVA 문제를 계속해서 풀것이다.. SQL 문제는 오늘 9문제 풀었고 JAVA는 3문제를 풀었다. JAVA는 입문레벨이어서 빠르게 풀어 나가며 기초문법을 익혀야 되겠다는 생각이 들어서 빠른 시일내에 입문레벨을 끝낼 것이다. 오늘 같이 스터디한 분이 기초부터 꼼꼼하게 알려주셔서 문제 풀이에 큰 도움이 되었다. 오늘 배운 부분은 꼭 복습하고 기억해서 똑같은 부분이 나오면 잘 해결해봐야겠다고 생각했다.

 

벌써 4일차가 지났다. 시간이 뭔가 점점 빠르게 지나가는 것처럼 느껴진다. 아침부터 저녁까지 계속 수업을 듣는게 오랜만이어서 좀 피곤하긴 하지만 꾸준히 끝까지 열심히 공부할 것이다. 조금은 무리일 수 있겠지만 건강과 체력을 위해서 헬스장을 끊었다. 내일부터 운동도 꾸준히 해서 살도 빼려고 하는데, 너무 무리하지 않는 선에서 운동도 열심히 할것이다.

할수있다.

 

  • 4일차 공부 메모

3일차 수업 복습 진행

 

DML - SELECT

  • SELECT 시 중복되는 값 제거
    • select distinct name from author;
  • 선택한 결과의 정렬
    • SELECT 문으로 선택한 결과를 ORDER BY 절을 사용하여 정렬
    • 기본 설정은 오름차순(ASC)이며, 내림차순 시 DESC
    • 여러 필드의 데이터를 쉼표(,)를 사용하여 여러기준으로 정렬할 수도
    • order by 생략시 pk를 기준으로 오름차순 정렬하여 결과값 반환
    • SELECT * FROM AUTHOR LIMIT number : 반환할 행의 최대 수를 지정
    • SELECT * FROM AUTHOR ORDER BY id desc limit 2;
    • select * from author order by id desc limit 2;
  • 별칭(alias)을 이용한 처리
    • 테이블과 필드에 임시로 별칭(alias)을 부여하고, 해당 별칭을 SELECT 문에서 사용
    • SELECT 필드이름 AS 별칭 FROM 테이블이름;
    • SELECT 필드이름 FROM 테이블이름 AS 별칭;
    • select name as 이름, email from author;
    • 별칭 사용 이유는 다른 테이블 같이 조회 시 헷갈리지 않으려고 사용

DDL, DML - 전체 실습

  • drop database;
  • database 재생성
  • 아래 스키마를 보고 각 각 author, post 테이블 재생성, fk에는 별도의 참조키 관련 옵션이 없는 default(restrict) 설정

author 테이블
post 테이블

drop table post;
drop table board;
create table author(id INT, name VARCHAR(100) NOT NULL, email VARCHAR(255), password VARCHAR(255), role VARCHAR(50), address VARCHAR(255), PRIMARY KEY(id));
create table post(id INT, title VARCHAR(255), contents VARCHAR(3000), author_id INT, PRIMARY KEY(id), FOREIGN KEY(author_id) REFERENCES author(id));
  • 게시판 회원은 총 5명이 되도록 만들고, 게시판 실명으로 글이 쓰여진 게시글은 총 3건, 익명으로 글이 쓰여진 글은 총 2건이 있도록 데이터 insert
  • 게시판의 회원을 모두 delete하되, 기존에 posting된 글은 삭제되지 않고 남아있도록 여라.
    • where author_id is not null
  • post의 글을 3개만 조회하되, title을 기준으로 오름차순하고 만약 제목이 같은경우 contents로 내림 차순이 되도록 조회.
insert into author(id, name, email) values(1, 'abc', 'abc@naver.com');
insert into author(id, name, email) values(2, 'abd', 'abd@naver.com');
insert into author(id, name, email) values(3, 'abe', 'abe@naver.com');
insert into author(id, name, email) values(4, 'abf', 'abf@naver.com');
insert into author(id, name, email) values(5, 'abg', 'abg@naver.com');

insert into post(id, title, contents, author_id) values(1, 'hello1', 'hhhhh', 1);
insert into post(id, title, contents, author_id) values(2, 'hello2', 'ggggg', 2);
insert into post(id, title, contents, author_id) values(3, 'hello3', 'fffff', 3);
insert into post(id, title, contents) values (4, 'hello4', 'ddddd');
insert into post(id, title, contents) values (5, 'hello5', 'sssss');

update post set author_id = null where author_id is not null;
delete from author;
select * from post order by title ASC, contents DESC limit 3;

 

타입(data type) - 숫자

  • 테이블의 타입 확인
    • DESCRIBE 테이블명;
  • 숫자 타입
    • 정수
      • TINYINT
        • -128 ~ 127범위, 1바이트(8비트)
        • java의 byte와 매핑
      • INT
        • 4바이트
        • java의 int타입과 매핑
      • BIGINT
        • 8바이트
        • java의 long타입과 매핑
      • UNSIGNED 타입을 사용하여 양수만 표현가능
        • 표현값 2배로 증가
        • TINYINT UNSIGNED(- 사용X) 이렇게 사용한다면 255까지 사용가능 ex)나이
  • 실수
    • 부동 소수점 타입
      • FLOAT, DOUBLE
      • 오차가 발생할 여지가 있음
    • 고정 소수점 타입
      • DECIMAL(M,D) - 소수점 표현 시 DECIMAL 사용
      • create table post(price DECIMAL(10,3))
        • java의 Bigdecimal
        • M은 총자릿수 (정수부+소수부)를 의미 하고, 65자리까지 표현가능
        • D는 소수부 의미
        • 정확한 숫자 표현을 위해사용

===== 타입(data type) - 숫자 실습 =====

  • author 테이블에 age 데이터 tinyint unsigned 추가
    • 255이하로 insert, 255초과로 insert 테스트
  • post에 price라는 원고료컬럼을 추가. 원고료 컬럼은 총자릿수 10자리 및 소수점 단위는 3자리까지 가능
    • 컬럼 추가 후 비어있는 컬럼에 숫자 update test. (소숫점 3이하 test, 소숫점 3초과 테스트)
alter table author ADD column age tinyint unsigned;

insert into author(id, name, age) values(1, 'abc', 255);
insert into author(id, name, age) values(1, 'abc', 256);

alter table post ADD column price DECIMAL(10,3)

update post set price = 100.123 where id=1;
update post set price = 100.1255 where id=2;
-- 소수점 아래 4번째 숫자 반올림 되어서 100.126이 값으로 들어간다.

타입(data type) - 문자타입

  • CHAR와 VARCHAR
    • CHAR(255) → 10바이트 → 255바이트 차지
      • M은 문자열의 최대 길이를 의미
      • 고정 길이의 문자열(0~255까지 설정가능)
      • 정해진 자릿수 문자에 제한을 두기 위해서는 사용
    • VARCHAR(255) → 10바이트 → 10바이트 차지
      • java의 String사용 시 varchar
      • 0부터 65,535까지 설정가능
      • 가변 길이의 문자열(M을 통해 길이지정)
      • 길이를 지정하더라도 실제 입력된 문자열의 길이만큼만 저장하고 사용
      • 일반적으로 가장 많이 사용
  • TEXT
    • TEXT: 65,535바이트 저장 가능한 가변 길이 문자열 타입 name TEXT
    • varchar보다 더 큰 범위의 표현이 가능 ex)LONGTEXT는 4GB
    • disk에 저장해서 조회속도가 VARCHAR(메모리저장)에 비해 느림
    • index 사용의 어려움(B-tree인덱싱 불가, Full-Text 인덱스 가능)
  • VARCHAR는 B-tree 인덱싱이 가능해서 속도가 TEXT보다 빠르다.
  • BLOB(longblob)
    • 다양한 크기의 바이너리 데이터를 저장할 수 있는 타입
    • 일반적으로 PNG와 같은 이미지 파일을 저장할 때 지정하는 타입
    • 예시)
    • INSERT INTO table_blob (id, myimg) VALUES(1, LOAD_FILE(C:\\beach.jpeg));
    • SELECT HEX(myimg) FROM table_blob WHERE id = 1;
  • ENUM(중요!!!)
    • 미리 들어갈 수 있는 특정 데이터의 값을 지정
    • 컬럼명 ENUM(’데이터값1’, ‘데이터값2’,…) ex.) role ENUM(’admin’,’user’)
    • NOT NULL DEFAULT ‘user’ 등의 옵션도 추가 가능
    • ex.) role ENUM(’admin’,’user’)

===== ENUM타입 실습 =====

  • role타입 enum타입으로 변경하고, ‘user’, ‘admin’으로 enum타입 지정.
  • not null로 설정하되, 입력이 없을시에는 ‘user’로 세팅되도록 default 설정
    • alter table author modify column role ENUM('user','admin') not null default 'user’

dml test)

admin으로 데이터 세팅 후 insert

  • insert into author(id, name, role) values(1, 'abc', 'admin')

super-user 데이터로 insert

  • insert into author(id, name, role) values(3, 'abc', 'super-user')

role데이터 없이 insert

  • insert into author(id, name) values(1, 'abc')

===== DATETIME 타입 실습 =====

post테이블에 DATETIME으로 created_Time 컬럼 추가 및 default로 현재시간 들어가도록 설정

  • datetime(6) default current_timestamp(6)
  • 컬럼 추가 후 insert 테스트
  • alter table post ADD column created_time DATETIME DEFAULT current_timestamp;

타입(data type) - 문자타입

  • DATE
    • 날짜를 저장할 수 있는 타입
    • YYYY-MM-DD
  • DATETIME(m) (시간, 분, 초까지는 확인하는게 좋기 때문에 DATETIME 사용하기)
    • 날짜와 함께 시간까지 저장, m지정시 소수점 microseconds
    • YYYY-MM-DD HH:MM:SS
    • 가장 많이 사용
    • java의 localdatetime과 sync
  • DATETIME DEFAULT CURRENT_TIMESTAMP
    • 현재시간을 default로 삽입하는 형식
  • 데이터베이스 기본 UTC기준 시간인데 굳이 한국시간을 바꿀필요없다
    • 전체 프로그램이 UTC 기준이기 때문에 한국시간으로 맞추면 오차가 생길 수 있기 때문에.

비교연산자

  • =
    • select * from abc where name = ‘hongildong’;
  • !=, <>
    • seledt * from abc where name ! = ‘hongildong’;
  • <, <=, >, >=
  • IS NULL, IS NOT NULL (공백이 들어가도 NULL이 아니다.)
  • BETWEEN min AND max
    • 피연산자의 값이 min 값보다 크거나 max 보다 작으면 참을 반환함.
  • IN(), NOT IN()
  • *프로그래머스 sql 문제풀이(비교연산자(IS NULL) - 나이 정보가 없는 회원 수 구하기)

논리연산자

  • AND
    • &&도 가능
  • OR
    • ||
  • NOT
    • !

===== 논리연산자 - 실습 =====

  • author 테이블의 id가 1,2,4는 아닌 데이터 조회(NOT IN 사용)
    • select * from author where id NOT IN(1,2,4);
  • post 테이블의 id가 2~4까지 데이터 조회
    • between 활용
      • select * from post where id between 2 and 4;
    • and 조건 활용
      • select * from post where (id >= 2 and id <= 4);
    • or 조건 활용
      • select * from post where not (id < 2 or id > 4);

검색 패턴

  • LIKE
    • 특정 패턴을 포함하는 데이터만을 검색하기 위한 와일드 카드(wildcard) 문자
    • 일반적으로 %와 함께 사용됨
    • SELECT * FROM author WHERE name LIKE ‘홍%’; - 홍으로 시작하는 NAME을 찾아와
    • SELECT * FROM author WHERE name LIKE ‘%동’; - 동으로 끝나는 NAME을 찾아와
    • SELECT * FROM author WHERE name LIKE ‘%길%’; - 중간에 길이 들어가있는 NAME을 찾아와
  • NOT LIKE : LIKE 반대
  • REGEXP
    • 정규표현식을 토대로 패턴 연산 수행
    • SELECT * FROM author WHERE name REGEXP ‘[a-z]’;
    • SELECT * FROM author WHERE name REGEXP ‘[가-힣]’;

타입 변환(함수)

  • CAST
    • CAST(a AS type)
    • a값을 type으로 변환
    • 보통 정수 값을 DATE 타입으로 변환하는데 사용
    • SELECT CAST(20200101 AS DATE); ⇒ 2020-01-01
  • CONVERT
    • 문자열을 날짜/시간으로 변환하는 데 사용
    • CONVERT(’2020-01-01’, DATE); ⇒ 2020-01-01
  • DATE_FORMAT
    • DATE_FORMAT 함수는 날짜/시간 타입의 데이터를 지정된 형식의 문자열로 변환
    • 가장 많이 사용
    • DATE_FORMAT(date, format)
      • ex) SELECT DATE_FORMAT(’2020-01-01 17:12:00’, ‘%Y-%m-%d’); ⇒ 2020-01-01

'한화시스템 백엔드 SW교육' 카테고리의 다른 글

2023.11.20 5일차 회고  (3) 2023.11.21
한화시스템 BEYOND 캠프 3기 1주차 회고  (3) 2023.11.20
2023.11.16 3일차 회고  (2) 2023.11.16
2023.11.15 2일차 회고  (2) 2023.11.15
2023.11.14 1일차 회고  (4) 2023.11.14