Structerd Query Lanuage
DB에 있는 정보를 사용할 수 있도록 지원하는 언어.
대소문자를 구분하지 않음.
DDL(데이터 정의), DML(데이터 조작), DCL(데이터 제어), TCL(트랙잭션 제어) 등이 있다.
create database DB명
default character set utf8mb3 collate utf8mb3_general_ci;
// utf8mb3 - 한글까지 지원, utf8mb4 - 이모지 문자까지 지원
alter database DB명
dafault character set 값 collate 값;
drop database DB명;
user DB명;
문자열 데이터
| 유형 | 정의 |
|---|---|
| char(M) | 고정 길이를 갖는 문자열, 1~255, char(20)에 10자만 저장해도 20자를 차지 |
| varchar(M) | 가변 길이를 갖는 문자열, 1~65535, 10자를 저장하면 10자만큼만 차지 |
char vs varchar
create table 테이블명(
column1 type [optional attributes]
);
| attribute | desc |
|---|---|
| not null | null을 허용하지 않음 |
| default 값 | 값이 없을 때 기본값 설정 |
| unsigned | 숫자인 경우 양수로 제한 |
| auto increment | 새 레코드가 추가될 때마다 필드 값을 1씩 증가 |
| primary key | primary key로 설정 |
열에 저장될 데이터의 조건을 설정
제약조건에 위배되는 데이터는 저장 불가
| attribute | desc |
|---|---|
| not null | null을 허용하지 않음 |
| unique | 중복된 값을 저장할 수 없음, NULL은 허용 |
| foreign key | 외래키 지정 |
| default | null일 경우 기본 값 지정 |
| primary key | primary key로 설정 |
| check | 값의 범위나 종류 지정 |
alter table 테이블명 add column 칼럼명 data-type 제약조건;
alter table 테이블명 modify column 칼럼명 data-type 제약조건;
alter table 테이블명 change column 칼럼명 변경할컬럼명 data-type 제약조건;
alter table 테이블명 drop column 칼럼명;
alter table 테이블명 rename 변경할테이블명;
테이블에 대한 동작 속도를 높여주는 자료구조다.
RDBMS에서는 인덱스는 테이블 부분에 대한 하나의 사본이다.
인덱스는 고유 제약 조건을 실현하기 위해서도 사용된다.
고유 인덱스는 중복을 금지하므로, 인덱스의 대상인 테이블에서 고유성이 보장된다.
칼럼의 값과 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어두어 빠르게 조회할 수 있도록 한다.
후보키: 데이터를 인식할 수 있는 최소한의 고유 식별 속성 집합
create index index명 on 테이블(칼럼명);
create unique index index명 on 테이블(칼럼명);
drop index index명 on 테이블명; // 인덱스 삭제
alter table 테이블명 drop primary key; // 클러스터형 인덱스 삭제
insert into 테이블명 (열1, 열2 ,열3) values(값1,값2,값3) + (값1,값2,값3)(벌크);
생략가능한 field
1. null 2. default 3. auto increment
update 테이블 set 열1=변경값 , 열2=변경값 where 조건;
delete from 테이블 where 조건;
select 조회할 열, 조회할 열 from 테이블 where 조건;
| clause | desc |
|---|---|
| * | 모든 열을 선택 |
| ALL | 선택된 모든 행을 반환 (default) |
| DISTINCT | 중복 행 제거 |
| column | 지정된 열 선택 |
| expression | 값, 연산자 및 sql 함수의 조합 |
| alias | 별칭 |
조건으로 행을 정렬 함.
select * from employees order by id DESC
// id를 기준으로 내림차순
// ASC: 오름차순(default), DESC : 내림차순
select id , sum(salary) from employees;
//에러 발생, id는 다중행, sum은 단일행
select id , sum(salary) from employees group by id;
// group by를 통해 id를 묶음.
select id, avg(salaray) from employees
where avg(salary) > 7000
group by id; // 에러 발생
select id, avg(salaray) from employees
group by id
having avg(salary) > 7000;
select member_id as id, from member_table as table where table.member_id > 1000;
// member_id란 열을 id라는 별칭을 부여해서 조회 as생략 가능
// 중간에 공백이 들어가는 경우 ""로 묶어줘야함
// 열 별칭은 where 절에서 사용 불가능(order by나 group by에선 가능), 테이블 별칭은 가능.
AND, OR, NOT: 논리연산
(NOT) IN
배열 안에 존재하는 값이 있는지
select id, name from employees where id in (50,60,70);
BETWEEN
범위 조건
select id, name from employees where id between 1 and 30;
IS NULL, NOT NULL : null 비교
select id from employees where email is null;
select id from employees where email is not null;
select id from employees where email = null; // 불가능
LIKE
해당 문자열이 들어갔는지
select id from employees where name like '%x%';
// 이름에 x가 들어간 사람 조회
// % : 와일드 카드, _ : 한 글자

| function | desc |
|---|---|
| ABS(숫자) | 절대값 |
| CEILING(숫자) | 올림 |
| FLOOR(숫자) | 내림 |
| ROUND(숫자, 자릿수) | 반올림 |
| TRUNCATE(숫자, 자릿수) | 자릿수까지 버림 |
| POW(숫자,N) or POWER(숫자 ,N) | 숫자의 N승 |
| MOD(숫자, div) | 숫자를 div로 나눈 나머지 |
| GREATEST(숫자1, 숫자2,....) | 가장 큰 수 반환 |
| LEAST(숫자1, 숫자2 ....) | 가장 작은 수 반환 |
| function | desc |
|---|---|
| ASCII(문자) | 문자의 아스키 코드 값 리턴 |
| INSERT('문자열1','문자열2'..) | 문자열들을 결합 |
| REPLACE('문자열', '기존 문자열', '바뀔 문자열') | 문자열 중 기존 문자열을 바뀔 문자열로 바꿈. |
| INSTR('문자열', '찾는 문자열') | 찾는 문자열의 위치 반환 |
| SUBSTRING(SUBSTR)('문자열',시작위치, 개수) or MID('문자열',시작위치,개수) | 문자열 중 시작위치부터 개수만큼 리턴 |
| LTRIM('문자열') | 왼쪽 공백 제거 |
| RTRIM('문자열') | 오른쪽 공백 제거 |
| TRIM('문자열') | 양쪽 공백 제거 |
| LCASE('문자열') or LOWER('문자열') | 소문자로 변경 |
| UCASE('문자열') or UPPER('문자열') | 대문자로 변경 |
| REVERSE('문자열') | 반대로 나열 |
| LENGTH('문자열') | 길이 반환 |
| function | desc |
|---|---|
| NOW(), CURRENT_TIMESTAMP() | 현재 날짜와 시간 리턴, select 실행 되는 순간 시간 |
| SYSDATE() | 현재 날짜와 시간 리턴, 함수가 호출될 때 시간 |
| function | desc |
|---|---|
| COUNT(필드) | NULL 값이 아닌 레코드 수 리턴 |
| SUM(필드) | 레코드 값의 합계 |
| AVG(필드) | 레코드 값들의 평균 |
| MAX(필드) | 레코드 값 중 가장 큰 값 |
| MIN(필드) | 레코드 값 중 가장 작은 값 |
트랙잭션 : 데이터베이스의 상태를 변화시키는 일종의 작업 단위
| name | desc |
|---|---|
| start transaction | commit, rollback이 나올 때까지 실행되는 SQL문 |
| commit | 모든 코드를 실행 |
| rollback | start transaction 상태 전으로 되돌림 |
MySQL의 경우 autocommit을 꺼줘야함
start transaction;
insert into table values('a');
insert into table values('b');
insert into table values('c');
rollback; // insert 문들 전부 취소
commit // insert 적용
//세이브포인트
start transaction;
insert into table values('a');
insert into table values('b');
savepoint p1;
insert into table values('c');
rollback to p1; // p1 이전으로 돌아감
가상의 테이블
실제 행과 열을 가지고 있지만 데이터를 저장하진 않음.
데이터를 조회 할 때 번거로움을 줄일 수 있음.
Table은 실질적인 데이터가 있지만 View는 데이터가 없고 SQL만 저장한다.
기존 테이블의 data가 업데이트되면 view의 내용도 변함.
select 문에서 선택된 필드를 이용하여 생성.
원본 테이블의 이름과 같은 이름을 사용 할 수 없음.
create view 뷰이름
as
select * from table
where condition;
// 이미 존재하면 replace 없으면 create
create or replace 뷰이름
as
select * from table
where condition;
//수정
alter view 뷰이름
as
select * from table;
//삭제
drop view 뷰이름;