데이터베이스/0 + SQL

[패스트캠퍼스] SQL 강의 1. 데이터베이스의 개요와 SQL 문법

힘들면힘을내는쿼카 2022. 12. 5. 00:56
728x90
반응형

데이터베이스의 개요

데이터베이스란?

데이터베이스는 데이터를 저장하고 조직화하는 시스템 입니다.
이말은 대량의 데이터를 처리할 때 유용하다는 의미 입니다.

왜 데이터베이스인가?

Excel, Spreadsheet 같은 응용프로램을 사용하여 데이터를 정합하고 차트 같은 것을 만들어본 경험이 있을 겁니다.
이러한 프로그램의 장점은 교육을 받지 않은 사람들도 쉽게 데이터로 작업할 수 있다는 점입니다.
하지만, 데이터의 용량이 커지고 데이터를 공유해야하는 상황이 발생하면 Excel, Spreadsheet같은 프로그램을 사용하기에는 어려움이 생길 것 입니다.

이러한 문제를 해결하기위해 데이터베이스를 사용합니다.
데이터베이스는 완전성에 정말로 효과적 입니다.
그 누구도 셀을 클릭하여 데이터를 변경하는 것을 원하지 않을 것 입니다.
이러한 것은 데이터베이스에서는 불가능한 작업 입니다.
데이터베이스는 또한 대용량의 데이터도 처리할 수 있습니다.
그 정도의 용량의 데이터라면 Excel, Spreadsheet에서는 충돌이 발생할 수 있습니다.
또한, SQL 구문이 있기 때문에 재사용 단계에서도 완벽하게 자동화할 수 있습니다.

데이터베이스 플랫폼

  • PostgreSQL
    • Free(Open Source)
  • MySQL, MariaDB
    • Free(Open Source)
  • MS SQL Server Express
    • Free, but with some limitations Compatible with SQL Server Windows only
728x90

테이블

테이블이란 데이터베이스에서 데이터를 타입(형태)를 정해놓고 모아 놓은 저장 공간

로 이루어진 데이터 표를 의미한다.

Excel, Spreadsheet에서는 sheet가 역할을 대신한다.

 

  • 열(컬럼)
    • 데이터를 저장하기 위한 틀
    • 컬럼의 이름과 값(데이터) 타입은 테이블을 만들 때 미리 정한다.
    • 컬럼의 이름은 동일한 테이블 내에서 중복이 불가하다.
    • 테이블은 반드시 1개 이상의 컬럼을 가져야 한다.
  • 행(로우)
    • 테이블의 값의 리스트
      • e.g) 하나의 행은 하나의 테이블의 값의 리스트
    • 같은 테이블 안에서 행은 항상 동일한 구조를 가진다.
    • 행을 단위로 데이터를 삽입한다.
  • 값(데이터)
    • 열(컬럼)에 속한 실제 데이터 값
    • 컬럼의 데이터 타입만을 값으로 가질 수 있다.

기본 문법#1(SQL: Structured Query Language)

SQL은 구조화된 질문 언어라는 의미 입니다.

사람이 데이터베이스에게 질문(SQL)하는 것이죠~

즉, SQL데이터베이스와 사람은 커뮤니케이션을 할 수 있습니다.

데이터 베이스 생성

fastcampus라는 이름의 데이터베이스 생성

CREATE DATABASE `fastcampus`;

테이블 생성

fastcampus 데이터 베이스에 idol 테이블 생성

CREATE TABLE fastcampus.idol (
    name VARCHAR(20),
    age INT,
    `group` VARCHAR(50)
);

테이블 이름 변경

idol테이블을 my_idol로 이름 변경

ALTER TABLE idol RENAME my_idol;

새로운 컬럼 추가

my_idol테이블에 team_name컬럼 추가

ALTER TABLE my_idol ADD COLUMN team_name VARCHAR(50);

컬럼 타입 변경

my_idol테이블에 team_name컬럼의 데이터 타입 변경

  • 기존: VARCHAR(50)
  • 변경: CHAR
    ALTER TABLE my_idol MODIFY COLUMN team_name CHAR;

기존 컬럼 이름 변경

team_namecompany_name으로 변경

ALTER TABLE my_idol 
RENAME COLUMN team_name TO company_name;

기존 컬럼 이름과 타입 변경

company_nameteam_name으로 변경하고 타입을 CAHR에서 VARCHAR(25)로 변경

ALTER TABLE my_idol 
CHANGE COLUMN company_name team_name VARCHAR(25);

컬럼 지우기

team_name 컬럼을 삭제한다.

ALTER TABLE my_idol DROP COLUMN team_name;

테이블 전체 데이터(값)만 삭제

fastcampus데이터 베이스에있는 my_idol테이블의 값만 삭제한다.

TRUNCATE TABLE fastcampus.my_idol 

테이블 삭제

my_idol테이블을 삭제한다.

DROP TABLE my_idol;

데이터베이스가 존재한다면 지우기

inflearn 데이터베이스가 존재하면 삭제

DROP DATABASE IF EXISTS inflearn;

존재하지 않으면 아래와 같은 로그 출력
Can’t drop database ‘inflearn’; database doesn’t exist

테이블이 존재한다면 지우기

my_money테이블이 존재하면 삭제

DROP TABLE IF EXISTS my_money

데이터 한 행 삽입

idol테이블의
name에는 아이유,
age에는 30
group에는 솔로가 삽입 된다.

이때, 삽입하고자 하는 컬럼명 리스트와 삽입데이터의 갯수는 같아야 합니다.

  • name, age, group 3개
  • 아이유, 30, 솔로 3개
INSERT INTO idol (name, age, `group`)
VALUES ("아이유", 30, "솔로");

group예약어이기 때문에 `으로 감싼다.

결과

데이터 여러행 삽입

INSERT INTO idol (name, age, `group`)
VALUES ("권지용", 35, "솔로"),
         ("정국", 26 "솔로"),
         ("츄", 24, "솔로")

결과

데이터 삭제

idol 테이블에서 name권지용인 행을 삭제한다.

DELETE FROM idol 
WHERE name = '권지용';

데이터 수정

idol 테이블에서 name아이유인 행의 name이지은으로 변경한다.

UPDATE idol 
SET name = '이지은'
WHERE name = '아이유'; 

 

반응형

실습

테이블 만들고 데이터 넣기

당신은 포켓몬 신입 SQL 컨설턴트로 고용되었다고 가정해봅시다.
당신의 상사가 당신에게 아래와 같은 업무처리를 요구했습니다..!

pokemon 데이터베이스와 mypokemon 테이블을 만들고, 캐터피, 피카츄, 이브이의 포켓몬 번호(number), 영문 이름(name), 타입 데이터(type)를 넣어주세요.

 

데이터베이스 생성

CREATE DATABASE pokemon;

테이블 생성

CREATE TABLE pokemon.mypokemon (
    number INT,
    name VARCHAR(20),
    `type` VARCHAR(10)
);

데이터 삽입

INSERT INTO pokemon.mypokemon (number , name, type)
VALUES (10, "caterpie", "bug"),
         (25, "pikachu", "electric"),
         (133, "eevee", "normal");

USE pokemon;
을 입력하면 pokemon 데이터베이스를 사용한다는 의미로
pokemon.mypokemon에서 mypokemon을 사용할 수 있다.

테이블 만들고 데이터 넣기2

상사가 두번째 업무를 주는 군요..!

pokemon 데이터베이스에 mynewpokemon 테이블을 만들고, 
캐터피, 피카츄, 이브이의 포켓몬 번호(number), 영문 이름(name), 타입 데이터(type)를 넣어주세요.

테이블 생성

CREATE TABLE pokemon.mynewpokemon (
    number INT,
    name VARCHAR(20),
    `type` VARCHAR(10)
);

데이터 삽입

INSERT INTO pokemon.mynewpokemon (number, name, `type`)
VALUES (77, "포니타", "불꽃"),
       (132, "메타몽", "노말"),
       (151, "뮤", "노말");

SELECT 문법

위에서 우리는 데이터베이스/테이블/데이터 생성(Create), 삭제(Delete), 수정(Update) 하는 방법을 배웠다.
이번에는 데이터를 조회(Read)하는 방법을 배워보자.!

데이터 조회

SELECT 123; -- 결과: 123
SELECT 1 + 2 + 3; -- 결과: 6
SELECT "ABC"; -- 결과: "ABC"

SELECT는 특정 테이블의 데이터를 선택하여 조회할 수 있다.

데이터 조회(FROM 사용)

pokemon 데이터베이스의 mynewpokemon 테이블 컬럼 전체 조회

SELECT * FROM pokemon.mynewpokemon;

결과

AS 문법

컬럼에 별명(Alias)을 만드는 문법이다.
테이블 내의 실제 컬럼 이름은 변하지 않으며, 별명은 쿼리 내에서만 유효하다.

SELECT [컬럼이름] AS [컬럼별명] FROM [테이블이름];

데이터 조회(AS 사용)

SELECT number as num, name as n, type as t 
FROM pokemon.mynewpokemon;

결과

조회 결과만 컬럼명이 별명일 뿐 실제 컬럼명은 변하지 않는다.!

실제 컬럼 이름은 변경하고 싶으면, 앞에서 배운 ALTER TABLE RENAME COLUMN TO구문을 사용한다.

ALTER TABLE [테이블이름] 
RENAME COLUMN [컬럼명] TO [새로운 컬럼명];

그렇다면 왜 별명을 사용하는 것 일까?

사람이 알아보기 쉽게 하기 위함이다.

지금은 1개의 테이블에서 데이터를 조회하지만, 나중에 가면 서로 연관 있는 여러 테이블을 join 하여 한번에 조회하게 된다.
이때 Alias를 사용하지 않으면 알아보기가 힘들어 진다.

// Alias 사용 전
SELECT *
  FROM MEMBER
 INNER JOIN TEAM
    ON MEMBER.ID = TEAM.MEMBER_ID;


// Alias 사용 후
SELECT *
  FROM MEMBER as M
 INNER JOIN TEAM as T
    ON M.ID = T.MEMBER_ID;

LIMIT 문법

  • 조회한 결과의 갯수에 제한을 두기 위함
    • 만약 포켓몬데이터를 100만건을 보유하고 있는데, LIMIT을 하지 않고 조회한다면….? 100만건이 조회된다…..
  • LMIT [행 갯수]형식으로 사용
  • 쿼리의 가장 마지막에 위치
  • 입력한 숫자가 전체 행 갯수보다 크다면, 보유하고 있는 행 까지만 조회

데이터 조회(LIMIT 사용)

SELECT number as num, name as n, type as t 
FROM pokemon.mynewpokemon
LIMIT 2;

결과

DISTINCT 문법

  • 중복된 데이터는 제외하고 동일한 값은 한 번만 가져옴
    • 컬럼에 어떠한 값들이 있는지 확인하고 싶을때 사용
    • 게임회사에서 100만개의 무기 데이터가 있는 무기 테이블에 있는 무기 종류를 확인하고 싶을때 사용한다.
  • DISTINT [컬럼명] 형식으로 사용
  • SELECT 절에 위치하여 컬럼의 유일한 값들을 가져옴

데이터 조회(DISTINCT 사용)

pokemon 테이블이 다음과 같을때

SELECT DISTINCT type FROM pokemon.mypokemon;

결과

실습2

데이터 추출 하기

아침에 출근하고 이메일을 확인했습니다.
상사가 당신에게 아래와 같은 업무 지시메일을 보냈습니다.

안녕하세요.
SQL 공부는 잘하고 있나요? 잘하고 계신다고 믿겠습니다.^^

협력사에서 아래의 SQL구문이 필요하다고 요청이 왔습니다.
오늘 오전에 마무리해서 메일로 공유 부탁 드립니다.
데이터는 제가 어제 mypokemon 테이블에 넣어 두었습니다.

1. 123 곱하기 456
2. 2310 나누기 30
3. '피카츄'라는 문자열을 '포켓몬'이라는 이름의 컬럼 별명으로 조회
4번 부터는 포켓몬 테이블을 참고하세요.
4. 모든 포켓몬들의 컬럼과 값 전체
5. 모든 포켓몬들의 이름 조회
6. 포켓몬들의 이름, 키, 무게 조회
7. 포켓몬들의 키를 중복 제거하고 조회
8. 모든 포켓몬의 공격력을 2배 하여 attack2라는 별명으로 이름과 함께 조회
9. 모든 포켓몬들의 이름을 '이름'이라는 별명으로 조회
10. 공격력은 '공격력', 방어력은 '방어력' 이라는 별명으로 조회
11. 포켓몬 테이블의 키 컬럼은 m단위 입니다. cm로 환산하여 'height(cm)'라는 별명으로 조회
12. 포켓몬 테이블에서 첫번째 행에 위치한 포켓몬 데이터만 컬럼 값 전체를 조회
13. 포켓몬 테이블에서 2개의 포켓몬 데이터만 이름은 '영문명'이라는 별명으로, 키는 '키(m)'라는 별명으로, 몸무게는 '몸무게(kg)'이라는 별명으로 조회
14. 포켓몬 테이블에서 모든 포켓몬들의 이름과 능력치의 합을 조회하고, 능력치의 합은 'total'이라는 별명으로 조회할것(능력치의 합은 공격력, 방어력, 속도의 합을 의미)
15. 포켓몬 테이블에서 모든 포켓몬들의 BMI 지수를 구하여 'BMI'라는 별명으로 조회하고 이때 이름도 함께 조회할것
 - BMI 지수 = 몸무게(kg) / {키(m)}^2
 - 포켓몬 테이블의 체중은 kg, 키는 m 단위

문의사항이 있으면 연락주세요.
감사합니다.

 

 

메일을 읽었으니 빨리 일을 해보자..!

1, 2, 3 사항

SELECT 123 * 456; -- 1
SELECT 2310 / 30; -- 2
SELECT '피카츄' as '포켓몬'; -- 3

4, 5, 6 사항

SELECT * FROM mypokemon; -- 4
SELECT name FROM mypokemon; -- 5
SELECT name, heigh, weight FROM mypokemon; -- 6

7, 8, 9 사항

SELECT DISTINCT height from mypokemon; -- 7
SELECT name, attack * 2 as attack2 from mypokemon; -- 8
SELECT name as '이름' FROM mypokemon; -- 9

10, 11, 12 사항

SELECT attack as '공격력',defense as '방어력' FROM mypokemon; -- 10
SELECT height * 100 as 'height(cm)' FROM mypokemon; -- 11
SELECT * FROM mypokemon limit 1; -- 12

13, 14, 15 사항

SELECT name as '영문명', height as '키(m)', weight as '몸무게' 
FROM mypokemon limit 2; -- 13

SELECT name, attack + defense + speed as total FROM mypokemon; -- 14

SELECT name, weight / height^2 as BMI FROM mypokemon; -- 15

 

결과

안녕하세요.
요청하신 SQL 순서대로 작성하여 보내드립니다.

SELECT 123 * 456; -- 1
SELECT 2310 / 30; -- 2
SELECT '피카츄' as '포켓몬'; -- 3
SELECT * FROM mypokemon; -- 4
SELECT name FROM mypokemon; -- 5
SELECT name, heigh, weight FROM mypokemon; -- 6
SELECT DISTINCT height from mypokemon; -- 7
SELECT name, attack * 2 as attack2 from mypokemon; -- 8
SELECT name as '이름' FROM mypokemon; -- 9
SELECT attack as '공격력',defense as '방어력' FROM mypokemon; -- 10
SELECT height * 100 as 'height(cm)' FROM mypokemon; -- 11
SELECT * FROM mypokemon limit 1; -- 12
SELECT name as '영문명', height as '키(m)', weight as '몸무게' FROM mypokemon limit 2; -- 13
SELECT name, attack + defense + speed as total FROM mypokemon; -- 14
SELECT name, weight / height^2 as BMI FROM mypokemon; -- 15

검토 요청드립니다.

감사합니다.

 

 

728x90
반응형

'데이터베이스 > 0 + SQL' 카테고리의 다른 글

[패스트캠퍼스] 3. SQL 기초2  (0) 2022.12.26
[패스트캠퍼스] 2. SQL 기초1  (0) 2022.12.19