데이터 검색
RDBMS → 관계형 데이터베이스
- 데이터를 테이블 단위로 관리
- 중복을 최소화
- 여러 테이블에 분산되어 있는 데이터를 검색 시 테이브 간의 관계를 이용하여 필요한 데이터를 검색
- row(행) column(열)
SQL → Structured Query Language
- 데이터베이스에 있는 정보를 사용할 수 있도록 지원하는 언어
- 모든 DBMS에서 사용가능
- Query의 대소문자는 구분하지 않음 (MySQL은 데이터의 대소문자도 구분하지 않는다)
DDL
- 데이터베이스 객체의 구조를 정의
create 데이터 베이스 객체 생성
drop | 데이터베이스 객체 삭제 |
alter | 기존에 전재하는 데이터베이스 객체 수정 |
create database 데이터베이스명 default character set utf8mb4 collation utf8mb4_general_ci;
utf8mb4 —→ 이모지 문자까지 처리하는 명
collation —> 데이터 정렬할떄 규칙임 (한글로 정렬하려면 특정한 키워드 필요함)
alter database 데이터베이스명 default character set utf8mb4 collation utf8mb4_general_ci;
drop database 데이터베이스명
use 데이터베이스명
DML
- 데이터 조작어 (CRUD)
insert 입력
select | 조회 |
udpate | 수정 |
delete | 삭제 |
select → select 와 from은 필수요소
#모든 사원의 사번,이름,급여,급여*12검색
select employ_id as 사번, first_name "이 름", salary as "급여", salary*12 "연봉"
from employees;
#ifnull 함수
#IFNULL(ex1,ex2) ex1이 널이면 ex2를 반환
#고액연봉 저액연봉 등등 (case when end)
select employ_id, first_name, salary,
case when salary>15000 then '고액'
when salary>8000 then '평균'
else '저액연봉'
end "연봉등급"
from employees;
#where in
select employee_id, first_name, department_id
from employees
where department_id in(50,60,70);
#where not in
select employee_id, first_name, department_id
from employees
where department_id not in(50,60,70);
#between and
select employee_id, first_name, slary
from employees
where salary between 6000 and 10000;
중요한점 !!!!!!!!!!!11 xx = null 이라고 비교하면 안됨
where department_id is null;
where department_id is not null;
#LIKE (wild card :%,_)
#이름에 x가 들어간 사원
select *
from employees
where first_name like "%x%";
#이름 끝에서 3번째 자리에 x가 들어간 사원
select *
from employees
where first_name like "%x__";
!!and or not 등 논리 연산시 null이 끼면 무조건 NULL 도출되는 것음 아님
ex ) null && false → false
null || true → true;
정렬
order by
desc → 내림차순
#부서별 정렬 , 급여 순 내림차순
order by department_id, salary desc;
INSERT
insert into ssafy_member (userid ......)
values (.....);
insert into ssafy_member(...)
values (),(),();
UPDATE (주의 : where절을 생략하면 모든 데이터가 바뀐다)
update ssafy_member
set userpwd =1111
where userid = "1234";
DELETE (주의 : where절을 생략하면 모든 데이터가 바뀐다.)
delete from ssafy_member
where userid ="1234"
DCL
- 데이터 제어어
revoke | 권한을 취득 |
grant | 권한을 부여 |
TCL (transaction control languager)
- 트랜잭션 제어어
commit 실행한 쿼리를 최종적으로 적용
rollback | 실행한 쿼리를 마지막 커밋 전으로 최소시켜 데이터를 복구 | |
commit | 실행한 퀴리를 최종적으로 적용 |
savepoint f1;
rollback to f1;
내장함수
숫자관련 함수
abs() 절대값
ceiling() | 올림 |
floor() | 내림 |
round(숫자, 자리수) | 자리수까지 반올림(1의자리가 0) 음수가 위로 |
truncate(숫자,자리수) | 버림 |
pow(x,y) | x의 y승 |
mod(분자, 분모) | 나머지 |
greatest(1,2,3,…) | 가장 큰수 |
least(1,2,3,4) | 작은 수 반환 |
문자관련 함수
ascii() 아스키코드값 리턴
concat(1,2,3) | 문자열 결함 |
insert(문자열,시작위치, 길이, 새로운 문자열) | 새로운 문자열로 대치 |
replace(문자열,기존문자열,바뀔문자열) | 문자열 변 |
insrt(문자열, 찾는문자열) | 문자열 중 찾는 문자열의 위치 값을 리턴 |
mid(문자열, 시작위치, 개수) | 문자열 중 시작위치부터 개수만큼 리턴 |
substring(문자열,시작위치,개수) | 문자열 중 시작위치부터 개수만큼 리턴 |
ltrim(문자열) ,rtrim(),trim() | 왼쪽 공백제거 , 오른쪽 공백제거, 양쪽 모두 공백 제거 |
lcase(), lower() | 소문자 |
ucase(), upper() | 대문자 |
left(문자열,개수) | 문자열 중 왼쪽에서 개수만큼 추출 |
right(문자열,개수) | 오른쪽에서 개수만큼 추출 |
reverse() | 반대로 |
length() | 문자열의 길 |
날짜 관련 함수
now(),current_timestamp() 현재
sysdate() | 함수가 호출될 때 시간 |
curdate(), current_date() | 현재 날짜 |
curtime(),current_time() | 현재 시간 |
Date_Add(날짜, interval 기준값) | 날짜 + 기준 값 ,second, hoiur, day |
date_sub(날짜, interval 기준값) | 날짜 - 기준 값 |
year(),month() | 연도,월 |
monthname()dayname() | 영어로 리턴 |
dayofmonth() | 날짜의 월별 일자 리턴 |
dayofweek() | 주별 일자 리턴(일요일 1) |
weekday() | 월요일 0 |
dayofyear() | 1년 중 몇일 |
week() | 일년 중 몇번 째 주 |
from_days(날수) | 날수많큼 경과한 시간 리턴 |
to_days(날짜) | 날짜까지의 일수 리턴 |
date_formate(날짜,’형식’) | 날짜 형식 |
논리관련 함수
IF(논리식,값1,값2) 참: 값1 거짓 : 값2
IFNULL(값1,값2) | 값1이 NULL이면 값2, NULL이 아니면 값1 |
NULLIF(값1,값2) | 값1==값2 NULL 아니면 값1 |
집계함수
- 하나 이상의 행을 그룹으로 묶어 연산
sum, avg,count,max,min
group by : 테이블의 행을 그룹으로 묶음
실행 순서
- from
- where
- group by
- having
- select
- order by
select department_id,sum(salary), avg(salary)
from employees;
#-----> XXXXXXXXXXXXXXXXXXXXXXx department_id는 다중행, 집계함수는 단일 행이라 안됨
#group by로 묶어주어야 함
#group by에서의 조건은 having에 걸어줘야함
JDBC
JDBC란? SQL문을 실행할 수 있는 함수 호출 ㅇ니터페이스
특징
- DBMS 종류에 독립적인 자바 프로그래밍 가능
- 데이터베이스가 달라지더라도 동일한 API사용 가능 (드라이버 및 URL만 수정)
- 자바가 가지는 플랫폼에 독립적이라는 특성과 DBMS에 독립적인 특성을 가진다.
기능
- 데이터베이스에 연결
- SQL문장을 전송
- 처리
Driver, connection
Class.forname(DRIVER);
DriverManager.getConnection(URL,DB_ID,DB_PASS);
//디폴티로 setAutoCommit(true)
// false로 하면 sql문 수행할 때마다 명시적으로 commit() 해야함
Statement
public boolean execute(String sql) throws SQLException
//DML , 쿼리 DDL 실행
public ResultSet excuteQuery(String sql) throws SQLException
//Select 처리할 떄 씀
public int executeUpdate(String sql) throws SQLExcepion
//주로 DML등을 수행
PrepaeredStatement도 스테이트먼트랑 동일 but
conn = DBConnection.getConnection();
String sql = "insert into person (name,age,job) values (?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, person.getName());
pstmt.setInt(2, person.getAge());
pstmt.setString(3, person.getJob());
int rowCnt = pstmt.excuteUpdate();
// SQL insection 방
ResultSet → 결과값 처리
ResultSet rs;
conn = DBConnection.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.excuteQuery();
while(rs.next()){}
//getInt() ,,,,
JDBC 개발 순서
1. JDBC 드라이버와 로딩 (JVM안으로 특정 드라이버 클래스 적재)
Class.forName(url);
2. DBMS와 연결
- 드라이버매니저 클래스를 이용하여 URL형태로 주어진 데이터베이스 접속
Connection conn = DriverManager.getConnection(URL,id,pass);
3. SQL 실행 준비
Statememt stmt = conn.createStatement();
PrepaeredStatement pstmt = conn.prepareStatement(SQL);
4. SQL 실행
//DML
int cnt = stmt.excuteUpdate(SQL);
//select
ResultSet rs = stmt.excuteQuery(SQL);
pstmt.setInt(1,4);
//DML
int cnt = pstmt.excuteUpdate();
//select
ResultSet rs = pstmt.excuteQuery();
//결과 값 가져오기
rs.next();
rs.getInt(index or name);
5. DBMS 연결 끊기
- connection은 상당한 overhead를 가져온다. 따라서 최적화된 상태를 유지하기 위해서는 반드시 connection을 닫아주어야 한다.
후기 : 노션에 정리한 걸 블로그에 옮기니 서식이 망가진다.ㅜㅜ