import pandas as pd
import numpy as np
data = {
'이름' : ['유재석', '박명수', '정준하', '노홍철', '정형돈', '하하'],
'지역' : ['서울', '부산', '부산', '서울', '서울', '서울'],
'나이' : [19, 23, 20, 25, 18, 21],
'국어점수' : [86, 90, 80, 65, 50, 60],
'수학점수' : [86, 100, 66, 70, 40, 80],
'코딩' : ['Python', 'Java', np.nan, 'Javascript', 'PYTHON', np.nan]
}
df = pd.DataFrame(data, index=['1번', '2번', '3번', '4번', '5번', '6번'])
df.index.name = '번호'
import pandas as pd
import numpy as np
# 데이터 프레임 생성
data = {
'이름': ['유재석', '박명수', '정준하', '노홍철', '정형돈', '하하'],
'지역': ['서울', '부산', '부산', '서울', '서울', '서울'],
'나이': [19, 23, 20, 25, 18, 21],
'국어점수': [86, 90, 80, 65, 50, 60],
'수학점수': [86, 100, 66, 70, 40, 80],
'코딩': ['Python', 'Java', np.nan, 'Javascript', 'PYTHON', np.nan]
}
df = pd.DataFrame(data, index=['1번', '2번', '3번', '4번', '5번', '6번'])
df.index.name = '번호'
# 점수 총합 및 평균 컬럼 추가
df['점수총합'] = df[['국어점수', '수학점수']].sum(axis=1)
df['평균'] = df[['국어점수', '수학점수']].mean(axis=1)
# 결과 출력
print(df)
# '지역' 컬럼에서 '서울'을 '경기'로, '부산'을 '대구'로 변경
df['지역'] = df['지역'].replace({'서울': '경기', '부산': '대구'})
def add_age(age):
return str(age) + "살"
df['나이'] = df['나이'].apply(add_age)
or
# '나이' 컬럼에 "살"을 붙이기 위해 apply 함수 사용
df['나이'] = df['나이'].apply(lambda x: f"{x}살")
iloc는 정수 인덱스로 인덱싱을 함 0부터 시작
loc는 라벨(문자열)/인덱스번호로 인덱싱을 함.
iloc는 인덱스 마지막 번호는 포함하지 않음.
loc는 마지막 라벨(문자열)/인덱스번호를 포함한 결과가 출력됨.
데이터 프레임 슬라이싱할때 문자열은 마지막도 포함한다는거 기억이 나나?
중요한건 마지막 번호나 마지막라벨을 인덱싱하는가 안하는가 차이로 보면 되고,
iloc는 라벨로 인덱싱이 불가능하고, loc는 라벨,정수인덱스 둘다 인덱싱이 가능 그래서 보통 인덱스가 라벨이면 loc, 정수인덱스이면 iloc를 사용하는 것이 좋다.
iloc는 컴퓨터가 빨리 이해하는 인덱싱, loc는 사람이 발리 이해하는 인덱싱으로 데이터 양이 많을 때는 iloc를 쓰는것이 속도면에서 유리하다.
def passcheck(점수총합):
if 점수총합 > 160:
return "합격"
else:
return "불합격"
df['결과'] = df['점수총합'].apply(passcheck)
or
# '나이' 컬럼에 "살"을 붙이기 위해 별도의 함수 정의 후 apply 함수 사용
df['결과'] = df['점수총합'].apply(lambda x: '합격' if x > 160 else '불합격')
SELECT ename, comm
from emp
where (sal, comm) in (select sal, comm from emp where deptno=30) ;
-- 부서번호가 30번인 부서의 최소 급여보다 .많은 급여를 받는
-- 부서의 부서번호, 최소 급여를 출력해보세요.
select deptno, min(sal)
from emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno = 30);
-- 사원의 사원번호, 이름, 직업, 입사일을 출력해보세요.
SELECT empno, ename, job, hiredate
FROM emp
WHERE empno IN (SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL);
서브쿼리:
SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL
mgr(Manager) 컬럼에 있는 모든 고유한 사원번호(EMPNO) 를 가져옵니다.
mgr IS NOT NULL 조건을 추가하여 NULL(매니저가 없는 CEO 등)은 제외합니다.
메인쿼리:
empno가 서브쿼리 결과(mgr)에 포함된 사원을 찾습니다.
즉, 적어도 한 명의 부하 직원을 가진 사원을 찾습니다.
select empno, ename, sal
from emp
where sal > (select avg(sal) from emp);
위는 다 SQL 언어의 종류
👉 데이터 정의 언어(DDL: Data Definition Language)
👉 데이터 조작 언어(DML:Data Manipulation Language)
👉 데이터 제어 언어(DCL:Date Control Language)
👉 트랜잭션 제어 언어(TCL: Transaction Control Language)
✒DDL이란?
테이블의 컬럼을 정의하는 명령어로 생성, 수정, 삭제 등의 데이터 전체 골격을 결정하는 역할을 담당한다.
✒DDL 특징
DDL은 명령어를 입력하느 순간 작업이 즉시 반영(Auto Commit)되기 때문에 사용할 때 주의해야 한다.
✒DDL 종류
명령어 내용
CREATE 테이블을 생성하는 역할
ALTER 테이블의 구조를 수정하는 역할
DROP 테이블을 삭제하는 역할
RENAME 테이블을 이름을 변경하는 역할
TRUNCATE 테이블을 초기화하는 역할
👉 CREATE 규칙
객체를 의미하는 것이므로 단수형으로 이름을 짓는걸 권고한다.
유일한 이름으로 명명해야 한다.
테이블 내의 컬럼명 또한 중복되지 않는 유일한 이름으로 명명해야 한다.
정의할 때 각 컬럼은 ,으로 구분하며 테이블 생성문의 마지막은 ;이다.
컬럼명은 데이터 표준화 관점에서 일관성 있게 사용해야 한다.
컬럼 뒤에 데이터 유형을 반드시 지정해야 한다.
테이블과 컬럼명은 반드시 문자로 시작한다.
대소문자 구분을 하지 않지만, 기본적으로 대문자로 만들어진다.
👉 ALTER: 컬럼 변경 문법
명령어 내용
ADD COLUMN 컬럼을 추가하는 역할
DROP COLUMN 컬럼을 삭제하는 역할
MODIFY COLUMN 컬럼을 수정하는 역할
RENAME COLUMN 컬럼 이름을 변경하는 역할
DROP CONSTRAIN 컬럼을 제약조건을 기반해서 삭제하는 역할
📎 DML이란?
데이터베이스의 내부 데이터를 관리하기 위한 언어이다. 데이터를 조회, 추가, 변경, 삭제 등의 작업을 수행하기 위해 사용된다.
📎 DML 특징
DDL과 달리 DML은 적는 즉시 반영(Auto Commit)이 되기 않는다. 다시 말해, DML에 의한 데이터 변동은 영구적인 변경이 아니기 때문에 ROLLBACK으로 다시 되돌릴 수 있다.
또한, DML은 Target 테이블을 메모리 버퍼 위에 올려두고 변경을 수행하기 때문에, 실시간으로 테이블에 반영되지 않는다. Commit 명령어를 통해 Transaction을 종료해야 해당 변경 사항이 테이블에 반영된다.
📎 DML 종류
명령어 내용
SELECT 데이터베이스에서 데이터를 검색하는 역할
INSERT 테이블에 데이터를 추가하는 역할
UPDATE 테이블 내에 존재하는 데이터를 수정하는 역할
DELETE 테이블에서 데이터를 삭제하는 역할
📎 DCL이란?
데이터를 관리 목적으로 보안, 무결성, 회복, 병행 제어 등을 정의하는데 사용한다. DCL을 사용하면 데이터베이스에 접근하여 읽거나 쓰는 것을 제한할 수 있는 권한을 부여하거나 박탈할 수 있고 트랜잭션을 명시하거나 조작할 수 있다.
📎 DCL 특징
불법적인 사용자로부터 데이터를 보호하기 위한 데이터 보안의 역할을 수행하며, 데이터의 정확성을 위한 무결성을 유지하기도 한다. 마지막으로 시스템 장애에 대비한 회복과 병행수행을 제어한다.
📎 DCL 종류
명령어 내용
GRANT 권한을 정의할때 사용하는 명령어
REVOKE 권한을 삭제할때 사용하는 명령어
📎 TCL이란?
DCL과 비슷한 맥락이지만 데이터를 제어하는 언어가 아닌 트랜잭션을 제어할때 사용한다. 논리적인 작업 단위를 묶어 DML에 의해 조작된 결과를 트랜잭션 별로 제어한다.
📎 트랜잭션(Transaction)이란?
데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 말한다. 보통 DBMS 선능을 초당 트랜잭션이 몇개가 실행되었는지로 측정한다. MySQL의 입력하는 모든 명령어들은 각각 하나의 트랜잭션이라고 할 수 있다.
📎 트랜잭션(Transaction) 단위
👉트랜잭션 단위 예시 가져옴
게시판을 예로 들어보자
1) 게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다.
2) 그러면 글 올리기가 처리되고 자동으로 다시 게시판에 돌아오게 된다.
3) 게시판에서 자신의 글이 포함된 업데이트된 게시글들을 볼 수 있다.
여기서 작업의 단위는 insert문과 select문 둘다 를 합친것이다.
이러한 작업단위를 하나의 트랜잭션이라 한다.
관리자나 개발자가 하나의 트랜잭션 설계를 잘하는 것이 데이터를 다루는 것에 많은 이점이 있다.
📎 트랜잭션 특징 4가지
👉 원자성(Atomicity)
원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다. 트랜잭션은 사람이 설계한 논리적인 작업 단위로서, 일처리는 트랜잭션의 작업이 부분적으로 실행되다가 중단되 않고 작업단위 별로 이루어져야 사람이 다루는데 무리가 없다.
사
👉 일관성(Consistency)
일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다. 즉, 데이터 타입이 반환 후와 전이 항상 동일해야 한다. 예시) 갑자기 데이터 타입이 정수형에서 문자열로 변화하면 안됨
👉 독립성(Isolation)
독립성은 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적임을 의미한다. 각각의 트랜잭션은 서로 간섭이 불가하기 때문에 하나의 특정 트랜잭션이 완료될때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.
👉 지속성(Dutability)
지속성은 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다는 점이다. 보통 Commit이 완료되면 지속성은 자연스럽게 충족되는 특징이다.
3줄요약
1. 서브쿼리는 단일행 과 복수행 리턴 쿼리로 나누어 진다.
2. 데이타 프레임에서 결측치 처리 함수는 fillna() 와 dropna() 가 있다.
3. DB 에서 delete 사용시 항상 주의하자.