Section 4. 더 깊이 알아보기
기본키
중복되지 않는 고유값만 허용
NULL 값 허용하지 않음
테이블당 하나의 기본키만 지정 가능
1 | -- 기본키 넣는 방법 2 |
다중 기본키
1 | CREATE TABLE people ( |
고유키
중복 제한, NULL 값 가능
1 | -- 고유키 넣는 방법 2 |
외래키
1 | ALTER TABLE _자식테이블명 |
외래키 제약
제약 |설명 |비고
——— | ———
NO ACTION, RESTRICT| 자식 테이블에 해당 외래키가 있을 때 수정/삭제되지 않음 |
CASCADE |자식 테이블의 해당 행도 수정/삭제 |
SET NULL |자식 테이블의 외래키를 NULL로 |자식 외래키가 NOT NULL일 시 설정 불가
SET DEFAULT |자식 테이블의 외래키를 기본값으로 |InnoDB 엔진에서 사용 불가
(오키) 자바의정석, 챕터 13 - 쓰레드
쓰레드 구현과 실행
1.Thread 클래스 상속
1 | class MyThread extends Thread { |
2.Runnable 인터페이스 구현
1 | class myThread2 implements Runnable { |
쓰레드가 종료 될때까지 기달리는 함수 join();
1 | t1.join(); |
쓰레드의 I/O 블락킹 (blocking)
쓰레드의 우선순위 함수 setPriority (int newPriority);
인자로 쓰는 상수
MAX_PRIORITY = 10; // 최대
NORM_PRIORITY = 5; //보통
MIN_PRIOIRTY = 1; // 최소
쓰레드 그룹, 지정하지 않으면 main 쓰레드 그룹에 속하게 되고 자신이 상속한 부모의 우선순위를 따라간다. (5)
13-18 데모 쓰레드 (deamon thread)
일반 쓰레드의 작업을 돕는 보조적인 역할 수행
일반 쓰레드가 종류 되면 자동으로 종료
사용 처: 가비지 컬렉터, 자동저장, 화면 자동 갱신 등
일반 적인 구현 예: 무한루프에 조건문 확인 하여 특정 일을 처리 이후 대기
1 | public void run() { |
13-20 쓰레드의 상태
생성 만 된 상태 (start() 호출 전): NEW
실행 혹은 실행 가능한 상태 (줄서있는 상태): RUNNABLE
동기화 블럭에 위해 일시정된 상태(LOCK 풀릴때까지): BLOCKED
일시정지 상태:WAITING, TIMED_WAITING
종료: TERMINATED
suspend(); // 일시 정지
sleep(long mills); // 잠자기
wait(); join(); // 기다리기
I/O block; // 입출력 대기 상태
interrupt(); // 깨우는 것
stop();
resume();
yield();
sleep()
exception 이 필수로 나와서 try catch 로 싸야 한다.
util 함수를 하나 만들어 쓰면 간편
interrupt()
대기 상태(WAITING)를 실행 대기 상태(RUNNABLE)로 만든다.
1 | class ThreadEx extends Thread { |
suspend(), resume(), stop()
dead-lock 교착 상태 발생 빈번이 되어서 현재 deprecated 되었음 > 사용 권장 X
유사 기능이 필요할때는 멤버 변수를 활용 해서 유저 레벨 에서 구현 하면 된다.
join()
th1.join(); // th1이 종료 할때까지 기달린다.
try - catch 로 묶고 Interrupted Exception로 나올수도 있다.
yield()
yield()와 interrupt()을 적절히 사용 하면 응답성과 효율을 높힌다.
sleep() 으로 길게 돌고 있을때 busy-wait 가 될수 있다.
그래서 interrupt 로 빨리 깨워서 동작 시키거나
sleep() 하는 대신 yield() 호출 해서 효율을 높힌다.
동기화 synchronization
- 멀티 쓰레드, 서로 간섭이 없도록 ‘동기화’ 해준다
임계영역 : critical section
lock을 얻은 쓰레드 한개만 임계영역에 들어갈수 있다.
1.메세드 전체 임계 영역 지정
1 | public synchronized void calcSum() { |
2.특정 부분만 지정
1 | synchronized(객체의 참조 변수) { |
wait()와 notify()
동기화 효율을 높이기 위해 wait(), notify() 사용
Object 클래스에 정의 되어 있으며, 동기화 블록 내에서만 사용 할수 있다.
wait() - 객체의 lock을 풀고 쓰레드를 해당 객체의 waiting pool 에 넣는다.
notify() - waiting pool 에서 대기 중인 쓰레드 중의 하나를 깨운다
notifyAll() - waiting pool 에서 대기 중인 모든 쓰레드를 깨운다.
1 | class Account { |
Section 3. MySQL 설치
테이블 생성, 변경, 삭제 및 데이타 입력
테이블 생성 CREATE TABLE
변경 ALTER TABLE, CHANGE COLUMN
삭제 DROP COLUMN, DROP TABLE
1 | CREATE TABLE people ( |
값입력 INSERT INTO
1 | INSERT INTO people |
테이블 생성시 제약 넣기
AUTO_INCREMENT
새 행 생성시 자동 1씩 증가PRIMARY KEY
중복 입력 불가 / 빈 값 불가UNIQUE
중복 입력 불가NOT NULL
빈 값 불가UNSIGNED
양수 onlyDEFAULT
값이 없을때 기본값
1 | CREATE TABLE people ( |
숫자 자료형
정수, 각 1,2,3,4,8 BytesTINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
고정소수점(Fixed Point) 수, 좁은 범위의 수, 정확한 값DECIMAL(s,d)
실수 부분 s와 소수 부분 d
부동소수점(Floating Point) 수, 넓은 범위의 수, 덜 정확한 값FLOAT, DOUBLE
문자 자료형
CHAR(s), VARCHAR(s)
Fixed와 가변 문자열(실제 글자수 + 1Byte for 글자수 정보)
행 최대 저장이 65,535 이라서 VARCHAR 을 65,535 까지 쓰면 행에 다른 값 저장이 안됨
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
긴 글을 저장 할때 사용 LONGTEXT은 4G 까지 저장 가능
시간 자료형
DATE
, TIME
DATETIME
(입력된 시간 자체 저장), TIMESTAMPE
(설치된 컴퓨터의 시간대로 저장)
- 시간 데이터를 가감없이 기록 할때 DATETIME
- 시간 자동 기록, 국제적인 서비스 할 경우 TIMESTAMP 사용
데이터 변경, 삭제
DELETE
: WHERE 와 함께 사용 해서 삭제, WHERE
없을시 전부 삭제 되니 주의 요TRUNCATE
: 테이블 초기화 로 AUTO INCREMENT 하던 ID 값등이 RESET 된다.
1 | DELETE FROM businesses |
UPDATE
: 자료 업데이트 ‘SET’ 와 ‘WHERE’ 와 같이 사용
1 | UPDATE menus |
`WHERE’ 없으면 전부 업데이트 됨으로 주의 요
1 | UPDATE menus |
예제 프로젝트 Database 및 값
1 | CREATE TABLE sections ( |
Section 2. 쿼리 와 조인
1. 비상관/ 상관 서브 쿼리
우선 서브 쿼리란 () 으로 쿼리 안에 쿼리를 부르는 기능이다.
1 | SELECT |
이 예제에 IN
, ALL
, ANY
연산자가 있는데 ‘= ANY’ 은 IN
와 같은 효과 이고
서브 쿼리에 자주 쓰인는 연산자 이다.
한개 테이블에 대해서 쿼리 할때 비상관 이라 하고 안과 밖에 쿼리가 서로 관계 해서 쿼리 하는 걸 상관 쿼리 라고 한다. 아래 예제 처럼 table 2개를 연관 하는 경우다.
1 | SELECT |
다수의 예제다.
1 | SELECT |
2. JOIN - 여러 테이블 조립하기
2개 테이블을 연관 해서 가져온다. 구문이 JOIN
, ON
들어간다.
제일 기본이 Inner Join이라고 하고 양쪽 모두에 값이 있는 행만 반환 한다.
1 | SELECT C.CategoryID, C.CategoryName, P.ProductName |
여러 테이블을 조인 할수 있고 GROUP BY 도 가능하다.
1 | SELECT |
SELF JOIN 이라고 한개의 테이블로도 가능 하다
1 | SELECT |
값이 없는 행을 가져 오고 싶을 때는 쓰는 것이 외부 조인이고 LEFT/RIGHT OUTER JOIN
왼쪽 NULL 값도 보여줄때 LEFT, 오른쪽 은 RIGHT 이다.
1 | SELECT |
IFNULL
활용해서 없는 값에 원하는 구문 넣을수 있다.
조건 없이 모든 조합을 해 보는 것을 CROSS JOIN
이라고 한다.
1 | SELECT |
3. UNION - 집합으로 다루기
합집합: UNION, UNION ALL
1 | SELECT CustomerName AS Name, City, Country, 'CUSTOMER' |
교집합
1 | SELECT CategoryID AS ID |
차집합
1 | SELECT CategoryID AS ID |
대칭차집합: 교집합만 제외
1 | SELECT ID FROM ( |
(오키) 자바의정석, 챕터 12 - Generics, Enum, Annotation
12-1 Generics 란?
- 컴파일시 타입을 체크해 주는 기능 (compile-time type check) - JDK1.5
- 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌
12-2 타입변수
- 클래스를 작성 할때, Object 타입 대신 타입 변수(E)를 선언해서 사용
1 | public class ArrayList extends AbstractList { |
12-3 타입 변수에 대입하기
- 객체를 생성시, 타입 변수(E) 대신 실제 타입(Tv)을 지정(대입)
- 타입 변수 대신 실제 타입이 지정되면, 형변환 생략 가능
1 | ArrayList<Tv> tvList = new ArrayList<Tv>(); |
12-4 Generics 용어
1 | Box<T> 지네릭 클래스 'T의 Box' 또는 'T Box' 라고 읽는다. |
12-7 Iterator<E>
- 클래스를 작성할 때, Object 타입 대신 T와 같은 타입 변수를 사용
12-8 HashMap <K,V>
- 여러 개의 타입 변수가 필요한 경우, 콤마(,)를 구분자로 선언
1 | HashMap<String, Student> map = new HashMap<String, Student>(); // 생성 |
12-9 제한 된 지네릭 클래스
- extends 로 대입할수 있는 타입을 제한
1 | class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정 가능 |
- 인터페이스인 경우에도 extends를 사용
1 | interface Eatable {} |
12-11 지네릭스의 제약
- 타입 변수에 대입은 인스턴스 별로 다르게 가능
1 | Box<Apple> appleBox = new Box<Apple>(); |
- static 멤버에 타입 변수 사용 불가
1 | class Box<T> { |
- 배열 생성 할때 타입 변수 사용 불가. 타입 변수로 배열 선언은 가능
1 | class Box<T> { |
12-12 와일드 카드 <?>
- 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
제한 없음 <? extends Object> 와 동일
12-14 Generic methods, 지네릭 메서드
- 지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
1 | static <T> void sort(List<T> list, Comparator<? super T> c); |
1 | - 클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개 |
- 메서드를 호출 할때마다 타입을 대입해야(대부분 생략 가능)
12-15 지네릭 타입의 형변환
- 지네릭 타입과 원시 타입 간의 형변환은 바람직 하지 않다. (경고 발생)
1 | Box<Object> objBox = null; |
12-16 지네릭 타입의 제거
- 컴파일러는 지네릭 타입을 제거 하고, 필요한 곳에 형변환을 넣는다.
- 지네릭 타입의 경계(bound)를 제거
- 지네릭 타입 제거 후에 타입이 불일치하면, 형변환 추가
- 와일드 카드가 포함된 경우, 적절한 타입으로 형변환 추가
12-17 열거형 (Enum)
- 관련된 상수들을 같이 묶어 놓은 것
enum 열거형이름 { 상수명1, 상수명2, 상수명3, ... }
1 | class Card { |
1 | class Unit { |
- 열거형 상수의 비교에 == 와 compareTo() 사용 가능
1 | if(dir = DIRECTION.EAST) { |
12-19 열거형의 조상 - java.lang.Enum
- 모든 열거형은 Enum의 자손, 아래 메서드를 상속 받는다
1 | String name(); // 열거형 상수의 이름을 문자열로 반환 |
values(), valueOf()는 컴파일러가 자동으로 추가
1 | static E[] values(); |
ch12-21,22 열거형에 멤버 추가하기
- 불연속적인 열거형 상수, 괄호()안에 적을수 있다 이때 선언 이후 끝에 ; 필요 와 생성자가 필요 함
1 | enum Direction { |
ch12-23 애너테이션이란?
- 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공
ch12-25 @Override
- Overide 하는 함수에 적어주면 javac 에서 확인 체크 해줌
ch12-26 @Deprecated
- 앞으로 사용 하지 않을 것을 권장 하는 필드나 메서드에 붙인다
ch12-27 @FunctionalInterface
- 함수형 인터페이스에 붙이면, 컴파일로가 올바르게 작성 했는지 체크
- 함수형 인터페이스에는 하나의 추상 메서드만 가져야 한다는 제약이 있음
1 |
|
ch12-28 @SupressWarnings
- 컴파일러의 경고 메시지가 나타나지 않게 억제 한다.
- 괄호() 안에 억제 하고자 하는 경고의 종류를 문자열로 지정
1 |
|
- 둘 이상의 경고를 동시에 억제 하려면 다음과 같이 한다.
1 | "deprecation", "unchecked", "varargs"}) ({ |
ch12-29 메타 애너테이션
- 애너테이션 만들때 사용, java.lang.annotation 에 있음
- @Target: 적용 대상 지정
- @Retention: 유지 되는 기간 지정, SOURCE, CLASS, RUNTIME
- @Documented: javadoc에 포함
1 |
|
- @Inherited: 상속 하고자 할때 사용
1 |
|
- @Repeatable: 반복해서 붙일수 있음
ch12-34 애너테이션 타입 정의하기
1 | 애너테이션이름 { |
- 사용 시, 요소마다 값을 넣어 선언
- default 값이 있는 경우도 생략 가능
- 요소가 하나 이면 요소 이름 생략 가능
- 요소의 타입이 배열 일 경우, 괄호 사용 {}
1 | TestInfo { |
ch12-36 모든 애너테이션의 조상 - java.lang.annotation.Annotation
1 | public interface Annotation { |
ch12-37 마커 애너테이션 - Marker Annotation
요소가 하나도 정의 되지 않는 애너테이션 예: @Test, @Deprecated
ch12-38 애너테이션 요소의 규칙
타입으로 기본형, String, enum, 애너테이션, Class만 허용됨
예외 선언 X, 괄호()안에 매개변수 선언 X, 타입 매개변수 X
1 | AnnoTest { |
Annotation 선언 및 사용 예
1 |
|
Section 1. Select 기초 - 원하는 정보 가져오기
강좌 링크
https://www.yalco.kr/@sql/1-1/
실습 링크 (W3School)
https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_select_all
1. SELECT 와 기본 구문
다 가져오기 SELECT *
FROM Customers;
원하는 조건만 WHERE
정렬 ORDER BY xx ASC
, 내림차순은 DESC
원하는 갯수 LIMIT
별명/alias AS
모두 활용 예제
1 | SELECT |
- 주석 달때는 ‘– ‘ 하면 된다
LIMIT
은 화면 페이지 구현 하는데 사용
LIMIT {가져올 갯수} 또는 LIMIT {건너뛸 갯수}, {가져올 갯수} 를 사용하여, 원하는 위치에서 원하는 만큼만 데이터를 가져올 수 있습니다.
2. 연산자
연산자 | 의미 |
---|---|
+, -, *, / | 더하기, 빼기, 곱하기, 나누기 |
%, MOD | 나머지 |
IS | 양쪽이 모두 TRUE 또는 FALSE |
IS NOT | 한쪽은 TRUE, 한쪽은 FALSE |
AND, && | 양쪽이 모두 TRUE일 때만 TRUE |
OR, ` | |
= | 양쪽 값이 같음 |
!=, <> | 양쪽 값이 다름 |
>, < | (왼쪽, 오른쪽) 값이 더 큼 |
>=, <= | (왼쪽, 오른쪽) 값이 같거나 더 큼 |
BETWEEN {MIN} AND {MAX} | 두 값 사이에 있음 |
NOT BETWEEN {MIN} AND {MAX} | 두 값 사이가 아닌 곳에 있음 |
IN (…) | 괄호 안의 값들 가운데 있음 |
NOT IN (…) | 괄호 안의 값들 가운데 없음 |
LIKE ‘… % …’ | 0~N개 문자를 가진 패턴 |
LIKE ‘… _ …’ | 갯수만큼의 문자를 가진 패턴 |
3. 숫자와 문자열 함수들
1.숫자 관련ROUND
, CEIL
, FLOOR
, ABS
, GREATEST
, LEAST
MAX
, MIN
, COUNT
, SUM
, AVG
제곱: POW(A,B)
, POWER(A,B)
제곱근: SQRT(A)
소숫점 짜르기: TRUNCATE(N,n)
https://dev.mysql.com/doc/refman/8.0/en/numeric-functions.html
2.문자열 관련
UCASE, UPPER
, LCASE, LOWER
CONCAT(..)
, CONCAT_WS(S, ..)
SUBSTR, SUBSTRING
, LEFT
, RIGHT
LENGTH
, CHAR_LENGTH
, CHARACTER_LENGTH
TRIM
, LTRIM
, RTRIM
LPAD(S,N,P)
, RPAD(S,N,P)
padding
REPLACE(S,A,B)
INSTR(S,s)
// 위치 반환, 없을시 0
1 | SELECT * FROM Customers |
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
3.자료형 변환
|함수 |설명
|CAST(A, T) |A를 T 자료형으로 변환
1 | SELECT |
4.A 시간/날짜 관련
현재 : CURDATE
, CURTIME
, NOW
문자열 인자로 : DATE
, TIME
1 | SELECT |
(날짜) 필요한 부분만 추출: YEAR
, MONTHNAME
, MONTH
, WEEKDAY
, DAYNAME
, DAYOFMONTH, DAY
주어진 DATETIME값의 요일값 반환(월요일: 0): WEEKDAY
(시간) 필요한 부분만 추출: HOUR
, MINUTE
, SECOND
(시간/날짜) 더하기, 빼기 : ADDDATE, DATE_ADD
, SUBDATE, DATE_SUB
1 | SELECT |
차이 구하기 : TIMEDIFF
, DATEDIFF
해당 달의 마지막 날 가져오기 : LAST_DAY
1 | SELECT |
시간/날짜 -> String으로 포멧 함수: DATE_FORMAT
1 | SELECT |
String -> 시간/날짜 포멧 함수: STR_TO_DATE
1 | SELECT |
4.B 기타 함수
IF(조건, T, F) 와 CASE 문
1 | SELECT IF (1 > 2, '1는 2보다 크다.', '1은 2보다 작다.'); |
IFNULL(A,B) : A가 NULL 일 시 B 출력
1 | SELECT |
5. 조건에 따라 그룹으로 묶기
GROUP BY : 특정 컬럼 별루 묶음
통상 MAX
, MIN
, COUNT
, SUM
, AVG
와 같이 쓰임WITH ROLLUP
을 넣어주면 결과 마지막줄에 합계 추가
1 | SELECT |
HAVING
: 그룹된 결과를 필터링 하고 싶을때 사용WHERE
-> GROUP BY
-> HAVING
: 조합으로 많이 쓰임
1 | SELECT |
DISTINCT
: GROUP BY 와 달리 집계 함수 사용 X, 정렬 하지 않아 더 빠름, SELECT 부분에 들어감
1 | SELECT DISTINCT CategoryID |
인프런 강좌 수강 ~
인강?, 책?, 스터디? 어떤 것으로 배움을 시작 할까 하는데 인프런 강좌 쿠폰을 받아서 여기 수강 신청을 했다.
안녕하세요, 코딩유튜버를 하는 얄코입니다.
인프런에서 18,700원에 제공하는 제 MySQL 강의를
천원에 수강하실 수 있는 쿠폰을 천 분께 뿌립니다.
쿠폰은 오는 5월 말일까지 유효하고 재고소진시 바로 마감됩니다.
https://www.inflearn.com/course/얄코-마이에스큐엘?inst=3e046db4
쿠폰번호: 5399-579e5041aadf
개인적으로 큰 일을 하나 무사히 끝내게 되어 기념으로 나눔합니다 😅
필요하신 분들 챙겨가세요! 감사합니다~!!
열심히 들어보자 :)