윈도우에서는 지원되지 않는 기능
mysql프롬프트 바로 제공
mysql client utility 명령 (;없어도 됨, 여러라인 구성안됨)
DB 관리리스템 명령(SQL;structured query language) (여러라인 구성됨, 끝을 알리기 위해 ; 필요)
edit 기능
edit -> vi편집기 열림 -> sql문 작성 -> 저장 -> ;입력-> 오류 발생 시 다시 edit -> 수정가능
리눅스 계열에서만 지원된다! edit명령은 마지막으로 실행한 sql문을 띄워준다.
# 파일을 입력해 실행
mysql -uroot -p < create.txt
-- student의 권한 보기
SHOW GRANTS FOR student ;
information_schema
모든 사용자, 데이터베이스, 권한 등등이 저장되어 있어 사용자가 명령을 실행하면 DBMS는 이 데이터베이스를 체크하여 조건을 만족하면 실행해 준다. (meta database)
이 데이터베이스의 테이블에 저장된 데이터를 meta data라고 한다.
데이터베이스 개요
체계화된 데이터의 집합으로 여러 사람들이 공유하여 사용할 목적으로 통합 관리되는 정보의 집합이다.
데이터베이스 관리 시스템(Database Management System;DBMS)
데이터의 독립성
데이터의 무결성
데이터의 보안성
데이터의 일관성
데이터 중복의 최소화
DBMS 기능 2가지
사용자 보안 관리
명령 실행 기능
관계형 데이터베이스 관리 시스템(RDBMS)
데이터베이스는 최소한의 의미를 가지는 테이블들로 구성되며 그 테이블들을 컬럼으로 연결한 것이다.
관계에 대한 정의
관계형 데이터베이스의 관계는 업무적인 연관성 이다.
존재의 유형
부서-사원의 관계
행위의 유형
고객-주문의 관계
SQL(structured query language)
관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
DDL(Data Definition Language): 데이터 정의 언어
DML(Data Manipulation Language): 데이터 조작 언어
DCL(Data Control Language): 데이터 제어 언어
TCL(Transaction Control Language): 트랜젝션 제어 언어
대상이 객체(테이블, 스키마 등) 일 때 ALTER, DROP (DDL)
대상이 데이터 일 때 UPDATE, DELETE (DML)
사용자 추가하기
사용자 추가 및 삭제
-- 사용자 추가
CREATE USER student @ '%' IDENTIFIED BY 'Iloveyou7!' ; -- @'%' 생략 가능
CREATE USER IF NOT EXISTS student IDENTIFIED BY 'Iloveyou7!' ; -- 조건추가 사용자 추가
사용자계정[@’호스트명’] 계정은 항상 호스트와 쌍을 이룸
-- 사용자 삭제
DROP USER student ;
DROP USER IF EXISTS student ;
권한의 위임 및 해제
-- 권한 부여(student 데이터베이스의 모든 테이블(*)에 대해 모든 권한, grant권한 제외)
GRANT all privileges ON student . * TO student ;
-- 권한 해제(all privileges로 줬기에 all privileges를, *에 대해 했기에 *를 해제함)
REVOKE all privileges ON student . * FROM student ;
비밀번호 변경
-- MariaDB
SET PASSWORD FOR student = PASSWORD ( '비밀번호' );
-- MySQL
ALTER USER student @ '%' IDENTIFIED BY '비밀번호' ;
MySQL Storage Engine
InnoBD 엔진
트랜젝션을 처리하기 위해 고안된 엔진으로 롤백(ROLLBACK) 되지않고 완료되는 짧ㅅ은 트랜잭션이 많은 경우의 처리에 적당한 엔진이다.
결제 정보와 같이 정보의 무결성을 보장하고 손실되면 안되는 중요한 데이터 관리에 사용되는 엔진이다.
database 관리
MySQL에서 작은 의미로서의 데이터베이스는 테이블의 집합소이다.
oracle에서는 하나의 테이블 스페이스에 테이블 앞에 소유자를 붙여서 같은 이름을 가진 테이블이 존재할 수 있다.
이렇게 논리적으로 구분된 공간이 스키마(schema)이다.
MySQL에서는 하나의 데이터베이스가 스키마라 생각하면 된다.
-- 데이터베이스 생성
CREATE DATABASE 데이터베이스명 ;
-- 데이터베이스 선택(SQL문이 아니라 ;안붙임)
USE 데이터베이스명
-- 데이터베이스 검색
SHOW DATABASES LIKE 'my%' ;
+ ------------------+
| Database ( mysql ) |
+ ------------------+
| mysql |
+ ------------------+
와일드 문자
0이상의 모든문자
객체대상: *
데이터대상: %
하나의 모든문자: _
-- 테이블 검색
SHOW TABLES LIKE 'u%' ;
+ ----------------------+
| Tables_in_mysql ( u % ) |
+ ----------------------+
| user |
+ ----------------------+
-- 컬럼 검색
SHOW COLUMNS IN user LIKE 'user' ; -- IN절이 빠지면 안된다
+ -------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ -------+----------+------+-----+---------+-------+
| User | char ( 32 ) | NO | PRI | | |
+ -------+----------+------+-----+---------+-------+
-- 테이블 보기
EXPLAIN user ;
DESCRIBE user ;
DESC user ;
-- 데이터베이스 삭제
DROP DATABASE 데이터베이스명 ;
MySQL 자료형
숫자형
TINYINT (1Byte)
SMALLINT (2Byte)
MEDIUMINT (3Byte)
INT (4Byte)
INTEGER (4Byte)
FLOAT (4Byte): 단 정도 부동 소수점 타입
DOUBLE (8Byte): 배 정도 부동 소수점 타입
DOUBLERECISION (8Byte)
REAL (8Byte)
DECIMAL(m,n) (가변형): 고정 소수점 타입(m: 전체 자릿수, n: 소수점 이하의 자릿수)
BIT(m) : m개의 비트 크기의 자료형
문자형
CHAR(M) : M개의 문자를 저장. 최대 255개
VARCHAR(M) : CHAR과 같지만 가변형으로 메모리 사용량을 줄일 수 있다.
BINARY(M), VARBINARY(M) : M개의 ASCII 문자를 저장(byte기준)
TINYTEXT : 255개의 문자를 저장
TINYBLOB : 255개의 문자를 저장(binary)
TEXT : 65535개의 문자(64KB)를 저장
BLOB : 65535개의 문자를 저장(binary)
MEDIUMTEXT : 16777215개의 문자를 저장
MEDIUMBLOB : 16777215개의 문자를 저장(binary)
LONGTEXT : 4294967295(4GB)의 문자를 저장
LONGBLOB : 4294967295(4GB)의 문자를 저장(binary)
ENUM(‘value1’, ‘value2’,…) : 문자를 숫자형으로 보관. 65535개의 멤버를 가질 수 있으며 멤버는 대소문자 구분이 없다. 멤버는 서로 상호 베타적.(필드의 값은 멤버들 중 하나만을 저장)
SET(‘value1’, ‘value2’,…) : 문자를 숫자형으로 보관. 64개의 멤버를 가질 수 있으며 멤버는 대소문자 구분이 없다. ENUM과는 달리 상호 베타적이지 않다.(멤버들을 콤마를 이용하여 조합, 저장이 가능)
날짜 및 시간
DATATIME(M) (8Byte) : YYYY-MM-DD HH-mm-ss. M은 분수 초 정밀도. 0~6
DATE (3Byte) : DATETIME의 날짜부분만 저장
TIMESTAMP(M) (4Byte) : 시간을 정수값으로 저장. M은 분수 초 정밀도. 0~6
TIME (3Byte) : DATETIME의 시간부분만 저장
YEAR(1Byte) : 연도만 저장
MySQL 연산자
기본적인 프로그래밍 언어의 연산자와 유사하다.
프로그래밍 언어와 다르게 3/2는 1.500이 나온다.
0이 아니면 true 0은 false
=
은 대입연산자가 아니라 관계연산자이다.
!=
, <>
: 같지 않을 경우 참
IN
: lv가 rvs에 존재하면 참
BETWEEN
: lv가 rv1 and rv2 사이에 존재하면 참
LIKE
: 문자열 비교에서 패턴이 일치할 경우 참
NOT LIKE
: 문자열 비교에서 패턴이 일치하지 않을 경우 참
<=>
: 같은 경우 참(null에 대해서도 가능)
IS NULL
: 값이 없을 경우 참
IS NOT NULL
: 값이 있을 경우 참
문자열을 비교할 경우 ‘=’가 와일드문자(%)를 인식하지 못하므로 LIKE를 쓴다.=> 문자열 검색에는 LIKE이용(보안에 주의할것)
비교연산의 특징
인수가 모두 문자여이면 문자열로 비교
인수가 모두 정수이면 정수로 비교
인수가 모두 null이면 연산의 결과도 null
한쪽의 인수가 timestamp면 나머지도 변환되여 비교
한쪽의 인수가 datetime이면 나머지도 변환되어 비교
나머지의 경우 부동소수점 실수로 비교
-- 변수 선언
SET @ id : = 3 ; -- 또는 SET @id = 3;
-- 변수 출력
SELECT @ id ;
테이블
스키마(Schema)
데이터베이스의 구조와 제약 조건에 관해 전반적인 명세를 기술한 것이다. 개체의 특성을 나타내는 속성과 속성들의 집합으로 이루어진 개체 그리고 개체와 개체 사이에 존재하는 관계에 대한 정의와 이들이 유지해야 할 제약 조건을 기술한 것이다.
테이블
관계형 데이터베이스에서 테이블(Table)은 분류된 데이터의 집합으로 데이터의 기본 구성요소이며 관계(Relation)를 형성한다. 테이블은 행과 열로 구성된다.
열(column) (파일 시스템의 field)
각 컬럼이 어떤 값을 의미하는가를 나타내고 있는 것을 속성(Attribute)라고 한다. 이러한 속성의 수를 차수(Degree)라고 한다.
행(row) (파일 시스템의 record)
테이블을 구성하는 행을 튜플(Tuple)이라고도 하며 한 테이블 내에 포함된 중복되지 않는 데이터 수를 카디널리티(Cardinality)라고 한다.
테이블 생성
CREATE TABLE sawon (
sabun int unsigned auto_increment primary key ,
sa_name varchar ( 20 ) not null ,
sa_age tinyint unsigned default 20
);
DESC sawon ;
+ -------------------+
| Tables_in_student |
+ -------------------+
| sawon |
+ -------------------+
-- 컬럼 하나인 테이블 생성
CREATE TABLE sawon ( sabun int unsigned auto_increment primary key );
DESC sawon ;
+ -------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+ -------+--------------+------+-----+---------+----------------+
| sabun | int unsigned | NO | PRI | NULL | auto_increment |
+ -------+--------------+------+-----+---------+----------------+
테이블 편집
-- 컬럼 추가
ALTER TABLE sawon ADD sa_name varchar ( 20 ) not null ;
DESC sawon ;
+ ---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+--------------+------+-----+---------+----------------+
| sabun | int unsigned | NO | PRI | NULL | auto_increment |
| sa_name | varchar ( 20 ) | NO | | NULL | |
+ ---------+--------------+------+-----+---------+----------------+
-- 컬럼 순서 지정 추가
ALTER TABLE sawon ADD dept VARCHAR ( 20 ) not null AFTER sabun ;
-- 컬럼 맨 앞 추가
ALTER TABLE sawon ADD sa_age TINYINT UNSIGNED NOT NULL default 0 FIRST ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+----------------+
| sa_age | tinyint unsigned | NO | | 0 | |
| sabun | int unsigned | NO | PRI | NULL | auto_increment |
| dept | varchar ( 20 ) | NO | | NULL | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
+ ---------+------------------+------+-----+---------+----------------+
-- 컬럼 데이터 수정
ALTER TABLE sawon MODIFY dept INT NOT NULL ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+----------------+
| sa_age | tinyint unsigned | NO | | 0 | |
| sabun | int unsigned | NO | PRI | NULL | auto_increment |
| dept | int | NO | | NULL | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
+ ---------+------------------+------+-----+---------+----------------+
-- 컬럼 위치 수정
ALTER TABLE sawon MODIFY sa_age tinyint unsigned NOT NULL default 0 AFTER sa_name ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+----------------+
| sabun | int unsigned | NO | PRI | NULL | auto_increment |
| dept | int | NO | | NULL | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
+ ---------+------------------+------+-----+---------+----------------+
-- 컬럼명 수정
ALTER TABLE sawon CHANGE sabun sa_bun INT UNSIGNED NOT NULL default 0 ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+-------+
| sa_bun | int unsigned | NO | PRI | 0 | |
| dept | int | NO | | NULL | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
+ ---------+------------------+------+-----+---------+-------+
-- 컬럼 삭제
ALTER TABLE sawon DROP dept ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+-------+
| sa_bun | int unsigned | NO | PRI | 0 | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
+ ---------+------------------+------+-----+---------+-------+
테이블 삭제
-- 테이블 삭제
DROP TABLE sawon ;
제약조건 (constraints)
-- 컬럼 제약사항(Primary Key) 삭제
ALTER TABLE sawon DROP PRIMARY KEY ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+-------+
| sa_bun | int unsigned | NO | | 0 | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
+ ---------+------------------+------+-----+---------+-------+
-- 컬럼 제약사항(Primary Key) 추가
ALTER TABLE sawon ADD PRIMARY KEY ( sa_bun );
DESC sawon ;
+ ---------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+-------+
| sa_bun | int unsigned | NO | PRI | 0 | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
+ ---------+------------------+------+-----+---------+-------+
-- 테이블 생성 (보통 create에서 컬럼들을 추가함...)
CREATE TABLE dept ( dept_no CHAR ( 2 ) NOT NULL PRIMARY KEY );
ALTER TABLE dept ADD dept_name VARCHAR ( 50 ) NOT NULL ;
DESC sawon ;
+ -----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ -----------+-------------+------+-----+---------+-------+
| dept_no | char ( 2 ) | NO | PRI | NULL | |
| dept_name | varchar ( 50 ) | NO | | NULL | |
+ -----------+-------------+------+-----+---------+-------+
-- sawon 테이블에 dept 테이블 관계 넣기(Foreign Key)
ALTER TABLE sawon ADD dept_no CHAR ( 2 ) NOT NULL ;
ALTER TABLE sawon ADD FOREIGN KEY ( dept_no ) REFERENCES dept ( dept_no );
DESC sawon ;
+ ---------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+-------+
| sa_bun | int unsigned | NO | PRI | 0 | |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
| dept_no | char ( 2 ) | NO | MUL | NULL | |
+ ---------+------------------+------+-----+---------+-------+
데이터의 입력(INSERT)
INSERT INTO dept VALUES ( '01' , '총무부' );
SELECT * FROM dept ;
+ ---------+-----------+
| dept_no | dept_name |
+ ---------+-----------+
| 01 | 총무부 |
+ ---------+-----------+
-- 순서 변경 입력
INSERT INTO dept ( dept_name , dept_no ) VALUES ( '영업부' , '02' );
SELECT * FROM dept ;
+ ---------+-----------+
| dept_no | dept_name |
+ ---------+-----------+
| 01 | 총무부 |
| 02 | 영업부 |
+ ---------+-----------+
-- 제약사항이 있을 때 데이터 입력
INSERT INTO sawon VALUES ( 1 , '홍길동' , 20 , '02' );
SELECT * FROM sawon ;
+ --------+-----------+--------+---------+
| sa_bun | sa_name | sa_age | dept_no |
+ --------+-----------+--------+---------+
| 1 | 홍길동 | 20 | 02 |
+ --------+-----------+--------+---------+
-- 없는 foregine key로는 입력불가 (참조의 무결성)
-- 자동증가 속성 추가
ALTER TABLE sawon MODIFY sa_bun INT UNSIGNED AUTO_INCREMENT ;
DESC sawon ;
+ ---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+ ---------+------------------+------+-----+---------+----------------+
| sa_bun | int unsigned | NO | PRI | NULL | auto_increment |
| sa_name | varchar ( 20 ) | NO | | NULL | |
| sa_age | tinyint unsigned | NO | | 0 | |
| dept_no | char ( 2 ) | NO | MUL | NULL | |
+ ---------+------------------+------+-----+---------+----------------+
-- 컬럼 생략하려면 테이블명 뒤에 어떤 컬럼인지 명시 해줘야한다. 지정하지 않은 값에는 default 값이 들어간다.
INSERT INTO sawon ( sa_name , dept_no ) VALUES ( '심청이' , '01' );
SELECT * FROM sawon ;
+ --------+-----------+--------+---------+
| sa_bun | sa_name | sa_age | dept_no |
+ --------+-----------+--------+---------+
| 1 | 홍길동 | 20 | 02 |
| 2 | 심청이 | 0 | 01 |
+ --------+-----------+--------+---------+
-- auto_increment 옵션의 특징
INSERT INTO sawon VALUES ( 100 , '임꺽정' , 45 , '01' );
INSERT INTO sawon ( sa_name , sa_age , dept_no ) VALUES ( '에디슨' , 50 , '02' );
SELECT * FROM sawon ;
+ --------+-----------+--------+---------+
| sa_bun | sa_name | sa_age | dept_no |
+ --------+-----------+--------+---------+
| 1 | 홍길동 | 20 | 02 |
| 2 | 심청이 | 0 | 01 |
| 100 | 임꺽정 | 45 | 01 |
| 101 | 에디슨 | 50 | 02 |
+ --------+-----------+--------+---------+
-- 임의의 입력 값 다음값으로 증가가 계속된다.
-- 다중 입력
INSERT INTO sawon ( sa_name , sa_age , dept_no )
VALUES ( '놀부' , 25 , '02' ),
( '흥부' , 22 , '02' );
SELECT * FROM sawon ;
+ --------+-----------+--------+---------+
| sa_bun | sa_name | sa_age | dept_no |
+ --------+-----------+--------+---------+
| 1 | 홍길동 | 20 | 02 |
| 2 | 심청이 | 0 | 01 |
| 100 | 임꺽정 | 45 | 01 |
| 101 | 에디슨 | 50 | 02 |
| 102 | 놀부 | 25 | 02 |
| 103 | 흥부 | 22 | 02 |
+ --------+-----------+--------+---------+
자료의 검색(SELECT)
SELECT * FROM category ;
+ --------+-----------+
| c_code | c_name |
+ --------+-----------+
| FT | 소설 |
| LF | 라노벨 |
| RE | 참고서 |
+ --------+-----------+
SELECT * FROM book ;
+ --------+------------------------------------------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+------------------------------------------------------+---------+--------+
| FT0001 | 늑대와 춤을 | 15000 | FT |
| FT0002 | 인간시장 | 12000 | FT |
| LF0001 | 전생했더니 슬라임이었다 건 | 25000 | LF |
| LF0002 | 스파이 패밀리 | 26000 | LF |
| LF0003 | 성계의전기 | 27000 | LF |
| LF0004 | 십이국기 | 28000 | LF |
| LF0005 | 길모둥이 마족 | 25000 | LF |
| LF0006 | 공의경계 | 26000 | LF |
| LF0007 | 던전에서 만남을 추구하면 안되는걸까 ? | 27000 | LF |
| RE0001 | ECMAScript Ver 6 | 20000 | RE |
| RE0002 | C 프로그래밍 기초 | 25000 | RE |
| RE0003 | 고급 C ++ 프로그래밍 | 29000 | RE |
| RE0004 | JAVA 프로그래밍 기초 | 29000 | RE |
| RE0005 | 객체지향프로그래밍 기초 | 30000 | RE |
| RE0006 | 리엑트 프레임워크 | 28000 | RE |
| RE0007 | 스프링 프레임워크 | 29000 | RE |
| RE0008 | 스프링 부트 | 30000 | RE |
+ --------+------------------------------------------------------+---------+--------+
-- 중복제거
SELECT DISTINCT b_code FROM book ;
+ --------+
| b_code |
+ --------+
| FT0001 |
| FT0002 |
| LF0001 |
| LF0002 |
| LF0003 |
| LF0004 |
| LF0005 |
| LF0006 |
| LF0007 |
| RE0001 |
| RE0002 |
| RE0003 |
| RE0004 |
| RE0005 |
| RE0006 |
| RE0007 |
| RE0008 |
+ --------+
-- 10% 할인가 출력
SELECT b_name , b_price , b_price * 0 . 9 FROM book ;
+ ------------------------------------------------------+---------+-------------+
| b_name | b_price | b_price * 0 . 9 |
+ ------------------------------------------------------+---------+-------------+
| 늑대와 춤을 | 15000 | 13500 . 0 |
| 인간시장 | 12000 | 10800 . 0 |
| 전생했더니 슬라임이었다 건 | 25000 | 22500 . 0 |
| 스파이 패밀리 | 26000 | 23400 . 0 |
| 성계의전기 | 27000 | 24300 . 0 |
| 십이국기 | 28000 | 25200 . 0 |
| 길모둥이 마족 | 25000 | 22500 . 0 |
| 공의경계 | 26000 | 23400 . 0 |
| 던전에서 만남을 추구하면 안되는걸까 ? | 27000 | 24300 . 0 |
| ECMAScript Ver 6 | 20000 | 18000 . 0 |
| C 프로그래밍 기초 | 25000 | 22500 . 0 |
| 고급 C ++ 프로그래밍 | 29000 | 26100 . 0 |
| JAVA 프로그래밍 기초 | 29000 | 26100 . 0 |
| 객체지향프로그래밍 기초 | 30000 | 27000 . 0 |
| 리엑트 프레임워크 | 28000 | 25200 . 0 |
| 스프링 프레임워크 | 29000 | 26100 . 0 |
| 스프링 부트 | 30000 | 27000 . 0 |
+ ------------------------------------------------------+---------+-------------+
-- 알리아스(Alias)
SELECT b_name AS bookName , b_price bookPrice , b_price * 0 . 9 'discountPrice' FROM book ;
-- 'discountPrice'="discountPrice"=`discountPrice` 어느것으로 감싸도 된다.
+ ------------------------------------------------------+-----------+---------------+
| bookName | bookPrice | discountPrice |
+ ------------------------------------------------------+-----------+---------------+
| 늑대와 춤을 | 15000 | 13500 . 0 |
| 인간시장 | 12000 | 10800 . 0 |
| 전생했더니 슬라임이었다 건 | 25000 | 22500 . 0 |
| 스파이 패밀리 | 26000 | 23400 . 0 |
| 성계의전기 | 27000 | 24300 . 0 |
| 십이국기 | 28000 | 25200 . 0 |
| 길모둥이 마족 | 25000 | 22500 . 0 |
| 공의경계 | 26000 | 23400 . 0 |
| 던전에서 만남을 추구하면 안되는걸까 ? | 27000 | 24300 . 0 |
| ECMAScript Ver 6 | 20000 | 18000 . 0 |
| C 프로그래밍 기초 | 25000 | 22500 . 0 |
| 고급 C ++ 프로그래밍 | 29000 | 26100 . 0 |
| JAVA 프로그래밍 기초 | 29000 | 26100 . 0 |
| 객체지향프로그래밍 기초 | 30000 | 27000 . 0 |
| 리엑트 프레임워크 | 28000 | 25200 . 0 |
| 스프링 프레임워크 | 29000 | 26100 . 0 |
| 스프링 부트 | 30000 | 27000 . 0 |
+ ------------------------------------------------------+-----------+---------------+
-- 예약어를 컬럼이나 테이블로 인식시켜야 할 때 백틱`을 이용한다. (오라클은 "을 사용)
SELECT book . b_name , book . b_price , book . b_price * 0 . 9 FROM `student` . book ;
-- FROM절에도 사용가능
SELECT B . b_name , B . b_price , B . b_price * 0 . 9 FROM book B ;
WHERE의 사용
SELECT * FROM book WHERE b_price BETWEEN 15000 AND 20000 ;
SELECT * FROM book WHERE b_price >= 15000 AND b_price <= 20000 ;
+ --------+------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+------------------+---------+--------+
| FT0001 | 늑대와 춤을 | 15000 | FT |
| RE0001 | ECMAScript Ver 6 | 20000 | RE |
+ --------+------------------+---------+--------+
-- 함수의 사용(floor: 소수점 버림)
SELECT * FROM book WHERE floor ( b_price / 10000 ) = 2 ;
+ --------+------------------------------------------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+------------------------------------------------------+---------+--------+
| LF0001 | 전생했더니 슬라임이었다 건 | 25000 | LF |
| LF0002 | 스파이 패밀리 | 26000 | LF |
| LF0003 | 성계의전기 | 27000 | LF |
| LF0004 | 십이국기 | 28000 | LF |
| LF0005 | 길모둥이 마족 | 25000 | LF |
| LF0006 | 공의경계 | 26000 | LF |
| LF0007 | 던전에서 만남을 추구하면 안되는걸까 ? | 27000 | LF |
| RE0001 | ECMAScript Ver 6 | 20000 | RE |
| RE0002 | C 프로그래밍 기초 | 25000 | RE |
| RE0003 | 고급 C ++ 프로그래밍 | 29000 | RE |
| RE0004 | JAVA 프로그래밍 기초 | 29000 | RE |
| RE0006 | 리엑트 프레임워크 | 28000 | RE |
| RE0007 | 스프링 프레임워크 | 29000 | RE |
+ --------+------------------------------------------------------+---------+--------+
-- 문자열 비교 LIKE
SELECT * FROM book WHERE b_name LIKE '길%' ;
+ --------+---------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+---------------------+---------+--------+
| LF0005 | 길모둥이 마족 | 25000 | LF |
+ --------+---------------------+---------+--------+
-- IN 사용
SELECT * FROM book WHERE b_price IN ( 15000 , 20000 , 25000 );
+ --------+----------------------------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+----------------------------------------+---------+--------+
| FT0001 | 늑대와 춤을 | 15000 | FT |
| LF0001 | 전생했더니 슬라임이었다 건 | 25000 | LF |
| LF0005 | 길모둥이 마족 | 25000 | LF |
| RE0001 | ECMAScript Ver 6 | 20000 | RE |
| RE0002 | C 프로그래밍 기초 | 25000 | RE |
+ --------+----------------------------------------+---------+--------+
-- NOT 사용
SELECT * FROM book WHERE NOT b_price IN ( 15000 , 20000 , 25000 );
+ --------+------------------------------------------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+------------------------------------------------------+---------+--------+
| FT0002 | 인간시장 | 12000 | FT |
| LF0002 | 스파이 패밀리 | 26000 | LF |
| LF0003 | 성계의전기 | 27000 | LF |
| LF0004 | 십이국기 | 28000 | LF |
| LF0006 | 공의경계 | 26000 | LF |
| LF0007 | 던전에서 만남을 추구하면 안되는걸까 ? | 27000 | LF |
| RE0003 | 고급 C ++ 프로그래밍 | 29000 | RE |
| RE0004 | JAVA 프로그래밍 기초 | 29000 | RE |
| RE0005 | 객체지향프로그래밍 기초 | 30000 | RE |
| RE0006 | 리엑트 프레임워크 | 28000 | RE |
| RE0007 | 스프링 프레임워크 | 29000 | RE |
| RE0008 | 스프링 부트 | 30000 | RE |
+ --------+------------------------------------------------------+---------+--------+
ORDER BY 절 사용
SELECT * FROM book WHERE NOT b_price IN ( 15000 , 20000 , 25000 ) ORDER BY b_price DESC , c_code ASC ;
+ --------+------------------------------------------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+------------------------------------------------------+---------+--------+
| RE0005 | 객체지향프로그래밍 기초 | 30000 | RE |
| RE0008 | 스프링 부트 | 30000 | RE |
| RE0003 | 고급 C ++ 프로그래밍 | 29000 | RE |
| RE0004 | JAVA 프로그래밍 기초 | 29000 | RE |
| RE0007 | 스프링 프레임워크 | 29000 | RE |
| LF0004 | 십이국기 | 28000 | LF |
| RE0006 | 리엑트 프레임워크 | 28000 | RE |
| LF0003 | 성계의전기 | 27000 | LF |
| LF0007 | 던전에서 만남을 추구하면 안되는걸까 ? | 27000 | LF |
| LF0002 | 스파이 패밀리 | 26000 | LF |
| LF0006 | 공의경계 | 26000 | LF |
| FT0002 | 인간시장 | 12000 | FT |
+ --------+------------------------------------------------------+---------+--------+
-- DESC: 내림차순, ASC: 오름차순
LIMIT 사용
LIMIT (n) : n개
LIMIT (n,m) : n부터 m개
SELECT * FROM book ORDER BY b_price DESC , c_code ASC LIMIT 5 , 2 ;
+ --------+---------------------------+---------+--------+
| b_code | b_name | b_price | c_code |
+ --------+---------------------------+---------+--------+
| LF0004 | 십이국기 | 28000 | LF |
| RE0006 | 리엑트 프레임워크 | 28000 | RE |
+ --------+---------------------------+---------+--------+
함수
그룹함수
인수로 여러데이터가 올 수 있는 함수
개별 컬럼과 사용하면 안됨
SELECT count ( * ) FROM book ;
+ ----------+
| count ( * ) |
+ ----------+
| 17 |
+ ----------+
SELECT MIN ( b_price ), MAX ( b_price ), AVG ( b_price ), SUM ( b_price ) FROM book ;
+ --------------+--------------+--------------+--------------+
| MIN ( b_price ) | MAX ( b_price ) | AVG ( b_price ) | SUM ( b_price ) |
+ --------------+--------------+--------------+--------------+
| 12000 | 30000 | 25352 . 9412 | 431000 |
+ --------------+--------------+--------------+--------------+
-- 주로 통계를 구함!
-- 그룹으로 묶어 개별 컬럼을 그룹함수와 사용
SELECT c_code , AVG ( b_price ) FROM book GROUP BY c_code ;
+ --------+--------------+
| c_code | AVG ( b_price ) |
+ --------+--------------+
| FT | 13500 . 0000 |
| LF | 26285 . 7143 |
| RE | 27500 . 0000 |
+ --------+--------------+
-- c_code에 F가 들어간 책의 평균 가격 구하기
-- 첫번째 방법(WHERE: SELECT 필터링) F포함된 자료들을 걸러서 그룹화
SELECT c_code , AVG ( b_price ) FROM book WHERE c_code LIKE '%F%' GROUP BY c_code ;
+ --------+--------------+
| c_code | AVG ( b_price ) |
+ --------+--------------+
| FT | 13500 . 0000 |
| LF | 26285 . 7143 |
+ --------+--------------+
-- 두번째 방법(HAVING: GROUP BY 조건 설정) 그룹화 후 F포함된 자료 필터링
SELECT c_code , AVG ( b_price ) FROM book GROUP BY c_code HAVING c_code LIKE '%F%' ;
+ --------+--------------+
| c_code | AVG ( b_price ) |
+ --------+--------------+
| FT | 13500 . 0000 |
| LF | 26285 . 7143 |
+ --------+--------------+
-- 조건이 GROUP BY절의 컬럼일 경우 두번째 방법을 쓸것
-- 아니면 WHERE을 써야 한다.
SELECT c_code , AVG ( b_price ) FROM book WHERE b_price > 20000 GROUP BY c_code HAVING c_code LIKE '%F%' ;
+ --------+--------------+
| c_code | AVG ( b_price ) |
+ --------+--------------+
| LF | 26285 . 7143 |
+ --------+--------------+
모든 절은 순서가 맞아야 한다!!
JOIN
두 개 이상의 테이블에서 두 테이블의 레코드를 조합하여 검색하는 것을 말한다.
INNER JOIN
THETA JOIN
FULL JOIN 에 WHERE 절로 조건을 지정한 경우
-- 두 테이블을 비교하여 매칭되는 것만
SELECT * FROM category C , book B WHERE C . c_code = B . c_code ;
INNER JOIN
SELECT * FROM category C INNER JOIN book B USING ( c_code );
-- 컬럼명이 다를 경우
SELECT * FROM category C INNER JOIN book B ON ( C . c_code = B . c_code );
NATURAL JOIN
-- 알아서 공통 컬럼을 찾아 가져온다.
SELECT * FROM category C NATURAL JOIN book B ;
OUTER JOIN
해당 컬럼에 존재하나 데이터가 없을 경우 안나옴-> OUTER JOIN이용
-- LEFT: JOIN 절의 좌측을 기준으로 출력(category에는 존재하지만 book에는 없어도 출력)
SELECT * FROM category LEFT JOIN book USING ( c_code );
SELECT * FROM category LEFT JOIN book ON ( book . c_code = category . c_code );
-- 뒤에 계속 JOIN할 수 있다.
SELECT category . c_code , c_name , b_name , b_price FROM category LEFT JOIN book ON ( book . c_code = category . c_code );
+ --------+--------------+------------------------------------------------------+---------+
| c_code | c_name | b_name | b_price |
+ --------+--------------+------------------------------------------------------+---------+
| FT | 소설 | 늑대와 춤을 | 15000 |
| FT | 소설 | 인간시장 | 12000 |
| LF | 라노벨 | 전생했더니 슬라임이었다 건 | 25000 |
| LF | 라노벨 | 스파이 패밀리 | 26000 |
| LF | 라노벨 | 성계의전기 | 27000 |
| LF | 라노벨 | 십이국기 | 28000 |
| LF | 라노벨 | 길모둥이 마족 | 25000 |
| LF | 라노벨 | 공의경계 | 26000 |
| LF | 라노벨 | 던전에서 만남을 추구하면 안되는걸까 ? | 27000 |
| RE | 참고서 | ECMAScript Ver 6 | 20000 |
| RE | 참고서 | C 프로그래밍 기초 | 25000 |
| RE | 참고서 | 고급 C ++ 프로그래밍 | 29000 |
| RE | 참고서 | JAVA 프로그래밍 기초 | 29000 |
| RE | 참고서 | 객체지향프로그래밍 기초 | 30000 |
| RE | 참고서 | 리엑트 프레임워크 | 28000 |
| RE | 참고서 | 스프링 프레임워크 | 29000 |
| RE | 참고서 | 스프링 부트 | 30000 |
| SC | 과학도서 | NULL | NULL |
+ --------+--------------+------------------------------------------------------+---------+
윈도우에서 db에 데이터 넣기
데이터가 크기에 입력 리다이렉션으로 할 수 있다.
mysql -ustudent -pIloveyou7! -h192.168.56.100 student < c:\study.sql
SELECT part_name , product_name , product_price FROM part AS P1 NATURAL JOIN product P2 ;
-- 복합적인 JOIN 사용
SELECT
OD . order_id '주문번호' ,
PR . product_name '주문제품명' ,
OL . product_price '주문단가' ,
OL . unit_count '주문수량' ,
PT . part_name '제품종류'
FROM `order` OD
INNER JOIN orderlist OL USING ( order_id )
INNER JOIN product PR USING ( product_id )
INNER JOIN part PT USING ( part_id )
WHERE order_id = 3456 ;
Reference
이 포스트는 SeSAC 인공지능 SW 개발자 양성 과정 - 김기희 강사님의 강의내용을 정리한 것입니다.
댓글남기기