[MYSQL][01] 데이터베이스(DataBase, DB)-1

목차

1. 데이터베이스란?

2. 데이터베이스의 역할

3. 데이터베이스의 장단점

4. 데이터베이스 관리 시스템

5. 데이터베이스의 종류

6. SQL(Structured Query Language, SQL)이란?

7. SQL문법 종류

8. 데이터베이스 생성 및 삭제

9. 테이블 생성 및 삭제

10. 데이터 삽입, 조회, 수정, 삭제

1. 데이터베이스란?

공유(Share)할 목적으로 통합(Integrate) 관리를 위해 일정한 형태로 저장(Stored)한 데이터를 데이터베이스라고 한다.

데이터베이스의 정의 : ISOS

Integrated Data(통합된 데이터) : 중복을 최소화 한 데이터
Stored Data(저장된 데이터) : 컴퓨터가 접근가능한 위치에 저장된 데이터
Operational Data(운영 데이터) : 업무수행을 위해 반드시 필요한 데이터
Shared Data(공용 데이터) : 여러 응용시스템이 공동 소유 및 유지하는 데이터

데이터베이스 시스템의 특징 : R1C3

Real Time Accessibility(실시간 접근성) : 질의에 실시간 응답 처리
Continuous Evolution(지속적인 변화) : 최신 데이터를 동적으로 유지(삽입, 삭제, 수정)
Concurrent Sharing(동시 공유) : 목적이 다른 사용자가 동시에 원하는 데이터 공유
Content Reference(내용에 의한 참조) : 주소에 의한 참조가 아닌 사용자가 요구하는(질의에 따른) 데이터 내용을 참조

2. 데이터베이스의 역할

중복데이터의 배제가 아닌 최소화하여 목적에 맞게 관리

3. 데이터베이스의 장단점

장점

  • 데이터 중복 방지
    • 데이터를 중앙에서 관리하여 중복을 최소화, 일관성 있는 데이터를 유지
  • 효율적인 저장공간 사용
    • 중복을 제거하고, 데이터를 정규화하여 저장 공간을 절약
  • 빠른 데이터 접근
    • 인덱싱, 쿼리 최적화 등을 통해 빠르고 효율적인 데이터 검색이 가능
  • 데이터 공유 용이
    • 여러 사용자나 애플리케이션이 동일한 데이터를 접근하고 수정할 수 있어 협업 및 데이터 공유가 용이
  • 데이터 무결성 보장
    • 데이터베이스 관리 시스템(DBMS)은 무결성 제약조건을 통해 데이터의 정확성, 일관성을 보장
  • 보안 강화
    • DBMS는 사용자 권한, 인증, 암호화 등의 보안 기능을 제공하여 데이터 접근을 제어하고 보호
  • 백업 및 복구 기능
    • 데이터 손실을 방지하기 위한 백업 및 복구 기능이 제공되어 안전하게 데이터를 보호

단점

  • 시스템 복잡성
    • 설계, 구축 및 관리가 복잡하여 운영을 위해서 기술의 전문성이 필요
  • 전문 인력 필요
    • 관리 및 최적화, 문제 해결 등을 위해 전문가가 필요
  • 운영 비용 증가
    • 관리 및 유지보수, 라이센스 비용 등이 발생하여 운영 비용이 증가
  • 백업 및 복구 시간
    • 대규모 데이터베이스의 백업 및 복구는 시간이 많이 걸리고, 대량의 데이터 처리로 시스템에 부담
  • 성능 문제
    • 데이터베이스가 매우 크거나 복잡해질 경우, 쿼리 성능이 저하되거나 시스템 과부하 야기
  • 보안 위험성
    • 보안이 제대로 구성되지 않으면 해킹, 데이터 유출 등의 관리 위험성

4. 데이터베이스 관리 시스템 (DataBase Management System, DBMS)

데이터의 입력, 수정, 삭제, 조회 등을 제공하는 소프트웨어

5. 데이터베이스의 종류

5-1. 계층형 데이터베이스

부모 자식관계인 트리구조

5-2. 네트워크형 데이터베이스

  • 데이터를 노드로 표현한 모델

5-3. Key-Value(키-값) 데이터베이스

  • NoSQL의 한 종류
  • 키 값을 일대일 대응
  • 데이터 중복이 발생하며 비정형데이터 저장에 유리

5-4. 관계형 데이터베이스

실무에서 가장 많이 사용하는 데이터베이스 종류

관계형 데이터베이스의 구조

  • 테이블(Table) = 릴레이션(Relation) : 행과 열의 값들의 모음, 도메인 특성에 따라 데이터를 논리적으로 그룹화
    • 행(Row), 튜플(Tuple), 레코드(Record) : 관계된 데이터의 묶음, 각 행은 기본키(Primary Key, PK)로 구분 및 식별
    • 열(Column), 필드(Field), 어트리뷰트(Attribute, 속성) : 고유한 이름과 타입이 있다.

※ 도메인(Domain) : 특정 속성(필드, 컬럼)의 허용 값의 타입과 범위

※ 도메인의 주요 특성

  • 유형제한 : 특정 데이터 타입으로 제한(숫자, 문자열, 날짜 등)
  • 범위제한 : 값의 범위를 정의
  • 형식제한 : 값의 형식을 정의(이메일, 주소, 전화번호 등)
  • 일관성보장

※ 도메인의 예시

  • 성별 필드의 도메인 : 남, 여
  • 학년 필드의 도메인 : 1,2,3,4

ERD(Entity Relationship Diagram)

테이블 간의 관계를 표현한 다이어그램

  • 논리모델 : 요구사항을 수집 및 분석해 데이터베이스의 모양을 구성
  • 물리모델 : 논리모델을 기반으로 실제 데이터를 저장할 수 있는 모델을 표현

대표적 DBMS

  • SQL Server
  • Oracle Database
  • DB2
  • PostregSQL
  • MySQL
  • SQLite

6. SQL(Structured Query Language, SQL)이란?

관계형 데이터베이스 관리시스템의 데이터를 관리하는 프로그래밍 언어

※ 구조(Structured) -> 정형화 되어 있다. -> 정형화된 데이터를 질의해서 다룬다.
※ NoSQL은 비정형 데이터를 다룬다.
※ 관계형 데이터베이스(Relational DataBase Management System, RDBMS)

7. SQL 문법의 종류

데이터 정의 언어(DDL), 데이터 조작 언어(DML), 데이터 제어 언어(DCL)

7-1. 데이터 정의 언어(Data Define Language, DDL)

데이터베이스를 정의하는 언어

  • Create : 테이블 생성
  • Alter : 테이블 수정
  • Drop : 디비 또는 테이블 삭제
  • Truncate : 테이블 초기화

7-2. 데이터 조작 언어(Data Manipulation Language, DML)

  • Select : 데이터 조회
  • Insert : 데이터 입력
  • Update : 데이터 수정
  • Delete : 데이터 삭제

7-3. 데이터 제어 언어(Data Control Language, DCL)

  • Grant : 특정 디비 사용자에게 특정 권한 부여
  • Revote : 권한 삭제
  • Commit : 트랜잭션 작업을 완료
  • Rollback : 트랜잭션 작업을 취소 및 이전상태로 복구

8. 데이터베이스 생성 및 삭제

8-1. mysql 접속

mysql -u root -p
Enter password : ******
mysql>

8-2. DDL - create : 데이터베이스 생성

mysql> create database myDatabase;
Query OK, 1 row affected(0.01 SEC)

8-3. 데이터베이스 목록 확인

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| mydatabase         |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

8-4. 데이터베이스 사용(선택)

mysql> use myDatabase;
Database changed

8-5. 테이블 조회

mysql> show tables;
Empty set (0.00 sec)

8-6. DDL - drop : 데이터베이스 삭제

mysql> drop database myDatabase;
Query OK, 0 rows affected (0.02 sec)

9. 테이블 생성 및 삭제

9-1. 테이블 생성

mysql> create table member (col1 int, col2 VARCHAR(50), col3 DATETIME);
Query OK, 0 rows affected (0.04 sec)

9-2. 테이블 생성 확인

mysql> show tables;
+----------------------+
| Tables_in_mydatabase |
+----------------------+
| member               |
+----------------------+
1 row in set (0.00 sec)

9-3. 테이블 구조 확인

mysql> desc member;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col1  | int         | YES  |     | NULL    |       |
| col2  | varchar(50) | YES  |     | NULL    |       |
| col3  | datetime    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

9-4. 테이블 삭제

mysql> drop table member;
Query OK, 0 rows affected (0.01 sec)

9-5. 테이블 삭제 확인

mysql> show tables;
Empty set (0.00 sec)

10. 데이터 삽입, 조회, 수정, 삭제

10-1. 데이터 삽입

DML - insert(삽입) 기본형식

INSERT INTO 테이블이름 (열1, 열2, ...) VALUES (값1, 값2, ...);
mysql> INSERT INTO member(col1, col2, col3) VALUES (1,"col2 text", "2024-01-01");
Query OK, 1 row affected (0.01 sec)

10-2. 데이터 조회

DML - select(조회) 기본형식

mysql> select [열1, 열2, ... | * ] from 테이블명
※ 열을 콤마로 구분하여 직접 선택하거나 *를 사용하여 전체를 선택
mysql> select * from member;
+------+-----------+---------------------+
| col1 | col2      | col3                |
+------+-----------+---------------------+
|    1 | col2 text | 2024-01-01 00:00:00 |
+------+-----------+---------------------+
1 row in set (0.00 sec)

10-3. 데이터 삭제

DML - delete(삭졔) 기본 형식

DELETE FROM 테이블명 WHERE 조건;
mysql> delete from member where col1 = 1;
Query OK, 1 row affected (0.00 sec)

10-4. 데이터 조회

mysql> select * from member;
Empty set (0.00 sec)
 
반응형

loop

배열의 데이터를 꺼낼 때 for, for of, foreach 예제

1차원 배열

for문


let arr = ["가","나","다","라"];

for(let i=0;i<arr.length;i++){

    console.log(arr[i]);

}

for of문


let arr = ["가","나","다","라"];

for(let el of arr){

    console.log(el);

}

forEach 메서드


let arr = ["가","나","다","라"];

arr.forEach(function(el, idx){

    console.log("arr[" + idx "] = " + el);

})

결과

가
나
다
라

2차원 배열

for문


let arr = [

    ["서울시청","https://www.seoul.go.kr/"],
    ["경기도청","https://www.gg.go.kr/"],
    ["제주도청","https://www.jeju.go.kr/"],
    ["강원도청","https://state.gwd.go.kr/"]

];


for(let i=0;i<arr.length;i++){

    console.log("기관명 : " + arr[i][0]);
    console.log("누리집 : " + arr[i][1]);

}

for of문


let arr = [

    ["서울시청","https://www.seoul.go.kr/"],
    ["경기도청","https://www.gg.go.kr/"],
    ["제주도청","https://www.jeju.go.kr/"],
    ["강원도청","https://state.gwd.go.kr/"]

];


for(let el of arr){

    console.log("기관명 : " + arr[0]);
    console.log("누리집 : " + arr[1]);

}

forEach 메서드


let arr = [

    ["서울시청","https://www.seoul.go.kr/"],
    ["경기도청","https://www.gg.go.kr/"],
    ["제주도청","https://www.jeju.go.kr/"],
    ["강원도청","https://state.gwd.go.kr/"]

];


arr.forEach(function(el, idx){

    console.log("기관명 : " + el[0]);
    console.log("누리집 : " + el[1]);

})

출력결과

기관명 : 서울시청
누리집 : https://www.seoul.go.kr/
기관명 : 경기도청
누리집 : https://www.gg.go.kr/
기관명 : 제주도청
누리집 : https://www.jeju.go.kr/
기관명 : 강원도청
누리집 : https://state.gwd.go.kr/

객체 배열 (Object Array)

for문


let arr = [

    {
    orgname:"서울시청", 
    url:"https://www.seoul.go.kr/", 
    latitude:"37.56677014701592", 
    longitude:"126.97867491234639"
    },

    {
    orgname:"경기도청", 
    url:"https://www.gg.go.kr/", 
    latitude:"37.28893135508412", 
    longitude:"127.05347693534611"
    },

    {
    orgname:"제주도청", 
    url:"https://www.jeju.go.kr/", 
    latitude:"33.48889985012181", 
    longitude:"126.49822386525447"},

    {
    orgname:"강원도청", 
    url:"https://state.gwd.go.kr/", 
    latitude:"37.88530735666828", 
    longitude:"127.72982257639035"
    }

];


for(let i=0;i<arr.length;i++){

console.log("기관명 : " + arr[i].orgname);
console.log("누리집 : " + arr[i].url);
console.log("위도 : " + arr[i].latitude);
console.log("경도 : " + arr[i].longitude);


}


for of문


let arr = [

    {
    orgname:"서울시청", 
    url:"https://www.seoul.go.kr/", 
    latitude:"37.56677014701592", 
    longitude:"126.97867491234639"
    },

    {
    orgname:"경기도청", 
    url:"https://www.gg.go.kr/", 
    latitude:"37.28893135508412", 
    longitude:"127.05347693534611"
    },

    {
    orgname:"제주도청", 
    url:"https://www.jeju.go.kr/", 
    latitude:"33.48889985012181", 
    longitude:"126.49822386525447"},

    {
    orgname:"강원도청", 
    url:"https://state.gwd.go.kr/", 
    latitude:"37.88530735666828", 
    longitude:"127.72982257639035"
    }

];


for(let el of arr){

console.log("기관명 : " + el.orgname);
console.log("누리집 : " + el.url);
console.log("위도 : " + el.latitude);
console.log("경도 : " + el.longitude);

}

forEach 메서드


let arr = [

    {
    orgname:"서울시청", 
    url:"https://www.seoul.go.kr/", 
    latitude:"37.56677014701592", 
    longitude:"126.97867491234639"
    },

    {
    orgname:"경기도청", 
    url:"https://www.gg.go.kr/", 
    latitude:"37.28893135508412", 
    longitude:"127.05347693534611"
    },

    {
    orgname:"제주도청", 
    url:"https://www.jeju.go.kr/", 
    latitude:"33.48889985012181", 
    longitude:"126.49822386525447"},

    {
    orgname:"강원도청", 
    url:"https://state.gwd.go.kr/", 
    latitude:"37.88530735666828", 
    longitude:"127.72982257639035"
    }

];


arr.forEach(function(el, idx){

console.log("기관명 : " + el.orgname);
console.log("누리집 : " + el.url);
console.log("위도 : " + el.latitude);
console.log("경도 : " + el.longitude);

});

출력결과

기관명 : 서울시청
누리집 : https://www.seoul.go.kr/
위도 : 37.56677014701592
경도 : 126.97867491234639
기관명 : 경기도청
누리집 : https://www.gg.go.kr/
위도 : 37.28893135508412
경도 : 127.05347693534611
기관명 : 제주도청
누리집 : https://www.jeju.go.kr/
위도 : 33.48889985012181
경도 : 126.49822386525447
기관명 : 강원도청
누리집 : https://state.gwd.go.kr/
위도 : 37.88530735666828
경도 : 127.72982257639035

성능 차이

  1. for 문
    반복 조건을 미리 정하여 인덱스로 배열에 접근하기 때문에 빠르다.

  2. for of 문
    ES6에 도입된 반복문으로 배열또는 iterable 객체에서 순차적으로 요소를 가져오는 방식이다.
    for문보다 약간 느리지만 가독성이 좋다.

  3. forEach 메서드
    forEach는 배열의 각 요소에 대한 콜백함수를 실행하는 메소드.
    콜백 함수 호출로 인한 오버헤드 때문에 for, for of 보다 성능이 떨어질 수 있다고 한다.

반응형

Scanner 클래스

java.util 패키지에서 제공하는 Scanner 클래스를 이용하여 화면에서 입력받을 수 있다.

자바를 공부하면서 프로그램 입력처리할 때 가장 많이 사용한다.

1. import

아래와 같이 import 선언

import java.util.Scanner;

2. 객체 생성

// 키보드 입력
Scanner scanner = new Scanner(System.in);

// 파일 입력
Scanner scanner = new Scanner(new File("파일경로"));

// 문자열 입력
Scanner scanner = new Scanner("입력 문자열");

3. 주요 메소드

next()

공백을 기준으로 하나의 문자열을 읽음

공백을 기준으로 한 번에 입력 가능하다.


import java.util.Scanner;

public class J101_Scanner {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("데이터를 입력 : ");

        String a = sc.next();
        String b = sc.next();
        String c = sc.next();

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        sc.close();

    }

}

실행결과

데이터를 입력 > 
a b c
a
b
c

nextLine()

한 줄을 읽음(공백도 포함)

import java.util.Scanner;

public class J101_Scanner {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("데이터를 입력 > ");
        String a = sc.nextLine();
        System.out.println("데이터를 입력 > ");
        String b = sc.nextLine();
        System.out.println("데이터를 입력 > ");
        String c = sc.nextLine();

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        sc.close();

    }

}

실행결과

데이터를 입력 > 
a b c
데이터를 입력 > 
x y z
데이터를 입력 > 
1 2 3
a b c
x y z
1 2 3

자주 사용하는 타입별 메소드

필요한 입력값에 맞춰서 아래의 메소드를 사용

  • nextByte()
  • nextInt()
  • nextFloat()
  • nextDouble()

hasNext()

입력에 데이터가 남아 있는지 확인

hasNextInt()

다음 입력값이 정수인지 확인


import java.util.Scanner;

public class J101_Scanner_has {

    public static void main(String[] args) {

        String data = "1 q 2 w 3 e 4 r";
        Scanner sc = new Scanner(data);

        while (sc.hasNext()) {

            if (sc.hasNextInt()) {

                System.out.println("숫자: " + sc.nextInt());

            } else {

                System.out.println("문자열: " + sc.next());
            }

        }

        sc.close(); 
    }

}

숫자: 1
문자열: q
숫자: 2
문자열: w
숫자: 3
문자열: e
숫자: 4
문자열: r

형변환 필요할 때

next와, nextLine 메소드는 문자이기 때문에 숫자를 입력 받으면 형변환이 필요하다
nextInt를 사용하지 않고 정수 값이 필요할 때는 형변환을 한다.


// string -> Integer
String a = sc.next();
System.out.println(Integer.parseInt(a));

// Integer -> String
int b = sc.nextInt();
System.out.println(String.valueOf(b));
변환 방향 사용 방법 메서드/기법
문자 → 정수 Character.getNumericValue(), Integer.parseInt() 단일 문자 또는 문자열 처리
정수 → 문자 캐스팅 (char), Character.forDigit() ASCII 활용 또는 변환 함수
문자열 → 정수 Integer.parseInt() 문자열 전체 처리
정수 → 문자열 String.valueOf(), Integer.toString() 문자열 변환 함수
반응형

+ Recent posts