[패스트캠퍼스] 데이터 분석 부트캠프 16기 8주차 - SQL 기본 이론

2024. 10. 11. 17:58·데이터 분석 부트캠프/주간학습일지

SQL 기본

RDBMS의 개념

  • RDBMS (관계형 데이터베이스 관리 시스템; Relational Database Management System)
  • 2차원의 테이블(table) 형식을 이용하여 데이터를 정의하고 설명하는 데이터 모델
  • 속성(attribute)과 데이터 값(value)로 구성됨
  • 데이터를 구조화한다 = 속성과 데이터 값 사이에서 관계(relation)을 찾아내고 이를 테이블 모양의 구조로 도식화

주요 용어

  • 테이블 (Table) = 관계 (Relation)
  • 컬럼 (Column) = 필드 (Field) = 속성 (Attribute)
  • 로우 (Row) = 레코드 (Record) = 튜플 (Tuple)
  • 기본키 (Primary Key; PK)
    • 한 테이블의 각 로우를 유일하게 식별해주는 컬럼
    • 각 테이블마다 기본키가 존재해야 함
    • NULL 값을 허용하지 않음
    • 각 로우 마다 고유한(unique) 값이어야 함
  • 외래키 / 외부키 (Foreign Key; FK)
    • 한 테이블의 속성 중 다른 테이블의 로우를 식별할 수 있는 키
    • 한 테이블의 열이 다른 테이블의 기본키를 참조하도록 하는 제약
    • 이를 통해 두 테이블 간의 관계를 정의하고, 데이터의 무결성을 유지할 수 있음
  • 스키마 (schema)
    • 데이터베이스의 테이블 구조 및 형식, 관계 등의 정보를 형식 언어(formal language)로 기술한 것 (데이터베이스의 설계도)

SQL DDL (Data Definition Language)

DATABASE

  • CREATE DATABASE : 데이터베이스 생성
CREATE DATABASE dbname;
  • SHOW DATABASES : 데이터베이스 목록 보기
SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
  • USE : 데이터베이스 사용
USE dbname;
  • DROP DATABASE : 데이터베이스 삭제
  • IF EXISTS : 특정 명칭의 데이터베이스가 존재한다면 명령 실행 (특정 명칭의 데이터베이스가 존재하지 않을 때 오류 발생을 방지함)
DROP DATABASE [IF EXISTS] dbname;

TABLE

  • CREATE TABLE : 테이블 생성
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    age INT
);
  • SHOW TABLES : 테이블 목록 보기
USE mysql;
SHOW TABLES;
+------------------------------------------------------+
| Tables_in_mysql                                      |
+------------------------------------------------------+
| columns_priv                                         |
| component                                            |
| db                                                   |
| default_roles                                        |
| engine_cost                                          |
| func                                                 |
| general_log                                          |
| global_grants                                        |
| gtid_executed                                        |
| help_category                                        |
| help_keyword                                         |
| help_relation                                        |
| help_topic                                           |
| innodb_index_stats                                   |
| innodb_table_stats                                   |
| ndb_binlog_index                                     |
| password_history                                     |
| plugin                                               |
| procs_priv                                           |
| proxies_priv                                         |
| replication_asynchronous_connection_failover         |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version              |
| replication_group_member_actions                     |
| role_edges                                           |
| server_cost                                          |
| servers                                              |
| slave_master_info                                    |
| slave_relay_log_info                                 |
| slave_worker_info                                    |
| slow_log                                             |
| tables_priv                                          |
| time_zone                                            |
| time_zone_leap_second                                |
| time_zone_name                                       |
| time_zone_transition                                 |
| time_zone_transition_type                            |
| user                                                 |
+------------------------------------------------------+
38 rows in set (0.00 sec)
  • DESC : 테이블 구조 설명
USE mysql; -- mysql : 데이터베이스명
DESC db; -- db : 테이블명
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(255)     | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(32)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.01 sec)
  • ALTER TABLE : 테이블 구조 수정
  • ADD COLUMN : 테이블에 새로운 컬럼 추가
ALTER TABLE table_name
ADD COLUMN column_name datatype;
  • NOT NULL : NULL 값을 허용하지 않음
ALTER TABLE mytable
ADD COLUMN model_type varchar(10) NOT NULL;
  • MODIFY COLUMN : 테이블 컬럼 타입 변경
ALTER TABLE mytable
MODIFY COLUMN name varchar(20) NOT NULL;
  • DROP COLUMN : 테이블 컬럼 삭제
ALTER TABLE mytable
DROP COLUMN series;

SQL DML (Data Manipulation Language)

DML의 주 기능 : CRUD (Create, Read, Update, Delete)

생성 (Create)

  • INSERT INTO … VALUES : 테이블 전체 컬럼에 대응하는 값 삽입
INSERT INTO mytable VALUES(1, 'i7', '7700', 'Kaby Lake');
/* VALUES 안의 값은 컬럼 순서대로 각 컬럼에 해당하는 데이터형과 제약조건을 만족해야 에러 없이 데이터 값 삽입 가능 */

INSERT INTO mytable (name, model_num, model_type)
VALUES('i7', '7700K', 'Kaby Lake');
/* 특정 컬럼에만 데이터값 삽입 가능 */

읽기 (Read)

  • SELECT ... FROM : 특정 테이블의 특정 데이터를 선택해서 불러오기
SELECT * FROM table_name; -- 테이블 전체 컬럼의 데이터 모두 읽기
SELECT name, model_num FROM mytable; -- 테이블 특정 컬럼의 데이터만 읽기
  • COUNT() : 컬럼값의 개수
  • SUM(): 컬럼값의 합계
  • AVG() : 컬럼값의 평균
  • MAX() : 컬럼값의 최대값
  • MIN() : 컬럼값의 최소값
  • AS : 컬럼명 변경
SELECT CountryCode,
    COUNT(*) AS total
FROM city
GROUP BY CountryCode;
  • WHERE : 조건에 맞는 데이터만 검색하기
SELECT * FROM mytable WHERE id < 2; -- 비교
SELECT * FROM mytable WHERE id > 0 OR id < 2; -- 논리 연산자 OR
SELECT * FROM mytable WHERE id = 1 AND name = 'i7'; -- 논리 연산자 AND
SELECT * FROM 테이블명 WHERE 필드명 LIKE '홍%'; -- 홍으로 시작되는 값을 모두 찾을 경우
SELECT * FROM 테이블명 WHERE 필드명 LIKE '%홍%'; -- 홍이 들어간 값을 모두 찾을 경우
SELECT * FROM 테이블명 WHERE 필드명 LIKE '홍__'; -- 홍으로 시작되고 뒤에 2글자가 붙을 경우
  • GROUP BY : 특정 컬럼값을 기반으로 그룹화
SELECT COUNT(*) FROM film WHERE 조건문 GROUP BY rating;
/* 특정 조건에 맞는 데이터 중 rating 값 종류별로, 몇 개의 데이터가 있는지를 확인 */
  • ORDER BY : 데이터 정렬 기준 설정
ORDER BY column_name DESC|ASC -- 아무것도 안쓰면 오름차순 정렬
  • LIMIT : 결과 중 일부만 데이터 불러오기
SELECT * FROM 테이블명 LIMIT 10; -- 결과의 앞 10개만 불러오기
SELECT * FROM 테이블명 LIMIT 100, 10; -- 결과중 100번째부터, 10개만 가져오기
  • SQL 조건 순서
SELECT 컬럼 AS 컬럼명
FROM 테이블명
WHERE 조건
GROUP BY 컬럼
ORDER BY
LIMIT

갱신 (Update)

  • UPDATE ... SET : 데이터 수정 (보통 WHERE 조건문과 함께 쓰임)
UPDATE 테이블명
SET 수정하고 싶은 컬럼명 = '수정하고 싶은 값'
WHERE 특정 컬럼 = '값';

/* 다수 컬럼 값 수정 가능 */
UPDATE 테이블명
SET 수정하고 싶은 컬럼명1 = '수정하고 싶은 값',
    수정하고 싶은 컬럼명2 = '수정하고 싶은 값',
    수정하고 싶은 컬럼명3 = '수정하고 싶은 값'
WHERE 특정 컬럼 < '값';

삭제 (Delete)

  • DELETE FROM : 테이블에 저장된 데이터 삭제 (보통 WHERE 조건문과 함께 쓰임)
DELETE FROM 테이블명
WHERE 특정 컬럼 = '값';

DELETE FROM 테이블명; -- 테이블에 저장된 모든 데이터 삭제 가능

SQL DCL (Database Control Language)

mysql -u root -p
mysql> use mysql;
mysql> create user '만들고싶은ID'@'%' identified by '비밀번호'; # 사용자 추가
mysql> select host, user from user;
mysql> SET PASSWORD FOR '만들고싶은ID'@'%' = '신규비밀번호'; # 사용자 비밀번호 변경
mysql> exit;

데이터베이스 정규화 과정

1차 정규화 (1NF)

  • 모든 컬럼의 값이 원자적이어야 함
  • "원자적"이란 각 컬럼에 단일 값만 포함되어야 하며, 더 이상 분리할 수 없는 상태를 의미
  • 예를 들어, 이름 컬럼에는 하나의 이름만 있어야 하고, 배열이나 여러 값이 함께 있는 경우는 허용되지 않음

2차 정규화 (2NF)

  • 모든 비기본 키 속성이 전체 기본키에 완전히 종속되어야 함
  • 즉, 복합 기본키가 있는 경우 각 비기본 키 속성은 그 기본키 전체에 대해서만 종속되어야 하며, 기본키의 일부분에만 종속되어서는 안 됨

3차 정규화 (3NF)

  • 이행적 종속성을 제거
  • 이행적 종속이란 A가 B에 종속적이고, B가 C에 종속적일 때, A가 C에 이행적으로 종속적인 관계를 의미
저작자표시 비영리 변경금지 (새창열림)

'데이터 분석 부트캠프 > 주간학습일지' 카테고리의 다른 글

[패스트캠퍼스] 데이터 분석 부트캠프 16기 12주차 - 생성형 AI 활용  (3) 2024.11.07
[패스트캠퍼스] 데이터 분석 부트캠프 16기 9주차 - SQL 문법  (2) 2024.10.18
[패스트캠퍼스] 데이터 분석 부트캠프 16기 5주차 - Python을 활용한 데이터 시각화 (NumPy / Pandas / MatPlotLib / Seaborn)  (3) 2024.09.20
[패스트캠퍼스] 데이터 분석 부트캠프 16기 4주차 - Python의 Selenium을 활용한 데이터 크롤링  (6) 2024.09.13
[패스트캠퍼스] 데이터 분석 부트캠프 16기 3주차 - Python 제어문/예외처리/함수/변수/클래스  (7) 2024.09.05
'데이터 분석 부트캠프/주간학습일지' 카테고리의 다른 글
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 12주차 - 생성형 AI 활용
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 9주차 - SQL 문법
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 5주차 - Python을 활용한 데이터 시각화 (NumPy / Pandas / MatPlotLib / Seaborn)
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 4주차 - Python의 Selenium을 활용한 데이터 크롤링
MaxH
MaxH
Development and Analysis log by Max H
  • MaxH
    Max’s analog
    MaxH
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 무료배포자료 (1)
      • 데이터 분석 부트캠프 (19)
        • 주간학습일지 (11)
        • 회고록 (8)
      • Python (1)
      • SQL (2)
      • AWS (1)
      • Linux (0)
  • 블로그 메뉴

    • 링크

      • GitHub (@missiletoe)
      • LinkedIn (Yong Suk Heo)
    • 공지사항

    • 인기 글

    • 태그

      코딩테스트
      MSA
      셀레니움
      데이터분석
      데이터분석가
      sql코딩테스트
      1년무료
      크림보관판매매크로
      SQL
      크림보판
      패스트캠퍼스데이터분석부트캠프
      aws과금
      패스트캠퍼스부트캠프
      크레딧지급
      국비지원취업
      olist
      패스트캠퍼스
      아마존웹서비스
      크림보관판매
      부트캠프
      한정판리셀
      프리티어
      크림리셀
      db생성
      redis
      보판매크로
      국비지원
      보관판매
      aws프리티어
      데이터분석부트캠프
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.5
    MaxH
    [패스트캠퍼스] 데이터 분석 부트캠프 16기 8주차 - SQL 기본 이론
    상단으로

    티스토리툴바