Wecode - Foundation 1 (부트캠프)/MySQL (데이터베이스 만듦_terminal 이용)

[MySQL] MySQL 명령문 - DDL, DML, DQL, table/post 생성 수정 추가 삭제, Join

JBS 12 2023. 9. 1. 11:46

MySQL 은 SQL 명령문 사용해서 명령 내린다.

 

데이터 / 테이블 생성, 추가 후에는 select와 show로 확인한다. 
* select: 데이터 조회 
* create, insert, add 로 데이터 생성, 추가 

 

 SQL문 특징 

  • 끝은 항상 세미콜론 (중간 연결은 쉼표) 
  • 공백이나 개행이 자유롭기 때문에 띄어쓰기든 탭이든 엔터든 모두 같은 한칸 띄어쓰기로 판단
  • 명령어는 대문자 (대소문자는 자유롭지만, 가독성을 위해 예약어는 대문자로 적어주는 것이 관례)

Primary key(기본키) : 데이터베이스에는 기본키가 존재

 

1)

mysql.server start
myspl 서버 실행

2)

 mysql -u root -p
mysql 서버 접속

터미널로 mysql 시작할 때 입력 

MySQL 진입 명령어


;

mysql 접속하면, mysql>로 터미널이 바뀌고, 그다음부터는 sql 퀴리문을 사용한다. 

이후 모든 명령어 뒤에 ; 붙이기


mysql> SHOW DATABASES; 

현재 MySQL 에 저장되어있는

모든 데이터베이스 목록 보기/ 출력 


+--------------------------+
| Database                 |
+--------------------------+
| westagram                |
| information_schema       |
| mysql                    |
| performance_schema       |
| sys                      |
+--------------------------+

 

desc [table_name];
묘사하다 describe 

선택한 database의 테이블 구조 출력

특정, 선택한 테이블에 어떤 column 열이 있는지, 구조가 무엇인지 조회 


select : 데이터 조회
SELECT [column_name] From [table_name]
SELECT * FROM [table_name];

*  선택한 DB 의 모든 column열 조회/출력 

 

mysql> SELECT * FROM users;


SQL 문, MySQL 명령어

  • DDL -create/ alter/drop /truncate/ rename (데이터 정의)
  • DML - insert/update/delete/ merge/ lock table (데이터 조작)
  • DQL - select
  • TCL - commit/ rollback/savepoint/ set transaction

1. DDL; Data Definition Language 데이터 정의 언어: 생성/수정/삭제

  • create, alter, drop (생성, 추가/ 수정/ 삭제), truncate, rename
  • 메타데이터(데이터에 대한 데이터) 다루는 쿼리문

1-1. Create 명령어

: 데이터베이스, 테이블 생성 

 

데이터베이스 생성

mysql> CREATE DATABASE [dbname]
CREATE DATABASE
[dbname];

 

데이터베이스 생성 및 속성 설정 

CREATE DATABASE [dbname] CHARACTER SET utf8mb4 collate utf8mb4_general_ci

 

데이터베이스 생성 후, 그 데이터베이스 사용(선택)

use DB이름;
선택 사용

테이블 생성 

CREATE TABLE [tablename] (
    [column_name1] INT PRIMARY KEY AUTO_INCREMENT,         --> INT: 데이터타입
    [column_name2] VARCHAR(255) NOT NULL,                            --> VARCHAR: 데이터타입
    [column_name3] DATETIME NOT NULL,
)CHARSET=utf8;

 

테이블 생성 후, DB의 테이블 목록 출력

show tables;

1-2. Drop 명령어

: 테이블, 데이터베이스 삭제 

 

drop 옆에 database/table 적어줌으로서 어떤 걸 삭제하는지 구분 

 

데이터베이스 전체 삭제 

DROP DATABASE  [dbname] ; 

 

테이블 전체 삭제 명령어 

DROP TABLE [tablename] ;

 

1-3. Alter 명령어

수정 명령어

 

테이블에 컬럼 추가
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_type];
 
테이블의 컬럼 타입 변경
ALTER TABLE [table_name] MODIFY COLUMN [column_name] [column_type];

 

테이블의 컬럼 이름 변경
ALTER TABLE [table_name] CHANGE COLUMN [old_column_name] [new_column_name] [new_column_type];
 
테이블의 컬럼 삭제
ALTER TABLE [table_name] DROP COLUMN [column_name];

 

테이블에 컬럼 인덱스 주기
ALTER TABLE [table_name] DROP INDEX [index_name];
 
테이블에 PRIMARY KEY 만들기
ALTER TABLE [table_name] ADD PRIMARY KEY( column_name_on_this_table );
 
테이블에 PRIMARY KEY 삭제
ALTER TABLE [table_name] DROP PRIMARY KEY;
 
테이블 명 바꾸기
ALTER TABLE [old_table_name] RENAME [new_table_name];
 

1-4. Rename 명령어

테이블 이름 변경

데이터베이스 이름 변경 (x)

 

* 테이블 이름 변경
RENAME TABLE [old_table_name] TO [new_table_name];
 :  하나의 테이블 이름 변경


* 여러 테이블 이름 변경
RENAME TABLE [old_table_name1] TO [new_table_name1], [old_table_name2] TO [new_table_name2];
: 여러 개의 테이블 이름을 한 번에 변경


* Delete vs. Drop vs. Truncate 명령어 차이점

DML의 DELETE 명령어: WHERE문과 같은 조건문을 붙여서 원하는 곳만 삭제 (데이터 삭제한 공간 재사용)

DDL의 DROP 명령어: 테이블 혹은 데이터베이스를 모두 삭제 (

DDL의 TRUNCATE: DROP 후 CREATE (데이터 존재하던 공간까지 제거)


2. DML; Data Manipulation Language 데이터 조작 쿼리문 : 추가/수정/삭제

insert, update, delete, merge, lock table : 조건문 붙여서 능동적으로 명령하는 쿼리문

 

2-1. INSERT 명령어 

데이터를 테이블에 넣기

생성되어 있는 테이블에 원하는 값 삽입

 

 

INSERT INTO {table_name} (column1, column2, ... ) VALUES (data1-1, data1-2, ... ), (data2-1, data2-2, ... );

 

INSERT [LOW_PRIORITY DELAYED HIGH_PRIORITY] [IGNORE]       *|  키워드 중 하나만 선택해서 사용 가능 

                                                                                                                       *  [IGNORE] 중복키 에러 발생 시 신규 입력 레코드 무시 
    [INTO] table_name                                                                               *  [INSERT INTO] = [INSERT] 
    [PARTITION (partition_name [, partition_name] ...)]                      * 하나의 테이블을 여러 개 테이블로 분리해서 관리
    [(col_name [, col_name] ...)]
    { {VALUES | VALUE} (value_list) [, (value_list)] ... } 
    [AS row_alias[(col_alias [, col_alias] ...)]]
    [ON DUPLICATE KEY UPDATE assignment_list]              * 데이터 추가 시, UNIQUE 인덱스 or PRIMARY  KEY에서 중복 값

                                                                                                           발생 시, 기존 행 업데이트 


2-2. UPDATE 명령어

생성된 테이블에 삽입되어있는 값 수정

이미 있는 테이블에 존재하는 데이터 수정

 

 

UPDATE {table_name} SET {column_name}={new_data} WHERE {condition};

 

 

* alter vs update 명령문 차이점

  • 데이터 정의 DDL ALTER : 데이터베이스에서 테이블의 속성을 추가, 삭제, 수정

ALTER TABLE [table_name] ADD [column_name] [column_type];

ALTER TABLE [table_name] DROP COLUMN [column_name];

ALTER TABLE [table_name] RENAME COLUMN [old_name] TO [new_name];

ALTER TABLE [table_name] ALTER COLUMN [column_name] [column_type]; 

 

  •  데이터 조작 DML UPDATE : 데이터베이스의 레코드 수정(업데이트)

UPDATE [table_name] SET column_name1 = value1, column_name2 = value2, ..., column N = value N Where [조건] ;


2-3. Delete 명령어

데이터를 테이블에서 삭제 

ex. 회원 탈퇴 요청, 등록한 게시물 삭제 요청, database 내 저장공간 확보 위한 삭제 요청

 

DELETE FROM {table_name} WHERE {condition}; 

 

DELETE FROM table_name [WHERE where_condition]

 

  • 하나의 테이블에 대해 1건 or 여러 건의 row(행) 삭제 

--> update, insert처럼 별도 column 명시해서 그 열만 삭제 못함 

  • where구 지정, 생략 가능

ex. mysql> DELETE FROM posts WHERE user_id = 1;


3. DQL; Data Query Language  데이터 검색/ 조회

Query ; 질문하다 묻다

 

데이터베이스 서버에게 데이터를 달라고 요청하는 것 

3-1. SELECT

Select 명령어

생성된 테이블에서 원하는 값 선택하여 가져오기

 

기본 선택 명령 (table_name 테이블에서 모두 가져오기)
SELECT * FROM [table_name];
 
WHERE문 포함 선택 명령어 (table_name 테이블에서 name이 '깜이군'인 값 가져오기
SELECT * FROM [table_name] WHERE name='깜이군'; 
SELECT * FROM [table_name] WHERE name LIKE '깜이군';
 
애매한 것도 모두 선택하는 명령어(table_name 테이블에서 name에 '깜이' 들어가는 것 모두 가져오기)
SELECT * FROM [table_name] WHERE name LIKE '%깜이%';
 
선택 후 name 컬럼으로 오름차순 정렬하는 명령어(내림차순에는 뒤에 붙여줘야 하지만, 오름차순에는 뒤에 ASC 붙이지 않아도 가능)
SELECT * FROM [table_name] ORDER BY name;
SELECT * FROM [table_name] ORDER BY name ASC;
 
선택 후 name 컬럼으로 내림차순 정렬하는 명령어
SELECT * FROM [table_name] ORDER BY name DESC;
 
선택 후 여러 컬럼으로 정렬하는 명령어(우선순위 name > email)
SELECT * FROM [table_name] ORDER BY name, email;

SELECT [column_name] FROM [table_name] ; 


* column 별칭 사용해서 출력하는 방법 

[column_name] , 공백, 별칭 쓰기

SELECT last_name "성명", salary "급여" FROM [table_name]

 

 

[post] 테이블의 모든 데이터 조회

mysql> SELECT * FROM [posts]


열 지정해서 원하는 열 column만 표시

mysql> SELECT [posts.title] FROM [posts];

mysql> SELECT [title] FROM [posts];

 

내용 함께 보고 싶을 때

,로 나열하면 여러 열column의 값을 테이블에서 뽑아올 수 

mysql> SELECT [posts.title], [posts.content] FROM [posts]; 


WHERE절 (기본 조건 표현식)

조건 걸기

post 테이블에 많은 row 행 중에 필요한 행만 검색

 

WHERE user_id=1

(=는 비교 연산자로, 좌변 우변 같으면 True/ 같지 않으면 False)

 

mysql> SELECT id, title, content, user_id FROM posts WHERE user_id =1


select id, email, password from users; 

select users.id, users.email, users.password from users; 

두 개의 코딩 결과는 같은데 어떻게 다르냐면, 

일단 지금은 테이블이 users 하나니까, 괜찮은데, 

 

만약 join_left, join_right 를 한다면, 

'select id. email, password from users left  join posts on = ' 라고 할 때,

mysql이 id, email,password를 users에서 select 하라는건지 posts에서 select 하라는건지 

순서를 모른다.

 


WHERE절 (복수 조건 표현식)

and, or, not 사용

 

SELECT * FROM posts WHERE user_id = 1 AND created_at < '2022-04-15 00:00:00';

 

  • AND 연산:  조건을 만족하는 행을 집합으로 표현했을 때 이들 집합이 겹치는 교집합
  • OR 연산: 합집합으로 계산
  • NOT 연산자: 오른쪽에 조건 표현식이 참(True)이면 NOT이 붙어서 반대 거짓(False)를 반환

WHERE + LIKE

LIKE + %를 합쳐서,

  • 문자열 맨 앞의 단어와 일치
  • 문자열의 중간에 검색하고자 하는 단어가 포함되어 있는 경우
  • 문자열 맨 뒤에 있는 경우

1) 문자열 맨 앞의 단어와 일치하는 경우 검색 'HTML%'

SELECT id, title, content, user_id FROM posts WHERE content LIKE 'HTML%';

2) 문자열의 중간에 검색하고자 하는 단어가 포함되어 있는 경우 LIKE %HTML%

SELECT id, title, content, user_id FROM posts WHERE content LIKE 'HTML%';

 


1) 스키마 생성, 스키마(Schema) 설계

데이터베이스 생성

CREATE DATABASE [database_name]

 

생성된 데이터베이스에 접근하는 명령어

USE [database_name];

 

서비스에 필요한 데이터를 저장할 수 있는 데이터베이스 시스템을 구축할 때,

가장 먼저 스키마 생성(테이블 객체를 담을 수. 이후 테이블 정의)

mysql> USE westagram;           ------1
mysql> SHOW TABLES;            ------2

Empty set (0.00 sec)                  -----3

 

1 명령 프롬프트에서 instagram 스키마를 사용하겠다고 MySQL 서버에 알려주고,
SHOW TABLES; 명령을 전달하면 해당 스키마 내에 테이블(table) 객체 목록을 출력해볼 수 있습니다.
3 아직까지는 테이블을 생성하지 않았으니 테이블의 정보가 없습니다.

 

데이터베이스 객체

 데이터베이스 내 실체를 가지는 어떤 것 

 

데이터베이스 객체 이름 규칙: 

- 중복 x 

- 영어로 시작, 숫자로 시작x, 

- 길이 초과 x 

 

스키마 Schema

 

mysql 접속 - show databases; 명령 (데이터베이스 목록 출력) - 기본적으로 생성되는 데이터베이스 존재 

2) Table 생성

CREATE TABLE [table_name] (field, field, field, constraint); 

 

RDBMS에서 스키마 내에서 가장 먼저 만드는 객체중에 하나

 

스키마 설계도(ERD, Entity Relationship Diagram) 참고해서 테이블 형성 

  • 위스타그램의 회원 정보를 저장할 사용자 테이블(users table)
  • 사용자가 등록한 게시글 정보가 담길 게시글 테이블(posts table)

두 개를 기준으로 DDL을 사용해서 실제로 테이블을 구축

 

 

CREATE TABLE {테이블명} 

작성하고 싶은 테이블 이름 지정, 열(column) 정의

 

열(column)- 자료형, 제약 조건 지정

 

자료형

INTEGER, VARCHAR, DATETIME 등

 

특히 자주 사용되는 VARCHAR나 CHAR 문자열형: 최대길이 정해줘야

 

제약 조건

자료형 뒤에 오는 NULL, NOT NULL, PRIMARY KEY

문자 그대로 테이블 혹은 컬럼에 제약을 설정함으로써 저장될 데이터를 제한

 

ex. NOT NULL : 해당 열에 NULL 값이 저장되지 않도록 제한하는 조건

 

 


2)-1. DDL을 사용해서 데이터베이스에 사용자 테이블(users) 생성

 

mysql> CREATE TABLE users 
(
  id INT NOT NULL AUTO_INCREMENT,                    # id 칼럼을 정수, NULL을 허락하지 않으며 값을 자동증가하게 설정
  name VARCHAR(50) NOT NULL,                             # name 칼럼을 50 bytes의 크기를 가지는 문자열, NULL을 허락하지 않음
  email VARCHAR(200) NOT NULL,
  profile_image VARCHAR(1000) NULL,    
  password VARCHAR(200) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),                # 데이터의 이력관리를 위해서 생성 시간을 기록
  updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,      # 데이터의 이력관리를 위해서 변경 시간을 기록
 PRIMARY KEY(id)                                                                                            # 이 테이블의 Primary Key를 id 로 설정
);                                                                             # 쿼리문은 ; 로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성할 수 

 

mysql> DESC users;
DESC users;

테이블을 생성한 후에 원하는 대로 잘 생성 되었는지 확인

테이블의 정보를 보여줌


2)-2. DDL을 사용해서 데이터베이스에 게시물 테이블(posts) 생성

posts 테이블을 생성할 때는

한 가지 더 고려

 

사용자와 게시물이 1:M 관계이므로,

게시물 테이블에는 어떤 사용자가 작성한 게시글인지 고려.

 

테이블 간에 부모 자식 관계를 지정(데이터의 정합성을 위함)하기 위해서

외부키(FOREIGN KEY) 제약 조건 설정

 

자식 테이블(posts)에 FOREIGN KEY를 지정해 부모 테이블을 참조하도록 합니다.

부모 테이블에서 참조될 열반드시 유일성을 가져야 하므로 보통 PRIMARY KEY를 지정

 

mysql> CREATE TABLE posts
(
  id INT NOT NULL AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  content VARCHAR(2000) NULL,
  user_id INT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  PRIMARY KEY (id),
  FOREIGN KEY (user_id) REFERENCES users (id) # 외래키를 걸어줄 칼럼과 참조할 테이블과 칼럼을 순서대로 적어줍니다.
);

 

테이블을 생성한 후에 항상 원하는 대로 잘 생성 되었는지 확인

mysql> DESC posts; 
+------------+---------------+------+-----+-------------------+-----------------------------+
| Field      | Type          | Null | Key | Default           | Extra                       |
+------------+---------------+------+-----+-------------------+-----------------------------+
| id         | int           | NO   | PRI | NULL              | auto_increment              |
| title      | varchar(100)  | NO   |     | NULL              |                             |
| content    | varchar(3000) | YES  |     | NULL              |                             |
| user_id    | int           | NO   | MUL | NULL              |                             |
| created_at | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp     | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+------------+---------------+------+-----+-------------------+-----------------------------+
```

 

MUL : 다른 테이블의 PK를 참조하는 FK는 MUL로 표현(MULTIPLE)

posts 테이블의 여러 행(row)이 동일한 값을 가질 수 있음을 의미

예를 들어서, 다수의 게시물(post)가 동일한 user_id를 가질 수 있기 때문입니다.


3) 테이블 변경

가장 간단한 방법은 

DROP TABLE 명령어로 테이블을 완전히 삭제하고 

변경된 구조에 맞게 CREATE TABLE 명령으로 다시 생성하는 것입니다. 

하지만 이 방법은 초기에 처음 데이터베이스를 구축할 때 이거나 테이블이 비어있는 경우에 사용할 수 있는 방법

 

이미 서비스되고 있는 경우에는 테이블에 많은 데이터가 존재하는 경우가 대부분이기 때문에,

데이터를 그대로 유지하면서 테이블의 구조를 변경할 수 있는 방법 = ALTER TABLE

 

테이블의 구조 변경하는 명령어

ALTER TABLE [table_name] MODIFY {column} {data structure} {constraint};


 

* 열(column) 추가
Ex. users 테이블에 age 열을 추가

ALTER TABLE 명령에 

변경하고자하는 테이블명(users)/ 행위(ADD) / 열 이름(age) / 자료형(INT) / 제약 조건(NOT NULL) 순서로 지정하면, 

새롭게 나이를 저장할 수 있는 컬럼을 users 테이블에 추가할 수 있습니다.

 

mysql> ALTER TABLE users ADD age INT NOT NULL;

mysql> desc users;

 

 

* 열(column) 삭제

EX. users 테이블의 profile_image 열을 삭제

 

ALTER TABLE로 열을 삭제할 때는

변경하고자하는 테이블명(users) / 행위(DROP) / 열 이름(profile_image) 순서로

삭제하고 싶은 열을 지정

 

mysql> ALTER TABLE users DROP profile_image;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc users;

 

 

* 열(column) 수정

EX. posts 테이블의 content 열의 자료형을 VARCHAR에서 TEXT로 변경

mysql> ALTER TABLE posts MODIFY content TEXT NULL;

MODIFY가 아닌 CHANGE 명령을 통해서 열 이름도 변경할 수


4) 테이블 삭제

[1] DROP TABLE 명령 (테이블 삭제 = 테이블, 테이블 안의 데이터 삭제)

 

mysql> DROP TABLE posts;

 

테이블 객체안에 포함된 모든 데이터도 함께 삭제

그렇기 때문에 실수로 테이블을 삭제하지 않도록 신중하게 실행해야 하는 명령

 

[2] 테이블은 그대로 두고 데이터만 전부 삭제 (테이블 안의 데이터만 삭제, 테이블 삭제x)

ex. 테스트용 데이터베이스의 경우, 매번 테스트 시작 전에 테이블의 값들 전부 지워주는 작업이 필수로 필요.

DELETE 명령을 사용해서 테이블 내의 데이터만 삭제할 수 있습니다.

 

mysql> DELETE FROM posts WHERE condition;

 

행(row) 단위로 내부적으로 처리하기 때문에 삭제할 행이 많으면 처리 속도가 상당히 늦어짐

 

 

[3] 삭제할 행이 많을 경우 (테이블 안의 모든 데이터(행) 삭제/ 테이블 삭제x)

 TRUNCATE TABLE 명령 -> 모든 행 삭제

 

mysql> TRUNCATE TABLE posts;

5) 데이터 조회/ 검색

Select 문장에 조건 지정, 선택해서 데이터 가져오기 (= 검색) 

 

데이터 검색 조건 방법

1. 열 column 지정 

2. 행row 지정 

 

3-1. SELECT

SELECT [column_name] FROM [table_name] ; 

 

* column 별칭 사용해서 출력하는 방법 

[column_name] , 공백, 별칭 쓰기

SELECT last_name "성명", salary "급여" FROM [table_name] 

 

 

[post] 테이블의 모든 데이터 조회

mysql> SELECT * FROM [posts] 


열 지정해서 원하는 열 column만 표시

mysql> SELECT [posts.title] FROM [posts];

mysql> SELECT [title] FROM [posts];

 

내용 함께 보고 싶을 때

,로 나열하면 여러 열column의 값을 테이블에서 뽑아올 수 

mysql> SELECT [posts.title], [posts.content] FROM [posts]; 


WHERE절 (기본 조건 표현식)

조건 걸기

post 테이블에 많은 row 행 중에 필요한 행만 검색

 

WHERE user_id=1

(=는 비교 연산자로, 좌변 우변 같으면 True/ 같지 않으면 False)

 

mysql> SELECT id, title, content, user_id FROM posts WHERE user_id =1

 

WHERE절 (복수 조건 표현식)

and, or, not 사용

 

SELECT * FROM posts WHERE user_id = 1 AND created_at < '2022-04-15 00:00:00';

 

  • AND 연산:  조건을 만족하는 행을 집합으로 표현했을 때 이들 집합이 겹치는 교집합
  • OR 연산: 합집합으로 계산
  • NOT 연산자: 오른쪽에 조건 표현식이 참(True)이면 NOT이 붙어서 반대 거짓(False)를 반환

WHERE + LIKE

LIKE + %를 합쳐서,

  • 문자열 맨 앞의 단어와 일치
  • 문자열의 중간에 검색하고자 하는 단어가 포함되어 있는 경우
  • 문자열 맨 뒤에 있는 경우

1) 문자열 맨 앞의 단어와 일치하는 경우 검색 'HTML%'

SELECT id, title, content, user_id FROM posts WHERE content LIKE 'HTML%';

2) 문자열의 중간에 검색하고자 하는 단어가 포함되어 있는 경우 LIKE %HTML%

SELECT id, title, content, user_id FROM posts WHERE content LIKE 'HTML%';

 

 

6) 테이블 결합 (RDBMS 해당)

여태까지는 하나의 테이블에 많은 데이터 저장.

실제 서비스에서 데이터를 정규화해서 여러 개 테이블로 나누어 저장

 

그렇기에, 복수의 테이블 결합해서 데이터 검색 

 

 

ex. 위스타그램 게시물 목록에서

각 게시물 마다

사용자 이름 name, 제목title, 내용content을 한번에 보여주기 위해서,

users과 posts 테이블을 결합

 

// 목표 결과
+----+--------------+------------------------------+----+-----------------+
| id      | title                | content                                         | id   |       name            |
+----+--------------+------------------------------+----+-----------------+
|  1 | 위코드 1일차    | HTML과 CSS 익숙해지기..                |  1     | Rebekah Johnson |
|  2 | 위코드 2일차    | Javascript 기본 문법 학습..              |  1     | Rebekah Johnson |
|  3 | 위코드 3일차    | 웹서비스의 역사와 발전 세션을 듣고.. |  1    | Rebekah Johnson |
|  5 | 자료구조 1번    | BigO Notation이란 무엇인가?          |  2.    | Fabian Predovic |
|  6 | 자료구조 2번    | 시간 복잡도와 공간 복잡도에 대해서.. |  2    | Fabian Predovic |
|  7 | 프론트 개발 입문 | 프론트 입문 HTML이란 무엇인가?     |  3  | Elenor Gottlieb |
+----+--------------+------------------------------+----+-----------------+

 

6)-1 곱집합

실무에서 많이 사용되지 않음. (필요한 경우 없고, 비용 많이 드는 연산)

 

두 개의 집합을 곱하는 연산 방법

cf. 합집합(UNION) 교집합(INTERSECT)

 

시즌 집합 {시즌1, 시즌2, 시즌3}과 회차 집합 {1화, 2화, 3화, 4화, 5화, 6화, 7화, 8화}으로 아래와 같은 편성표

// 비밀의 숲
+---------+----------+---------+---------+----------+---------+---------+---------+
| 시즌1-1화 | 시즌1-2화 | 시즌1-3화 | 시즌1-4화 | 시즌1-5화 | 시즌1-6화 | 시즌1-7화 | 시즌1-8화 |
+---------+----------+---------+---------+----------+---------+---------+---------+
| 시즌2-1화 | 시즌2-2화 | 시즌2-3화 | 시즌2-4화 | 시즌2-5화 | 시즌2-6화 | 시즌2-7화 | 시즌2-8화 |
+---------+----------+---------+---------+----------+---------+---------+---------+
| 시즌3-1화 | 시즌3-2화 | 시즌3-3화 | 시즌3-4화 | 시즌3-5화 | 시즌3-6화 | 시즌3-7화 | 시즌3-8화 |
+---------+----------+---------+---------+----------+---------+---------+---------+

 

 

6)-2 교차집합 (Cross Join)

데이터베이스에서 테이블(집합)과 테이블(집합)의 곱집합을 계산하는 방법으로 교차결합(Cross JOIN)

FROM에 여러 개의 테이블을 ,로 구분지어 지정

//users 테이블과 posts 테이블을 집합으로
{user1, user2, user3, user4} X {post1, post2, post3, post4, post5}

(user1, post1), (user1, post2), (user1, post3), (user1, post4), (user1, post5)
(user2, post1), (user2, post2), (user2, post3), (user2, post4), (user2, post5)
(user3, post1), (user3, post2), (user3, post3), (user3, post4), (user3, post5)
(user4, post1), (user4, post2), (user4, post3), (user4, post4), (user4, post5)
(user5, post1), (user5, post2), (user5, post3), (user5, post4), (user5, post5)

 

 

mysql> SELECT 
posts.id, 
posts.title, 
posts.user_id, 
posts.content, 
users.id, 
users.name 
FROM posts, users 

+----+------------+---------+----------------------------+----+------------------+
| id     | title              | user_id    | content                                    | id     | name                    |
+----+------------+---------+----------------------------+----+------------------+
|  1    | 위코드 1일차  |       1          | HTML과 CSS 익숙해지기..       |  1 | Rebekah Johnson  |
|  1    | 위코드 1일차  |       1         | HTML과 CSS 익숙해지기..       |  2 | Fabian Predovic  |
|  1    | 위코드 1일차  |       1         | HTML과 CSS 익숙해지기..       |  3 | Elenor Gottlieb  |
|  1   | 위코드 1일차   |       1         | HTML과 CSS 익숙해지기..       |  4 | Madge Ledner     |
|  1   | 위코드 1일차   |       1         | HTML과 CSS 익숙해지기..       |  5 | Zelma Kunde      |
|  2   | 위코드 2일차  |       1 | Javascript 기본 문법 학습..              |  1 | Rebekah Johnson  |
|  2   | 위코드 2일차  |       1 | Javascript 기본 문법 학습..             |  2 | Fabian Predovic  |
|  2   | 위코드 2일차  |       1 | Javascript 기본 문법 학습..             |  3 | Elenor Gottlieb  |
|  2   | 위코드 2일차  |       1 | Javascript 기본 문법 학습..             |   4 | Madge Ledner     |
|  2   | 위코드 2일차  |       1 | Javascript 기본 문법 학습..             |  5 | Zelma Kunde      |
|  3   | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.  |  1 | Rebekah Johnson  |
|  3   | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.      |  2 | Fabian Predovic  |
|  3   | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.      |  3 | Elenor Gottlieb  |
|  3   | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.      |  4 | Madge Ledner     |
|  3   |  위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  5 | Zelma Kunde      |
|  5   | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?         |  1 | Rebekah Johnson  |
|  5   | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?         |  2 | Fabian Predovic  |
|  5   | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?         |  3 | Elenor Gottlieb  |
|  5   | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?         |  4 | Madge Ledner     |
|  5   | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?         |  5 | Zelma Kunde      |
|  6   | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  1 | Rebekah Johnson  |
|  6   | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  2 | Fabian Predovic  |
|  6   | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  3 | Elenor Gottlieb  |
|  6   | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  4 | Madge Ledner     |
|  6   | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  5 | Zelma Kunde      |
|  7   | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  1 | Rebekah Johnson  |
|  7   | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  2 | Fabian Predovic  |
|  7   | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  3 | Elenor Gottlieb  |
|  7   | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  4 | Madge Ledner     |
|  7   | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  5 | Zelma Kunde      |
+----+------------+---------+----------------------------+----+------------------+

6)-3 내부결합 (Inner Join)

기준이 되는 테이블 (left table)과

join이 걸리는 테이블(right table)

양쪽 모두에 결합조건이 matcing되는 row만 검색하는 방법

 

users 테이블의 id와

posts 테이블의 user_id가

매칭되는 row만을 검색

 

+----+------------+---------+----------------------------+----+------------------+
| id    | title                | user_id   | content                                   | id    | name                     |
+----+------------+---------+----------------------------+----+------------------+
|  1    | 위코드 1일차  |       1 | HTML과 CSS 익숙해지기..                 |  1  | Rebekah Johnson  |
|  1    | 위코드 1일차  |       1 | HTML과 CSS 익숙해지기..                |  2 | Fabian Predovic  |
|  1   | 위코드 1일차  |       1 | HTML과 CSS 익숙해지기..                |  3 | Elenor Gottlieb  |
|  1   | 위코드 1일차  |       1 | HTML과 CSS 익숙해지기..                |  4 | Madge Ledner     |
|  1   | 위코드 1일차  |       1 | HTML과 CSS 익숙해지기..                |  5 | Zelma Kunde      |
|  2   | 위코드 2일차  |       1 | Javascript 기본 문법 학습..              |  1 | Rebekah Johnson  |
|  2 | 위코드 2일차  |       1 | Javascript 기본 문법 학습..                 |  2 | Fabian Predovic  |
|  2 | 위코드 2일차  |       1 | Javascript 기본 문법 학습..                 |  3 | Elenor Gottlieb  |
|  2 | 위코드 2일차  |       1 | Javascript 기본 문법 학습..                 |  4 | Madge Ledner     |
|  2 | 위코드 2일차  |       1 | Javascript 기본 문법 학습..                  |  5 | Zelma Kunde      |
 3 | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  1 | Rebekah Johnson  |
|  3 | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  2 | Fabian Predovic  |
|  3 | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  3 | Elenor Gottlieb  |
|  3 | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  4 | Madge Ledner     |
|  3 | 위코드 3일차  |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  5 | Zelma Kunde      |
|  5 | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?   |  1 | Rebekah Johnson  |
|  5 | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?   |  2 | Fabian Predovic  |
|  5 | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?   |  3 | Elenor Gottlieb  |
|  5 | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?   |  4 | Madge Ledner     |
|  5 | 자료구조 1번  |       2 | BigO Notation이란 무엇인가?   |  5 | Zelma Kunde      |
|  6 | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  1 | Rebekah Johnson  |
|  6 | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  2 | Fabian Predovic  |
|  6 | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  3 | Elenor Gottlieb  |
|  6 | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  4 | Madge Ledner     |
|  6 | 자료구조 2번  |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  5 | Zelma Kunde      |
|  7 | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  1 | Rebekah Johnson  |
|  7 | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  2 | Fabian Predovic  |
 7 | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  3 | Elenor Gottlieb  |
|  7 | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  4 | Madge Ledner     |
|  7 | 프론트 개발   |       3 | 프론트 입문 HTML이란 무엇인가?   |  5 | Zelma Kunde      |
+----+------------+---------+----------------------------+----+------------------+

 

교차 결합으로 계산된 곱집합에 

결합조건(users.id = posts.user_id) 검색하는 것= 내부결합(Inner Join)

 

WHERE절을 사용해서 내부결합을 계산할 수 있습니다.

 

내부 결합= 교차 결합의 부분집합

 

mysql> SELECT 
posts.id,
posts.title,
posts.user_id,
posts.content
users.id,
users.name
FROM posts, users
WHERE posts.user_id = users.id;
+----+--------------+---------+----------------------------+----+-----------------+
| id      | title                   | user_id   | content                                         | id     | name                     |
+----+--------------+---------+----------------------------+----+-----------------+
|  1     | 위코드 1일차       |       1           | HTML과 CSS 익숙해지기..       |  1 | Rebekah Johnson |
|  2    | 위코드 2일차      |                  | Javascript 기본 문법 학습..     |  1 | Rebekah Johnson |
|  3   | 위코드 3일차      |       1            | 웹서비스의 역사와 발전 세션을 듣고.|  1 | Rebekah Johnson |
|  5   | 자료구조 1번       |       2          | BigO Notation이란 무엇인가?   |  2 | Fabian Predovic |
|  6   | 자료구조 2번      |       2          | 시간 복잡도와 공간 복잡도에 대해서.|  2 | Fabian Predovic |
|  7   | 프론트 개발 입문 |       3         | 프론트 입문 HTML이란 무엇인가?   |  3 | Elenor Gottlieb |
+----+--------------+---------+----------------------------+----+-----------------+

같은 것만 추출 

 

 

INNER JOIN 키워드를 사용해서 내부결합을 계산

(이 방법을 많이 씀)


mysql> SELECT * FROM [table_1] 
INNER JOIN [table_2] ON [search_condition]
WHERE [where_condition]

 

ex. INNER JOIN으로 users 테이블과 posts

테이블을 user_id 기준으로 결합

 

mysql> SELECT 
posts.id,
posts.title, 
posts.user_id, 
posts.content 
users.id, 
users.name
FROM posts 
INNER JOIN [users] ON [posts.user_id = users.id];

 

 

6)-3 외부결합 (Outer Join)

Join = 교집합 (동일한 column 기준으로 테이블을 하나로 합친다)

  • LEFT (OUTER) JOIN
  • RIGHT (OUTER) JOIN
  • FULL (OUTER) JOIN

여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블을 기준으로 모두 출력

 

 


SUM() Syntax

 

SELECT SUM(column_name)
FROM table_name
WHERE condition;

 

AVG() Syntax

SELECT AVG(column_name)
FROM table_name
WHERE condition;

 

COUNT() Syntax 

SELECT COUNT(column_name)
FROM table_name
WHERE condition;

 

BETWEEN Syntax

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

 

SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;

 

SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;

 

 

 selects all products with a price between 10 and 20.

In addition; do not show products with a CategoryID of 1,2, or 3:

SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID NOT IN (1,2,3);

 

 

SELECT * FROM Products
WHERE ProductName BETWEEN "Carnarvon Tigers" AND "Chef Anton's Cajun Seasoning"
ORDER BY ProductName;

 

 

참고 https://www.w3schools.com/sql/sql_between.asp