doo_ 2023. 12. 12. 15:01

[오늘 할 일]

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으로 데이터를 구분할 수 있는 유일한 값이다.