데이터 모델링의 중요성

데이터 모델링이란?

모델링이란

모델링이란 복잡한 현실 세계에 존재하는 데이터를 단순화 시켜 표현해 컴퓨터 세계의 데이터베이스로 옮기는 변환 과정입니다.
 
현실의 개념들을 체계적으로 수집하여 정보모델링을 통해 사용자의 정보요구사항을 조사하고 이를 개체, 관계, 속성을 중심으로 명확하게 체계적으로 표현하고 문서화하는 기법을 데이터 모델링이라고 합니다.

 

- 중복 : 같은 시간 데이터 제공

- 비유연성 : 사소한 업무변화에 데이터 모델이 수시로 변경되면 안됨. 데이터 정의를 사용 프로세스하고 분리해야한다.

- 비일관성 : 데이터 간 상호 연관 관계에 대해 명확히 정의해야 함.

 

데이터 모델링

개념전 , 논리적 , 물리적 데이터 모델링

 

데이터 독립성 요소

스키마란? 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합.

외부 스키마 : 개개 사용자가 보는 개인적 DB 스키마

개념 스키마 : 모든 사용자 관점을 통합한 전체 DB

내부 스키마 : 물리적 장치에서 데이터가 실제적 저장

 

데이터 독립성

논리적 독립성 : 개념스키마 변경, 외부 스키마에 영향이 없다

물리적 독립성 : 내부 스키마 변경 , 외부/개념스키마에 영향이 없음

 

데이터 모델링의 3요소

어떤 것(Things) , 성격(Attributes) , 관계(Realitonships)

모델링의 특징

(현실세계) -> 추상화, 단순화, 정확화 -> (모델)

ERD 작업순서

1. 엔티티 그림

2. 엔티티 배치

3. 엔티티 관계설정

4. 관계명 기술

5. 관계의 참여도 기술

6. 관계필수여부


틀린 이유

데이터 모델링이 필요한 주요 이유

3. 데이터베이스를 구축하기 위한 용도를 위해 데이터모델링을 수행하고 업무에 대한 설명은 별도의 표기법이라 했는데

 -> 데이터 모델링 자체로서 업무를 설명하고 분석하는 부분에서 매우 의미가 있음.

 

6. 모든 사용자 관점을 통합한 조직 전체 관점의 통합적 표현 외부 스키마라고 생각을 했는데

 -> 개념스키마 통합관점의 스키마구조를 표현함

 -> 데이터 모델링은 통합관점의 뷰를 가지고 있는 개념 스키마를 만들어가는 과정으로 이해할 수 있음.

 

10. 데이터로서 존재하지만 업무에서 필요로 하지 않으면 해당 업무의 엔터티로 성립될 수 없다.

 -> 반드시 해당 업무에서 필요하고 관리되어야 하는 정보

 -> 유일한 식별자에 의해 식별이 가능해야함

 -> 영속적으로 존재하는 (두개 이상의)인스턴스의 집합이어야함

 -> 엔터티는 업무 프로세스에 의해 이용되어야 함

 -> 엔터티는 반드시 속성이 있어야 함

 -> 엔터티는 다른 엔터티와 최소 한 개 이상의 관계가 있어야 함

 내가 고른 답은 객체지향의 디자인 패턴에는 싱글턴 패턴이 있어 하나의 인스턴스를 가지는 클래스가 존재한다.

이와 유사하게 엔터티는 한 개의 인스턴스를 가지는 것만으로 충분한 의미를 부여할 수 있다.

 -> 여러개의 인스턴스를 가질 수 있기 때문에 정답이 안된다.

 

엔터티 = 객체 , 인스턴스 = 행 

 

13. 가능하면 약어를 사용하고 엔터티의 이름을 간결하고 명확하게 표현한다. ( X ) 

  -> 첫 번째는 가능하면 현업업무에서 사용하는 용어를 사용한다.  

  -> 두 번째는 가능하면 약어를 사용하지 않는다.

  -> 세 번째는 단수명사를 사용

  -> 네 번째는 모든 엔터티를 통틀어서 유일하게 이름이 부여 함.

  -> 다섯 번째는 엔터티 생성의미대로 이름을 부여함.

 

15. 하나의 인스턴스에서 각각의 속성은 한 개의 속성값을 가져야 함.

 

16. 일반예금은 코드 엔터티를 별도로 구분하고 값에는 코드값만 포함한다.

  -> 이자와 이자율은 파생속성이다. 

  이자는 계산된 값으로 파생속성이 맞지만, 이자율은 원래 가지고 있어야 하는 속성이므로 기본속성이다.

 

21. 관계는 존재적 관계와 행위에 의한 관계로 나뉘어지는게 맞다.

 -> 관계의 표기법은 관계명, 관계 차수, 선택성의 3가지 개념으로 표현이됨.

 

26. 지정된 주식별자 값은 자주 변하지 않는 것이어야 한다.

 자주 수정이 되면 연쇄 수정이 필요하여 시스템 상에 부하의 원인이 될 수 있어서 주식별자로 적합하지 않다.

 

27. 나는 주민등록번호가 보여지면 안된다 생각해서 3번을 골랐는데,

  -> 사람의 이름을 주식별자로 하면, 동명이인이 될 수 있으므로 적절하지가 안흔ㄴ 것이다.

 

28. 주식별자를 도출하기 위한 기준은

  -> 해당 업무에서 자주 이용되는 속성을 주식별자

  -> 명칭 , 내역 등과 같이 이름으로 기술되는 것들을 가능하면 주식별자로 하지 않는다.

  -> 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.

  자주 수정되는 속성이 주식별자가 되면 자식 엔터티에 대한 연쇄 수정이 필요하기 때문에 적합하지 않다.


하나의 테이블에 많은 양의 데이터가 저장되면 인덱스를 추가하고 테이블을 몇 개로 쪼개는 성능이 저하되는 경우가 있다.

이때 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리하여 데이터 액세스 성능도 향상시키고, 데이터 관리방법도 개선할 수 있도록 테이블에 적용하는 기법을 파티셔닝이라고 함.

 

49. 인덱스는 값의 범위에 따라 일정하게 정렬이 되어 있으므로 상수값으로 EQUAL 조건으로 되는 칼럼이 가장 앞으로 나오고

범위조회 하는 유형의 칼럼이 그 다음에 오도록 하는 것이 인덱스 범위를 좁힐 수 있는 가장 좋은 방법

 

 


1. 2 O
2. 2 X
3. 3 O
4. 2 O
5. 1 O
6. 1 X 
7. 4 O
8. 4 O
9. 2 O
10. 4 X
11. 1 O
12. 1 O
13. 4 X
14. 컬럼? -> 속성 O 
칼럼(column)이란 관계형 데이터베이스 테이블에서 특정한 단순 자료형의 일련의 데이터값과 테이블에서의 각 열을 말한다. 칼럼은 열이 어떻게 구성되어야 할 지에 대한 구조를 제공한다. 관계형 데이터베이스 용어에서 칼럼과 같은 의미로 사용되는 것은 속성(attribute)이다.
15. 4 X
16. 1 값에는 코드 엔터티가 필요하지 않나.. X
17. 1 O
18. 4 O
19. 3 O
20. 3,4 O
UML이란 요구분석, 시스템 설계, 시스템 구현 등의 시스템 개발 과정에서 개발자간의 의사소통을 원활하게 이루어지게 하기 위하여 표준화한 모델링 언어. 
21. 1 X
22. 2 O
23. 3 O
24. 4 O
25. 4 O
26. 2 X
27. 3 X
28. 1 X
29. 비식별자의 관계? 4 O
30. 2 O

31. 1 O
32. 반정규화 ( 왜 정규화가 아닌지 ? ) 
정규화는 중복을 최소화 반정규화(비정규화)는 읽는 시간을 최적화 O
33. 4 O
34. 1 O
35. 4 X 
36. 2 X
37. 4 O
38. 2 X
39. 2 ? X
40. 1 O
41. 4 O
42. 1 X
43. 4 X
44. 1 O
45. 2 X
46. 조인? X
47. 2 O
48. 2 X
49. 1 X
50. 3 X
51. 2,4 O
52. 2 X

같이 공부하는 개발자 친구와 얘기하는 도 중 디버깅 얘기가 나왔다.

 

이클립스를 사용할 때 DEBUG 버튼이 있던 걸 봤었다.

 

근데 디버깅.. 오류를 찾기 위해서 로그 레벨은 낮춰서 확인하는 줄 알았다. 

 

 

위에있는 벌레 모양이 디버그 버튼이고 코드 옆에 10,12번 라인에 브레이크 포인트를 설정 했었다.

 

package debug;

import java.util.Arrays;

public class DebugTest01 {

	static int[] arr = new int[10];
	
	public static void main(String[] args) {
		int dan = 5;
		for(int i=0; i<10; i++) {
			arr[i] = multi(i , dan);
		}
		
		System.out.println(Arrays.toString(arr));
	}
	
	static int multi(int num1, int num2) {
		return num1 * num2;
	}

}

위의 예제 말고 간단히 구구단 예제를 만들어서 넣었다.

 

버퍼리더나 스캐너를 통해서 값을 사용자에게 입력 받을 수 있지만 일단 알아보기 쉽게 하기 위해서 변수를 선언해서 밸류를 대입했다.

 

디버그 모드를 하면 레이아웃이 살짝 바뀐다.

 

그리고 오른쪽위의 Show Staic Vairables 옵션을 추가하면

Static 변수도 보인다.

현재 어떤 내용을 가지고 있는지 확인 가능

 

브레이크 포인터를 int dan = 5; 있는 곳에 넣었기 떄문에 아직 배열에 들어가 있지 않은 상태

 

왼쪽위에 step into 하고 step over이 있는데 이렇게 해서 라인마다 실행이 가능하고

그러면 dan이 생긴걸 볼 수 있고 그다음 i가 for문 0이 생긴다

12번 라인에서 이제 step into 하고 step over의 차이점을 알 수 있다.

 

step into를 클릭하면 mult(i , dan); 부분인 multi의 함수로 들어간다.

step into 를 하면 메서드가 리턴 됐고 맨 위에 mult() returned 0이 나와있다.

그럼 이제 arr[0] 에 0의 값이 할당이 된 것.

 

그럼 이제 for문에 의해서 1이 증가됨.

 

반복문이 하나하나 실행되는 것을 보여준다.

 

이제 여기서 step over 를 클릭하면 multi라는 메서드에는 들어가지 않고 반복문을 실행해준다.

 

변수값 위에 커서를 올려보면 지금 까지 실행된 값들이 들어가 있는 것을 확인할 수 있다.

 

또 이제 표현식(Expressions)에 표현식을 넣으면 값이 출력되는것을 볼 수 있다.

 

Expression은 내용이 초기화 되지 않는다.

 

Variables와 Expressions의 차이점은

 

일단 Variables의 값은 수정할 수 있지만 Expressions의 값은 수정할 수 없다.

 

 

브레이크 포인트를 잡고 우측 클릭하여 properties를 볼 수 있고, 또는 오른쪽에 BreakPoints에서 DebugTest를 클릭해서 볼 수 있다.

Hit count를 8로 두고 실행하면 i가 8번 실행되고 7에 찍혀있는 것을 확인할 수 있다.

 

 

i 부분에서 i == 8로 하면 i가 8일떄까지 실행시켜주고 그 값을 보여준다.

Expression에 테스트 해 본 결과 잘 나온것을 볼 수 있다.


Debug shell

디버그 쉘을 이용할 수 있다.

아래에 구문을 입력하고 실행을 누르면 재생되지 않는다!

구문을 모드 드래그 하고 실행시켜줘야 한다!

 

i라는 변수는 이미 위에서 사용중이므로 에러가 뜬다.

이렇게 j로 바꿔주고 지금 현재 실행된 값이 35까지이니깐

sum을 이용해서 구문을 입력하면 0~35 까지 실행된 값들이 더해진다.

그리고 멀티에 들어가서 받는 파라미터 값이 정확한지 확인하기 위해서

이렇게 하고 실행 옆에 있는 Display result of evaluating 를 클릭하면 (boolean) true로 볼 수 있다.

 

근데 이러한 구문을 계속해서 복붙해서 어디 메모장 같은데에 넣어놓고 쓰기 보단,

이걸 모니터링 하고 싶다면 expression에 들어가게 할 수 있다.

해당 버튼을 클릭하면 표현식이 들어간 것을 보고 num1의 값이 0과 10사이인지 모니터링 할 수 있다.

 


디버그 모드에서 다시 자바로 되돌릴 때

피보나치 수열에서 사용할 때

package debug;

public class DebugTest02 {

	public static void main(String[] args) {
		System.out.println(fibo(5));
	}
	
	public static int fibo(int n) {
		if(n < 2) {
			return n;
		}else {
			return fibo(n-1) + fibo(n-2);
		}
	}

}

실행되면서 메서드 스택이 잡히는 것을 확인할 수 있음

각각의 밸류가 나온다..

그리고 n이 4인 지점에서 다시 다른 동작을 하고 싶으면 Drop the frame을 클릭하면 된다.

 


디버깅을 해야하는 이유는 논리적 오류 또는 문법적 오류가 났을 때 찾을 수 있고,

로그로 항상 찾아왔는데 로그는 말 그대로 그냥 기록일 뿐이지 용도에 맞지 않다고 볼 수 있다.

 

 

 

테이블 만들기

table을 만드는데 city의 데이터를 가지고그대로 city2에 만들어 준다.

 

CREATE DATABASE

- 새로운 데이터베이스를 생성

- USE문으로 새 데이터베이스를 사용

 

마우스로 테이블 생성가능

직접 작성해서 NULL, NOT NULL 등등을 줄 수 있음.


ALTER TABLE

ALTER TABLE 문과 함께 ADD문을 사용하면, 테이블에 컬럼을 추가할 수 있음

ADD

col4를 추가해 줄 수 있다.

MODIFY

test2의 col4를 수정했다.

 

DROP

드랍하면 컬럼이 삭제된 것을 볼 수 있다.


인덱스

- 테이블에서 원하는 데이터를 빠르게 찾기 위해 사용

- 일반적으로 데이터를 검색할때 순서대로 테이블 전체를 검색하므로 데이터가 많으면 탐색하는 시간이 늘어남

- 검색과 질의를 할 때 테이블 전체를 읽지 않기 때문에 빠르다

- 설정된 컬럼 값을 포함한 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우, 인덱스도 함께 수정되어야 함

- 인덱스가 있는데 테이블은 처리 속도가 느려질 수 있으므로, 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 좋음.

 

CREATE INDEX

인덱스 생성 test에 생성할 것 col1을 가지는 곳에

인덱스를 탐색하려면 SHOW INDEX FROM test;를 이용하고, 

프라이머리키는 생성되면 자동으로 인덱스를 가지게 된다. 기본적인 것임.

 

CREATE UNIQUE INDEX

중복 값을 허용하지 않는 인덱스

Non_unique가 0인 Col2Idx가 만들어진 것을 볼 수 있다. 그러므로 유니크

 

FULLTEXT INDEX

FULLTEXTINDEX는 일반적인 인덱스와는 달리 매우 빠르게 테이블의 모든 텍스트 컬럼을 검색

 

구문이 좀 길어졌다.

일단 col3가 존재하지 않아서 만들어줬는데 INT로 만들어줬다.

FULLTEXT INDEX를 이용하기 위해서는 VARCHAR2()형식으로 만들어야 한다.

그러므로 VARCHAR2형식으로 컬럼을 바꾸고, FULLTEXT INDEX를 적용시켰다.

끝에 FULLTEXT라고 보이는 것을 확인할 수 있다.

 

INDEX 삭제(ALTER)

- ALTER문을 사용하여 테이블에 추가된 인덱스 삭제

ALTER 이용 DROP

INDEX 삭제(그냥 DROP)

 

DROP INDEX 하고 인덱스명 ON 테이블 명을 하면 삭제 된 것을 볼 수 있다.


VIEW

- 뷰는 데이터베이스에 존재하는 일종의 가상 테이블

- 실제 테이블처럼 행,열 but 실제로 데이터를 저장하지 않음

그럼 why?

- MySQL에서 뷰는 다른테이블이나 다른 뷰에 저장되어 있는 데이터를 보여주는 역할만 수행

- 뷰를 사용하면 여러 테이블이나 뷰를 하나의 테이블처럼 볼 수 있음

 

뷰의 장점 !!

- 특정 사용자에게 테이블 전체가 아닌 필요한 컬럼만 보여줄 수 있다

- 복잡한 쿼리를 단순화해서 사용

- 쿼리 재사용 

 

뷰의 단점

- 한 번 정의된 뷰는 변경 할 수 없다

- 삽입, 삭제, 갱신 작업에 많은 제한 사항을 가진다.

- 자신만의 인덱스를 가질 수 없음

 

CREATE VIEW

ALTER VIEW ( Col3 추가 )

 

DROP VIEW 

뷰 삭제

city, country, countrylanguage 테이블을 JOIN하고, 한국에 대한 정보만 뷰 생성하기

첫 번째

테이블을 JOIN

두 번째

한국에 대한 정보만 뷰 생성

필요한 컬럼들만 가지는 korview가 생성되었다.

 

검색해보면 kor에 대한 테이블이 나온다


INSERT

- 테이블 이름 다음에 나오는 열 생략 가능

- 생략할 경우 VALUE 다음에 나오는 값들의 순서 및 개수가 테이블이 정의된 열 순서 및 개수와 동일해야 함

테이블에 있는 내용을 다른 테이블에 삽입하려면?

UPDATE

- 기존에 입력되어 있는 값 변경

WHERE절 생략 가능하나 테이블의 전체 행의 내용을 변경시킬수 있음

DELETE

- 행 단위로 데이터 삭제하는 구문

- DELETE FROM 테이블 이름 WHERE 조건;

- 데이터는 지워지지만 테이블 용량은 줄어들지 않음

- 원하는 데이터만 지울 수 있음, 삭제 후 잘못 삭제하면 되돌릴 수 있음

WHERE 조건을 명시하지 않으면 전체 테이블을 지운다

그리고 또, 데이터 자체는 지우는데 용량은 줄어들지 않는다.

롤백시킬 수 있다. (휴지통에 넣었다고 생각)

TRUNCATE TABLE

- 아예 다 삭제 복구 불가능함. 껍데기 빼고 나머지 안에 데이터 다 삭제되는 것을 볼 수 있음.

- 용량이 줄어듦

 

DROP DATABASE Lipton;

- 데이터베이스 삭제

 

 

 

MySQL 내장함수

- 사용자 편의를 위해서 내장 함수를 제공하고 있음

- 문자열 함수, 수학, 날짜와 시간 함수 등등

 

LENGTH()

- 전달받은 문자열의 길이 반환

CONCAT()

- 전달받은 문자열을 모두 결합하여 하나의 문자열로 반환시킴

- 전달받은 문자열 중 하나라도 NULL이면 NULL 반환

문자를 세개 합해서 보여준다.

 

LOCATE()

- 문자열 내에서 찾는 문자열이 처음으로 나타내는 위치를 찾아서 해당 위치를 반환

- 찾는 문자열이 문자열 내에 존재하지 않으면 0을 반환

mysql에서는 1부터 시작함 12출력

 

LEFT(): 문자열의 왼쪽부터 지정한 개수만큼의 문자 반환

RIGHT(): 문자열의 오른쪽부터 지정한 개수만큼의 문자를 반환

LEFT는 왼쪽에서부터 5개까지 보여주고 RIGHT는 오른쪽에 있는 6개의 글자를 보여줌.

 

LOWER(): 문자열의 문자를 모두 소문자로 , UPPER(): 문자열의 문자를 모두 대문자로

 

REPLACE()

- 자바와 비슷하게 사용된다. 문자를 교체시켜줌.

TRIM()

- 문자 앞 , 뒤 양쪽 모두에 있는 특정 문자 제거

    - BOTH: 양끝 문자 제거

    - LEADING : 전달받은 문자열 앞에 존재하는 문자 제거

    - TRAINING : 전달받은 문자열 뒤에 존재하는 문자 제거

- 만약 지정하지 않으면 자동 BOTH

- 제거할 문자 안정하면 공백 제거

LEADING 하면 왼쪽 @ 제거, TRAILING 하면 오른쪽 @ 제거

 

FORMAT()

- 숫자 타입의 데이터를 (,) '#,###,###.###' 형식으로 변환, 두 번째 인수는 반올림할 소수 부분의 자릿수가 된다.

 

소수점이 3자리 까지 나오는 것을 확인

 

FLOOR(), CEIL(), ROUND()

- FLOOR() : 내림

- CEIL() : 올림

- ROUND() : 반올림

 

SORT(), POW(), EXP() , LOG()

- SORT() : 양의 제곱근

- POW() : 첫 번째 인수로는 밑수를 전달하고, 두 번째 인수로는 지수를 전달하여 거듭제곱

- EXP() : 인수로 지수를 전달받아, e의 거듭제곱을 계산

- LOG() : 자연로그 값을 계산

SIN(), COS(), TAN()

말 그대로 사인값 코사인값 탄젠트 값 반환 삼각 함수의 값 반환함.

ABS(), RAND()

- ABS(X) : 절대값을 반환

- RAND() : 0.0보다 크거나 같고 1.0보다 작은 하나의 실수를 무작위 생성 Math.random()과 비슷

NOW()

- 현재 날짜와 시간 반환

'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 형태로 반환

CURDATE()

- 현재 날짜를 반환, 이때 반환 되는 값은 'YYYY-MM-DD' 또는 YYYYMMDD 형태로 반환

CURTIME()

- 현재 시각을 반환, 이때 반환 되는 값은 'HH:MM:SS' 또는 HHMMSS 형태로 반환

DATE(), MONTH(), DAY(), HOUR() , MINUTE() , SECOND()

2021-11-03 오후 8:37분 작성

MONTHNAME()

- 월에 해당하는 이름 반환

DAYNAME()

- 요일에 해당하는 이름 반환

DAYOFWEEK()

- 일자가 해당 주에서 몇 번째 날인지를 반환, 1부터 7사이의 값 반환 일요일=1 토요일=7

DAYOFMONTH()

- 해당 월에서 몇 번째 날인지 반환 0~31 사이

DAYOFYEAR()

- 해당 연도에서 몇번째 날인지 반환, 1부터 ~ 366 사이 값

DATE_FORMAT()

- 전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 반환

 

MySQL이란?

오픈 소스이며, 다중 사용자와 다중 스레드를 지원

아양한 운영체제에서 사용할수 있고, 특히 PHP와 함께 웹 개발에 자주 사용

MySQL은 오픈 소스 라이센스를 따르기는 하지만, 상업적 사용할 때 상업용 라이센스 필요

오라클이 MySQL 사면서 WorkBench 이용 가능함


DML, DDL, DCL 

DML(Data Manipulation Language)

- 데이터 조작 언어

- 데이터를 조작(선택,삽입,수정,삭제)하는데 사용됨

- DML 구문이 사용되는 대상은 테이블 행

- SQL문 중 SELECT,INSERT,UPDATE,DELETE가 해당

- 트랜잭션이 발생하는 SQL도 DML에 속함

  - 테이블의 데이터를 변경(입력/수정/삭제)할 때 실제 테이블에 완전히 적용하지 않고, 임시로 적용시키는 것

  - 취소 OK

 

DDL(Data Definition Language)

- 데이터 정의 언어

- CREATE, DROP, ALTER 구문

- DDL은 트랜잭션 발생시키지 않는다.

- DDL문은 즉시 바로 MySQL에 적용

- ROLLBACK이나 COMMIT 사용 불가

- DB,테이블,뷰,인덱스 등의 데이터 베이스 개체를 생성 / 삭제 / 변경하는 역할을 가지고 있음

 

DCL(Data Control Language)

- 데이터 제어 언어

- 사용자에게 어떤 권한을 부여하거나 빼앗을 때 사용함


SHOW DATABASES

- 현재 DB 몇개 있는지 보여줌

USE world 

- 지금 데이터 베이스 뭐 쓸지 보여줌

world가 bold된 것을 볼 수 있다.

SHOW TABLES

- 테이블 보여줘

SHOW TABLE STATUS

- 테이블의 상태까지 나온다

TABLE S안들어감

DESCRIBE city

- 테이블에 대한 정보를 볼 수 있음.(city,country,countrylanguage)

DESC country

DESC countrylanguage

- 줄여서 사용 가능

desc로 줄여서 볼 수 있다


SELECT

- 일반적으로 제일 많이 사용

- 요구하는 데이터를 가져오는 구문

- 형식

SELECT ~

FROM ~

WHERE ~

GROUP BY ~

HAVING ~

ORDER BY ~

 

SELECT * FROM city

- 전체 데이터를 볼 수 있음

SELECT Name, CountryCode FROM city;

- 원하는 부분만 선택해서 볼 수 있음.


WHERE

- 조회하는 결과에 특정한 조건으로 원하는 데이터만 볼 때

- SELECT 필드이름 FROM 테이블이름 WHERE 조건식 조건이 없으면 찾을려고 할 때 COST와 시간 노력이 증가한다.

 

SELECT *

FROM city

WHERE Population > 200000

- 조건을 줄 수 있음, 보여주는데 Population이 200000보다 크게

관계 연산자

- OR , AND , 조건 연산자(=,<,> 등등)

- 관계 연산자(NOT ANT OR) 등 사용 가능

 

관계 연산자를 이용하지 않고도 BETWEEN을 이용해서 사잇값을 구할 수 있다.

 

이산적인 값 조건에서 IN을 이용해서 국적코드가 AND 와 KOR 값을 구했다.


LIKE

- 문자열의 내용 검색하기 위해서 LIKE 연산자 사용 문자 뒤에 % - 뒤에 허용

- 한글자 매치하기 위해서는 '_'를 사용한다

JOR KOR 둘다 검색되는 것을 볼 수 있다.

%R 이면 R로 끝나는 데이터

%R%하면 R이 사이에 있는 데이터

R% 하면 R로 시작하는 데이터가 출력된다.


Sub Query

- 서브 쿼리

- 쿼리문 안에 또 쿼리문이 들어 있는 것

- 서브 쿼리의 결과가 둘 이상이 되면 에러 발생

City의 자료중에서 CountryCode가 (서브쿼리 들어감) ContryCode안에서 이름이 'Seoul'인 쿼리

 

Any

- 서브쿼리의 여러 개의 결과 중 한가지만 만족해도 가능

- SOME은 ANY와 동일한 의미로 사용

- =ANY 구문은 IN과 동일한 의미

여러 가지의 결과가 나오는데 한가지만 만족해도 됨. ANY 대신에 SOME 넣어도 됨.

 

ALL

- 서브쿼리의 결과를 모두 만족해야 함

 

안에 있는 서브쿼리만 실행해보면 New York인데 

 

뉴욕에 있는 Population보다 큰 값만 보여줘라 이 말임.


ORDER BY

- 결과 출력 순서를 조절한다

- 기본적으로 ASC(오름차순) 생략 가능

 

혼용해서 사용가능 CountryCode는 오름차순, Population은 내림차순으로 사용 가능

 

Q. 인구수로 내림차순 한국에 있는 도시, 국가 면적 크기로 내림차순 나라보기


DISTINCT

- 중복된 것 1개씩 만 보여줌

- 테이블 크기가 크면 좋다

현재 AFG가 중복돼서 나오는데 DISTINCT 키워드를 이용해서 중복을 없앨 수 있음.


LIMIT

- 출력 개수를 제한

- 상위의 N개만 출력하는 'LIMIT N' 구문

- 서버의 처리량을 많이 사용해 서버의 전반적인 성능을 나쁘게 하는 악성 쿼리문 개선할떄 사용??

 

이렇게 하면 전체의 쿼리 다봄

이것을 LIMIT으로 개선시키면

20개만 볼 수 있다.


GROUP BY

- 그룹으로 묶어주는 역할

- 집계 함수를 함께 사용

 - AVG 평균 , MIN 최소값 , MAX 최대값 , COUNT 행의 개수 , COUNT(DISTINCT) 중복 제외된 행 개수

   STEDV 표준 편차 , VARIANCE 분산

- 효율적인 데이터 그룹화

- 읽기 좋게 하기 위해 별칭 사용

 

여러 개의 Country코드들이 있었는데 마치 DISTINCT가 된 것 처럼 그룹화 되어있고, 

그 중 MAX()함수를 이용해서 가장 큰 값들만 보여주고 있다.


HAVING

- WHERE과 비슷한 개념으로 조건을 제한한다.

- HAVING 절은 반드시 GROUP BY절 다음에 나와야 한다.

 

조건을 걸때 WHERE로 걸지만 GROUP에 조건을 줄때는 HAVING을 사용한다!

ROLLUP

- 총합 또는 중간합계가 필요한 경우

- GROUP BY절과 함께 WITH ROLLUP문 사용

보면은 AFG라는 컨트리 코드가 있는데

SUM함수로 총 인구수를 보여주는데 이제 중간에 총 합계가 보여지는 구문이 나오고 또 중간 과정도 나오는 것을 같이 볼 수 있다.

 

JOIN

- JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현

 

조인은 여러개의 테이블을 한번 조합해보자 라는 의미.

 

ON에 조건이 들어감

city에 있는 Country코드랑 country에 있는 code랑 같으면 조인을 해줘러 이 말임.

 

세개를 조인하려면 마찬가지임 뒤에다가 JOIN을 추가해서 작성해주면 됨.


OSI 7 Layer 

osi 7 계층은 무엇일까?

네트워크 통신이 일어나는 과정을 7단계로 나눈 것을 말함.

나눈 이유는 통신이 일어나는 과정을 단계별로 파악할 수 있기 때문!


Physical Layer(물리계층 1 계층)

 

모든 파일과 프로그램은 0과 1로 이루어져 있고, 결국 0 하고 1만 주고받을 수 있으면 두 컴퓨터가 통신할 수 있다?

 

두 컴퓨터에 선을 놓고 0일 때는 -5v 전류를 흐르게 하고 1일 때는 5v 전류를 흐르게 하면 통신이 가능할까?

 

전압에 대해서는 잘 알지 못하므로.. 결론은 전자기파는 항상 0~무한대[Hz]의 주파수 범위를 가지기 때문에 전기신호를 보낼 수 있는 전선은 없다.

 

그럼 어떻게 신호를 어떻게 보내야 될까?

 

아날로그식으로 보내야 한다 0101 0101 수신자 컴퓨터는 아날로그 신호를 해석해서 받을 수 있게 됩니다.

 

보내는 컴퓨터에서 인코딩을 해서 모듈(함수) 전기 연결 선을 이용해서 받는 컴퓨터에서 아날로그 신호를 디코딩해서 받는 것이다.


Data-Link Layer(2 계층)

Data-Link Layer에 대해서 알기 전에!

 

여러 대의 컴퓨터가 통신하려면 어떻게 해야 할까?

승현 <-> 호창 

      준상

승현하고 호창은 데이터를 주고받을 수 있는데 준상이 와도 데이터를 주고받고 싶으면 어떻게 해야 할까?

선을 준상이한테도 연결하고 호창이한테도 연결하면 가능하지만 컴퓨터가 많아지면 그만큼 비용이 많이 들어가기 때문에 비효율적일 것이다.

 

태정 , 인규 , 상후 , 재홍이의 컴퓨터가 더 추가됐다고 가정하자.

 

그러면 승현 호창 준상 태정 인규 상후 재홍이를 연결하는 구리선을 만들어서 그 구리선에 자기 컴퓨터를 꽂으면 데이터를 주고받을 수 있게 가능하다.

승현은 만약 태정이한테 데이터를 보내고 싶다.

하지만 다른 나머지 사람들도 그 데이터 내용을 알 수 있다.

 

그런데 만약에 이 데이터 보내는 목적지를 확인해서 보낼 수 있다면?

이런 기능을 하게 만들어 준 것이 스위치다.

서로 다른 네트워크가 있는 곳의 준상한테는 메시지를 어떻게 보낼까?

스위치와 스위치를 연결해서 서로 다른 네트워크에 속한 컴퓨터끼리 통신을 가능하게 해주는 것이 라우터다.

 

이때 저 초록색 기계는 공유기라고 생각하면 된다.

 

라우터와 라우터도 라우터로 연결할 수 있다.(라라라😅)

 

우리나라와 일본이 연결되려면 규모가 엄청 커야겠죠?

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=giftsmile4u&logNo=222059529225

더보기

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=giftsmile4u&logNo=222059529225

실제로 해저 안에 저렇게 엄청 큰 케이블이 있다.😲

 

1 계층은 컴퓨터가 많아지면 제약이 생긴다.

 

여러 대의 컴퓨터는 어떻게 통신할까?

승현 -> 0101

호창 -> 1100

재홍 -> 1111

이 스위치에 데이터를 보내면 

준상이는 010111001111 이렇게 받는다.. 잘못 끊어 읽으면 이상하게 해석될 수 있음..😕

 

그럼 어떻게 해야 제대로 끊어 읽을까?

 

송신자 데이터를 보내는 사람은 앞에는 1111을 뒤에는 1111을 붙인다고 생각하자

주석의 시작 /*(1111) */(0000)이라고 생각하면 되겠다.

 

승현은 데이터를 보낼 때 그러면 1111 0101 0000

 

그래서 결국 Data-link Layer는

같은 네트워크에 있는 여러 대의 컴퓨터들이 데이터를 주고받기 위해서 필요한 모듈

Framing은 Data-link Layer에 속하는 작업들 중 하나.

Framing(아까 1111 0000으로 데이터를 감싸는 작업)


Network Layer(3 계층)

라우터들의 이름을 A, B, C, D를 붙여줬다.

승현이 준켄한테 데이터를 보내려면 어떻게 해야 될까?

승현은 목적지 주소 준캔의 주소를 붙인다.

준캔은 구글 재팬이라고 가정하자. https://www.google.co.jp/webhp

준캔의 주소 127.12.34.56 (이것을 IP주소라고 함, 각 컴퓨터들이 갖는 고유한 주소를 말함)

승현은 127.12.34.56 DATA 이렇게 해서 날려준다.

 

우리가 주소창에 www.naver.com을 입력하면 이 영어 주소는 IP 주소로 변환되어 사용합니다.(준캔은 일본 구글 주소이므로 https://www.google.co.jp/webhp를 사용한다.)

 

따라서 우리는 상대방의 IP주소를 알고 있어야 메시지를 보낼 수 있다.

 

가장 먼저 승현은 [127.12.34.56 DATA] A에게 패킷을 전달합니다.

패킷을 열어서 목적지 IP주소를 확인함. A는 자기와 연결된 컴퓨터 중에 IP주소가 같은 것이 없다는 것을 확인하고

데이터를 다시 포장해서 HA에게 넘겨줍니다.

우리는 HA에서 당연히 일본으로 넘어가 D의 라우터에게 주는 것을 알지만

HA는 A에게 줘야 할지, B에게 줘야 할지 C에게 줘야할지 고민에 빠짐.. 이것에 대해서는 라우팅에 대해서 공부를 해야 함!

이 부분은 라우팅에 관한 부분이니깐 넘어가고, 다시 D의 라우터한테 포장해서 넘겨줌.

그렇게 해서 데이터를 준켄한테 가는 것을 알 수 있음.

 

그래서 Network Layer란?

수많은 네트워크들의 연결로 이루어지는 inter-netwrok 속에서

어딘가에 있는 목적지 컴퓨터로 데이터를 전송하기 위해,

IP 주소를 이용해서 길을 찾고(routing)

자신 다음의 라우터에게 데이터를 넘겨주는 것(forwarding)이다.

Network Layer 기술은 어디에 구현되어 있을까?

운영체제의 커널에 소프트웨어적으로 구현되어 있다.


Transport Layer(4 계층)

모든 컴퓨터가 통신할 수 있게 되었음

일본의 준켄까지 데이터를 받을 수 있는 걸로 보아 전 세계적으로 데이터를 받을 수 있음.

 

이제 지금 승현의 컴퓨터에서는 카카오톡이랑 디스코드 같은 프로그램들이 실행되고 있음.

근데 이제 Hello , 안녕하세요 라는 다른 유저들이 데이터를 보냈음.

만약에 Hello, 안녕하세요라는 데이터를 카카오톡이랑 디스코드에 주고 싶은데 컴퓨터는 어떻게 알 수 있을까?

 

데이터를 받고자 하는 프로세스(프로그램)들은 포트 번호(8080,8090)라는 것을 가져야 함.

포트번호는 하나의 컴퓨터에서 동시에 실행되고 있는 프로세스들이 서로 겹치지 않게 가져야 함.

우리가 지금 실행하는 것도 cmd를 통해서 보면 각각 하나의 포트번호를 가지고 있음 작업 관리자를 통해서도 확인할 수 있음.

 

카카오톡 포트번호 8080 디스코드 포트번호 8090이라 치면

Port:8080 안녕하세요 처럼 카카오톡에 보내려고 하면 포트번호까지 알고 있어야 한다.

그럼 승현은 카카오톡의 포트번호까지 알고 있어야 하나요?

사실 검색창에 www.naver.com을  을 입력하는 것은 뒤에 www.naver.com:80  이 생략된 것이므로 

네이버의 포트번호까지 알고 있는 셈이 된다.

결국 Transport Layer 란?

port 번호를 사용하여 도착지 컴퓨터의 최종 도착지인 프로세스에 까지 데이터가 도달하게 하는 모듈이다.

Transport Layer 기술은 어디에 구현되어 있을까?

운영체제의 커널에 소프트웨어적으로 구현되어 있다.

 


Application Layer(7 계층)

엥?😯왜 5,6 계층은 설명하지 않고 넘어가는 거지?

사실 현대의 인터넷은 OSI 모델이 아니라 TCP/IP 모델을 따르고 있음.

현대의 인터넷이 TCP/IP 모델을 따르는 이유는 OSI 모델이 TCP/IP 모델과의 시장 점유 싸움에서 졌기 때문입니다.

4,5,6 계층이 Application Layer에 들어갔음.

 

TCP/IP 소켓 프로그래밍

운영체제의 Transport layer에서 제공하는 API를 활용해서

통신 가능한 프로그램을 만드는 것을

TCP/IP 소켓 프로그래밍, 또는 네트워크 프로그래밍이라고 한다.

 

소켓 프로그래밍 만으로도

클라이언트, 서버 프로그램을 따로따로 만들어서 동작시킬 수 있는데요.

뿐만 아니라, TCP/IP 소켓 프로그래밍을 통해서 누구나 자신만의 Application Layer 인코더와 디코더를 만들 수 있습니다.

누구든 자신만의 Application Layer 프로토콜을 만들어서 사용할 수 있다는 뜻!

 

응용 계층에서는 클라이언트의 요청을 전달하기 위해 서버가 이해할 수 있는 데이터로 변환하고 전송 계층으로 전달하는 역할을 함.

 

클라이언트 측 애플리케이션에서 서버 측 애플리케이션과 통신하려면 응용 계층의 프로토콜을 사용해야 한다.

 

웹사이트를 볼 때는 HTTP, 파일을 전송할 때는 FTP, 메일을 보낼 때는 SMTP, 메일을 받을 때는 POP3라는 프로토콜을 사용한다.

 

프로토콜 : 사람과 사람이 서로 이해할 수 있는 언어, 전 세계 사람과 얘기하려면 공용된 언어를 사용하듯이 컴퓨터도 컴퓨터 서로 이해할 수 있는 공용된 언어를 사용하는 것이 프로토콜.

 

 

+ Recent posts