23.12.12
[오늘 할 일]
1. SQL 코드 카타 문제 풀기 (5문제)
2. SQLD 자격증 대비반 8주차 수강&정리
3. SQLD 자격증 대비반 9주차 50% 수강 (나머지는 내일)
4. 아티클 스터디
[내용 정리]
1. SQL
-- 다음 조건에 해당하는 데이터 불러오기
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d')
FROM DOCTOR
WHERE MCDP_CD IN ('CS','GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
-- IN( ) / DATE_FORMAT( A, '%Y-%m-%d')
-- 가격이 제일 높은 제품 데이터 가져오기
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
-- ORDER BY PRICE DESC LIMIT 1; 내림차순을 통해 구하기
-- 오늘 한 실수 : SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, MAX(PRICE)
-- 이는 MAX(PRICE)에 해당하는 행을 가져오는 것이 아니라 PRICE에서 가장 큰 값만 불러오는 것일뿐
-- 조건에 해당하는 데이터 불러오기
SELECT COUNT(*)
FROM USER_INFO
WHERE DATE_FORMAT(JOINED, '%Y') = 2021
AND AGE BETWEEN 20 AND 29;
/* 다른 방법들
-- JOINED LIKE '2021%'
-- TO_CHAR(JOINED, 'YYYY')='2021'
-- JOINED BETWEEN '2021-01-01' AND '2021-12-31'
*/
SELECT ANIMAL_ID, NAME,
IF(SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%','O','X') AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
/* IF와 CASE 사용
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%'
THEN 'O'
ELSE 'X'
END AS 중성화
*/
2. SQLD자격증 대비반 수강
<8주차>
[DML] Data Manipulation Language
테이블에 데이터를 삽입(INSERT) 삭제(DELETE) 수정(UPDATE) 조회(SELECT) 하는 일을 수행하는 SQL로 구성되어 있다. 이후에는 이를 데이터베이스에 완전하게 반영하는 커밋(COMMIT)과 데이터베이스 작업의 취소를 위한 롤백(ROLLBACK)이 있다.
1) INSERT
- 테이블에 필요한 데이터를 저장하는 명령어
-- 칼럼 리스트 명시하여 삽입하는 방법(칼럼에 맞춰서 삽입)
INSERT INTO 테이블_이름 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);
-- 칼럼 리스트 명시하지 않고 삽입하는 방법(순서대로 삽입)
INSERT INTO 테이블_이름 VALUES (값1, 값2, ...);
2) UPDATE
입력된 데이터를 수정해야 할 때 사용한다. 이때 WHERE문을 사용하여 조건에 맞는 데이터를 찾아 해당 데이터를 수정할 수 있다.
UPDATE 테이블_이름 SET 수정_할_컬럼_이름 = 수정_할_새로운_값, ...;
*참고) WHERE를 사용하지 않고 UPDATE 진행시 모든 데이터가 바뀔 수 있기에 주의
3) DELETE
데이터를 삭제할 때 사용한다.
DELETE [FROM] 테이블_이름;
DELETE [FROM] 테이블_이름 WHERE 삭제할_조건;
+) DELETE vs TRUNCATE
- DELETE 명령어는 실행하면 바로 데이터가 삭제되지 않는다. COMMIT이라는 명령어가 실행되고 난 이후에 DB에 최종 적용된다. 만약 데이터를 DELETE하여 잘못 삭제했다면 ROLLBACK명령어를 통해 다시 되돌릴 수 있다.
- DDL의 TRUNCATE는 DELETE와 같이 데이터를 삭제하지만 바로 테이블에 적용하기 떄문.
*) 데이터 삭제는 이렇게 하세요
- 데이터 '삭제'는 굉장히 비즈니스에 큰 영향을 끼칠 수 있는 작업, 그렇기에 지우려는 데이터가 맞는지 SELECT를 통해 여러번 확인 후 지우는 습관! SELECT에서 DELETE만 바꿔주면 되기에 번거롭지도 않다.
[SELECT] : 데이터 조회
- 테이블의 데이터를 조회할 때 사용.
SELECT 칼럼 FROM 테이블 ;
-- *은 모든 칼럼을 가져올 때 사용
* ALIAS(가명, 별명)
만약 칼럼 명이 너무 길거나 더 구분하기 쉽게 명칭을 바꾸고 싶을 때(가독성 높일 떄) ALIAS사용한다. 이는 테이블 칼럼 이름을 직접 변경하는 것이 아닌 일회성으로 수정하여 결과에만 나타난다.
SELECT 컬럼_이름 AS '별명' FROM 테이블_이름;
-- AS를 생략할 수도 있음
* 테이블 별칭 사용하기
쿼리 내에서 테이블 이름에 대한 대체 이름을 지정하는 것으로 여러 테이블을 하나의 SQL문에서 조회(JOIN)할 때 많이 사용한다.
SELECT 칼럼S FROM 테이블 B ;
-- 테이블 별칭에는 AS를 붙이지 않음
* DISTINCT
쿼리 결과에서 중복된 값을 제거하여 고유한 값만 반환하도록 하는 역할
SELECT DISTINCT 칼럼A FROM 테이블 ;
-- IF
SELECT DISTINCT 칼럼A, 칼럼B FROM employees;
-- 칼럼 A와 B를 한 묶음으로 DISTINCT
[산술 연산자]
SELECT 10 + 5 AS addition,
15 - 7 AS subtraction,
6 * 3 AS multiplication,
20 / 4 AS division,
17 % 5 AS modulo
FROM dual;
[합성 연산자]
-- Oracle
SELECT 문자형1 || 문자형2 FROM 테이블_이름;
-- SQL Server
SELECT 문자형1 + 문자형2 FROM 테이블_이름;
또는 CONCAT 사용
SELECT CONCAT(문자형1, 문자형2) FROM 테이블_이름;
<9주차>
[WHERE]
1) WHERE
모든 데이터가 아닌 내가 원하는 조건에 해당하는 데이터를 조회, 수정, 삭제할 때 사용한다. (데이터 필터링)
- SELECT [ALL|DISTINCT] 칼럼명 [AS 별명] FROM 테이블명 WHERE 조건식;
- UPDATE 테이블명 SET 칼럼명=값 WHERE 조건식;
- DELETE FROM 테이블명 WHERE 조건식;
2. 연산자 종류
1) 비교연산자 : 비교 연산자(=, >, >=, <, <=)는 숫자 혹은 문자 값의 대/소 그리고 동일한지를 확인할 때, 사용
( 참고 ) 문자 유형 비교 방법
> 양쪽이 모두 CHAR 타입인 경우
- 길이가 서로 다른 CHAR 타입이면 작은 쪽에 공백을 추가하여 길이를 같게 만든 후 비교
- 서로 다른 문자가 나올 때 까지 비교
- 뒤에 나오는 BLANK의 수만 다르다면 같은 값으로 결정
- 달라진 첫 번째 문자의 값에 따라 크기를 결정
> 한 쪽이 VARCHAR 타입인 경우
- 길이도 같고 다른 문자가 없다면 같다고 판단
- 서로 다른 문자가 나올 때 까지 비교
- 길이가 다르면 짧은 것이 끝날 때까지만 비교 후 길이가 긴 것을 크다고 판단
> 상수값과 비교할 경우
- 상수 쪽을 변수 타입과 동일하게 바꾸고 비교
- CHAR 타입이면 CHAR 비교 방식, VARCHAR 타입이면 VARCHAR 비교 방식을 적용
2) SQL 연산자
- BETWEEN 값1 AND 값2
- IN ( 값1, 2, 3, 4)
- LIKE '비교문자열' :
> LIKE는 대소문자 구분하지 않는다.
> WILD CARD : % 어떤 문자를 포함하는 모든 것을 조회 / _ : 1개 단일문자
- IS NULL
- IS NOT NULL
참고) NULL과 숫자 혹은 날짜를 연산하면 결과값은 NULL
3) 논리 연산자
- AND
- OR
- NOT
( 참고 ) 논리 연산자 사용시 고려사항
- 여러 개의 논리 연산자를 같이 사용할 때는 우선순위를 잘 확인해야 한다. 실수를 방지하기 위해 괄호를 사용하여 우선순위를 명시적으로 표시하는 것을 권장한다.
-- 키가 175이거나 키가 183이면서 몸무게가 80인 사람
WHERE HEIGHT = 175 OR HEIGHT = 183 AND WEIGHT = 80
-- 키가 175이거나 183 중에서 몸무게가 80인 사람
WHERE (HEIGHT = 175 OR HEIGHT = 183) AND WEIGHT = 80
- 여러 조건들을 논리 연산자로 연결한 후 해당 동작이 IN 연산자와 BETWEEN 연산자와 유사하다면 IN연산자와 BETWEEN 연산자로 대체해도 됩니다.
-- Before
WHERE HEIGHT >= 170 AND HEIGHT <= 180 AND WEIGHT = 90
-- After
WHERE HEIGHT BETWEEN 170 AND 180 AND WEIGHT = 90
4) 부정 연산자
- 같이 않음 (!=, ^=, <>) / ~와 같지 않다 (NOT 칼럼명 = ) / ~보다 크지 않다. (NOT 칼럼명 >)
- a와 b의 값 사이에 있지 않다. (NOT BETWEEN a AND b)
/ list 값과 일치하지 않는다. (NOT IN (list)) / NULL 값을 갖지 않는다. (IS NOT NULL)
5) 연산자 우선순위
괄호() -> OT 연산자 -> 비교 연산자, SQL 비교 연산자 -> AND -> OR
[ROWNUM]
실제 테이블에 저장된 데이터 번호가 아니라 조회한 자료에서 임시로 열 번호를 임시로 부여하는 것이다. 오직 조회만.
SELECT / UPDATE / DELETE 문
WHERE ROWNUM 비교연산자 행의갯수;
참고) Pseudo Column(의사/가상 칼럼)은 테이블의 칼럼처럼 동작하지만 실제 데이터베이스에는 저장되지 않는 칼럼이다.
[TOP]
SQL Server에서 활용하는 임시 칼럼으로 Oracle과 마찬가지로 각 행에 대해 임시로 번호를 부여한다.
SELECT TOP(N) 칼럼명 FROM 테이블명;
[ROWID]
ORACLE에서 사용하는 PSEUDOCOLUMN으로 데이터를 구분할 수 있는 유일한 값이다.