MySQL - DDL / DML

타다닥·2024년 1월 14일
0
post-thumbnail

이제는 실전!
더 상세하게 알아보자!

사실 이 내용은 두 달 전.. 수업 후 노션에 정리해놓은 내용이다.
벨로그 게시글을 안올린지 오래 되어 밀린 기록들을 올리려 한다.

그래서 드는 생각은 아 이거 중요하구나! 이다.
배울 때는 몰랐다. 와르르 배우고 이걸 왜 알아야하는지, 그래서 언제 쓰이는지 중요성과 필요성을 제대로 느끼지 못했다. 근데 정말 모두모두 필요한 내용들이었다. 🎉

결국 프로젝트를 진행하면서 많은 걸 느꼈다.
백과 프론트 사이 데이터가 오고가는 것을 나도 확인하면서 진행하게 된다.
그리고 컨트롤러의 코드를 보면서 백에서 어떤 식으로 명령을 하는 지?
어느정도 내가 이해를 해야 수월했다. 알고 모르고의 차이가 아주 컸다!

아무튼 그렇다. 몰라서 나쁠 건 없다. 알면 다 좋은 것 들!


데이터 정의어 (DDL, Data Definition Language)

CREATE 문

  • 데이터와 테이블을 생성하는 명령어이다. (테이블 이름, 열 이름, 데이터 형식 등 지정)
  • CREATE로 생성할수있다.
    • 문법은 대문자 작성 권장, 이름이나 속성은 소문자로 작성해준다. 단어 사이는 언더바(_) 로 구분해준다.
    • SQL에서 기본적으로 사용되는 데이터 타입을 이름으로 정하는 것은 피하는 것이 좋다.
-- DATABASE 생성 (이모지 지원에 한계가 있다.)
CREATE DATABASE db_name 
-- DATABASE 설정
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

-- DATABASE 생성과 설정 (한글 인코딩, 이모지 지원 사용 가능.)
CREATE DATABASE db_name
DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
  • 테이블 만들기 CREATE TABLE
-- -------------------- 기본 형태
CREATE TABLE 테이블명 (
속성이름1 데이터타입1 PRIMARY KEY,
속성이름2 데이터타입2,
[FOREIGN KEY 속성이름 REFERENCES 테이블이름(속성이름)]
);

-- -------------------- 사용 예시
CREATE TABLE USER(
id varchar(10) PRIMARY KEY not null,
password VARCHAR(20) not null,
age INT UNSIGNED
);
  • 기본키, 외래키 정의가 가능하다.
-- -------------------- 기본 형태
CREATE TABLE 테이블명 (
속성이름1 데이터타입1 PRIMARY KEY,
속성이름2 데이터타입2,
[FOREIGN KEY 속성이름 REFERENCES 테이블이름(속성이름)]
);

-- -------------------- 사용 예시
-- customer 테이블의 custid 속성을 참조해서 외래키로 사용하겠다.
FOREIGN KEY (custid) REFERENCES customer(custid)

-- -------------------- cascade 사용 예시
-- 관련된 데이터가 어디선가 삭제 시 함께 삭제된다.
FOREIGN KEY (custid) REFERENCES customer(custid) on delete cascade);

ALTER 문

  • 생성된 테이블의 속성과 관련한 내용을 변경 할 수 있다.
  • 기본키, 외래키 변경이 가능하다.
-- -------------------- 기본 형태
-- 새로운 속성 추가 (column 추가)
ALTER TABLE 테이블명 ADD 속성이름 데이터타입;

-- 기존 속성 삭제 (column 삭제)
ALTER TABLE 테이블명 DROP COLUMN 속성이름;

-- 기존 속성 수정 (column 수정)
ALTER TABLE 테이블명 MODIFY 속성이름 데이터타입; 

-- -------------------- 사용 예시
ALTER TABLE user ADD gender ENUM('여자', '남자') not null; -- enum은 문자열만 가능.
ALTER TABLE user DROP COLUMN age;
ALTER TABLE user MODIFY gender VARCHAR(2) not null; 

DROP

  • 테이블의 구조와 데이터가 모두 삭제된다!
    • 테이블을 잘못 만들었거나 앞으로 아예 필요 없는 경우 사용한다. 완전히 지워지는 것!
    • TRUNCATE 의 경우 테이블 값들을 초기화 할 때 사용한다. 제목 행만 남긴다고 생각!
DROP TABLE 테이블명;
TRUNCATE TABLE 테이블명;

데이터 조작어 (DML, Data Manipulation Language)

INSERT 문

  • 테이블에 새로운 튜플을 추가
  • 필드와 값의 순서가 같아야 한다. 필드를 명시하지 않는 경우 테이블의 모든 칼럼에 값을 순서대로 작성해야 한다!
-- -------------------- 기본 형태
INSERT INTO 테이블명 (필드1, 필드2, 필드3, ...) VALUES (1,2,3, ...) ;
INSERT INTO 테이블명 VALUES (1,2,3, ...) ;

-- -------------------- 사용 예시
INSERT INTO user (id, password) VALUES ('jeong', '1234');
INSERT INTO user VALUES ('jeong', '1234', 99);

SELECT 문

  • 데이터를 검색하는 기본 문장이다. 질의어 (query)라고도 한다.
  • SQL문법 중 가장 많이 사용된다!
-- -------------------- 기본 형태
-- FROM, WHERE, SELECT 순으로 읽는다.
SELECT 속성이름, ... FROM 테이블이름 [WHERE 검색조건은 선택.] ;

-- 테이블명의 모든 값(*)을 조회 할 수 있다.
SELECT * FROM 테이블명 ;

-- 테이블의 특정 속성만 조회
SELECT 속성1, 속성2 FROM 테이블명 ;

-- -------------------- 사용 예시
-- member테이블에서 name이 '보노보노'인 사람의 phone을 찾아라.
SELECT phone FROM member [WHERE name = '보노보노'] ;
SELECT * FROM member ;
SELECT name, addr FROM member ;

SELECT문 - WHERE 과 ORDER BY

  • WHERE 에서 사용하는 조건

  • ORDER BY
    • 기본값은 PK를 기준으로 정렬한다.
    • 결과가 출력되는 순서를 조절해준다.
    • WHERE과 함꼐 사용이 가능하다. 꼭 WHERE 뒤에 나와야 한다!
    • ASC: Ascending, 오름차순 (기본값)
    • DESC: Descending, 내림차순
-- -------------------- 기본 형태
-- 조건 복합적으로 사용 시 꼭 순서대로 작성!
SELECT 속성이름, ... FROM 테이블이름 [WHERE 검색조건은 선택.][ORDER BY 속성이름] ;

-- -------------------- 사용 예시
-- custid가 bunny인 회원
select * from customer where custid='bunny';

-- birth가 2000-01-01 이후에 태어난 회원 조회
select * from customer where birth >= '2000-01-01';

-- birth가 2000-01-01 ~ 2005-01-01 사이에 태어난 회원 조회
select * from customer where birth between '2000-01-01' and '2005-01-01';

-- addr이 '대한민국 서울'이거나 '미국 로스앤젤레스'둘 중 하나라면 조회하겠다.
select * from customer where addr in('대한민국 서울', '미국 로스앤젤레스');

-- %는 앞 뒤로 아무 문자가 있어도 되고 없어도 된다. 즉 '대한민국'을 포함하기만 하면 전부 선택.
select * from customer where addr like '%대한민국%';

-- 언더바 2개. 앞에 2자리 뒤에 '수'가 들어오는 사람 조회. 총 3글자여야 한다.
select * from customer where custname like '__수';

-- 혼합해서 사용도 가능하다. 앞에 글자는 아무거나 상관없다. 뒤에서 두번째 글자가 '해'여야 한다.
select * from customer where custname like '%해_';

-- is null 사용 예시
select * from customer where custname is null;

-- -------------------- 복합 조건 사용 예시
-- AND, OR, NOT 
select * from customer where addr like '%대한민국%' AND birth <= '2000-05-05';
select * from customer where addr like '%대한민국%' OR birth <= '2000-05-05';

-- customer테이블을 custname을 기준으로 오름차순하겠다. 
select * from customer order by custname asc;

-- where과 order by 같이 쓰기. where이 앞에 와야 한다!
-- addr에 대한민국을 포함하고 잇는 회원 조회. 그리고 custname기준으로 내림차순 정렬하여 보여주기.
-- 조회를 먼저 하고 정렬하고 보여주게 되는 것이다.
select * from customer where addr like '%대한민국%' order by custname desc;

-- limit. 위와 동일하게 하면서 첫번째 1명만 가져오겠다.
-- 복합 조건을 사용하려면 꼭 아래 순서대로 작성해줘야한다!
select * from customer where addr like '%대한민국%' order by custname desc limit 1;

UPDATE 문

  • 테이블에서 특정 속성 값을 수정한다.
-- -------------------- 기본 형태
UPDATE 테이블명 SET 필드1 =1 WHERE 필드2 = 조건2;

-- -------------------- 사용 예시
UPDATE customer SET custname = '보노보노' WHERE custid = '해달';

DELETE

  • 테이블에서 기존 튜플을 삭제한다.
    • 삭제하려는 내용이 다른 곳에서 참조되고 있다면 삭제가 불가능하다. 참조되고 있는 데이터에서 우선적으로 삭제 후 삭제가 가능하다.
-- -------------------- 기본 형태
DELETE FROM 테이블명 WHERE 필드1 =1;

-- -------------------- 사용 예시
DELETE FROM customer WHERE custid = 'jeooong22';

Select 심화

  • DISTINCT
    • 중복된 데이터를 제거해준다.
-- -------------------- 기본 형태
SELECT [DISTINCT] 속성이름, ... FROM 테이블이름 [WHERE 검색조건은 선택.][ORDER BY 속성이름] ;

-- -------------------- 사용 예시
SELECT [DISTINCT] addr FROM customer;
  • LIMIT
    • 출력 개수를 제한한다.
-- -------------------- 기본 형태
SELECT [DISTINCT] 속성이름, ... 
FROM 테이블이름 [WHERE 검색조건은 선택.][ORDER BY 속성이름][LIMIT 개수] ;

-- -------------------- 사용 예시
SELECT * FROM customer WHERE addr like '%대한민국%' ORDER BY custname DESC LIMIT 1;
  • 집계 함수
    • SUM() : 합계
    • AVG() : 평균
    • MAX(), MIN() : 최대값, 최소값
    • COUNT() : 행 개수 세기
    • COUNT(DISTINCT) : 중복값을 제외한 행 개수 세기
-- -------------------- 사용 예시
SELECT COUNT(*) FROM orders;

-- as를 사용해 보여지는 이름을 지정할 수 있다. 새로운 속성을 만들어 준 셈.
SELECT custid SUM(amount) AS 'total_amount' FROM orders GROUP BY custid;
  • GROUP BY
    • 속성 이름끼리 그룹으로 묶을 수 있다.
    • HAVINGGROUP BY와의 결과를 나타내는 그룹을 제한한다.
-- -------------------- 기본 형태
SELECT [DISTINCT] 속성이름, ... 
FROM 테이블이름 [WHERE 검색조건은 선택.]
[GROUP BY 속성이름][HAVING 조건식]
[ORDER BY 속성이름][LIMIT 개수] ;

-- -------------------- 사용 예시
SELECT custid, SUM(amount) AS 'total_amount' FROM orders WHERE custid != 'bunny' GROUP BY custid HAVING SUM(amount) >= 5;
SELECT custid, SUM(amount) AS 'total_amount' FROM orders GROUP BY custid HAVING SUM(amount) >= 5;

JOIN

  • 두 테이블을 묶어서 하나의 테이블을 만드는 것이다. 원하는 값을 뽑아내기 위해!
-- -------------------- 기본 형태
SELECT 속성이름, ... 
FROM 테이블이름1, 테이블이름2
WHERE 조인조건 AND 검색조건 ;

SELECT 속성이름, ... 
FROM 테이블이름1 INNER JOIN 테이블이름2 ON 조인조건
WHERE 검색조건 ;
-- -------------------- 사용 예시
SELECT customer.addr, orders.* FROM customer
INNER JOIN orders ON customer.custid = orders.custid;
profile
프론트엔드 ㄱH발ㅈr ㅎH보ㅈr - ☆

0개의 댓글