240626

Gi Woon Lee·2024년 6월 26일
1

TIL

목록 보기
4/78
post-thumbnail

SQL

1. WHERE 절에는 연산자만 올 수 있는건가?

SQL 10번 문제 中 WHERE 절에 "is not" 은 안되고 "!=" 은 되던데
한 번 정리할 필요가 있을 듯 하다.

🅰️ WHERE 절에는 연산자들이 오는데 "NULL"만 특별하게 취급하여 "IN NOT NULL", "IN NULL" 이라고 적어준다.

# 젊은 동물의 아이디와 이름을 조회, 아이디 칼럼 정렬
select animal_id, name
from animal_ins
where intake_condition != "aged"
#where intake_condition is not "aged" 는 안된다. 
order by animal_id
/*
select count(user_id) USERS
from user_info
where age = null
*/

select count(user_id) USERS
from user_info
where age is null

# 이번에는 where 절에 is 가 오네..? null 값을 찾을 때만 is 를 사용 할 수 있는거야?
# 조건문 where 절에서 연산자를 사용해야 하는 상황과 is를 사용해야 하는 상황 구분해야 할 듯.

SQL에서 'NULL' 값은 특별하다!
'NULL' 을 확인할 때: "IS NULL" or "IS NOT NULL"을 사용해야 한다.
비교연산자(예: =, !=, <, >)로는 비교가 불가능.
쿼리 where age = null은 어떠한 결과도 반환하지 않음.

2. order by 다중 정렬 조건

🅰️ ORDER BY 절에 ","를 사이에 두고 여러개의 정렬 조건이 나열되면 첫 번째 정렬 결과값 속 중복 행에 대하여 다음 정렬이 수행된다.

# mission: select all ID, NAME, DATETIME, order by name / same name -> order by datetime desc

select ANIMAL_ID, NAME, DATETIME
from animal_ins
order by NAME, DATETIME DESC

# order by 절에 조건이 ,를 사이에 두고 여러개가 오면, 1번 조건은 유지되는 상태에서 2번 조건이 수행된다.
#또한 order by 첫 번째 조건인 name 으로 정렬했을 때, 같은 값을 가진 name 이 없다면, 두 번째 order by 조건인 datetime desc는 수행되지 않는다. 

SQL에서 ORDER BY 절에 여러개의 정렬 조건을 사용하면 수행 플로우는 다음과 같다.
ORDER BY CONDITION1, CONDITION2
1. 첫 번째 정렬 조건(CONDITION1) (이름 순 정렬)
2. 두 번째 정렬 조건(CONDITION2) (같은 이름? -> 날짜 기준 내림차순 정렬)

위 코드 order by name에서 만약 같은 name 값을 가진 행이 존재하지 않는다면, order by datetime desc는 실행되지 않는다.

3. 특정 값이 포함된 값 찾기

🅰️ WHERE ~ LIKE %~%

EX) "부산" 이 포함된 칼럼 찾기
where name like %부산%

4. 집계함수는 SELECT 문에만 사용하는가?

집계함수: max() min()등의 함수

🅰️ 일반적으로 'SELECT' 문에서 가장 많이 사용된다.

하지만 'HAVING' 절에서 사용될 수 있다.

HAVING:
그룹화된 결과에 대한 조건을 지정할 때 사용되며,
GROUP BY 절과 함께 사용되어 특정 조건을 만족하는 그룹만을 필터링할 때 사용

주요 집계 함수:
MAX(): 주어진 열의 최대값을 반환
MIN(): 주어진 열의 최소값을 반환
SUM(): 숫자 열의 총합을 반환
AVG(): 숫자 열의 평균값을 반환
COUNT(): 특정 조건을 만족하는 행의 수를 계산

5. IF 절은 어디에 들어가야 하는가?

IF 절은 칼럼이 들어갈 곳에 들어간다?

  • if 절의 구조
if(조건, 조건을 충족할 때, 조건을 충족하지 않을 때)

🅰️ IF() 함수는 주로 SELECT 문 내에서 칼럼이 들어갈 위치에 사용된다.

SELECT ANIMAL_TYPE,
       IF(NAME IS NULL, 'No name', NAME) NAME,
       SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

/* 
	[IF 함수를 대체할 수 있는 CASE함수]
       CASE 
           WHEN NAME IS NULL THEN 'No name'
           ELSE NAME
       END AS NAME,
*/

6. DATE_FORMAT() 함수와 Specifier

learnsql.com 참조

날짜 데이터의 구조를 변경하고 싶을 때 사용하는 함수:
DATE_FORMAT()

registration_datetime 칼럼의 날짜 데이터 구성을 변경해보자.

SELECT
  first_name,
  last_name,
  DATE_FORMAT(registration_datetime, '%a, %Y %M %e %H:%i:%s')
    AS format_registration_datetime
FROM student_platform;

SELECT
  first_name,
  last_name,
  DATE_FORMAT(registration_datetime, '%a, %Y %M %e %H:%i:%s')
    AS format_registration_datetime
FROM student_platform;
  • 날짜 데이터 지정자(specifier)는 다음과 같다.
    %a – Abbreviated weekday name.
    %Y – Year, in 4-digits.
    %M – Full name of the month.
    %m - months. (from 01-12)
    %d - Day of the month, numeric ( 00 .. 31 )
    %e – Day of the month (from 1 – 31).
    %H – Hour (from 00-23).
    %i – Minutes (from 00-59).
    %s – Seconds (from 00-59).

7. WHERE 절 복수의 필터링 사용 어떻게 하지..?

🅰️ 논리연산자(AND,OR), 혹은 IN연산자를 사용한다.

#sql_19_흉부외과 또는 일반외과 의사 목록 출력하기

SELECT DR_NAME,
       DR_ID,
       MCDP_CD,
       DATE_FORMAT(HIRE_YMD, "%Y-%m-%d") HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'GS'OR MCDP_CD = 'CS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC


# WHERE 절에 들어가는 복수의 조건들 표현 
# 꼭 저렇게 자세히 써야해? 

KodeTaka19번 문제를 풀다가 where절에 대한 의문이 생겼다.

🤔 WHERE MCDP_CD = 'GS' OR 'CS' 라고 하면 왜 안되는가..?

🅰️ CS는 언제나 참이 되기 때문에 원하는 결과가 나오지 않는다.

따라서 여러 조건을 확인할 때는 논리연산자(AND,OR,NOT)를 각각 사용해주거나 'IN'연산자를 사용할 수 있다.

'IN'연산자

WHERE MCDP_CD = 'GS' OR MCDP_CD = 'CS'

or 연산자는 각 조건을 전부 작성해줘야 하기에 같은 칼럼 내 조건을 작성하는데 있어서 비효율적이라고 느낄 수 있다.

WHERE MCDP_CD IN ('GS', 'CS')

이 때 이처럼 'in'연산자를 사용하여 같은 칼럼 내 조건들을 괄호 안에 전부 넣어버릴 수 있다.
SQL구문이 더 간결하고 가독성이 높아진다!

FIND_IN_SET('해당사항',칼럼) > 최소수량

#CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 
#하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 

SELECT CAR_TYPE,
       COUNT(CAR_ID) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE FIND_IN_SET('통풍시트',OPTIONS) > 0
   OR FIND_IN_SET('열선시트',OPTIONS) > 0
   OR FIND_IN_SET('가죽시트',OPTIONS) > 0 
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE

8. MAX() 활용 시 주의사항

⭐MAX()가 적용된 데이터"만" 최대값인 경우를 주의하라.

문제: 가장 비싼 가격의 항목의 정보를 전부 구하라.


 1번 코드
SELECT PRODUCT_ID,
       PRODUCT_NAME,
       PRODUCT_CD,
       CATEGORY,
       MAX(PRICE) PRICE
FROM FOOD_PRODUCT 
이렇게 작성하면 MAX(PRICE) 와는 상관없는 칼럼들이 나온다. 

-----------------------------------------------------
 2 번 코드
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)

조건절에서 이미 최대가격의 행을 선별하였기에 해당 행이 전부 최대값이다. 

1번 코드로 작성하면,
PRICE 칼럼에는 최대값이 출력되지만 나머지 칼럼에는 전부 최대값과는 관련없는 데이터가 출력된다.

PRODUCT_IDPRODUCT_NAMEPRODUCT_CDCATEGORYPRICE
최대값아님최대값아님최대값아님최대값아님최대값

2번 코드처럼 WHERE 서브퀘리를 통해 해당 행 정보를 전부 출력해야 한다.

PRODUCT_IDPRODUCT_NAMEPRODUCT_CDCATEGORYPRICE
최대값최대값최대값최대값최대값

9. CAST()

CAST( AS 형식)

select date_format(cast(date as date), '%Y-%m') m
  • 위 select 절 workflow는 다음과 같다.
  1. date 칼럼의 데이터 형식이 str
  2. str 데이터를 time data로 변경해준다. cast(date as date)
  3. time data로 변경한 칼럼을 대상으로 date_format 함수를 사용하여 format을 원하는 것으로 바꿔준다!

날짜를 다루는 칼럼은 보통 "date"로 이름짓기 때문에 막연하게 time data겠거니~ 하고 검증을 뛰어넘는 경우가 있다.

그럴 경우 date_format 함수 같은 time data를 대상으로 하는 함수를 사용하지 못할 뿐 만 아니라 정렬 과정에서도 오류가 날 수 있기에 주의하자.

10. case

  • case when 에서 조건을 각각 작성해줘야 한다.
    오류: when 1 < level <= 10 then '1~10Lv 이하'
    변경: when 1 < level and level <= 10 then '1~10Lv 이하'
---------------------------case함수 구조------------------------
    case when 조건1 then(수식)1
	 when 조건2 then(수식)2
     else(수식)3
end

-----------------------------예시--------------------------------
select game_actor_id ,
	   level,
 	   case when 1 < level and level <= 10 then '1~10Lv 이하' 
 	   		when 10 < level and level<= 20 then '10~20Lv 이하' 
 	   		when 20 < level and level  <= 30 then '20~30Lv 이하' 

PYTHON

1. 파이썬 산술연산자

덧셈(+), 뺄셈(-), 곱셈(*) 생략

  • / : 나누기

  • % : 나머지

  • ** : 거듭제곱

  • // : 나눗셈의 몫

    #나눗셈의 몫 예시
    num1 = 10
    num2 = 3
    # result는 3
    
    def solution(num1, num2):
    result = num1//num2
    return result

CodeKata Note

  • NULL 필터링 시, NAME IS NULL 이라고 작성해야 함. NAME IS "NULL" 이라고 하면 오류가 나타난다.

  • if() 함수는 select 문 칼럼 위치에 들어간다.

# sql_11_이름에 el이 들어가는 동물 찾기

select ANIMAL_ID, NAME
from animal_ins
where name like "%EL%" and animal_type = "dog"
order by name

# 이름 순으로 정렬하라고... 문제 똑바로 읽자. 
#sql_16_경기도에 위치한 식품창고 목록 출력하기

SELECT WAREHOUSE_ID,
       WAREHOUSE_NAME,
       ADDRESS,
       IF(FREEZER_YN IS NULL, 'N', FREEZER_YN) FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE "%경기%"
ORDER BY WAREHOUSE_ID ASC

0개의 댓글