본문 바로가기

TIL

[TIL 2024. 01. 11]

오늘 한 일

-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