[내일배움캠프] 13일 차 - SQL 코드카타, Python 알고리즘 코드카타, SQLD
SQL 코드카타
문제 58
취소되지 않은 진료 예약 조회하기
최종 답안
SELECT A.APNT_NO,
P.PT_NAME,
A.PT_NO,
A.MCDP_CD,
D.DR_NAME,
A.APNT_YMD
FROM APPOINTMENT A
JOIN PATIENT P -- JOIN 2번
ON A.PT_NO = P.PT_NO
JOIN DOCTOR D -- JOIN 2번
ON A.MDDR_ID = D.DR_ID
WHERE DATE(A.APNT_YMD) = '2022-04-13'
AND A.APNT_CNCL_YN = 'N'
ORDER BY A.APNT_YMD;
개선점
1. [MySQL] 3개 이상의 테이블 연결할 때 JOIN
FROM TABLEA
LEFT JOIN TABLEB
ON A.COLUMN = B.COLUMN
LEFT JOIN TABLEC
ON A.COLUMN = C.COLUMN
-- TABLEA 기준으로 LEFT JOIN
2. [MySQL] JOIN이라고 쓰면 'INNER JOIN'을 의미함
Python 알고리즘 코드카타
문제 32
내적
최종 답안
def solution(a, b):
answer = sum([a[i]*b[i] for i in range(len(a))])
return answer
새롭게 알게 된 것
1. List Comprehension
설명
새로운 리스트 만들기
문법
[표현식 for 항목 in iterable if 조건]
표현식: 새로운 리스트에 넣을 값, 또는 값을 구할 수식
항목: iterable을 반복하면서 얻는 요소
iterable: 반복 가능 객체. 리스트, 튜플, 문자열 등
조건 (선택): 특정 조건 만족하는 요소만 리스트에 추가
예시
# 짝수만 포함한 리스트 만들기
a = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = [i for i in a if i % 2 == 0]
print(even_numbers)
2. SUM(list)
설명
리스트의 전체 요소의 합 더하기
요소가 integer일 때만 사용 가능
문법
SUM(list)
SQLD 헷갈리는 내용만 정리 - Oracle 기준
참고 자료
SQL 자격검정 실전문제, 한국데이터산업진흥원
GPT 검색
GRANT, REVOKE
어떤 사용자가 WITH GRANT OPTION과 함께 권한 허가받았으면, 그 사용자는 해당 권한을 WITH GRANT OPTION 유무와 관계없이 다른 사용자에게 허가할 수 있다.
PUBLIC 사용하면 자신에게 허가된 권한을 모든 사용자들에게 허가할 수 있다.
REVOKE 사용하여 권한 취소하면, 권한 취소당한 사용자가 WITH GRANT OPTION을 통해서 다른 사용자들에게 허가했던 권한들도 모두 연쇄적으로 취소된다.
REVOKE 사용해 권한 취소할 때, 그 권한 허가한 사용자가 권한을 취소할 수 있다.
DROP SCHEMA EMPLOYEE CASCADE;
EMPLOYEE 스키마 뿐만 아니라 연관된 객체들도 모두 삭제
DROP SCHEMA EMPLOYEE RESTRICT;
스키마가 공백인 경우에만 삭제, 스키마에 객체 있으면 삭제되지 않음
스키마(SCHEMA)
데이터베이스 객체들의 집합
데이터베이스의 폴더 같은 것
테이블, 뷰, 인덱스, 트리거, 프로시저, 함수 등 데이터베이스 내에서 모든 객체들이 포함될 수 있는 논리적인 구획
LAG 함수
LAG(column_name, offset, default_value) OVER (PARTITION BY column_name ORDER BY column_name)
- column_name: 값을 가져오고자 하는 컬럼명
- offset (선택사항): 몇 번째 이전 행의 값을 가져올지 지정 (기본값은 1로, 바로 이전 행을 가져옴)
- default_value (선택사항): 이전 값이 없을 때 반환할 값 (기본값은 NULL)
- OVER: 윈도우 함수는 OVER 절을 사용하여 데이터를 어떻게 나눠서(partition) 어떻게 정렬할지 지정합니다.
CREATE TABLE 제약조건 형식
마지막에
CONSTRAINT 제약조건명 PRIMARY KEY (PK가 될 컬럼이름)
트랜잭션의 특징
원자성
트랜잭션은 전체가 성공하거나 실패
일관성
트랜잭션 전후, 데이터는 항상 유효한 상태
고립성
여러 트랜잭션은 서로 간섭하지 않음
어떤 트랜잭션이 수행 중일 때 다른 트랜잭션의 영향 받아 잘못된 결과 도출하는 경우가 발생하는 것을 방지하는 것
영속성
트랜잭션 완료 후, 데이터는 영구적으로 저장
트랜잭션 ROLLBACK
트랜잭션 처리 시 SAVEPOINT 지정하면,
ROLLBACK 시 특정 SAVEPOINT로 돌아갈 수 있다.
테이블 생성 시 주의사항
- 테이블 이름은 객체 의미하는 적절한 이름
- 테이블 이름은 가능한 단수형
- 테이블 이름은 다른 테이블 이름과 중복되지 않아야
- 한 테이블 내에서 컬럼명 중복될 수 없다.
- 테이블 이름 지정하고, 각 컬럼들은 괄호"()"로 묶어 지정
- 각 컬럼 콤마(,)로 구분됨
- 테이블 생성문 끝은 항상 ;
- 컬럼은 다른 테이블까지 고려하여 데이터베이스 내에서 일관성 있게 사용하는 것이 좋다.
- 컬럼 뒤에 데이터 유형은 꼭 지정되어야 한다.
- 테이블명, 컬럼명 반드시 문자로 시작해야 하고, 벤더별로 길이에 대한 한계 있다.
- 벤더에서 사전에 정의한 예약어는 쓸 수 없다.
후보 키(Candidate key)
테이블의 각 행을 유일하게 식별할 수 있는 컬럼들의 집합
여러 개가 존재할 수 있습니다.
그 중 하나를 기본 키로 선택하고, 나머지는 후보 키로 남는다.
예시) 하나의 PK, 하나의 UNIQUE KEY가 있을 때, UNIQUE KEY가 후보 키
SELECT DISTICT COLUMN1, COLUMN2
COLUMN1과 COLUMN2의 값이 모두 동일한 행만 중복으로 판단
DEPENDENT
자식 테이블의 FK 데이터 생성 시 부모 테이블에 PK가 없는 경우, 자식 테이블 데이터 입력을 허용하지 않는 참조동작
INSERT, UPDATE 등에서 오류 패턴
컬럼이 NOT NULL인데,
입력 시 값이 없어 NULL이 될 상황이면 오류
DROP, TRUNCATE, DELETE 비교
DROP | TRUNCATE | DELETE | |
삭제 대상 | 테이블/데이터베이스/인덱스 등 | 테이블의 모든 행 | 조건에 맞는 행 |
테이블 구조 유지 | 삭제 | 유지 | 유지 |
속도 | 매우 느림 | 빠름 | 느림 |
트랜잭션 지원 | 지원되지 않음 (일반적으로) | 일부 DBMS에서 지원됨 (MySQL에서는 불가) | 지원 (롤백 가능) |
사용 예 | 테이블이나 DB 객체 완전 삭제 | 모든 데이터 삭제, 구조는 유지 | 조건에 맞는 데이터 삭제 |
자동 증가 리셋 | 해당 없음 | 리셋될 수 있음 (DBMS에 따라 다름) | 리셋되지 않음 |
사용 예 | 더 이상 사용하지 않는 테이블 삭제 | 모든 데이터 삭제 (빠르게) | 특정 조건에 맞는 데이터 삭제 |
Oracle VS SQL Server
Oracle: DDL 문장 수행 이후 자동으로 COMMIT 수행
SQL Server: DDL 문장 수행 이후 자동으로 COMMIT 수행하지 않음
*DDL: CREATE, ALTER, DROP, TRUNCATE
*COMMIT
COMMIT을 하면 변경된 데이터가 영구적으로 저장되고, 그 이후에는 롤백할 수 없음
트랜잭션을 명시적으로 종료하는 방법
SQL Server TOP(n) WITH TIES column1, column2
column 높은 순으로 n위까지 출력하되, 같은 건수인 것 있으면 함께 출력