반응형
반응형
-- 사용 테이블 예제
CREATE TABLE product_order(
	ID   INT AUTO_INCREMENT PRIMARY KEY,
	NAME VARCHAR(20),
	product VARCHAR(50),
	price INT
);

INSERT INTO product_order(name, product, price) VALUES('홍길동', 'TV', 5000);
INSERT INTO product_order(name, product, price) VALUES('홍길동', '라디오', 3000);
INSERT INTO product_order(name, product, price) VALUES('홍길동', '컴퓨터', 2000);
INSERT INTO product_order(name, product, price) VALUES('홍길동', '핸드폰', 10000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', 'TV', 5000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', '라디오', 3000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', '컴퓨터', 2000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', '핸드폰', 10000);
INSERT INTO product_order(name, product, price) VALUES('김민수', 'TV', 5000);
INSERT INTO product_order(name, product, price) VALUES('김진수', '컴퓨터', 2000);

📝HAVING

HAVING이란 뭐냐면 WHERE과 똑같습니다 조건절인데 GROUP BY를 쓰는 경우 WHERE절을 사용할 수 없기 때문에 HAVING을 써야합니다. 위치도 또한 중요한 중요한데 GROUP BY뒤에 쓰여야합니다.

지금까지 온 고객중 총 5,000원 이상 산 사람을 조회했습니다.

 

SELECT NAME, SUM(price) 
  FROM product_order 
 GROUP BY NAME
HAVING SUM(price) >= 5000;

 

Document
NAME sum
홍길동 20,000
홍길순 20,000
반응형
반응형
-- 사용 예제 테이블
CREATE TABLE product_order(
	ID   INT AUTO_INCREMENT PRIMARY KEY,
	NAME VARCHAR(20),
	product VARCHAR(50),
	price INT
);

INSERT INTO product_order(name, product, price) VALUES('홍길동', 'TV', 5000);
INSERT INTO product_order(name, product, price) VALUES('홍길동', '라디오', 3000);
INSERT INTO product_order(name, product, price) VALUES('홍길동', '컴퓨터', 2000);
INSERT INTO product_order(name, product, price) VALUES('홍길동', '핸드폰', 10000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', 'TV', 5000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', '라디오', 3000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', '컴퓨터', 2000);

📝SUM

SUM이라는 건 즉 모든 합을 의미하는데요 여기에선 SUM(price)이라는 건 total의 합을 의미합니다.

이럴경우 SELECT SUM(price) FROM product_order 쿼리문을 사용하면 됩니다.

이렇게 전체 손님이 산 물건의 총 값(매출)을 구할 수 있습니다.

 

SELECT NAME, SUM(price) FROM product_order GROUP BY name;

SELECT SUM(price) FROM product_order;

 

Document
SUM(price)
40000

 

 

📝GROUP BY

그냥 총합도 중요하지만 각각의 손님이 여러번 왔을 때마다 산 물건의 총 합도 구해야겠죠 하지만 위에 방식대로 하면 결과가 1개만 출력됩니다. 거기에서 필요한게 GROUP BY입니다. 묶는다는 의미를 가지고 있습니다.

위에 거를 예시를 들자면 GROUP BY name라고 적혀있는데 name이 같은 사람끼리 GROUP BY(묶는다)라고 이해하시면 되겠습니다. 래서 중복해서 나오지도 않고 개개인별로 결과값이 차곡차곡 쌓이게 되는 거죠

 

SELECT NAME, SUM(price) FROM product_order GROUP BY name;

 

Document
NAME SUM(price)
20000 20000

 

📝AS

AS란 ~로 대신 불려지는 걸 의미합니다. 즉 별칭입니다.

하기 쿼리 같이 SUM(price)를 total_price으로 별칭을 정할 수 있습니다. 그러면 출력 필드 명이 total_price로 변경됩니다.

SELECT NAME, SUM(price) AS total_price FROM product_order GROUP BY name;

 

Document
NAME total_price
20000 20000

 

📝AVG

AVG는 평균을 의미합니다. SUM이라는 작업을 하고 그걸 이제 갯수로 나눈것입니다.

총 레코드 수는 8개이고 총 SUM은 40,000원 입니다. 그 결과 5,000이 나오게 됩니다.

SELECT avg(price) AS avg_price FROM product_order;

 

Document
avg_price
5,000.0

 

📝MAX, MIN

MAX는 말 그대로 최대값, MIN 최솟값을 의미합니다.

 

SELECT MAX(price) AS max FROM product_order;

SELECT MIN(price) AS min FROM product_order;

 

Document
max
10,000

 

Document
min
2,000

 

📝COUNT

COUNT를 이용해 갯수를 셀 수 있습니다. COUNT(*)의 경우 전체의 갯수를 셉니다.

또한 괄호안에 조건을 넣을 수 있습니다. DISTINCT(NAME)을 이용해 이용한 고객이 몇명인지 파악할 수 있습니다.

SELECT COUNT(DISTINCT(NAME)) AS customer_count FROM product_order;

 

Document
custom_count
2
반응형
반응형
-- 사용할 예제 테이블
CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

INSERT INTO student VALUES('1','홍길동',20);
INSERT INTO student VALUES('2','홍길순', 23);
INSERT INTO student VALUES('3','김철수',22);
INSERT INTO student VALUES('4','김민수',27);
INSERT INTO student VALUES('5','김진수',27);
INSERT INTO student VALUES('6','김민철',24);

 

📝LIMIT

LIMIT라는 걸 걸어줘서 검색할 데이터양을 정할 수 있습니다

 

SELECT id, name, age FROM student LIMIT 2; # 2개 레코드를 출력해라

SELECT id, name, age FROM student LIMIT 1, 3; # 1번 레코드에서 시작하며 3개 레코드를 출력해라

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23

 

Document
ID NAME AGE
2 홍길순 23
3 김철수 22
4 김민수 27

 

📝테이블 복사하기

현재 있는 테이블을 다른 테이블로 복사하고 싶을 때 사용하면 좋습니다.

 

  • CREATE TABLE 새로운 테이블 (SELECT 복사할 필드 FROM 기존 테이블)
  • CREATE TABLE TEMP (SELECT * FROM student);

 

CREATE TABLE temp (SELECT * FROM student);

SELECT * FROM temp;

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22
4 김민수 27
5 김진수 27
6 김민철 24
반응형
반응형
-- 사용 테이블 예제
CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

INSERT INTO student VALUES('1','홍길동',20);
INSERT INTO student VALUES('2','홍길순', 23);
INSERT INTO student VALUES('3','김철수',22);
INSERT INTO student VALUES('4','김민수',27);
INSERT INTO student VALUES('5','김진수',27);
INSERT INTO student VALUES('6','김민철',24);

 

 

📝 ORDER BY 정렬할 필드명 (옵션 DESC)

ORDER BY의 경우 나온 결과를 정렬해줍니다.아무것도 안 적었을 때 기본적으로 ASC 정렬(오름차순)을 해줍니다.그래도 기본적으로 ASC를 적어서 안 헷갈리고 직관적으로 보이게 하는게 좋습니다.DESC의 경우 내림차순 정렬을 해줍니다.

SELECT id, name, age FROM student ORDER BY age; -- 아무것도 안 적었을 때 ASC와 동일
SELECT id, name, age FROM student ORDER BY age ASC;

SELECT id, name, age FROM student ORDER BY age DESC;

 

Document
ID NAME AGE
1 홍길동 20
3 김철수 22
2 홍길순 23
6 김민철 24
4 김민수 27
5 김진수 27

 

Document
ID NAME AGE
2 홍길순 23
3 김철수 22
1 홍길동 20
4 김민수 27
5 김진수 27
6 김민철 24

 

📝DISTINCT 중복 제거할 필드명

DISTINCT라는 것은 중복을 제하고 검색해주는 겁니다 나이가 동일한 '김민수' , '김진수' 중 하나를 제거해 보여줍니다.

SELECT DISTINCT(age) FROM student;

 

Document
AGE
20
23
22
27
24
반응형
반응형

 

-- 사용 테이블 정보
CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

DELETE FROM student WHERE 1=1;


INSERT INTO student VALUES('1','홍길동',20);
INSERT INTO student VALUES('2','홍길순', 23);
INSERT INTO student VALUES('3','김철수',22);
INSERT INTO student VALUES('4','김민수',27);
INSERT INTO student VALUES('5','김진수',27);
INSERT INTO student VALUES('6','김민철',24);

 

 

📝서브쿼리 (Sub Query)

저번에 작성중이던거에 데이터를 진라면을 추가했습니다.

 

서브쿼리란 무엇이냐면 쿼리안에 쿼리문이 또 들어있는 형태입니다.

 

  • SELECT id, name, age FROM STUDENT WHERE age >(SELECT age FROM STUDENT WHERE name = '김민철');

 

이와같이 두개의 SELECT 쿼리문이 들어가 있죠 '김민철' 나이보다 나이가 더 많은 사람을 조회하기 위해 저렇게 서브쿼리를 썼습니다.

 

SELECT  id ,name ,age 
  FROM student 
 WHERE age > (SELECT age FROM student WHERE name = '김민철');

 

Document
ID NAME AGE
4 김민수 27
5 김진수 27

 

-- (1) 나이가 평균보다 많은 회원
SELECT m.*
  FROM MEMBER m
 WHERE m.age > (select avg(m2.age) from Member m2)
 
-- (2) 한 건이라도 주문한 고객
SELECT m.*
  FROM Member m
 WHERE (SELECT count(o) FROM Order o WHERE m.member = o.mebmer) > 0

(1)번 쿼리의 경우 서브쿼리 내용과 밖의 쿼리 내용이 관계가 없기 때문에 성능상에 이점이 있다

(2)번 쿼리의 경우 밖에 내용을 가져와 서브쿼리랑 비교하기 때문에 필터 성능상 이점이 없다

 

 

📝ANY, SOME

서브쿼리의 경우 ( ) 안에 결과 겂이 2개 이상인 경우 에러가 발생하게 됩니다.

SELECT  id ,name, age 
  FROM student 
 WHERE age < (SELECT age FROM student WHERE age >= 24); -- 2개 이상의 결과로 에러 발생

 

그걸 해결하기 위해 ANY, SOME, ALL이라는 것을 사용하게 됩니다.

 

ANY의 경우나온 결과를 OR로 만족 시키는 결과만 반환하도록 합니다.

예를 들어 위에 괄호에 있는 쿼리를 실행시켰을 때 하기의 결과가 나오게 되는데 

WHERE age < ( SELECT age FROM student WHERE age >= 24); 에서 24보다 나이가 적은 사람 또는(OR) 27보다 나이가 적은 사람이라는 조건으로 찾게 됩니다. SOME도 동일하게 작동합니다

 

Document
AGE
24
27
27

 

SELECT  id, name, age 
  FROM student 
 WHERE age < ANY (SELECT age FROM student WHERE age >= 24);


SELECT  id, name, age 
  FROM student 
 WHERE age < SOME (SELECT age FROM student WHERE age >= 24);

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22
6 김민철 24

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22
6 김민철 24

 

 

📝ALL

SELECT  id, name, age 
  FROM student 
 WHERE age < ALL (SELECT age FROM student WHERE age >= 24);

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22

 

ALL의 경우나온 결과를 모두(AND) 만족시켜야합니다 예를 들면 위의 쿼리를 실행 시킬 때 24보다 나이가 적은 사람 이면서(AND) 27보다 나이가 적은 사람을 조회하라는 의미입니다.

반응형
반응형
-- 연습할 테이블 생성

CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

INSERT INTO student VALUES('1','홍길동',20);
INSERT INTO student VALUES('2','홍길순', 23);
INSERT INTO student VALUES('3','김철수',22);
INSERT INTO student VALUES('4','김민수',27);

 

 

📝BETWEEN

새로운 테이블을 만들고 데이터를 입력하겠습니다(빨간색영역)

 

그리고 나이가 23 ~ 25인 사람을 조회하려고 합니다. WHERE절과 AND이용해 할 수도 있지만

BETWEEN 이라는 걸 사용해서 조회할 수도 있습니다. 말 그대로 그 사이 값을 조회하는 거라고 생각하면 됩니다.

 

  • SELECT 필드명... FROM 테이블명 WHERE 필드명(조건을 걸) BETWEEN 최소값 AND 최대값(범위를 의미합니다)
  • SELECT id, nameFROM student WHERE age BETWEEN 23 AND 25;

 

SELECT id, name FROM student WHERE age BETWEEN 23 AND 25;

 

Document
ID NAME
2 홍길순

 

📝IN

이번에는 나이가 22살, 23살인 사람만 조회하도록 하겠습니다. OR과 WHERE절로 조회할 수 있지만

IN이라는 걸 쓰면 더 간단하게 할 수 있습니다.

 

  • SELECT id, name FROM student WHERE age IN('경기','충남','인천');
  • SELECT 필드명FROM테이블명 WHERE 필드명(조건을 걸) IN(조건); 

 

SELECT id, name FROM student WHERE age IN (22, 23);

 

Document
ID NAME
2 홍길순
3 김철수

 

 

📝LIKE

LIKE에 대해서 배워보도록 하겠습니다. 일단 홍%라고 주어진 것에 %의 의미는 무엇이든 허용한다는 의미입니다.

%는 몇글자인지 상관이 없습니다 여기에서 홍으로 시작하는 모든 것을 찾게 되는 거죠

 

_의 경우 딱 한글자만 무엇이든 허용한다는 의미입니다.

여기에서는 성이 '김'이든 '홍'이든 상관 없이 이름이 '길순'인 세글자 성명이면 다 찾아줍니다.

 

_, %를 조합해서 쓸 수 있습니다 여기에서는 성은 상관 없고

가운데가 '민'이고 세글자인든 네글자이든 뒤에는 상관없이 찾아줍니다.

 

SELECT id, name FROM student WHERE name LIKE '%길동';

SELECT id, name FROM student WHERE name LIKE '_길순';

SELECT id, name FROM student WHERE name LIKE '_민%';

 

Document
ID NAME
1 홍길동

 

Document
ID NAME
2 홍길순

 

Document
ID NAME
4 김민수
반응형
반응형

📝스토리지 엔진 (Storage Engine)

  • MySQL은 각 DB를 파일 시스템 안의 정보를 스토리지 엔진에 저장합니다 다시 말해 MyTable이라는 테이블을 만드는 경우 MyTable.frm에 테이블 정의를 저장합니다 데이터베이스 이름과 테이블 정의를 저장하는데 파일 시스템을 사용합니다.

 

📝InnoDB Engine

  • 트랜잭션 처리 위해 고안 대부분의 경우 롤백 되지 않고 완료되는 (즉 정상 종료) 짧은 트랜잭션이 많은 경우 처리하기 좋게 되어있고 많이 쓰는 스토리지 엔진이다
  • 정보의 무결성과 손실되면 안 되는 중요한 데이터를 필요로 할 때 사용합니다
  • MySQL 스토리지 엔진의 인덱스 구조와 매우 상이해 신속한 PK 조회 가능합니다.
  • 만약 기본 키가 크다면 다른 인덱스(보조 인덱스 (PK 아닌 인덱스)) 또한 클 것이다. (조회가 더딜 수 있음)
  • 여러 인덱스를 가진다면 기본키가 작은 값을 갖게 해야 한다

 

📝MyISAM Engine

  • 전문 (full-text) 인덱싱압축, 공간 (Geographic Information System, GIS, 지리정보시스템) 함수 등 여러 유용한 기능을 제공하지만 Table lock 사용하여 트랜잭션이나 Row 수준의 잠금을 지원하지 않는다.
  • MyISAMTransaction을 지원하지 않기 때문에 InnoDB보다 심플하고 기본적으로 빠르지만동시성 제어가 어렵다는 단점이 있다 그래서 Read 쿼리가 많은 환경에서 많이 사용한다.

 

📝Memor Engine

  • 메모리에 데이터를 저장하는 엔진이며 Transaction을 지원하지 않는다
  • 메모리를 사용하기 때문에 기본적으로 속도가 아주 빠른 편 그렇기 때문에 중요하지 않지만 빠른 처리가 필요한 임시 테이블로 많이 사용하는 편이다.

 

📝Archive Engine

  • 아주 빠르게 INSERT 쿼리를 처리할 수 있는 엔진
  • Index를 지원하지 않으며 INSERT/REPLACE/SELECT 쿼리와 같이 데이터를 삽입하거나 읽는 것은 가능하지만DELETE/UPDATE와 같이 데이터를 삭제하거나 수정할수는 없다
  • transaction을 지원하지 않는다 주로 많은 양의 로그성 데이터를 저장하고 읽는데 주로 사용된다.

 

📝CSV Engine

  • CSV 엔진은 쉽표로 구분된 값(Comma Separated Values)으로 구성된 파일을 테이블로 처리할수 있지만 인덱스를 지원하지는 않는다
  • 스프레드시트에서 CSV 파일을 내보내 MySQL 서버의 데이터 디렉터리에 저장하면 서버는 그 즉시 이 파일을 읽을 수 있다 마찬가지로 CSV 테이블에 데이터를 기록하면 외부 프로그램이 이를 바로 읽을 수 있다.

 

📝Federated Engine

  • 데이터를 자체 스토리지에 저장하지 않는다Federated 테이블은 원격 MySQL서버 내의 태이블을 참조하는데, 결국 모든 작업에 있어서 원격 서버에 연결한다고 볼 수 있다.

 

📝Blackhole Engine 

  • 저장 메커니즘을 전혀 갖고 있지 않으며 모든 INSERT 구문을 실행하지 않고 그냥 버린다 그러나 서버는 Blackhole 테이블에 대한 쿼리를 로그에 기록하므로 그 정보가 슬레이브에 복제되거나 로그에 남아 있을 수 있다 이로 인해 Blackhole 엔진은 복잡한 복제 구성과 감사용 로깅에 유용하게 사용할 수 있다.

 

MySQL 기반의 응용 프로그램을 설계할 때, 어느 스토리지 엔진을 사용해 데이터를 저장할지 결정해야 한다 설계 단계에서 이를 생각해보지 않으면 나중에 번거로워질 수 있다.

반응형
반응형

📝INSERT

데이터를 삽입하려면 테이블이 먼저 있어야합니다. 저번에 만들어둔 걸 재활용합시다 테이블에 데이터 삽입하는 쿼리문은 이것입니다.

  • INSERT INTO 테이블명 VALUES (값,값....);
  • INSERT INTO student VALUES ('1','홍길동',20);
    • 전체 필드들 값을 다 입력해줘야한다. 테이블을 만들 때 필드를 선언한 순서대로
    • id , name , age 1 , 홍길동 , 20이 들어가게 됩니다.

 

값을 각각 넣을수도 있습니다

  • INSERT INTO 테이블명 (필드명, 필드명...) VALUES (값, 값...);
  • INSERT INTO student (id,name) VALUES ('2','홍길동');
    • 이런식으로 id와 name에만 값을 넣고 싶으면 이렇게 하시면 됩니다 하지만 이 경우에는 NOT NULL이거나 PRIMARY KEY일 경우에는 안 됩니다
    • 입력 안 한 필드는 NULL값이 들어가게 됩니다.

 

CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

INSERT INTO student VALUES('1','홍길동',20);
INSERT INTO student(id,name) VALUES('2','홍길순');

.

 

📝SELECT

 

이제 데이터가 잘 들어갔는지 한번 보도록 합시다 데이터를 조회하는 쿼리문 입니다.

  • SELECT 필드명 FROM 테이블명;
  • SELECT * FROM student;
    • *는 ALL이라는 의미입니다. 일반적으로 필드명을 직접 입력해주는게 좋습니다 왜냐하면 DB의 테이블 구조가 바뀌었을 때 *로 데이터를 가져가는 경우 원치 않는 값도 같이 가져와서 프로그래밍에 문제를 일으키는 경우도 있기 때문입니다.
  • SELECT id, pw FROM student;
    • 내가 원하는 필드명으로만 조회가 가능합니다.
  • SELECT * FROM student WHERE id = '1';
    • WHERE은 조건절이라고 생각하시면 됩니다.
    • student 전체 필드에서 id가 '1' 인 사람을 조회하는 것입니다.

 

SELECT * FROM student;

SELECT id, age FROM student;

SELECT id, age FROM student WHERE id = '1';

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 N

 

Document
ID AGE
1 20
2 N

 

Document
ID AGE
1 20
반응형
반응형

📝CREATE DTABSE

  • CREATE DATABASE DB명;
  • CREATE DATABASEstudent;
    • 이걸로 DB를 만들 수 있습니다
CREATE DATABASE student;

 

📝DROP DTABSE

  • DROP DATABASE DB명;
  • DROP DATABASE student;
    • 이걸로 DB를 지울 수 있습니다

 

DROP TABLE student;

 

DB를 다시 만들고 USE문을 이용해 그 해당DB안에 밑에 구조의 테이블을 만드려고 합니다

 

📝USE DATABASE

  • USE DB명;
  • USE student;
    • 이걸로 사용할 DB를 지정할 수 있습니다
USE student;

 

 

📝CREATE TABLE

  • CREATE TABLE 테이블명 (
  •     필드명  데이터 타입   조건,
  •     필드명 ...
  • );
    • 이런 형식으로테이블을 만드는게 기본 구조입니다.

 

CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

 

📝DROP TABLE 

  • DROP TABLE 테이블명;
  • DROP TABLE student;
    • 이거를 이용해서 테이블을 삭제할 수 있습니다.

 

DROP TABLE student;
반응형