-
2023-12-18스파르타/TIL(Today I Learned) 2023. 12. 18. 20:55
(엑셀보다 쉽고 빠른 SQL강의를 듣고서 정리하며 복습)
SQL이란?
SQL 은 데이터베이스와 대화를 하기 위한 언어
데이터베이스에게도 ‘A를 주겠니?’ 라고 이야기할 때 사용하는 언어
SQL 이란 언어를 이용하여 데이터베이스에 요청을 하는 질의를 ‘Query’ ,
데이터베이스에 요청을 할 때 Query 작성이라는 말을 사용
데이터베이스 & 테이블 & 컬럼
데이터 베이스
데이터가 저장되어있는 큰 폴더라고 생각 (일종의 set라고 생각됨)이 폴더를 열어보면 안에 적게는 한 개부터 많게는 여러 개의 테이블이 있음
테이블
row(행), column(열)row(행)
column(열)
이 중 한 개를 자세히 확대해본다면
컬럼
이 중 세로 성분을 행이라고 하며 ‘열’ 또는 ‘필드’라고도함
SELECT / FROM 문
‘어느 테이블에서 데이터를 가져올까’ 를 SQL로 Query를 작성할 때 가장 먼저 생각
SELECT : 데이터를 가져오는 기본 명령어로, 데이터를 조회하는 모든 Query 에 사용됨
FROM : 데이터를 가져올 테이블을 특정해주는 문법
- : 전부를 뜻하는 의미로 select * 경우 모든 컬럼을 가져와 준다는 의미
컬럼에 별명 붙이기 (이름)
- 방법1 : 컬럼1 as 별명1 - 방법2 : 컬럼2 별명2
- 별명 지을 때 유의사항구분 영문, 언더바 특수문자, 한글
방법 별명만 적음 “별명” 으로, 큰 따옴표 안에 적어줌 예시 ord_no “ord no” ”주문번호”
조건에 맞는 데이터만 필요할 때, SQL 로 필터링하기 (WHERE 이란)
전체 데이터 중 원하는 데이터만 필터링
select * from 테이블 where 필터링 조건 (eg. 20살 이상)
필터링을 할 때 유용한 표현 알아보기 (비교연산, BETWEEN, IN, LIKE)
- 비교연산자의 종류비교연산자 의미 예시
= 같다 age=21 gender=’female’ <> 같지 않다 (다르다) age<>21 gender<>’female’ > 크다 age>21 >= 크거나 같다 age>=21 < 작다 age<21 <= 작거나 같다 age<=21 - 다양한 조건의 종류 (BETWEEN, IN, LIKE)
- BETWEEM : A 와 B 사이 : between a and b
- IN : ‘포함’ 하는 조건 주기 : in (A, B, C) (구체적으로 특정 몇개를 포함하는 것)
- LIKE : 완전히 똑같지는 않지만, 비슷한 값을 조건으로 주기 (특정문자를 전체문자에서 포함하는 글자)
- : like ‘시작문자**%’ / like ‘%포함문자%’ / like ‘%**시작문자’
- 대,소문자 구분 애매
필터링 조건으로 여러개를 적용해야 할 때 (논리연산)
여러 개의 필터링 조건을 한 번에 적용하는 방법
- 논리연산의 종류
논리연산자 의미 예시
AND 그리고 age>20 and gender=’female’ → 나이가 20세 이상이고, 여성 OR 또는 age>20 or gender=’female’ → 나이가 20세 이상이거나, 여성 NOT 아닌 not gender=’female’ → 여성이 아닌 데이터 조회와 엑셀 함수 적용을 한 번에 끝내기 (SUM, AVG, COUNT, MIN, MAX)
- 숫자 연산 종류연산자 설명
+ 더하기 - 빼기 * 곱하기 / 나누기 - 합계와 평균 구하기
- 합계 : SUM(컬럼)
- 평균 : AVG(컬럼)
- 전체 데이터의 갯수 구하기
- 데이터 갯수 : COUNT(컬럼) * 컬럼명 대신 1 혹은 * 사용 가능
- 몇개의 값을 가지고 있는지 구할 때 : DISTINCT (몇 가지의 종류의 값을 가지고 있냐는 의미가 이해에 더 좋을듯)
- 데이터의 범위, 최솟값과 최댓값 구하기
- 최솟값 : MIN(컬럼)
- 최댓값 : MAX(컬럼)
범주별 연산을 한 번에 끝내기 (GROUP BY)
카테고리별로 숫자 연산특정한 행끼리의 데이터를 처리(합, 평균, 순위 등등)말 그대로 쉽게 결과를 정렬해 줌
- 오름차순 : 숫자가 점점 커지는 순서로 정렬
- 내림차순 : 숫자가 점점 작아지는 순서로 정렬
- 종류종류 구문 예시
오름차순 생략 order by sum(price) 내림차순 desc order by sum(price) desc
SQL 구조 마스터 - WHERE, GROUP BY, ORDER BY 로 완성되는 SQL 구조
SQL 문장의 구조 순서의 순서를 지켜야 한다 (현재 배운 내용을 기준으론 select부분이 여러 조건문 등이 들어가면서 많이 길어질 경우 헷갈리거나 까먹을 수 있지만 근본적으로 이 구조의 순서는 변하지 않음)
- select from where group by order by
- select 카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼), from group by 카테고리컬럼(원하는컬럼 아무거나) order by 정렬을 원하는 컬럼 (카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼) 둘 다 가능)
- Query 결과를 정렬하여 업무에 바로 사용하기 (ORDER BY)
- select 카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼), from group by 카테고리컬럼(원하는컬럼 아무거나)
+함수명은 컬럼명과 다르게 대소문자상관X
+group, order의 기준 여러 개 둘 수 있음
+group, order의 컬럼은 이름을 적어도 되고, 그 컬럼의 위치를 적어도 됨(1번째부터 1,2,3..)
+order의 경우 기준을 제일 처음 컬럼으로 꼭 하지 않아도 되나, 한글 별명으로 할 경우 부분적으로만 정렬되는 버그가 나는 듯함(체감상 그럴 수도 있으니 만약 쓰게 되는 일이 있다면 확인 필요/ 다시 확인해보니 오류는 안 일어나지만 정렬이 자체가 아예 안 되는 것 같기도 함)
업무 필요한 문자 포맷이 다를 때, SQL 로 가공하기 (REPLACE, SUBSTRING, CONCAT)
- 특정 문자를 다른 문자로 바꾸기(단, 출력 값만 바꿔서 출력하지 원본 데이터를 수정하여 저장하지는 않음)
- replace(바꿀 컬럼, 현재 값, 바꿀 값)
- 원하는 문자만 남기기
substr(조회 할 컬럼, 시작 위치, 글자 수)
- substring (또는 substr)
- 여러 컬럼의 문자를 합치기
붙일 수 있는 문자의 종류 : 컬럼, 한글, 영어, 숫자, 특수 문자concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)
- 여러 컬럼의 값을 하나로 합칠 수 있는 기능
조건에 따라 포맷을 다르게 변경해야 한다면 (IF, CASE)
- 조건에 따라 다른 방법을 적용하고 싶을 때 - If 문
if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
- 조건을 여러가지 지정하고 싶을 때 - Case 문
- case when 조건1 then 값(수식)1 when 조건2 then 값(수식)2 else 값(수식)3 end
+보통 select문 내에서 if나 case를 사용하는데 select에서 컬럼으로써 출력되는 것이므로 별명을 꼭 정해주는 것이 좋다(영어로 된 이름 추천) , 만약 이름을 정하지 않을경우 if~등의 줄이 그대로 컬럼명으로 들어감 , 영어로 된 이름을 추천하는 이유는 sub쿼리등을 쓸 때 한글로 이름을 지어줄 경우 바깥 select문에서 못 인식하는 듯 보였기 때문이다.
+데일리 루틴의 SQL문제
01 이름이 있는 동물의 아이디
문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLEANIMAL_ID VARCHAR(N) FALSE ANIMAL_TYPE VARCHAR(N) FALSE DATETIME DATETIME FALSE INTAKE_CONDITION VARCHAR(N) FALSE NAME VARCHAR(N) TRUE SEX_UPON_INTAKE VARCHAR(N) FALSE 동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.
예시예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKEA434523 Cat 2015-11-20 14:18:00 Normal NULL Spayed Female A562649 Dog 2014-03-20 18:06:00 Sick NULL Spayed Female A524634 Dog 2015-01-02 18:54:00 Normal *Belle Intact Female A465637 Dog 2017-06-04 08:17:00 Injured *Commander Neutered Male 이름이 있는 동물의 ID는 A524634와 A465637입니다. 따라서 SQL을 실행하면 다음과 같이 출력되어야 합니다.
ANIMAL_IDA465637 A524634 (코드)
SELECT ANIMAL_ID
from ANIMAL_INS
where NAME is not null
order by 1ID를 출력하는데 Name이 있는 즉 NUll이 아닌 것만 필터링해서 출력한 뒤 오름차순해주면 되는 간단한 문제이다
'스파르타 > TIL(Today I Learned)' 카테고리의 다른 글
2023-12-23 (0) 2023.12.23 2023-12-22 (0) 2023.12.22 2023-12-21 (0) 2023.12.21 2023-12-20 (0) 2023.12.21 2023-12-19 (0) 2023.12.20