국비학원 22일차 : SQL

Digeut·2023년 3월 24일
0

국비학원

목록 보기
16/44

My SQL 구문

MySQL에서 데이터베이스에 대한 작업 명령은 SQL 구문을 이용하여 처리
서버와의 연결을 끊는 구문인 QUIT와 같은 경우를 제외한 일반적인 구문 뒤에는 세미콜론(;)을 붙인다. 이러한 세미콜론은 SQL 구문을 구분하는 기준이 된다. 또한, MySQL은 키워드와 구문에서 대소문자를 구분하지 않는다.

💡 MySQL에서 키워드와 구문, 문자열은 대소문자를 구분하지 않지만, 테이블 명과 필드의 이름은 대소문자를 구분하므로, 주의해서 사용해야 한다.

My SQL 주석

-- 한줄 주석
# 한줄 주석

/*
여러줄 주석
*/

SQL 속성

  1. DDL : 데이터베이스나 테이블 등을 생성, 삭제하거나
    그 구조를 변경하기 위한 명령어 / CREATE, ALTER, DROP
  2. DML : 데이터베이스에 저장된 데이터를 처리하거나
    조회, 검색하기 위한 명령어 / INSERT, UPDATE, DELETE, SELECT 등
  3. DCL : 데이터베이스에 저장된 데이터를 관리하기 위하여
    데이터의 보안성 및 무결성 등을 제어하기 위한 명령어 / GRANT, REVOKE 등

My SQL 주요 구문

1. DDL

CREATE 문

# CREATE 문
# 데이터베이스, 테이블 등을 생성할때 사용하는 SQL문 

# 데이터 베이스 생성
# CREAT DATABASE 데이터베이스명;

CREATE DATABASE Hotel; #데이터 베이스 생성
SHOW DATABASES;

-- 데이터 베이스를 생성했으면 사용할 데이터베이스를 선택해야한다.
-- USE 데이터베이스명;
USE Hotel; #데이터 베이스 선택, 프로그램 껐다 키면 
#다시 USE부분 실행하거나, 왼쪽 창에 호텔부분 더블클릭하면 선택된다.

-- 테이블 생성 
-- CREATE TABLE 테이블 명(
-- 필드명 데이터타입(데이터 길이) 제약조건,
-- ... 데이터 타입이 프로그래밍언어에서 쓰는 데이터 타입과는 조금 다르다
-- 데이터의 길이 지정 
-- );
CREATE TABLE Custom( #필드명 데이터타입(데이터길이) 제약조건
	id INT PRIMARY KEY,
    name VARCHAR(20) NOT NULL, #문자형태, 길이 지정하면 문자열로 들어간다
    email VARCHAR(30) UNIQUE, #TEXT로 하면 문자열 길이 
    						  #지정하지 않고도 장문의 문자 넣을수있다. 
    # UNIQUE : 동일한 조건이 들어오지 못하게 막는 제약조건 
	age INT,
    address TEXT, #텍스트에는 디폴트값 못넣는다
    accept_marketing BOOLEAN DEFAULT FALSE 
    # 값을 넣을 적에 넣지않더라도 FALSE로만 들어가게
    #테이블의 필드명에 띄어쓰기가 포함된경우 
    #일반적으로 lower_snake_case, 언더바로 표현
);

SHOW TABLES; #만들어진 테이블 보여준다

제약 조건

데이터의 무결성을 지키기 위해 데이터를 입력받을 때 실행되는 검사 규칙
CREATE 문으로 테이블을 생성할 때나, ALTER 문으로 필드를 추가할 때 설정

NOT NULL # 해당 필드는 NULL 값을 저장할 수 없게 됩니다.

UNIQUE # 해당 필드는 서로 다른 값을 가져야만 합니다.

PRIMARY KEY # 해당 필드가 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가지게 됩니다.

FOREIGN KEY # 하나의 테이블을 다른 테이블에 의존하게 만듭니다.

DEFAULT # 해당 필드의 기본값을 설정합니다.

ALTER 문

-- 데이터 베이스 수정
-- ALTER DATABASE 데이터베이스명 수정할 속성명 = 값;

-- 테이블 수정
-- ALTER TABLE 테이블명

-- 테이블 필드 추가
-- ALTER TABLE 테이블명 ADD 필드명 데이터타입(데이터길이) 제약조건;

-- 테이블 필드 삭제
-- ALTER TABLE 테이블명 DROP;

-- 데이터 필드 수정
-- ALTER TABLE 테이블명 MODIFT COLUM 필드명 데이터타입(데이터길이) 제약조건;
-- 만약 실수로 필드명에 오타를 내거나 한 경우에는 MODIFY로 수정하면 된다
-- 공구모양 아이콘으로 눌러서 들어가서 하는게 더 좋다

DROP문

-- 데이터베이스 삭제
-- DROP DATABASE 데이터베이스명;

-- 테이블 삭제
-- DROP TABEL 테이블명;
-- TRUNCATE TABLE 테이블명;

-- DROP TABLE 테이블명 : 테이블의 정의자체를 제거한다
-- TRUNCATE TABLE 테이블명 : 테이블을 정의만 남기고 모두 제거 
-- (생성 초기상태로 돌려놓음)

⚠️ALTER과 DROP은 유의해서 사용해야한다

ALTER 문은 하면 안되는 행위중 하나다. 관계형 타입의 경우 한번 테이블을 만든다음에 수정을 하지 않는게 좋다. 자바의 OCP개념과 같이 정의 후 수정하게 되면 연관되어 있는것이 많아서 수정도 어렵고, 안하는게 좋다. 애초에 설계를 잘해야한다 추가해야하는 테이블이 있으면 필드를 추가하고 싶다면 참조시키는게 좋다. → 자바에서의 상속개념과 같다

DROP DATABASE 문이나 DROP TABLE 문을 사용하여 데이터베이스나 테이블을 삭제하려고 할 때, 만약 삭제하려는 이름의 데이터베이스나 테이블이 존재하지 않으면 에러가 발생한다.

테이블 자체가 아닌 테이블의 데이터만을 지우고 싶을 때는 TRUNCATE TABLE 문을 사용할 수 있다. 이 구문을 사용하면 테이블 자체는 그대로 남게 되며, 해당 테이블에 저장된 데이터만이 모두 삭제된다.
IF EXISTS 절을 사용하면 삭제하려는 데이터베이스나 테이블이 존재하지 않아서 발생하는 에러를 미리 방지할 수 있다.

DROP DATABASE IF EXISTS Hotel;
DROP TABLE IF EXISTS Reservation;

DDL의 TRUNCATE와 DML의 DELETE의 차이

DDL의 TRUNCATE 도 데이터 삭제, DML의 DELETE 도 데이터 삭제
DDL의 TRUNCATE는 인덱스도 관리를 한다. TRUNCATE은 정의되어있는 인덱스까지도 삭제 정의하고 난 초기 상태로 만들어버리는것(인덱스 0인가 1부터 시작)
DML의 DELETE는 삭제하고 난 후에 인덱스 n에서 삭제했다면 n+1로 시작

Data Type

  1. 숫자 타입
  2. 문자열 타입
  3. 날짜와 시간 타입

숫자타입

정수타입

SMALLINT = 자바의 short 타입
INT 4바이트

고정 소수점 타입 : 화폐단위같은것 정의할때

DECIMAL(M,D)

부동 소수점 타입

소수점이 증가하는 타입의 형태
float

문자열 타입

VARCHAR 가변문자열
CHAR 길이고정
CHAR는 0부터 255까지 설정할 수 있으며, VARCHAR는 0부터 65,535까지 설정 가능
BLOB Binary Large Object , 2진 데이터. 자바에서 bin이 전부 2진으로 되어있는 파일이다. 우리가 파일을 관리할적에 가장 많이 쓰이는 타입이다 그 형태 그대로 데이터베이스에 저장하고 싶다면 BLOB타입으로 지정해서 받아서 프로그램을 만들수 있다.
TEXT 기본값을 가질수없고 문자열의 대소문자 구별한다, 긴문자 게시글 등의 경우 텍스트 쓴다
ENUM 미리 정의한 집합 안의 요소 중 하나만을 저장할 수 있는 타입
BOOLEAN

날짜와 시간 타입

DATE 'YYYY-MM-DD'이며, 이때 저장할 수 있는 날짜의 범위는
'1000-01-01'부터 '9999-12-31'까지
DATETIME 'YYYY-MM-DD HH:MM:SS'이며, 이때 저장할 수 있는 범위는
'1000-01-01 00:00:00'부터 '9999-12-31 23:59:59'까지
TIMPSTAMP
TIME
YEAR

테이블 만들기

-- 기차예약 데이터베이스 생성
CREATE DATABASE train_reservation;
USE train_reservation; #선택

-- 가격테이블 생성
CREATE TABLE Cost(
	departure_station VARCHAR(50) NOT NULL,
    arrival_station VARCHAR(50) NOT NULL,
    amount INT NOT NULL
);

# DROP TABLE Cost;

CREATE TABLE Train(
	train_number VARCHAR(10) PRIMARY KEY, 
    #PRIMARY KEY속성 내에 NN과 UNIQUE 속성포함
    departure_station VARCHAR(50) NOT NULL,
    departure_time TIME NOT NULL,
    arrival_station VARCHAR(50) NOT NULL,
    arrival_time TIME NOT NULL,
    take_minute TIME NOT NULL,
    type VARCHAR(10) NOT NULL
    # stop_stations, 
    #자바 클래스에서 리스트로 가져온값들 따로 정의해서 가져와야한다
    # seats
    # 기본키, defalut (기본값넣어주는것), 
    #null not_null(필수일때), unique(중복허용안할때)
);

CREATE TABLE Station(
	station_number INT AUTO_INCREMENT PRIMARY KEY,
    station_name VARCHAR(50) NOT NULL,
    address TEXT NOT NULL UNIQUE,
    tel_number VARCHAR(15) NOT NULL UNIQUE
);

CREATE TABLE Stop_station(
	station_number INT NOT NULL,
    train_number VARCHAR(10) NOT NULL,
    departure_time TIME NOT NULL,
    arrival_time TIME NOT NULL
);

CREATE TABLE Seat( 
#좌석의 경우 이 모든 필드를 합쳐야 seat를 정의할수 있다. 
#복합 기본키로 잡아서 쓰기도한다 
#이 값들을 기본키로 잡아서 옮겨도 되는데 
#필드를 다 추가해야해서 하는 의미가 줄어듬
	seat_code VARCHAR(5) PRIMARY KEY,
	type VARCHAR(10) NOT NULL, #일반실 특실관련
    seat_number VARCHAR(2) NOT NULL,
    train_type VARCHAR(10) NOT NULL
);

기차가 예매하는 행위에 있어서 현실에 존재하는것 : 기차타는 고객, 기차, 기차역
우리가 어떠한 행위로 발생하는 데이터들은 관계에 의한 데이터라고 한다.

기차가 어떤 역을 점거를 하기 때문에 출발,도착시간이 있는것
역과 역사이의 거리가 있기 때문에 그에 따른 비용이 생기는것.

일 대 다 관계 : 하나의 열차는 특정역에서 출발할 적에 여러 역에서 출발 불가. 하나의 역에는 여러대의 기차 출발 가능 / 하나의 열차는 최종 목적지가 1개, 정착역에는 여러대의 기차 도착 가능

이때 종속되는 것을 필드에 넣어준다. 다에 해당하는 부분에 필드를 넣어서 표현해주기. 일 대 일, 일 대 다의 경우에는 필드에 추가해서 하나를 처리해준다.

다 대 다 관계 : 하나의 역에서 다른 역까지 가는 금액을 측정할때 그때 여러 역으로 가서 측정가능 / 도착역 입장에서는 여러 역에서도 와서 도착할 수 있다. 역과 역 사이에는 다 대 의 관계가 형성 된다.
하나의 레코드에 하나의 데이터만 무조건 들어가야해서 표현이 불가(여러개를 참조를 하기 힘들다) 이때는 중간관계 테이블을 하나 만들어서 출발역 도착역해서 출발역과 도착역에 여러 경우의 값들을 표현한다

이런 중간관계 테이블이 Cost, Stop_station

관계를 테이블로 표현할지 필드로 표현할지에 대해서는 관계정도에 따라 다르게 표현한다

💡Seat 테이블에 대한 관계에 대해서도 생각해보기

train 과 seat가 다대다의 관계가 있으니까 둘의 관계를 정의해주는 중간 테이블을 만들어주고 각각 테이블에서 기본키로 사용하는 값들을 가져온다음 참조키를 사용해 그 두 테이블의 기본키 요소를 필드값으로 가져오면 되는건가?
그럼 seat code와 train number을 참조하는 중간테이블에 seat_status 포함해서 만들면..?!

seat_code NOT NULL UNIQUE 넣어주면되나 (seat와의 관계설정할때)
seat_status BOOLEAN DEFAULT FALSE NOT NULL

profile
개발자가 될 거야!

0개의 댓글