TIL 38 | mySQL 기본쿼리문

dabin *.◟(ˊᗨˋ)◞.*·2021년 9월 13일
0

Database

목록 보기
2/6
post-thumbnail

mySQL 시작하기

mysql.server start -- 시작
mysql -u root -p -- 접속

쿼리문은 ';'로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성하면 된다.

DDL(Data Define Language)

데이터를 구성하는 논리적인 구조(데이터베이스 | 테이블)을 추가, 수정, 삭제한다. 메타데이터(데이터에 대한 데이터)를 다루문 쿼리문이다.

CREATE DATABASE [database name] CHARACTER SET [character set];

-- 현재 저장된 데이터 베이스 보기
SHOW DATABASES;

-- 한글 지원 character set으로 지정
CREATE DATABASE mysql_practice CHARACTER SET utf8mb4 COLLATE utf8mb4_general
_ci;

-- database 사용 
USE [database name]
USE mysql_practice

-- 표 확인
SHOW tables; -- 아무 것도 없으면 empty set

table 생성, 추가, 삭제

CREATE TABLE [table] (column1, column2 ...)
CREATE TABLE books(id INT NOT NULL, name VARCHAR(30));
-- id는 숫자 null이면 안됩니다!
-- name은 문자열을 저장해주시고 30바이트 이하로 해주세요! 

-- id를 정수, NULL을 허락하지 않으며 자동증가 하게 하려면? id INT NOT NULL AUTO_INCREMENT
-- Primary key를 id로 설정하려면? PRIMARY KEY (id)

DESC books; -- 표 설명
EXPLAIN books; -- 위와 같음

-- column 추가
ALTER TABLE [table name] ADD [column name] 데이터형식;
ALTER TABLE books ADD published_at DATE;

-- table 삭제
DROP TABLE [table name];
DROP TABLE books;

외래키를 사용할 경우(다른 테이블의 데이터를 참조할 경우)에는 표를 어떻게 생성할 수 있을까? FOREIGN KEYREFERENCES 두가지 옵션을 사용하면 된다. books 테이블의 데이터를 참조한다고 가정한다.

CREATE TABLES [table name]
(
    id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(100) NOT NULL,
    books_id INT,
    PRIMARY KEY (id),
    FOREIGN KEY (books_id) REFERENCES books (id)
    -- 외래 key를 걸어줄 column과 참조할 테이블 column
);

다시 정리하는 테이블 생성시 제약 넣는 방법!

AUTO_INCREMENT	-- 새 행 생성시마다 자동으로 1씩 증가
PRIMARY KEY	-- 중복 입력 불가, NULL(빈 값) 불가
UNIQUE	-- 중복 입력 불가
NOT NULL	-- NULL(빈 값) 입력 불가
UNSIGNED	-- (숫자일시) 양수만 가능
DEFAULT	-- 값 입력이 없을 시 기본값

DML(Data Manipulation Language)

데이터를 넣고, 삭제하고, 업데이트 하는 명령이다.

INSERT INTO [table name] VALUES(value1, value2, value3 ...);
INSERT INTO books VALUES(1, 'Python' , '2020-03-01');
INSERT INTO books VALUES(2, 'Flask', '2020-03-02');

SELECT*FROM [table name];
SELECT*FROM books

UPDATE [table name] SET [column]=[value] WHERE [condition]
UPDATE books SET published_at = '2020-03-03' WHERE id=2;

DELETE FROM [table name] WHERE [condition]
DELETE FROM books WHERE id=2;

DQL (Data Query Language) & JOIN

데이터를 쿼리하는데(서버에게 데이터를 달라고 요청) 사용되는 sql문을 알아보자.

-- * : 모든 컬럼의 데이터 가져오기
SELECT * FROM Customers; 

--원하는 열만 골라서 가져오기
SELECT CustomerName, ContactName FROM Customers;

-- 테이블의 컬럼이 아닌 값도 선택
SELECT CustomerName, 12, 'Hi', NULL FROM Customers;

-- 원하는 행만 가져오기(WHERE은 조건)
SELECT * FROM OrderDetails WHERE Quantity = 1;

-- 원하는 순서로 가져오기(ASC는 오름차순, DESC는 내림차순)
SELECT * FROM Customers ORDER BY ContactName; -- 오름차순이 디폴트
SELECT * FROM Customers ORDER BY ContactName DESC; -- 내림차순
SELECT * FROM Customers ORDER BY ContactName ASC, Address DESC; -- 두가지조건가능

-- 원하는 만큼만 데이터 가져오기(LIMIT {가져올 갯수} or LIMIT {건너뛸 갯수}, {가져올 갯수})
SELECT * FROM Customers LIMIT 5;
SELECT * FROM Customers LIMIT 15, 5; -- 16부터 5개 가져옴

-- 원하는 별명으로 가져오기
SELECT CustomerId AS '아이디' FROM Customers;

그룹으로 묶기

GROUP BY -- 조건에 따라 집계된 값을 가져옴

SELECT Category FROM products GROUP BY Category;

WITH ROLLUP -- 전체의 집계값
-- ORDER BY와 함께 사용 불가
-- 마지막 행에 전체의 집계값 나옴

HAVING -- 그룹화된 데이터 거르기(그룹 후)

DISTINCT -- 중복된 값 제거
-- 집계함수 사용되지 않음, 정렬하지 않으므로 GROUP BY 보다 빠름

SELECT DISTINCT CategoryID FROM Products;

쿼리 안의 서브쿼리

-- 비상관 서브쿼리 연결은?
SELECT
  CategoryID, CategoryName, Description,
  (SELECT ProductName FROM Products WHERE ProductID = 2)
FROM Categories;

ALL -- 서브쿼리의 모든 결과에 대해
ANY -- 하나 이상의 결과에 대해

SELECT CategoryID FROM Categories 
WHERE CategoryID = ANY(SELECT CategoryID FROM Products WHERE Price > 50);



-- 상관 서브쿼리의 연결은? 
SELECT
  ProductID, ProductName,
  (
    SELECT CategoryName FROM Categories C -- Categories를 C라고 할게요!
    WHERE C.CategoryID = P.CategoryID
  ) AS CategoryName
FROM Products P;

JOIN

JOIN은 교집합, 즉 연결성이 있는 부분으로 두 개의 테이블을 결합한다.

JOIN or INNER JOIN -- 양쪽 모두 값이 있는 행(NOT NULL)을 반환한다. 


SELECT * FROM Categories C
JOIN Products P 
  ON C.CategoryID = P.CategoryID; -- ON은 JOIN의 조건
  
-- 여러 테이블 join
SELECT 
  C.CategoryID, C.CategoryName, 
  P.ProductName, 
  D.Quantity
FROM Categories C
JOIN Products P 
  ON C.CategoryID = P.CategoryID
JOIN OrderDetails D
  ON P.ProductID = D.ProductID
  
  
  
LEFT JOIN or RIGHT JOIN -- 반대쪽에 데이터가 있든 없든(NULL) 선택된 방향에 있으면 출력, 행 수를 결정한다


SELECT
  C.CustomerName, S.SupplierName,
  C.City, C.Country
FROM Customers C
LEFT JOIN Suppliers S
ON C.City = S.City AND C.Country = S.Country;



CROSS JOIN -- 교차 join, 조건 없이 모든 조합 반환


SELECT
  E1.LastName, E2.FirstName
FROM Employees E1
CROSS JOIN Employees E2
ORDER BY E1.EmployeeID;

연산자

+, -, *, /	-- 각각 더하기, 빼기, 곱하기, 나누기
%, MOD	-- 나머지
IS	-- 양쪽이 모두 TRUE 또는 FALSE
IS NOT	-- 한쪽은 TRUE, 한쪽은 FALSE
AND, &&	-- 양쪽이 모두 TRUE일 때만 TRUE
OR, ||	-- 한쪽은 TRUE면 TRUE
=	-- 양쪽 값이 같음
!=, <>	-- 양쪽 값이 다름
>, <	-- (왼쪽, 오른쪽) 값이 더 큼
>=, <=	-- (왼쪽, 오른쪽) 값이 같거나 더 큼
BETWEEN {MIN} AND {MAX}	-- 두 값 사이에 있음
NOT BETWEEN {MIN} AND {MAX}	-- 두 값 사이가 아닌 곳에 있음
IN (...)	-- 괄호 안의 값들 가운데 있음
NOT IN (...)	-- 괄호 안의 값들 가운데 없음
LIKE '... % ...'	-- 0~N개 문자를 가진 패턴
LIKE '... _ ...'	-- _갯수만큼의 문자를 가진 패턴

참고자료
https://youtu.be/dgpBXNa9vJc

profile
모르는것투성이

0개의 댓글