KT 에이블스쿨(6기, AI)

[KT 에이블스쿨(6기, AI)] 14주차, SQL

대체불가 핫걸 2024. 12. 4. 20:00

<14주차 후기>

  • 3일간 SQL에 대해 배웠습니다! 쿼리문은 MySQL을 사용했고, 모델링은 exERD를 사용하여 실습 진행했습니다!
  • 주요 내용으로는 SQL을 활용한 데이터 조회, 변경, 집계와 함께, MySQL Workbench GUI 사용법도 배워 MySQL 툴 활용 능력을 키울 수 있었습니다.
  • 또한, Python으로 MySQL을 연결해 데이터를 가져오는 방법도 간단히 익혔습니다. 특히, 데이터를 MySQL에서 처리한 후 웹과 연결하는 과정을 이해하게 되었고, Python으로 긴 SQL문을 작성하기 부담스러울 경우 VIEW를 생성해 활용하는 실용적인 팁도 배웠습니다! 
  • 강의 때 다뤘던 예제 외에도 따로 실습하고, 추가로 공부할 수 있는 심화 자료들을 많이 주셔서 추후에 SQL문으로 쿼리를 짜야할 일이 생기면 유용하게 참고할 거 같아요. 유익하고 실습 중심적인 시간이어서 매우 만족스러웠습니다! 😊 

 

1️⃣ SQL이란?

Structured Query Language
데이터베이스에서 데이터를 조회하거나 처리(입력, 수정, 삭제)할 때 사용하는 구문

 

💡 초기 설정 

  • 스키마 생성
CREATE SCHEMA `schema_name` ;

 

  • DB 지정 후 확인
USE `schema_name`;
SELECT DATABASE();

 

 

2️⃣ 데이터 조회

💡 모든 열, 모든 행 

SELECT * FROM schema_name.table_name;

→ Schema 탭에 해당 스키마를 더블 클릭해서 활성화 시켜주면 schema_name은 생략 가능

 

💡 일부 열, 일부 행 

SELECT col_1, col_2, col_3	
    FROM table_name
    WHERE col_1 = 'target';
  • 문자열 조건(포함 관계) `%`
-- '강'씨 성을 갖는 고객
SELECT customer_id, customer_name
	FROM customers
	WHERE customer_name LIKE '강%';
    
-- '강'이 이름에 포함된 고객
LIKE '%강%';
    
-- '강'으로 이름이 끝나는 고객
LIKE '%강';

 

  • 문자열 조건(글자 수): `__@%`
-- 이메일 아이디가 5글자인 고객 이름
SELECT customer_name
	FROM customers
	WHERE email LIKE '____@%';

 

  • 범위 조건: `BETWEEN`
-- 가격이 1000원 이상 2000원 이하인 상품 조회
SELECT product_name
	FROM products
    	WHERE price BETWEEN 1000 AND 2000;

 

  • IS NULL: 결측치 조회
-- 나이가 NULL값이 아닌 테이블
SELECT name
	FROM informations
    	WHERE age IS NOT NULL; // NULL값인 것을 보려면 IS NULL

 

  • IF NULL: 결측치 처리
-- IFNULL() -> DBMS에 따라 다르게 동작, 인수 2개만 처리 가능
SELECT IFNULL(customer_name, '') AS customer_name
	FROM customers;

-- COALESCE() -> 모든 DBMS에서 똑같이 작동, 인수 여러 개 처리 가능 -> 이 함수를 쓰는 것을 추천 
SELECT COALESCE(customer_name, '') AS customer_name
	FROM customers;

 

  • 문자열 결합
SELECT CONCAT(customer_name, '(', name_id, ')') AS customer_name
	FROM customers;

※ 이름(이름 아이디) 형태의 데이터로 저장되며 컬럼 이름은 customer_name,

※  but 결합하려는 문자에 NULL값이 하나만 있어도 전체 NULL로 초기화

-- 구분자 사용(concat with seperate)
SELECT CONCAT_WS(',', customer_name, name_id) AS customer_name
	FROM customers;

※ 지정해준 구분자로 구분, NULL값이 있어도 문제 X

 

  • 정렬
-- WHERE절 뒤에
-- 오름차순: ASC(기본값), 내림차순: DESC
ORDER BY customer_name ASC, age DESC;

 

 

3️⃣ 데이터 변경

💡INSERT

INSERT INTO table_name(col_1, col_2, col_3)
    VALUES('val_11', 'val_21', 'val_31'),
          ('val_12', 'val_22', 'val_32');

 

💡UPDATE

UPDATE tabel_name
	SET col_name = 'update_value'
	WHERE col2_name = 'target_value';

 

💡DELETE

DELETE FROM vacation
   -- 조건 지정(행 전체를 지울 땐 X)
   WHERE col_name != 'target_value';

/* TRUNCATE TABLE vacation; */

 

 

4️⃣ 데이터 집계

💡집계 함수

<행으로만 집계>
SUM, AVG, MAX, MIN, COUNT
-- 나이에 대한 최대, 최소, 평균 집계
-- 고객 테이블의, 2024년 가입 고객 대상
-- 평균을 구할 때 NULL 값은 0으로 대체
SELECT MAX(age) AS max_age, MIN(age) AS min_age, AVG(IFNULL(age, 0)) AS average_age, 
    FROM customers
    WHERE YEAR(join_date) = 2024;

 

💡그룹별 집계(GROUP BY)

-- WHERE절 다음에 위치
SELECT MAX(age), 
    FROM customers
    WHERE YEAR(join_date) = 2024
    GROUP BY gender;

 

💡집계 결과에 대한 조건(HAVING)

※ 무조건 GROUP BY와 함께 

-- GROUP BY 다음에 위치
SELECT MAX(age) as max_age, 
    FROM customers
    WHERE YEAR(join_date) = 2024
    GROUP BY gender
    HAVING  MAX(age) >= 3
    ORDER BY max_age DESC;

 

 

5️⃣ 순위 함수

💡RANK

SELECT RANK() OVER(PARTITION BY 집계할 컬럼 ORDER BY 정렬할 컬럼 DESC) AS 새로운 컬럼 이름

 

-- 예시
값 -> 100 | 100 | 80
  • `RANK`: 동점이 있을 경우 같은 순위 부여 후 동점 이후 순위 건너 뜀(1등: 2명, 3등: 1명)
  • `DENSE_RANK`: 동점이 있을 경우 같은 순위 부여 후 순위 건너뛰지 않음(1등: 2명, 2등: 1명)
  • `ROW_NUMBER`: 동점이라도 고유한 값 부여(1등: 1명, 2등: 1명, 3등: 1명)

 

💡NTILE

  • 1, 2, 3, ...
SELECT NTILE(그룹 수) OVER(ORDER BY 컬럼 이름 DESC) AS 새로운 컬럼 이름
  • 상, 중, 하, ...
SELECT ELT(NTILE(그룹 수) OVER(ORDER BY 컬럼 이름 DESC), '상', '중', '하') AS 새로운 컬럼 이름

 

 

6️⃣ 다중 테이블 조회

💡 INNER JOIN(교집합)

  • 공통 조건에 맞는 데이터만 반환
SELECT t1.컬럼1, t1.컬럼2
	FROM 테이블1 AS t1
	INNER JOIN 테이블2 AS t2 ON t1.컬럼3 = t2.컬럼3

 

💡 OUTER JOIN(합집합)

  • `LEFT OUTER JOIN`: 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 행이 없으면 NULL을 반환
  • `RIGHT OUTER JOIN`: 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에서 일치하는 행이 없으면 NULL을 반환
  • `FULL OUTER JOIN`: 두 테이블의 모든 행 반환하고, 일치하는 행이 없으면 NULL을 반환

 

💡 CROSS JOIN(데카르트 곱)

  • 두 테이블의 모든 조합을 반환 
SELECT 컬럼1, 컬럼2
    FROM 테이블1 AS t1
    CROSS JOIN 테이블2 AS t2;

 

💡 하위 쿼리 

  • SQL 쿼리 내에서 다른 쿼리를 포함하는 쿼리
SELECT 컬럼1, 컬럼2
	FROM 테이블1 AS t1
	WHERE EXISTS (SELECT * 
                    FROM 테이블2
                    WHERE 테이블2_컬럼 = t1.컬럼);
반응형