no image
JOIN
A. 내부 조인 1) 일대다 관계의 이해 (PK-FK 관계) 1명의 회사원이 여러 번의 급여를 받는다. 학생 테이블과 학점테이블도 1명의 학생이 여러 과목의 학점을 받아야 하므로 일대다 관계 2) 내부 조인의 기본 두 테이블에 모두 있는 내용만 조인되는 방식 SELECT FROM INNER JOIN ON [WHERE 검색 조건] USE market_db; SELECT * FROM buy INNER JOIN member ON buy.mem_id = member.mem_id WHERE buy.mem_id = 'GRL'; 3) 별칭 USE market_db; SELECT mem_id --에러! buy.mem_id FROM buy INNER JOIN member ON buy.mem_id = member.mem_..
2024.01.23
SQL
no image
NoSQL
1. 데이터베이스 분류 1) RDBMS 테이블 기반, SQL 이용해서 작업 트리구조라서 깊이에 따라 조회 속도가 다름 2)NoSQL Not only SQL RDBMS 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durability - Transaction의 주요 성질) 특성을 제공하지 않는 확장성이나 성능의 특성을 갖는 비관계형 데이터베이스 최근에는 NoSQL에 관계형 데이터베이스의 트랜잭션의 개념을 도입시키고 관계형 데이터베이스에도 NoSQL의 개념을 도입하는 형태로 발전하는 중 2. No SQL 종류 1) Key Value DB Key와 Value의 형태로 저장하는 데이터베이스 Redis가 대표적인 Key Value 데이터베이스 2) Docum..
2024.01.23
SQL
no image
D3. 데이터 자료형
A. 데이터 형식 정수형 데이터 형식 바이트 수 숫자 범위 TINYINT 1 -128 ~ 127 SMALLINT 2 -32,768 ~ 32,767 INT 4 약 -21억 ~ +21억 BIGINT 8 약 ~900경 ~ +900경 그룹 인원을 지정할 때는 TINYINT도 충분 평균 키를 지정할 때도 TINYINT를 사용할 수 있지만, 128cm 이상인 사람들을 위해 값의 범위가 0부터 시작되는 UNSIGNED 예약어 사용! 255cm까지 커버 가능. 문자형 데이터 형식 바이트 수 CHAR(개수) 1~255 VARCHAR(개수) 1~16383 TEXT 1~65535 LONGTEXT 1~4294967295 BLOB 1~65535 LONGBLOB 1~ 4294967295 CHAR은 고정길이 문자형, CHAR(10..
2024.01.22
SQL
no image
Transaction
Transaction 한 번에 이루어져야 하는 작업의 논리적인 단위 All or Nothing. 다 되던지 하나도 되면 안 된다. Table이 있으면 원본 Table에 작업을 하는게 아님. 우리 컴퓨터에 Table이 복사가 되고 그 테이블에 작업이 이루어짐 그리고 내 컴퓨터에서 COMMIT 하면 원본 데이터에 반영함. 로그아웃을 할 때 커밋을 해줌. 그런데 복사하는 동안 다른 작업을 못하니까, 하루 몇백만건을 처리하는 은행은 중간에 튕기면 모든 거래가 다 날라가버리는 방법 대신, Save Point를 사용한다. 시간 단위로, 혹은 거래건수마다 S1, S2를 만들어서 Save Point로 Roll Back 한다. TCM COMMIT: 끝났따. ROLL BACK: 트랜잭션의 시작점으로 돌아가라. SAVE P..
2024.01.22
SQL
no image
D2. SQL 문법
A. 기본 문법 SELECT 열_이름 FROM 테이블_이름 WHERE 조건식 GROUP BY 열_이름 HAVING 조건식 ORDER BY 열_이름 LIMIT 숫자 순서: FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER 회원 테이블 만들기 USE market_db; CREATE TABLE member -- 회원 테이블 ( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK) mem_name VARCHAR(10) NOT NULL, -- 이름 mem_number INT NOT NULL, -- 인원수 addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력) phone1 CHAR(3), -- 연락처의 ..
2024.01.22
SQL
no image
D1. 데이터베이스 개요
*교재는 혼자 공부하는 SQL A. DBMS의 정의 데이터베이스에는 다양한 데이터가 저장되어 있다. 이러한 데이터베이스를 관리하고 운영하는 소프트웨어가 DBMS(Database Mamagement System) 여러 명의 사용자나 응용 프로그램과 실시간으로 공유하고 동시에 접근이 가능해야 한다. 예금 계좌 주인, 은행 직원, 인터넷 뱅킹, ATM 기기 등에서 모두 동시에 접근이 가능해야 한다. DBMS의 종류 MySQL, 오라클, SQL 서버, MariaDB 등 DBMS의 분류 계층형, 망형, 관계형, 객체지향형, 객체관계형 a. 계층형 은행업무에 아주 최적화 요즘은 잘 안쓴다. 트리 형태 b. 관계형 (RDB) 테이블, 열, 행 2차원구조 (격자구조, 모눈형식) 1. 데이터베이스 서비스명 2. 데이터베..
2024.01.10
SQL

JOIN

0ㅑ채
|2024. 1. 23. 19:29

 

A. 내부 조인

1) 일대다 관계의 이해 (PK-FK 관계)

1명의 회사원이 여러 번의 급여를 받는다. 

학생 테이블과 학점테이블도 1명의 학생이 여러 과목의 학점을 받아야 하므로 일대다 관계

 

2) 내부 조인의 기본

  • 두 테이블에 모두 있는 내용만 조인되는 방식
SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
    ON <조인될 조건>
[WHERE 검색 조건]
USE market_db;
SELECT *
FROM buy
	INNER JOIN member
    ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'GRL';

 

3) 별칭

USE market_db;
SELECT mem_id --에러! buy.mem_id
FROM buy
	INNER JOIN member
    ON buy.mem_id = member.mem_id;

Error Code: 1052. Column 'mem_id' in field list is ambiguous

  • SELECT할 때 겹치는 열 이름은 어떤 테이블의 열인지 명확하게 표현해야 함!
  • 그런데 이러면 코드가 너무 길어진다는 문제가 있다.
  • FROM 절 뒤에 별칭을 주자!
SELECT B.mem_id, M.mem_name
FROM buy B 
	INNER JOIN member M 
    ON B.mem_id = M.mem_id;

 

 

4) 내부 조인 활용

SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM buy B 
	INNER JOIN member M 
    ON B.mem_id = M.mem_id
ORDER BY M.mem_id;

  • 한번도 구매하지 않은 회원의 정보는 없다. 
  • 구매하지 않은 회원의 정보도 같이 검색되려면 외부조인을 사용해야 한다.

 

 

B. 외부 조인

1) 외부조인의 기본

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
[WHERE 검색 조건]
  • LEFT OUTER JOIN: 왼쪽 테이블(member)의 내용은 모두 출력되어야 한다.
  • RIGHT OUTER JOIN: 반대. 오른쪽에 있는 회원테이블을 기준으로 외부조인.
  • FULL OUTER JOIN: 한쪽에 들어 있는 내용이면 출력. 자주 사용되진 않음.
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM member M
	LEFT OUTER JOIN buy B
    ON M.mem_id = B.mem_id
ORDER BY M.mem_id;

 

2) 외부 조인의 활용

SELECT DISTINCT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM member M
	LEFT OUTER JOIN buy B
    ON M.mem_id = B.mem_id
WHERE B.prod_name IS NULL
ORDER BY M.mem_id;

 

 

 

C. 기타 조인

1) 상호조인 (cartesian product)

  • 한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 조인시키는 기능
  • 그래서 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.
SELECT *
FROM buy
CROSS JOIN member;
  • ON 구문은 사용할 수 없다.
  • 결과의 내용은 의미가 없다. 랜덤으로 조인하기 때문이다. 
  • 상호 조인의 주 용도는 테스트하기 위해 대용량의 데이터를 생성할 때!

 

2) 자체조인 (self join)

  • 자신이 자신과 조인한다는 의미
  • 1개의 테이블만 사용
  • 실무에서는 많이 사용하지 않지만, 회사의 조직 관계가 대표적
    • 직원의 직속 상관은 또한 회사의 직원이기도 하다. 
    • 그래서 직원의 직속 상관의 정보를 조회할 때 사용한다.
SELECT <열 목록>
FROM <테이블> 별칭A
	INNER JOIN <테이블> 별칭B
    ON <조인될 조건>
[WHERE 검색 조건]

 

create table emp_table (emp CHAR(4), manager CHAR(4), phone VARCHAR(8));

insert into emp_table values('대표', NULL, '0000');
insert into emp_table values('관리이사', '대표', '1111');
insert into emp_table values('경리부장', '관리이사', '1122');
insert into emp_table values('인사부장', '관리이사', '1133');
SELECT A.emp "직원", B.emp "직속상관", B.phone "직속상관연락처"
FROM emp_table A
	INNER JOIN emp_table B
    ON A.manager = B.emp
WHERE A.emp = '경리부장';

 

 

 

 

 

 

 

 

 

 

 

 

'SQL' 카테고리의 다른 글

NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

NoSQL

0ㅑ채
|2024. 1. 23. 17:45

 

 

1. 데이터베이스 분류

1) RDBMS

  • 테이블 기반, SQL 이용해서 작업
  • 트리구조라서 깊이에 따라 조회 속도가 다름

2)NoSQL

  • Not only SQL
  • RDBMS 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durability - Transaction의 주요 성질) 특성을 제공하지 않는 확장성이나 성능의 특성을 갖는 비관계형 데이터베이스
  • 최근에는 NoSQL에 관계형 데이터베이스의 트랜잭션의 개념을 도입시키고 관계형 데이터베이스에도 NoSQL의 개념을 도입하는 형태로 발전하는 중

 

2. No SQL 종류

1) Key Value DB

  • Key와 Value의 형태로 저장하는 데이터베이스
  • Redis가 대표적인 Key Value 데이터베이스

 

2) Document DB

  • 하나의 데이터를 하나의 문서로 취급
  • Mongo DB가 대표적인 Document DB

 

3) Wide Column Store

  • 열의 집합체를 만들 수 있는 데이터베이스
  • HBase나 Cassandra가 대표적인 Wide Column Store

 

4) Graph DB

  • 데이터에 그래프 자료구조를 도입한 데이터베이스
  • SNS에 주로 이용

 

 

3. Mongo DB

1) 개요

  • 데이터를 하나의 문서로 취급하는데 데이터를 표현할 때 JSON 표기법 사용
    *JSON 표기법: 자바스크립트 객체표현법, 파이썬도 동일

배열: [데이터 나열]

객체(dict): {키:값, 키:값..}

Mongo DB는 자바스크립트 문법으로 데이터를 다룸

 

MEAN: 자바스클비트만으로 Web Application을 제작하는 기술

* Mongo DB, Express.js, Angular,js, node.js

MERN으로 변하는 중

* React

 

2) Docker를 이용해 설치

docker run --name 컨테이너이름 -v ~/data/data/db -d -p 27017:27017 mongo
  • mongo 이미지를 다운로드 받아서 컨테이너 이름으로 생성
  • data/data/db라는 디렉토리 데이터를 저장하고 백그라운드로 실행
  • 27017 (mongo db의 기본 포트)로 접속 

 

3) bash shell에 접속 

  • shell 중에 가장 많이 사용됩
  • 운영체제와 사용자 사이에 인터페이스
  • 도커 컨테이너 안에 접속
  • cmd는 명령 프롬프트 창이지만, shell에서는 프로그래밍도 가능하다.
docker exec -it 컨테이너이름 bash

이렇게 바뀐다. 클라우드 하려면 명령어 연습하기!

 

4) Mongo DB Manual

https://www.mongodb.com/docs/manual/crud/

 

MongoDB CRUD Operations — MongoDB Manual

Docs Home → MongoDB Manual CRUD operations create, read, update, and delete documents.You can connect with driver methods and perform CRUD operations for deployments hosted in the following environments:Create or insert operations add new documents to a

www.mongodb.com

 

 

5) Mongo DB 작업

  • 로컬에 설치: 터미널에서 접속해서 사용
  • 도커에 설치:  bash shell에 접속해서 명령어를 실행
  • 접속도구 사용: Compass나 Robe 3T와 같은 GUT Tool을 이용해서 작업 수행 가능 

Connect만 하면 생김

 

 

6) 구성요소

  • 데이터베이스: 가장 큰 단위
  • 컬렉션: 테이블의 개념, 미리 생성하거나 구조를 만들 필요 없음
  • 도큐먼트: 하나의 데이터로 관계형 데이터베이스의 행의 개념
  • 필드: 관계형 데이터베이스에서 열의 개념
  • 인덱스: 데이터를 빠르게 접근하기 위한 객체
  • 조인 없음!! 대신 Embedding이나 Linking의 개념을 가짐
    • 데이터 안의 필드에 다른 데이터를 포함시킬 수 있음
  • SEELCT문의 결과로, 관계형 데이터베이스는 Row의 집합을 리턴하지만, 
    Cursor를 반환한다.

 

7) CRUD

데이터 작업을 위한 Application - RDBMS
                         ▼
Message Broker - Kafka
                         ▼
데이터 읽기를 위한 Applilcation - NoSQL

 

데이터 삽입

db.컬렉션이름.insertOne({키:값, 키:값})
db.컬렉션이름.insertMany([{키:값, 키:값..},{키:값, 키:값...}..])

db.users.insertOne({"name":"park", "age":26})
db.users.insertOne({"nick":"kim", "height":170})
  • 키는 문자열이고 값은 null, 숫자, 문자, 객체, 배열 boolean, 날짜 등이 가능
  • 데이터를 삽입할 때 ObjectId라는 타입의 _id라는 키 값이 같이 삽입된다. 

데이터 전체 확인

db.컬렉션이름.find({})

 

데이터베이스 생성 및 사용

use 데이터베이스이름;

switched to db 데이터베이스이름;

  • 쓰면 만들어지는 것이 특징

현재 데이터베이스 확인

db;

 

데이터베이스 삭제

db.dropDatabase();

 

전체 데이터베이스 확인 - 데이터가 존재하는 것만 확인 가능

show dbs;

 

데이터 확인

db.DB이름.find({});

 

 

Capped Collection

  • 일반 Collection과 다르게 정해진 크기를 초과하게 되면 자동으로 가장 오래된 데이터를 삭제하는 collection
  • 디스크가 한정된 상황에서 로그 데이터나 분석 결과를 저장할 때 사용

 

View

  • 데이터베이스 안에 쓸 수 는 없고 읽기만 가능한 데이터베이스 개체
  • 뷰를 만들면 읽기 속도가 빨라지고 보안을 유지할 수 있다.

 

 

8) Thread

Program : 동일한 목적을 달성하기 위한 파일의 집합

Process : 실행 중인 프로그램

 

Thread

  • 프로세스 안에서 자원을 할당에서 수행하는 작업 단위
  • 혼자서 동작할 수 없고 항상 Process 내에 속해서 동작해야 한다. 
  • 함수를 그냥 실행하면 함수는 수행이 종료될 때까지 다른 함수를 수행하지 못하는데, 
    함수를 Thread로 실행하면 수행 중간에 다른 Thread를 실행하고 돌아올 수 있다.
  • 실제 일하는 것보다 왔다갔다 하는 불필요한 시간이 긴 걸 OverHead라고 한다.

python에서 사용

import time

#스레드를 만들지 않고 2개의 함수를 호출하면 20초
def threadEx(id):
    for i in range(10):
        print('id={0} -> {1}'.format(id, i))
        time.sleep(1)
        
for i in range(2):
    threadEx("{0}번 스레드".format(i))

 

import time, threading

def threadEx(id):
    for i in range(10):
        print('id={0} -> {1}'.format(id, i))
        time.sleep(1)
        
for i in range(2):
    id = ("{0}번 스레드".format(i))
    th = threading.Thread(target=threadEx, args=(id, ))
    th.start()

print("메인 종료")
  • 스레드도 메인이다

 

asynchronous(비동기)

  • 동기: 순서대로 하나씩 실행
  • 비동기: 수행 중에도 다른 작업으로 제어권을 넘길 수 있는 것
  • 스레드 프로그래밍과 유사하게 사용
  • 스레드 프로그래밍에서 주의할 점 
    • 여러 개의 스레드에서 하나의 자원을 공유해서 수정할 때 문제: lock을 제외하면 이상한 결과가 출력
import time, threading

g_count = 0

class ThreadEx(threading.Thread):
    def run(self): 
        global g_count
        for i in range(10):
            print("id={0} 증가하기 전 --> {1}".format(self.getName(), g_count))
            g_count = g_count +1
            time.sleep(1)
            print("id={0} 증가하기 전 --> {1}".format(self.getName(), g_count))
            time.sleep(1)
    
for i in range(2):
    th = ThreadEx()
    th.start()

 

 

 

9) Mongo DB에서의 멀티 스레드를 이용한 데이터 삽입

  • name을 인덱스로 설정해서 유일무이하게 저장하도록 컬렉션을 생성
db.sample.createIndex({name:1}, {unique:true});

 

데이터 삽입

db.sample.insertOne({name:"adam"})
db.sample.insert([{name:"itstudy"}, {name:"adam"}, {name:"ggangpae"}])

MongoBulkWriteError: E11000 duplicate key error collection: test.sample index: name_1 dup key: { name: "adam" }

  • adam이 중복되기에 에러
db.sample.find({})

{
  _id: ObjectId('65af5043bd0803f0661363c7'),
  name: 'adam'
}

{
  _id: ObjectId('65af509dbd0803f0661363c8'),
  name: 'itstudy'
}

  • NoSQL은 싱글스레드 형태로 동작하기 떄문에 itStudy는 삽입이 되고 adam부터 삽입이 안됨
  • 멀티 스레드를 이용해서 삽입하려면 ordered:false라는 옵션을 추가
db.sample.insert([{name:"itstudy"}, {name:"adam"}, {name:"ggangpae"}], {ordered:false})

MongoBulkWriteError: E11000 duplicate key error collection: test.sample index: name_1 dup key: { name: "itstudy" }

  • 오류가 발생하지만 'ggangpae'까지 삽입된 걸 확인할 수 있다.

 

 

 

 

4. Python의 Exception Handling (예외 처리)

1) 오류의 종류

물리적 오류(Complie Error): 문법적인 오류

  • 전체를 컴파일하고 실행하는 프로그램에서는 이 오류가 있으면 실행하지 않는다.
  • 파이썬이나 자바스크립트의 경우는 괄호나 들여쓰기 오류를 제외하고 일단 실행되는 부분까지는 실행
  • 물리적 오류는 코드를 수정해서 해결

논리적 오류: 알고리즘 오류

  • 문법적인 오류는 없어서 실행이 잘 되는데 원하는 결과가 만들어지지 않는 경우
  • 디버깅으로 해결  - 순차적으로 프로그램을 실행시키면서 메모리 값을 확인하거나, 부분적으로 폐쇄시키면서 문제를 파악한다.

예외(Exception): 문법적인 오류는 없지만 실행 중 에러가 발생하고 프로그래밍이 중단되는 현상

  • 런타임 오류라 코드로 해결할 수 없는 경우
  • 런타임 오류가 아니라서 코드로 해결할 수 있는 경우

단언(Assertion)

  • 오류가 아닌데 강제로 예외를 발생시키는 것

 

2) 예외 처리 (Exception  Handling)

목적

  • 예외가 발생하더라도 계속 작업을 수행하기 위해
  • 예외가 발생한 경우 로깅을 하기 위해

예외 발생

def ten_div(x : int) -> float:
    return 10/x

print(ten_div(3))
print(ten_div(0))
print("메인 종료")
try: 
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생했을 때 수행할 코드
def ten_div(x : int) -> float:
    return 10/x

try:
    print(ten_div(3))
    print(ten_div(0))

except Exception as e:
    print(e)

3.3333333333333335
division by zero

 

  • 예외가 발생해도 프로그램이 중단되지 않음
  • Exception as e: 예외 발생한 이유 알려줌

 

 

3) 예외 종류 별 처리 

예외 처리 클래스 계층

https://docs.python.org/3/library/exceptions.html

 

Built-in Exceptions

In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any excep...

docs.python.org

 

예외를 별도로 처리: except절은 개수 제한이 없다.

ar = [10, 20, 30]

try:
    print(ar[0])
    print(ar[1])        
    print(ar[3])

except ZeroDivisionError as e:
    print("0으로 나누는 예외 발생")

except IndexError as e:
    print("인덱스 예외 발생")

10
20
인덱스 예외 발생

  • 예외 처리에서 except는 위에서 순차적으로 확인해서 자신의 타입과 일치하는 구문을 만나면 처리하고 빠져나간다.
  • 상위 클래스 타입의 참조형 변수에는 하위 클래스 타입의 인스턴스를 대입할 수 있다.
  • 반대는 불가: 순서가 반대로 되면 Not Reachable Code가 만들어진다.

 

4) else와 finally

  • except 아래에 절을 만들어서 예외가 발생하지 않은 경우게 수행할 로직을 작성할 수 있다.
  • finally는 예외 발생 여부에 상관 없이 수행할 로직을 작성할 수 있다.
ar = [10, 20, 30]

try:
    print(ar[0])
    print(ar[1])        
    print(ar[3])

except ZeroDivisionError as e:
    print("0으로 나누는 예외 발생")

except IndexError as e:
    print("인덱스 예외 발생")

except Exception as e:
    print()

else: 
    print("예외가 발생하지 않은 경우에 수행")

finally:
    print("무조건 수행")

10
20
인덱스 예외 발생
무조건 수행

 

 

5) 강제로 예외 발생 - 단언

raise 예외클래스이름(예외 메시지)
try:
    x = 10
    if x < 20:
        raise Exception("숫자가 너무 작음")
    print(x)

except Exception as e:
    print(e)

숫자가 너무 작음

 

 

 

5. Python과 Mongo DB 연동

1) 기본적인 사용법

패키지 설치

pip install pymongo

 

서버 연결

변수1 = pymongo.MongoClient("서버 IP", 포트번호)

 

데이터베이스 연결

변수2 = 변수1.데이터베이스 이름# 없으면 생성됨

 

컬렉션 연결

변수3 = 변수2.컬렉션이름 # 없으면 생성됨

 

데이터 1개 삽입

변수3.insert_one(dict 객체)

 

데이터 여러 개 저장

변수3.insert_many([dict 객체, dict 객체...])

 

from pymongo import MongoClient

#Mongo 데이터베이스 연결
con = MongoClient('127.0.0.1', 27017)
print(con)
    
#사용할 데이터베이스 연결
myDb = con.myDb
print(myDb)
    
#컬렉션 연결
col = myDb.col
print(col)

#1개 데이터 삽입
col.insert_one({'name':'kim', 'age':45})
#여러 개 데이터 삽입
col.insert_many([{'name':'lee', 'age':25}, {'name':'park', 'age':66}])

MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'myDb')
Collection(Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'myDb'), 'col')  

 

결과출력

result = col.find()
for row in result:
    print(row['name'])

kim
lee
park

 

 

NoSQL은 COMMIT을 안한다. 기본적으로 Transaction이 제공되지 않는다. 읽기 위주로 하기 때문이다. 

 

 

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

D3. 데이터 자료형

0ㅑ채
|2024. 1. 22. 19:21

A. 데이터 형식

정수형

데이터 형식 바이트 수 숫자 범위
TINYINT 1 -128 ~ 127
SMALLINT 2 -32,768 ~ 32,767
INT 4 약 -21억 ~ +21억
BIGINT 8 약 ~900경 ~ +900경
  • 그룹 인원을 지정할 때는 TINYINT도 충분
  • 평균 키를 지정할 때도 TINYINT를 사용할 수 있지만, 128cm 이상인 사람들을 위해
  • 값의 범위가 0부터 시작되는 UNSIGNED 예약어 사용! 255cm까지 커버 가능.

 

문자형

데이터 형식 바이트 수
CHAR(개수) 1~255
VARCHAR(개수) 1~16383
TEXT 1~65535
LONGTEXT 1~4294967295
BLOB 1~65535
LONGBLOB 1~ 4294967295
  • CHAR은 고정길이 문자형, CHAR(10)을 지정하면 입력된 글자수에 상관 없이 10자리를 모두 확보한다.
  • VARCHAR은 가별길이 문자형, VARCHAR(10)에 3글자만 저장하면 3자리만 사용한다.
  • VARCHAR가 공간을 더 효율적으로 사용하지만, 내부적인 성능(속도)면에서는 CHAR가 좋다.
  • LONGTEXT는 최대 약 42억자까지 저장한다.소설이나 영화 대본 등에 필요하다. 
  • BLOB은 글자가 아닌 이미지, 동영상 등의 데이터. 이진(Binary) 데이터!
  • LONG은 최대 4GB까지 입력 가능하다.

 

실수형

데이터 형식 바이트 수 설명
FLOAT 4 소수점 아래 7자리까지 표현
DOUBLE 8 소수점아래 15자리까지 표현

 

 

날짜형

데이터 형식 바이트 수 설명
DATE 3 날짜만 저장 YYYY-MM-DD
TIME 3 시간만 저장 HH:MM:SS
DATETIME 8 날짜 및 시간 저장

 

 

 

B. 변수 사용

SET @변수이름 = 변수의 값 ;
SELECT @변수이름 ;

 

데이터 형변환

CAST (값 AS 데이터_형식 [ (길이) ])
CONVERT (값, 데이터_형식 [ (길이) ])
  • CAST()에는 CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등이 올 수 있다.
    • SIGEND: 부호가 있는 정수
    • UNSIGNED: 부호가 없는 정수
SELECT CAST(AVG(price)AS SIGNED) '평균 가격' FROM buy;
SELECT CONVERT(AVG(price), SIGNED) '평균 가격' FROM buy;

 

CONCAT(): 문자를 이어주는 함수

  • 숫자와 문자를 CONCAT(100, '200') 연결하면 자동으로 문자열 100200 출력
  • CONCAT() 사용 없이도 숫자 100과 문자 '200'을 더하면 자동으로 300 출력
SELECT num, CONCAT(CAST(price AS CHAR), 'X', CAST(amount AS CHAR), '=')
'가격X수량', price*amount '구매액'
FROM buy;

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

Transaction

0ㅑ채
|2024. 1. 22. 18:31

 

 

Transaction

  • 한 번에 이루어져야 하는 작업의 논리적인 단위
  • All or Nothing. 다 되던지 하나도 되면 안 된다.
Table이 있으면 원본 Table에 작업을 하는게 아님. 우리 컴퓨터에 Table이 복사가 되고 그 테이블에 작업이 이루어짐 그리고 내 컴퓨터에서 COMMIT 하면 원본 데이터에 반영함. 로그아웃을 할 때 커밋을 해줌. 
그런데 복사하는 동안 다른 작업을 못하니까, 하루 몇백만건을 처리하는 은행은 중간에 튕기면 모든 거래가 다 날라가버리는 방법 대신, Save Point를 사용한다. 시간 단위로, 혹은 거래건수마다 S1, S2를 만들어서 Save Point로 Roll Back 한다.

 

TCM

COMMIT: 끝났따.

ROLL BACK: 트랜잭션의 시작점으로 돌아가라.

SAVE POINT: 저장했다가 여기로 롤백해. 

 

 

Transaction  실습

데이터베이스 확인

SHOW databases;

 

데이터베이스 생성

 CREATE database 이름;

 

데이터베이스 사용 설정

USE 이름;

 

데이터베이스 삭제

DROP database 이름;

 

 

실습할 테이블 생성

create table 테이블 이름(

    컬럼이름 자료형 컬럼제약조건
    ...
    테이블 제약조건
    ...
)ENGINE, AUTO_INCREMENT의 시작 숫자, 인코딩 등을 설정
create table transaction_test(
	account int,
	balance int);

 

데이터 삽입

insert into transaction_test(account, balance) values(1, 30);

 

데이터 확인

select *
from transaction_test;

 

트랜잭션 취소 - 트랜잭션이 만들어지는 시점으로 이동

ROLLBACK;

- 처음 로그인 했을 때 복사한 테이블로 돌아가는 것

- Commit 하는 동안은 다른 테이블에서는 Lock이 걸린다.

 

savepoint 생성

- 로그를 기록해서 돌아갈 때 다시 불러옴 

--데이터 추가
insert into transaction_test(account, balance) values(2, 40);
insert into transaction_test(account, balance) values(3, 40);

--save point 생성
savepoint s1; 

--데이터 추가 2
insert into transaction_test(account, balance) values(4, 40);
insert into transaction_test(account, balance) values(5, 40);

--rollback 명령어
rollback; -- 데이터 1개
rollback to s1; -- 데이터는 3개

 

 

 

Windows Function

1) 관계형 데이터베이스에서 group by를 사용할 때 주의할 점

> tStaff 테이블을 depart별로 depart와 salary의 평균을 조회 

select depart, salary
from tStaff
group by depart;

Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sys.tStaff.salary' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

  • group by는 그룹화 한 항목 별로 하나만 출력할 수 있는데, salary는 2개 이상이 될 수 있어서 어떤 것을 출력할지 몰라 error.
  • mysql의 fork인 Maria DB에서는 이 문법을 허용함.
select depart, avg(salary)
from tStaff
group by depart;

 

2) 사용 형식

SELECT <윈도우함수이름>(매개변수) OVER(
    [PARTITION BY 그룹화 항목 나열]
    ORDER BY 정렬할 항목
    출력할 컬럼이름 나열


FROM 테이블이름
[WHERE 조건];

  • partition은 선택인데 그룹을 만드는 것
  • partition이 없으면 전체 데이터를 가지고 수행

 

 

3) 순위 관련 함수

ROW_NUMBER: 중첩되지 않는 일련번호

DENSE_RANK: 중복된 순위에 동일한 순위를 할당하고 다음 순위를 건너뛰지 않고 리턴

RANK: 중복된 순위에 동일한 순위를 할당하고 다음 순위를 건너뛰고 리턴

NTILE(등분의 개수): 등분

 

 

4) 분석 함수

CUME_DIST(): 누적합
LEAD(컬럼, 인덱스): 다음 행
LAG(컬럼, 인덱스): 이전 행
FIRST_VALUE(컬럼): 첫 행
LAST_VALUE(컬럼): 마지막 행
PERCENT_RANK(): 백분율 순위

 

 

 

5) 정규화 / 반정규화

종속: 다른 데이터에 영향을 받는 것

1. 함수적 종속

  • 하나의 속성이 다른하나의 속성의 값을 결정하는 것
주민등록번호 -> 이름
주민등록번호가 이름을 함수적으로 종속했다.
반대로 하나의 이름에는 주민등록번호가 여러개 있을 수 있기 때문에 종속이 아님. 
주민등록번호를 결정자라고 한다.

 

부분 함수적 종속

  • 기본 키에 대해서만 적용이 된다.
  • 2개 이상의 속성으로 만들어진 기본키에서 1개의 속성으로 구별할 수 있는 경우

 

이행적 함수 종속

  • A → B
  • B → C
  • A → C

 

이 두 종속을 없애는 것을 정규화라고 한다.

 

 

2. 정규화

  • 읽기 이외 (특히 삭제) 할 때 유용하다.
주민등록번호 이름 수업 코드 수업료
1 C 30만원
2 C 30만원
1 D 15만원
  • 이런 경우 식별하기 좋은 키가 없다.
  • '이'가 수업 'C'를 철회할 경우 '이'에 대한 데이터가 모두 손실될 수 있다.
  • 따라서 테이블을 두개로 나눈다.
주민등록번호 이름
1
2
3
수강코드 수업료
C 30만원
D 15만원
F 15만원

 

 

 

3. 반정규화/역정규화

  • join을 하면 데이터가 많아져서 속도가 느려짐
  • 테이블 하나에 정보가 다 있으면 join을 할 필요가 없다.
  • 읽기 속도에 더 유리하다.

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

D2. SQL 문법

0ㅑ채
|2024. 1. 22. 16:29

A. 기본 문법

SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

순서: FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER

 

 

회원 테이블 만들기

USE market_db;
CREATE TABLE member -- 회원 테이블
( mem_id      CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    VARCHAR(10) NOT NULL, -- 이름
  mem_number  INT NOT NULL,  -- 인원수
  addr        CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
  phone1      CHAR(3), -- 연락처의 국번(02, 031, 055 등)
  phone2      CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
  height      SMALLINT,  -- 평균 키
  debut_date  DATE  -- 데뷔 일자
);

* CHAR: 고정형 - 8개가 들어오지 않아도 8글자 저장

* VARCHAR: 가변형 - 들어오는 글자만큼 저장, 저장 효율 good

 

구매 테이블 만들기

CREATE TABLE buy -- 구매 테이블
(  num 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
   mem_id  	CHAR(8) NOT NULL, -- 아이디(FK)
   prod_name 	CHAR(6) NOT NULL, --  제품이름
   group_name 	CHAR(4)  , -- 분류
   price     	INT  NOT NULL, -- 가격
   amount    	SMALLINT  NOT NULL, -- 수량
   FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);

 

 


데이터 조회

 

USE문

-- USE 사용
SELECT * FROM product;
USE shop_db;

-- USE 사용 안하려면
SELECT * FROM shop_db.product;
  • shop_db 데이터베이스를 대상으로 할거야. 
  • 이렇게 명시하지 않으면 모든 SQL문은 마지막으로 작업했던 DB에서 동작한다.

 

관계연산자, 논리연산자 사용

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;

 

 

BETWEEN ~ AND: 범위값 구하기

SELECT mem_name, height, mem_number
FROM member
WHERE height BETWEEN 163 AND 165;

 

 

IN()

SELECT mem_name, addr
FROM member
WHERE addr IN('경기', '전남', '경남');

 

LIKE: 문자열의 일부 글자 검색

SELECT *
FROM member
WHERE mem_name LIKE '우%';

  • 제일 앞 글자가 '우'이고 그 뒤는 무엇이든(%) 허용한다.
  • 한 글자와 매치하기 위해서는 언더바(_)를 사용한다.
SELECT *
FROM member
WHERE mem_name LIKE '__핑크';

  • 앞 두 글자는 상관 없고 뒤는 '핑크'인 회원을 검색한다.

 

서브 쿼리

SELECT mem_name, height FROM member
	WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');

 

ORDER BY

  • WHERE절과 함께 사용할 수 있다.
  • 다만 WHERE절을 먼저 사용해줘야 한다.
SELECT mem_id, mem_name, debut_date
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;

 

정렬 

  • ASC 오름차순
  • DESC 내림차순 

 

LIMIT

  • 출력하는 개수를 제한한다.
  • 전체 중 앞에서 n개까지만 조회 
SELECT *
FROM member
LIMIT 3;

  • LIMIT 시작, 개수 
SELECT mem_name, debut_date
FROM member
ORDER BY debut_date
LIMIT 3, 2;
  • 3번째부터 2건

 

 

DISTINCT

  • 중복된 결과를 제거
SELECT DISTINCT addr FROM member;

 

 

GROUP BY

  • 그룹으로 묶어준다.
  • 그룹을 묶어 집계한다.

 

집계 함수

  • SUM()
  • AVG()
  • MIN()
  • MAX()
  • STDDEV() : 표준편차 
  • VARIANCE() : 분산
  • COUNT()
  • COUNT(DISTINCT)
SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수"
FROM buy GROUP BY mem_id;

SELECT COUNT(*) FROM member;

  • 집계함수는 WHERE절과 함께 사용할 수 없다.
  • 대신 HAVING절을 사용한다.
  • HAVING절은 반드시 GROUP BY 뒤에 나와야 한다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM market_db.buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000;

 

 

 

 


데이터 입력

 

INSERT

INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)
  • 테이블 이름 다음에 나오는 열은 생략 가능
  • 열 이름을 생략할 경우 VALUES 뒤에 나오는 값들의 순서 및 개수는 테이블을 정의할 때 열 순서 및 개수와 동일해야 한다.
USE market_db;
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO hongong1 VALUES (1, '우디', 25);
  • 만약 age는 입력하고 싶지 않다면 테이블 이름 뒤에 입력할 열의 이름을 써줘야 한다. 
INSERT INTO hongong1 (toy_id, toy_name) VALUES (2, '버즈');
  • age 열에는 NULL 값이 들어감

 

 

AUTO_INCREMENT : 자동으로 증가

  • 열을 정의할 때 1부터 증가하는 값을 입력해준다.
  • INSERT에서는 해당 열이 없다고 생각하고 입력한다.
  • 주의: 지정한 열은 꼭 PRIMARY KEY로 지정!
CREATE TABLE hongong2 (
    toy_id INT AUTO_INCREMENT PRIMARY KEY, 
    toy_name CHAR(4),
    age INT);
  • 자동증가하는 부분은 NULL 값으로 채워 놓으면 된다.
INSERT INTO hongong2 VALUES (NULL, '보핍', 25);
INSERT INTO hongong2 VALUES (NULL, '슬링키', 22);
INSERT INTO hongong2 VALUES (NULL, '렉스', 21);
SELECT * FROM hongong2;
  • 계속 입력하다가 현재 어느 숫자까지 증가되었는지 확인이 필요할 때
SELECT LAST_INSERT_ID();

 

만약 AUTO_INCREMENT로 처음부터 입력되는 값을 100으로 지정하고, 다음 값은 3씩 증가하도록 하려면

ALTER TABLE hongong2 AUTO_INCREMENT=100;
SET @@auto_increment_increment=3;

 

더보기

 시스템 변수!

- MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수

- SHOW GLOBAL VARIABLES : 전체 시스템의 종류를 보여줘

- SELECT @@시스템변수 : 실행

여러 줄을 한 줄로 작성할 수도 있다.

INSERT INTO hongong2 VALUES (NULL, '보핍', 25), (NULL, '슬링키', 22), (NULL, '렉스', 21);

 

 

 

INSERT INTO ~ SELECT : 다른 테이블의 데이터를 한 번에 입력

  • 주의: SELECT 문의 열 개수는 INSERT할 테이블의 열 개수와 같아야 한다.
INSERT INTO 테이블_이름 (열_이름1, 열_이름2, ...)
    SELECT문;
CREATE TABLE city_popul (city_name CHAR(35), population INT);

INSERT INTO city_popul
    SELECT Name, Population FROM world.city;

 

 

 


데이터 수정

 

UPDATE 문의 기본 문법

UPDATE 테이블_이름
    SET 열1=값1, 열2=값2, ...
    WHERE 조건;

 

city_popul 테이블의 도시이름(city_name) 중에서 'Seoul' -> '서울'로 변경

USE market_db;
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';
SELECT * FROM city_popul WHERE city_name = '서울';

 

도시이름(city_name)인 'New York'을 '뉴욕'으로 바꾸면서 동시에 인구(population)는 0으로 설정

UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';
SELECT * FROM city_popul WHERE city_name = '뉴욕';

 

주의: UPDATE 문에서 WHERE 절은 생략 가능하지만, 생략하면 테이블의 모든 행의 값이 변경된다. 

UPDATE city_popul
    SET population = population / 10000;
SELECT * FROM city_popul LIMIT 5;

 

 

 


데이터 삭제

 

DELETE

DELETE FROM 테이블 이름 WHERE 조건;

 

 

 

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

D1. 데이터베이스 개요

0ㅑ채
|2024. 1. 10. 17:27

*교재는 혼자 공부하는 SQL

 

A. DBMS의 정의

  • 데이터베이스에는 다양한 데이터가 저장되어 있다.
  • 이러한 데이터베이스를 관리하고 운영하는 소프트웨어가 DBMS(Database Mamagement System)
  • 여러 명의 사용자나 응용 프로그램과 실시간으로 공유하고 동시에 접근이 가능해야 한다.
  • 예금 계좌 주인, 은행 직원, 인터넷 뱅킹, ATM 기기 등에서 모두 동시에 접근이 가능해야 한다.

 

DBMS의 종류

MySQL, 오라클, SQL 서버, MariaDB 등

 

DBMS의 분류

계층형, 망형, 관계형, 객체지향형, 객체관계형

 

a. 계층형

  • 은행업무에 아주 최적화
  • 요즘은 잘 안쓴다.
  • 트리 형태

b. 관계형 (RDB)

  • 테이블, 열, 행
  • 2차원구조 (격자구조, 모눈형식)

1. 데이터베이스 서비스명

2. 데이터베이스 계정명

3. 데이터베이스 설치 도메인과 포트

 

 

 

B. 데이터베이스 모델링

  • 테이블의 구조를 미리 설게, 건출 설계도 그리는 과정 -
  • 세상에서 사용되는 사물이나 작업을 DBMS의 데이터베이스 개체로 옮기기 위한 과정
  • 폭포수 모델의 업무 분석시스템 설계 단계에 해당한다.
  • 여기서가장 중요한 데이터베이스 개체인 테이블 구조가 결정된다.
  • 물론 테이블이 나오기 위해서는 다소 복잡한 절차를 거쳐야 한다. (정규화)
더보기

폭포수 모델 

ex. 슈퍼마켓 물건을 온라인으로도 판매하기 위해 인터넷 쇼핑몰을 구축

  1. 프로젝트 계획
  2. 업무 분석: 슈퍼마켓에서 업무가 어떻게 돌아가는지 파악한다. 물건은 어디서 들어오고 어떻게 계산하며 재고는 어떻게 관리하는지.
  3. 시스템 설계: 업무 분석을 컴퓨터에 적용시키기 위해서 알맞은 형태로 다듬는 과정 (UI/UX 포함)
  4. 프로그램 구현: 프로그래밍 언어로 코딩하는 단계
  5. 테스트: 코딩된 프로그램에 오류가 없는지 확인
  6. 유지보수: 온라인 쇼핑몰을 운영하면서 문제점을 보완하고 기능을 추가
  • 테이블이 나오기 위해서는 다소 복잡한 절차를 거쳐야 한다. (정규화)

 

용어

  • 데이터(data): 하나하나의 단편적인 정보
  • 테이블(table): 회원이나 제품의 데이터를 입력하기 위해 표 형태로 표현한 것.
  • 데이터베이스(Database): 테이블이 ㅉ저장되는 저장소. 데이터를 저장하는 곳. 
  • DBMS: 데이터베이스 관리 시스템 또는 소프트웨어.  (ex.  MySQL)
  • 열/컬럼/필드(column): 테이블의 세로. 각 테이블은 여러 개의 열로 구성된다.
  • 열 이름: 각 열을 구분하기 위한 이름. 열 이름은 각 테이블 내에서는 서로 달라야 한다.
  • 데이터 형식: 열에 저장된 데이터 형식. 숫자형, 문자형. 데이블을 생성할 때 열 이름과 함께 지정해준다. 
  • 행/로우/레코드(row): 실질적인 진짜 데이터. 즉 행의 개수가 데이터의 개수다.  
  • 기본 키/주키: 각 행을 구분하는 유일한 열. 중복되어서도 안 되고, 비어 있어서도 안 된다.
  • SQL: DBMS가 알아듣는, 구조화된 질의 언어

 

데이터베이스 구축 절차

데이터베이스 만들기 → 테이블 만들기 → 데이터 입력/수정/삭제하기 → 데이터 조회 →활용하기

 

CRUD

  • 테이블은 2차원의 표 형태로 이루어져 있으며, 각 열에 해당하는 데이터를 한 행씩 입력(C)할 수 있다.
  • 필요하다면 행에 입력된 데이터를 수정(U)하거나 삭제(D)할 수 있다. 
  • 마지막으로 입력이 완료된 데이터를 조회(R)에서 활용할 수 있다.

 

 

DB 만들기

Create Schema
DB 이름입력
Apply

 

 

Table 만들기

 

Create Table 선택
열 이름, 데이터 형식, 기본 키 설정

 

데이터 입력하기

Apply

 

 

 

데이터 입력

INSERT INTO 'shop_db'.'member' ('member_id', 'member_name', 'member_addr') VALUES('carry', '머라이어', '미국 텍사스 사막');

 

데이터 수정

UPDATE 'shop_db'.'member' SET 'member_addr' = '영국 런던 먹자골목' WHERE ('member_id' = 'carry');

 

데이터 삭제

DELETE FROM 'shop_db'.'member' WHERE ('member_id' = 'carry');

 

데이터 활용

SELECT 열_이름 FROM 테이블_이름 [WHERE 조건]

SELECT  member_name, member_addr FROM member;

SELECT  * FROM member WHERE member_name ='아이유';

 

 

 

데이터베이스 개체

  • 인덱스, 뷰, 스토어드 프로시저, 트리거, 함수, 커서 등의 개체는 모두 테이블과 연관이 있다.

 

인덱스

  • CREATE INDEX idx_member_name ON member(member_name);
  • 찾아보기 시간을 단축한다.

create view member_view
as 
select * from member;
  • 실제 데이터를 가지고 있지 않고, 진짜 테이블에 링크된 개념
  • 보안에 도움이 된다.
  • 긴 SQL문을 간략하게 만들 수 있다.

 

스토어드 프로시저

DELIMITER //
CREATE PROCEDURE myProc()
BEGIN
SELECT * FROM member WHERE member_name = '나훈아';
SELECT * FROM product  WHERE product_name = '삼각김밥' ;
END//
DELIMITER ;
CALL myProc();

 

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22