
SQL 10번 문제 中 WHERE 절에 "is not" 은 안되고 "!=" 은 되던데
한 번 정리할 필요가 있을 듯 하다.
# 젊은 동물의 아이디와 이름을 조회, 아이디 칼럼 정렬
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은 어떠한 결과도 반환하지 않음.
# 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는 실행되지 않는다.
EX) "부산" 이 포함된 칼럼 찾기
where name like %부산%
집계함수: max() min()등의 함수
하지만 'HAVING' 절에서 사용될 수 있다.
HAVING:
그룹화된 결과에 대한 조건을 지정할 때 사용되며,
GROUP BY 절과 함께 사용되어 특정 조건을 만족하는 그룹만을 필터링할 때 사용
주요 집계 함수:
MAX(): 주어진 열의 최대값을 반환
MIN(): 주어진 열의 최소값을 반환
SUM(): 숫자 열의 총합을 반환
AVG(): 숫자 열의 평균값을 반환
COUNT(): 특정 조건을 만족하는 행의 수를 계산
IF 절은 칼럼이 들어갈 곳에 들어간다?
if(조건, 조건을 충족할 때, 조건을 충족하지 않을 때)
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,
*/
날짜 데이터의 구조를 변경하고 싶을 때 사용하는 함수:
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;
#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절에 대한 의문이 생겼다.
따라서 여러 조건을 확인할 때는 논리연산자(AND,OR,NOT)를 각각 사용해주거나 'IN'연산자를 사용할 수 있다.
WHERE MCDP_CD = 'GS' OR MCDP_CD = 'CS'
or 연산자는 각 조건을 전부 작성해줘야 하기에 같은 칼럼 내 조건을 작성하는데 있어서 비효율적이라고 느낄 수 있다.
WHERE MCDP_CD IN ('GS', 'CS')
이 때 이처럼 'in'연산자를 사용하여 같은 칼럼 내 조건들을 괄호 안에 전부 넣어버릴 수 있다.
SQL구문이 더 간결하고 가독성이 높아진다!
#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
문제: 가장 비싼 가격의 항목의 정보를 전부 구하라.

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_ID | PRODUCT_NAME | PRODUCT_CD | CATEGORY | PRICE |
|---|---|---|---|---|
| 최대값아님 | 최대값아님 | 최대값아님 | 최대값아님 | 최대값 |
2번 코드처럼 WHERE 서브퀘리를 통해 해당 행 정보를 전부 출력해야 한다.
| PRODUCT_ID | PRODUCT_NAME | PRODUCT_CD | CATEGORY | PRICE |
|---|---|---|---|---|
| 최대값 | 최대값 | 최대값 | 최대값 | 최대값 |
값 AS 형식)
select date_format(cast(date as date), '%Y-%m') m
- 위 select 절 workflow는 다음과 같다.
- date 칼럼의 데이터 형식이 str
- str 데이터를 time data로 변경해준다. cast(date as date)
- time data로 변경한 칼럼을 대상으로 date_format 함수를 사용하여 format을 원하는 것으로 바꿔준다!
날짜를 다루는 칼럼은 보통 "date"로 이름짓기 때문에 막연하게 time data겠거니~ 하고 검증을 뛰어넘는 경우가 있다.
그럴 경우 date_format 함수 같은 time data를 대상으로 하는 함수를 사용하지 못할 뿐 만 아니라 정렬 과정에서도 오류가 날 수 있기에 주의하자.
---------------------------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 이하'
덧셈(+), 뺄셈(-), 곱셈(*) 생략
/ : 나누기
% : 나머지
** : 거듭제곱
// : 나눗셈의 몫
#나눗셈의 몫 예시
num1 = 10
num2 = 3
# result는 3
def solution(num1, num2):
result = num1//num2
return result
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