[SQL] SQL 기본

유민국·2023년 7월 8일
0

DB

  • 데이터베이스는 데이터를 바라보는 관점에 따라 관계형, 계층형, 그래프 등으로 나눌 수 있다.

관계형 데이터베이스(Relational Database)

  • 엑셀의 표에서 행, 열 처럼 여러 개의 행(row)이 모여 테이블을 이루며, 행에는 여러 개의 열(column)이 있다.
  • 각 테이블간의 데이터가 연관되어 있어 효율적으로 데이터를 저장, 관리할 수 있음.
  • 일반적으로 DBMS라고 하면 RDBMS(관계형)를 가리킨다. oracleDB, 마이크로소프트 SQL 서버, MySQL과 MariaDB, PostgreSQL 등이 이에 해당

SQL

  • Structured Query Language
  • 데이터를 조작, 정의, 제어를 하기 위해 RDBMS에서 사용되는 프로그래밍 언어
  • 임베디드 SQL 데이터베이스 엔진으로, 독립적인 서버 프로세스를 갖지 않는다.
  • 설치 과정이 없고, 설정 파일도 존재하지 않는다.
  • 테이블, 인덱스, 트리거, 뷰 등을 포함한 완전한 데이터베이스가 디스크 상에 단 하나의 파일로 존재한다.
  • 퍼블릭 도메인5으로서 개인적 또는 상업적 목적으로 사용할 수 있다.

MySql

스키마(SHEMAS)

  • MySql의 데이터베이스로 각 스키마는 안쪽에 테이블들을 가지고 있다.

스키마 생성

CREATE SHEMA 'NAME' DEFAULT CHARCTER SET utf8

Table

  • DB에 데이터가 저장되는 부분으로 행과 열로 이루어져 있음

CREATE TABLE

CREATE TABLE table_name (
 id_num    INT NOT NULL AUTO_INCREMENT,
 mb_id     VARCHAR(20),
 mb_pw    VARCHAR(100),
  PRIMARY KEY(seq)
) ENGINE= MYISAM CHARSET=utf8;

Type

  • INT
  • VARCHAR(문자 최대 길이)
  • DATE
  • BLOB : 이진 대형 객체, 문자가 아닌 큰 데이터를 넣을 수 있다.
  • TEXT : String

Option

  • Primary Key(PK) : 데이터를 고유하게 구분해주는 역할, 중복 불가
  • Foreign Key(FK) : 다른 테이블과 연결시키는 역할, 외래키가 설정된 컬럼은 다른 테이블을 의존하게 된다.
  • Not Null(NN) : 데이터를 추가할 때 빈칸(null) 허용하지 않음
  • Unique(UQ) : 각 행이 서로 다른 값을 가지게 만든다.
  • Auto Increment : 행이 추가될 때마다 값을 자동으로 1씩 증가
  • Default : 데이터를 넣을 때 값을 지정하지 않을 경우(null), 기본으로 들어갈 값 지정

CRUD

  • SQL 문의 키워드는 대소문자를 구분하지 않으며, 줄바꿈을 하지 않아도 된다.

INSERT

  • 해당 컬럼 지정
INSERT INTO Student (name, birthday)
VALUES ("NAME", "2000-01-01")
  • 모든 컬럼에 값을 넣을 때는 컬럼명을 생략할 수 있다(순서에 맞게 작성)
insert into Student values (2, "name2", "2010-01-01")
  • 여러 행 INSERT : values 절에 여러 행의 값을 적는다.
    insert into Student (name, birthday)
    values ("name3", "2010-01-01"), ("name4", "2010-01-02")

SELECT

  • 모든 행과 열 조회
SELECT * FROM Student
  • 원하는 컬럼 조회
SELECT name FROM Student
  • 특정 값 찾기(WHERE)
select * from Student where name = "name1"
  • 부분 일치하는 문자열 찾기 (LIKE)
select * from Student where name like "na%"
  • 원하는 순서로 조회(ORDER BY : 오름차순(default), 내림차순(desc))
SELECT name FROM Student ORDER BY idx
SELECT name FROM Student ORDER BY idx DESC

UPDATE

  • 갱신, where 구문 사용해서 조건 입력 가능
UPDATE Student SET Name = 'newName1'

DELETE

  • 삭제, where 구문을 사용해서 조건 입력 가능
  • 데이터를 전부 삭제해도 테이블 구조는 그대로 남아 있음
DELETE FROM Student

테이블 변경

  • ALTER TABLE 구문 사용

컬럼 추가/삭제

ALTER TABLE Student ADD COLUMN Height INTEGER
ALTER TABLE Student drop COLUMN Height

테이블 삭제

  • DROP TABLE을 실행하면 데이터베이스 스키마와 디스크 파일에서 테이블이 삭제되며, 되돌릴 수 없음
DROP TABLE Student

컬럼 별명(AS)

SELECT Name AS "이름", Birthday AS "생일" FROM Student;
  • AS 생략 가능
SELECT Name "이름", Birthday "생일" FROM Student;

View

생성

  • 일반 테이블과 똑같은 방법으로 조회 가능
CREATE VIEW Birthday
  AS
  SELECT
    Name,
    Birthday bdate,
    substr(Birthday, 1, 4) YYYY,
    substr(Birthday, 6, 2) MM,
    substr(Birthday, 9, 2) DD
FROM Person;

삭제

DROP VIEW Birthday

CASE

SELECT
    Name,
    bdate,
    MM,
    CASE
        WHEN MM = '01' THEN 'Jan.'
        WHEN MM = '02' THEN 'Feb.'
        WHEN MM = '03' THEN 'Mar.'
        WHEN MM = '04' THEN 'Apr.'
        WHEN MM = '05' THEN 'May.'
        WHEN MM = '06' THEN 'Jun.'
        WHEN MM = '07' THEN 'Jul.'      
        WHEN MM = '08' THEN 'Aug.'
        WHEN MM = '09' THEN 'Sep.'
        WHEN MM = '10' THEN 'Oct.'
        WHEN MM = '11' THEN 'Nov.'
        WHEN MM = '12' THEN 'Dec.'
    END Month
FROM Birthday;

GROUP BY

  • group by 1 은 첫 번째 컬럼을 가리킴
SELECT round(Height), count(*)
FROM   Person
GROUP  BY 1;

HAVING

  • 첫 번째 행 중
SELECT round(Height), count(*)
FROM   Person
GROUP  BY 1;
HAVING count(*) > 1;

JOIN

  • 조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다.

INNER JOIN(내부 조인)

  • 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.

OUTER JOIN(외부 조인)

  • 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.

CROSS JOIN(상호 조인)

  • 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다.

SELF JOIN(자체 조인)

  • 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.

sql 함수 사용

round(123.4567, 2) : 123.5
substr('abcdefg', 3) : 3번째 자리 부터 끝까지
substr('abcdefg', 3, 2) : 3번짜 자리부터 두 글자
count(*) : 모든 행 수를 센다.
count(컬럼명) : 해당 컬럼에 데이터가 있는 행을 센다.
max()
min()
sum(컬럼명)
avg(컬럼명)

profile
안녕하세요 😊

0개의 댓글