오늘 한 일
-SQL강의 4주차 완.
-Chat GPT _웹개발: 데일리모토 만들기 완.
-SQL예제 풀기
-TIL 작성
오늘 배운 것
[SQL]
-서브쿼리(Subquery)
: (a+b)*5와 같은 수식 계산에서 (a+b)값이 다시 연산에 사용되는 것과 같은 원리
(단순화_)변형해본 ex. 음식 타입별 음식점 수를 연산하고, 주문수량별 수수료율 산정하기
select cuisine_type,
count_res,
case when count_res<=5 then 0.02
when count_res>5 and count_res<=10 then 0.01
when count_res>10 and count_res<=15 then 0.008
when count_res>15 then 0.005 end vat
from
(
select cuisine_type,
count(distinct restaurant_name) count_res
from food_orders
group by 1
) a
-join문_필요한 데이터가 서로 다른 테이블에 있을 때
: 중요한 건 두 테이블 간 공통되는 컬럼이 있는지. 그 컬럼을 기준으로 join함.
종류는 left join(a테이블의 모든 내용)과 inner join(두 컬럼의 공통 내용).
join문의 기본구조
ex.
select f.customer_id,
f.price,
p.pay_type,
p.vat
f.price*p.vat "수수료"
from food_orders f left join payments p on f.customer_id=p.customer_id
where pay_type='card'
-> 별명 부여는 서브쿼리문, 컬럼, 테이블 모두에 가능
->where문은 마찬가지로 from문 뒤에.
-> join문을 통해 서로 다른 테이블에 있는 두 컬럼 간 연산도 가능
[Chat GPT_웹개발]
-웹페이지의 구조: 네브바(navbar), 메인(main), 푸터(footer)로 구분됨
-justify content: space around;하면 대상이 2개면 양끝으로 양분함. 하지만 3개면 일정한 간격 두고 떨어짐
-> 3개일 때의 대처는 2,3번째를 묶어주면 됨-> div태그 생성해서 그 사이로 2,3을 넣어주면 됨
-div태그는 특별한 기능이 있다기 보다는, 일종의 포장지다
-세로배치를 가로로 바꾸려면 display: flex;
flex는 기본적으로 (내가 보는 기준으로) 왼->오
단, flex-direction을 column으로 하면 위->아래로 바뀜
-패딩과 마진의 차이
: padding은 글자와 html박스 간의 (내부) 간격,
margin은 html박스 간, html박스와 외부 간의 간격
(padding: 20px, 0)은 padding 위아래는 20px, 좌우는 0을 주라는 뜻임
(ex.)
-div.navbar
-div.container 하고 자동완성
-> class가 navbar, container인 div태그 생성됨
-height: 100vh
=>우리가 보는 화면 높이만큼 html의 상자를 키워준다
->네브바 크기를 제외하기 때문에, 약간 내려간 것처럼 보일 수 있음
-width: 100%
개발자도구로 보면 html상자 가로길이가 100%증가(=화면에 꽉 차게)
->width를 주지 않으면, footer내용이 글자기 때문에 가운데 배치가 안됨
[SQL 예제풀이]
-IFNULL문: IFNULL(컬럼, 바꿀 내용)
ex. IFNULL(NAME, 'No name')
->case when문으로도 가능함
---------------------------------------------------------------------------------------------------------
SELECT DR_NAME, DR_ID, MCDP_CD, SUBSTR(HIRE_YMD, 1, 10)
FROM DOCTOR
WHERE MCDP_CD ='CS' OR MCDP_CD='GS'
ORDER BY HIRE_YMD DESC, DR_NAME
SELECT DR_NAME, DR_ID, MCDP_CD, SUBSTR(HIRE_YMD, 1, 10)
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME
둘 다 정답임. 필터링 조건이 몇 개 없을 때는 앞처럼 할 수 있지만,
조건 많으면 IN문 쓰는게 효율적임.
---------------------------------------------------------------------------------------------------------
SELECT DR_NAME, DR_ID, MCDP_CD, SUBSTR(HIRE_YMD, 1, 10)
FROM DOCTOR
WHERE MCDP_CD ='CS' OR 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME
다음과 같이 쿼리하면 CS만 조회됨. 접속사로 연결시_문장은 각각!!
---------------------------------------------------------------------------------------------------------
주의할 점
-서브쿼리는 가장 가운데 있는 괄호부터 보면 됨.
서브쿼리 내에서 블록 지정해서 실행하면 그 부분만의 연산도 확인할 수 있음
-> 오류를 줄이기 위해 중간중간 실행하면서 하는게 좋음!
-segmentation하기=case when문으로 정리하기
-<빈출실수>_case when문에서 then ''(작음따옴표, 문자표시)_ 주의하기!!
-<빈출실수>_컬럼 구분자 챙기기!!
-서브쿼리문에서_평균값을 최종 select문에서 segmentation할 경우
->평균값은 소수점 이하 자리로도 나오므로 between문 대신 직접 구간 나눠서 작성할 것!
(between문으로 했다가 오류남..)
-group by 할 카테고리 컬럼은 반드시 단독으로 select문에도 있어야 함
->서브쿼리 작성시에_특히 주의!!
-count(1)=count(price)=count(quantitiy)=count(같은 테이블 내 다른 컬럼 아무거나)
즉, count(컬럼)하면 중복 배제 없이 그냥 모두 카운트함.
따라서, 중복배제 위해서는 count(distinct price)로 쿼리해야 함!
(cf. count문의 기본은 count()임)
-테이블에 별명을 부여하는 경우는 join문에서 자주 사용함
왜냐하면 from문에서 쓰는 join~on 뒤가 너무 기니까..
'TIL' 카테고리의 다른 글
[TIL 2024. 01. 15] (0) | 2024.01.15 |
---|---|
[TIL 2024. 01. 12] (0) | 2024.01.12 |
[TIL 2024. 01. 10] (0) | 2024.01.10 |
[TIL 2024. 01. 09] (0) | 2024.01.09 |
[TIL 2024. 01. 08] (0) | 2024.01.08 |