본문 바로가기
내일배움 과제/기타 과제

걷기반 SQL - 2) 이제 좀 벌었으니 flex 한 번 해볼까요?!

by GREEN나무 2024. 10. 16.
728x90

문제

https://teamsparta.notion.site/2-flex-1102dc3ef5148108b390fcaad7a5b909

 

2) 이제 좀 벌었으니 flex 한 번 해볼까요?! | Notion

실제 데이터 베이스를 연결하기 전, SQL 문법을 탄탄하게 다져봅시다.

teamsparta.notion.site

 

 

5. products 테이블에서 제품 이름(product_name)과 가격(price)만을 선택하는 쿼리를 작성해주세요.

SELECT product_name, price FROM products;

 

6. products 테이블에서 제품 이름에 '프로'가 포함된 모든 제품을 선택하는 쿼리를 작성해주세요.

SELECT * FROM products WHERE product_name LIKE '%프로%';

 

7. products 테이블에서 제품 이름이 ''로 시작하는 모든 제품을 선택하는 쿼리를 작성해주세요.

SELECT * FROM products WHERE product_name LIKE '%';

 

8. products 테이블에서 모든 제품을 구매하기 위해 필요한 돈을 계산하는 쿼리를 작성해주세요.

SELECT SUM(price) FROM products;

 


 

풀이

 

5

특정 문자열 포함 여부 확인 LIKE 연산자, REGEXP 연산자, INSTR 함수

 

LIKE 연산자 : 조건절(WHERE)에서 특정 문자열이 포함된 데이터를 찾을 때 사용합니다.

   SELECT 컬럼 FROM 테이블이름 WHERE 컬럼 LIKE '%문자열%';

LIKE 연산자는 true, false를 반환하므로 CASE 표현식과 PL/SQLIF 문에서도 사용이 가능합니다.

 

1) 특정 문자로 시작하는 데이터 검색

   SELECT 컬럼  FROM  테이블이름  WHERE 컬럼  LIKE '문자열%';

 

2) 특정 문자로 끝나는 데이터 검색

   SELECT 컬럼 FROM  테이블이름  WHERE 컬럼  LIKE '%문자열';

 

3) 특정 문자를 포함하는 데이터 검색

   SELECT 컬럼 FROM  테이블이름  WHERE 컬럼 LIKE '%문자열%';

 

4) 복수의 특정 문자를 포함하는 데이터를 검색

   SELECT 컬럼 FROM  테이블이름  WHERE 컬럼

    LIKE '%문자열1%' OR 컬럼 LIKE '%문자열2%';

 

 

REGEXP 연산자 : 복수의 특정 문자를 포함하는 데이터를 검색합니다. (특정 문자열을 '|' 를 기준으로 구분)

   SELECT [필드명] FROM [테이블명] WHERE [필드명]

    REGEXP '문자열1|문자열2';

 

INSTR 함수 : 특정 문자열이 포함된 위치를 반환 하므로 특정 문자열을 자를 때 사용합니다.

   SELECT [필드명] FROM [테이블명] WHERE INSTR([필드명] LIKE '문자열');

   INSTR 함수는 특정 문자열을 찾은 위치를 정수형(숫자)으로 반환합니다. (문자열을 찾으면 1이상, 못 찾으면 0)

 

 

8

합계 구하는 SUM 함수

‘AS sum_000’에서 ‘sum_000’은 해당 열이 필요하거나 생성되는 것이 아니라 단순히 결과 집합에서 계산된 값에 대한 별칭을 지정한 것뿐이다.

 

1) 합계 구하기

   SELECT SUM(컬럼) FROM 테이블 이름;

 

2) 조건 있는 데이터 합계

SELECT SUM(컬럼) FROM 테이블 이름 WHERE job = 'SALESMAN’;
-- job'SALESMAN’인 경우 컬럼의 값을 합하여 출력합니다.
SELECT SUM(sal)  AS sum_sal
     , SUM(comm) AS sum_comm
     , SUM(sal) + SUM(comm) AS sum_total
  FROM emp
 WHERE job = 'SALESMAN
-- 직업(job)이 "SALESMAN"인 직원의 급여(sal)와 성과급(comm)의 합계를 출력합니다.

 

3) 그룹별 합계 구하기

GROUP BY 절을 사용하지 않으면 집계 함수(SUM)SELECT 절에 사용할 수 있습니다.

SELECT 절에 일반 칼럼(job)을 같이 사용하려면 GROUP BY 절을 사용해서 그룹으로 집계를 해야 합니다.

SELECT 컬럼1, SUM(컬럼2) AS sum_컬럼2 FROM 테이블이름 GROUP BY 컬럼1
-- 컬럼1에 따라 그룹을 지어 각 그룹에 속하는 컬럼2의 합계를 계산하고, 그 결과를 보여줍니다.
SELECT job
, SUM(sal) AS sum_sal
, SUM(comm) AS sum_comm
, ISNULL(SUM(sal), 0) + ISNULL(SUM(comm), 0) AS sum_total
FROM emp
GROUP BY job;
-- 직업(job)별로 급여(sal)와 성과금(comm)의 합계를 계산하고, 그 값을 합산하여 직업별로 결과를 보여줍니다.

 

4) 분석함수를 사용하여 합계 구하기 (OVER ) : 값을 테이블의 각 행마다 표시합니다

SELECT empno, ename, job, sal, SUM(sal) OVER() AS sum_sal
FROM emp
WHERE job = 'SALESMAN’
-- 조회된 데이터의 급여(sal) 총합계를 구하여 각 행에 표시합니다.
SELECT empno, ename, job, sal, SUM(sal)  OVER(PARTITION BY job) AS sum_sal
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN')
-- 조회된 데이터에서 직업(job)별로 급여(sal)를 합산하여 총합계를 직업(job)에 맞게 각 행에 표시합니다.

 

 

문자열 합치기 STRING_AGG() 함수 : LISTAGG() 함수와 비슷한 기능을 수행합니다.

   STRING_AGG("합칠컬럼명", "구분자") WITHIN GROUP(ORDER BY "컬럼명")

STRING_AGG 함수는 GROUP BY 절과 함께 사용해야 합니다.

ORDER BY 절을 사용하여 정렬이 가능하며 ORDER BY 절은 생략할 수 있습니다.

 

1) 기본 사용법

SELECT job, STRING_AGG(ename, ',') enames
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN') GROUP BY job
-- jobMANAGER‘ename’열의 문자열을 사이에 ‘,’로 구분지어 출력하고 'SALESMAN'인 경우도 모아서 출력합니다.

 

2) 컬럼 값을 정렬하여 합치는 방법

SELECT job, STRING_AGG(ename, ',') WITHIN GROUP(ORDER BY ename) enames
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN') GROUP BY job
-- 기본사용법 결과가 문자열의 글자 순으로 배열되어 출력됩니다.