TIL 38 | mySQL 기본쿼리문
mySQL 시작하기
mysql.server start -- 시작
mysql -u root -p -- 접속
쿼리문은 ';'로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성하면 된다.
DDL(Data Define Language)
mysql.server start -- 시작
mysql -u root -p -- 접속
쿼리문은 ';'로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성하면 된다.
데이터를 구성하는 논리적인 구조(데이터베이스 | 테이블)을 추가, 수정, 삭제한다. 메타데이터(데이터에 대한 데이터)를 다루문 쿼리문이다.
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 KEY
와 REFERENCES
두가지 옵션을 사용하면 된다. 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 '... _ ...' -- _갯수만큼의 문자를 가진 패턴
Author And Source
이 문제에 관하여(TIL 38 | mySQL 기본쿼리문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@dabin0219/TIL-38-mySQL-기본쿼리문
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
+, -, *, / -- 각각 더하기, 빼기, 곱하기, 나누기
%, 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 '... _ ...' -- _갯수만큼의 문자를 가진 패턴
Author And Source
이 문제에 관하여(TIL 38 | mySQL 기본쿼리문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dabin0219/TIL-38-mySQL-기본쿼리문저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)