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 |