1. 오늘 할일
- SQLD 자격증 2주차, SQL퀘스트 8, 아티클스터디(SQL의 가독성을 높이는 다섯 가지 사소한 습관)
2. 나만의 언어로 정리
SQL
Date_sub(기준 날짜, interval 뺄셈할 값 단위(일,시간)) = 날짜를 뺄셈하는 함수
Curdate() = 현재 날짜를 반환하는 함수(시간정보포함x)
DateDiff(날짜1, 날짜2) 날짜1에서 날짜2의 차이를 구하는 함수
파이썬
str(숫자) = 문자로 변경
int(문자) = 숫자로 변경
print(a&b) 교집합 / (a|b) 차집합 / (a-b) 가능
print(f'{문자}의 점수는 {문자}입니다')를 통해 쉽게 문자와 문자열 통합가능
- 코드
try:
if~
print()
except:
print() 를 통해 예외수가존재할때 예외를 빼고 데이터 추출가능
from 파일명 import (전체)또는 함수이름 으로 다른 파일에서 함수 불러오기
if 절을 한줄로 변환 가능 result = ('짝수'if num %2 ==0 else '홀수')
for 함수도 한문장으로 변환 가능 b_list = [a2 for a in a_list]
map은 기준을 하나하나씩돌면서 조건문을 확인하고 리스트로 묶은것
map(check_adult, people) people을 돌면서 check_adult의 결과를 제시
lambda는 x:x, 기준을 통해 x가 x에 부합하는지 실험
lambda person:'(성인' if person['age']>20 else '청소년'), people
filter는 map이랑 유사하지만 true만 추출
*args = 인수들을 무제한으로 받아 추출가능
**kwargs = 인자들을 지정하여 딕셔너리로 추출가능
SQLD자격증
엔터티
- 하나의 개체, 데이터베이스에서는 레코드가 개체에 해당, 데이터를 분류한 그룹
- 엔터티와 인스턴스(각각의 데이터) = 엔티티는 인스턴스의 집합으로 볼수있음
- 엔터티 특징
업무에서 필요로하는 정보
식별 가능 여부 = 인스턴스가 식별자에 의해 한 개씩만 존재하는지 검증
인스턴스의 집합 = 2개 이상의 인스턴스로 구성, 한 개 밖에 없는 인스턴스는 엔터티가 아님
업무 프로세스에 의해 활용 = 활용되지 않는 엔터티는 제거
속성을 포함 = 주식별자만 존재하고 일반 속성은 전혀 없는 경우는 엔터티가 아님
관계의 존재 = 관계가 설정 안된경우 부적절한 엔터티가 도출되거나 다른 엔터티와 연결관계를찾지못할수도있음
- 엔터티의 분류
유/무형에 따른 분류
1)유형 엔터티 = 물리적인 형태가 존재, 안정적이고 지속적
2)개념 엔터티 = 물리적인 형태는 아니지만 관리해야할 정보
3)사건 엔터티 = 특정한 이벤트에 종속되는 정보
발생 시점에 따른 분류
1) 기본/키 엔터티 = 독립적인 생성이 가능, 다른 엔터티의 부모 엔터티 역할, 고유한 주식별자 보유
2) 중심 엔터티 = 기본 엔터티로 발생하고 업무에서 중심역할, 처리 해야할 데이터양 많음, 관계를 통해 많은 행위 엔터티 생성
3) 행위 엔터티 = 두 개 이상의 부모 엔터티로부터 발생, 자주 변경되고, 데이터 양이 증가
- 엔터티의 이름짓기 방식
업무에서 사용하는 언어, (가능하면)생략X, 단수 명사사용, 띄어쓰기X, 이름중복X, 생성의미대로 이름부여
속성
- 개념 = 인스턴스가 가진 성격, 업무에서 필요로 하고 더 이상 분리되지 않는 최소의 데이터 단위
- 엔터티, 인스턴스, 속성, 속성값의 관계 = 한 개의 엔터티는 두 개 이상의 인스턴스의 집합, 한 개의 엔터티는 두 개 이상의 속성으로 구성, 한 개의 속성은 한 개의 속성값으로 구성
- 표기법 = IE표기법(선으로 속성을 구별), Barker표기법(속성값을 #,●,○,로표시)
- 속성의 특징
업무에서 필요로함 = 업무에서 관리하고자 하는 정보
의미상 더 이상 분리되지 않고 독립성 유지
엔터티를 설명하고 인스턴스의 구성요소
정규화 이론에 기반을 두고 주식별자에 함수적 종속성(X가Y에 영향을 미칠때 Y는 X에 함수적 종속/X결정자Y종속자)을 가짐
하나의 속성은 한 개의 값만 보유
- 속성의 분류
속성의 특징에 따른분류
1) 기본 속성 = 업무로부터 추출된 모든 속성, 가장 많은 종류를 차지
2) 설계 속성 = 새로 만들거나 변형하여 정의
3) 파생 속성 = 다른 속성에 영향을 받아 발생, 계산된 형태의 값, 정확성을 위해 적게 정의하는것이 좋음
엔터티 구성 방식에 따른 분류
1) PK(Primary Key)속성 = 엔터티를 식별
2) FK(Foreign Key)속성 = 다른 엔터티와의 관계에 포함
3) 일반속성 = 위 두개에 포함되지 않는 다른 속성
- 도메인 = 속성이 가질 수 있는 값의 범위, 속성에 대한 데이터 타입, 크기, 제약사항 지정
- 속성의 명명
1) 업무에서 사용하는 언어 사용 2) 축약어 사용X 3) 서술형보다는 명사형
4) 명시적인(수식어가 많이없는) 형태로 의미전달 5) 데이터 모델에서 유일하게 작성(속성 충돌 해결)
관계
- 정의 = 상호 연관성이 있는 상태, 엔터티와 인스턴스 사이의 논리적인 연관성으로서 존재의 형태 행위로서 서로에게 연관성이 부여된 상태
- 관계의 페어링 = 엔터티 안의 인스턴스가 개별적으로 연결되어 있는 구조, 두 엔터티 사이에서 두 개 이상의 관계 형성도 가능
- 관계의 종류
1) 존재에 의한 관계 = 소속/포함의 형태
2) 행위에 의한 관계 = 행동/행위의 결과
- UML(통합 모델링 언어) = 개발단계에서 사용, 추상화된 시스템을 특정한 모델로 표현하는 언어
- 관계의 표기법
관계명 = 관계가 시작하는 점을 '관계 시작점' 받는 쪽을'관계끝점' 시작점은 포함의미 끝점은 소속의미
관계 표기법
1) 개수표현 = ㅣ(1개)←(여러개)○(0개)
2) 식별/ 비식별 = IE표기법에서는 실선(식별)점선(비식별) Barker표기법에서는 실선에 세로선하나(식별) 그냥 실선(비식별)로 표기
- 관계 차수 = 두 개의 엔터티 간의 관계에서 참여자의 수를 표현
1) 1:1 관계표시 = 각 엔터티는 다른 엔터티에 대해 하나의 관계로 연결, 데이터가 각각 1개
2) 1:M 관계표시 = 각 엔터티는 다른 엔터티에 하나 혹은 그 이상의 관계로 연결, 방향은 한쪽 방향만 해당, 반대방향은 오직 하나의 관계만 존재, A 엔터티 데이터 1 B엔터티 데이터 여러개일때 관계가 1:M 관계
3) N:M 관계표시 = 1:M 관계가 양방향에서 모두 발생하는 경우, M:M관계로 표현된 데이터 모델은 이후 두 개의 주식별자의 관계 엔터티를 이용하여 3개의 엔터티로 구분하여 표현, 서로가 서로에게 1:N의 관계를 갖는 형태
- 관계선택사양 = 데이터 모델 관계에서 선택참여관계가 핵심
1)필수 조건 = 실선으로 표시(상대 엔터티에 대한 해당 조건을 만족하는 엔터티가 반드시 존재할 경우 )
2)선택 조건 = 점선으로 표시(상대 엔터티에 대한 해당 조건을 만족하는 엔터티가 존재할 수도 혹은 하지 않을 수도 있는 경우)
3)IE표기법에는 O표시를 통해 필수선택구분(0표시있을때 선택), Barker표기법에는 실선 점선으로 구분(점선이 있는 경우 선택)
- 관계 정의시 체크 사항 = 관심있는 연관규칙 존재여부, 정보의 조합 발생여부, 규칙 존재여부, 연결가능하게하는 동사 존재 여부
- 관계 읽기 =
식별자
- 개념 = 하나의 엔터티에 구성되어 있는 여러개의 속성 중에서 엔터티를 대표할 수 있는 속성, 하나의 엔터티는 반드시 하나의 유일한 식별자가 존재해야함
- 주식별자의 특징
1) 유일성 2) 최소성 3) 불변성 4) 존재성
- 식별자 분류
1) 대표성 여부 = 주식별자 / 보조 식별자
2) 스스로 생성 여부 = 내부 식별자 / 외부 식별자
3) 단일속성 여부 = 단일 식별자 / 복합 식별자
4) 대체 여부 = 본질 식별자(업무에 의해 만들어짐) / 인조 식별자
- 주식별자 도출 기준
1) 해당 업무에서 자주 이용되는 속성으로 설정
2) 특정한 이름으로 기술되는 것은 주식별자로 사용X
3) 너무 많은 속성 포함X
아티클 스터디(SQL의 가독성을 높이는 다섯 가지 사소한 습관)
SQL예약어는 대문자로 사용, 행갈이를 자주하여 보기쉽게 표현, 주석을 사용하여 코드의 의도파악, Alias를 잘사용하여 쿼리, 칼럼의 이름을 잘설정하여 다시 찾는 일없도록 작성, 합의된 규칙을 준수하여 팀원과 같은 방향의 해석을 할수있도록 작성
3. 퀘스트, 문제 코드 모음
SQL퀘스트 8
-
doctors 테이블에서 전공(major)가 성형외과인 의사의 이름을 알아내는 쿼리를 작성해주세요!
select name
from doctors
where major='성형외과'
-
doctors 테이블에서 각 전공 별 의사 수를 계산하는 쿼리를 작성해주세요!
select major,
count(1) cnt_major
from doctors
group by major
-
doctors 테이블에서 현재 날짜 기준으로 5년 이상 근무(hire_date)한 의사 수를 계산하는 쿼리를 작성해주세요!
select hire_date,
count(1) cnt_doctor
from doctors
where hire_date <= date_sub(curdate(), interval 5 year)
-
doctors 테이블에서 각 의사의 근무 기간을 계산하는 쿼리를 작성해주세요!
select name,
Datediff(curdate(), hire_date) working_days
from doctors
4. 내일 할일