DROP TABLE cars;
CREATE TABLE cars(
car_id INT PRIMARY KEY AUTO_INCREMENT,
car_model CHAR(20) NOT NULL,
car_price INT NOT NULL,
car_desc VARCHAR(200)
);
→ DROP 테이블명 : 테이블을 삭제한다.
→ CREATE 테이블명 : 테이블을 생성한다.
생성 시 열이름, 타입, 역할 순서대로 적어준다.
예를 들어 위에서 car_id 는 열이름, INT(정수) 는 타입, PRIMARY KEY 는 역할이다.
NOT NULL 은 필수로 들어가야한다 는 의미를 가진다.
<INT 와 INT(5) 의 차이가 무엇일까?>
: DB에는 제로필 옵션이 있다.
여기서 제로필(zero-fill)이란 해당 숫자의 길이가 지정된 자릿수보다 작을 경우 앞부분을 0으로 채우는 옵션이다.
INT(5) 는 사용자에게 데이터 사용방식을 알려주는 것이고, 예를 들어 00001로 나타낸다.
→ AUTO_INCREMENT : 자동으로 증가하라는 말인데, 위에서는 자동으로 car_id의 값이 1부터 증가한다.
mysql에만 있는 기능이며, 사용자가 직접 값을 입력할 수 있다.
한 테이블에서 1개의 열에만 쓸 수 있으며, 주key로 설정된 열에만 사용가능하다.
→ CHAR : 문자열을 나타내며, 고정 길이를 가진다.
위에서 CHAR(20)은 20바이트를 말한다.
CHAR(4) abc
CHAR의 공간이 4바이트이라고 한다면, abc를 넣고 1바이트가 남는다.
공간 활용이 좋지 않다.
하지만 반대로 생각하면 abc가 바뀌면 공간에 영향을 주지 않고 안에 있는 값만 변경될 뿐이라 변경에는 강하다.
→ VARCHAR : 문자열을 나타내며, 가변 길이를 가진다.
VARCHAR(4) abc
VARCHAR의 공간이 4바이트라고 한다면, abc를 넣으면 남은 바이트가 없어진다.
공간 활용에 좋다.
하지만 반대로 생각하면 abc가 바뀌면 공간에 영향을 주기에 안의 값만 변경되는 것이 아니라 공간도 변경되어야하므로 변경에는 취약하다.
→ 스키마(schema) : 청사진을 말한다.
데이터베이스의 구조를 정의하는 것으로, 테이블, 필드, 관계 등의 구조적인 요소들을 포함한다.
DESC cars;

INSERT INTO cars (car_model, car_price, car_desc)
VALUES ('sonata', 3000, 'not bad');
INSERT INTO cars (car_desc, car_model, car_price)
VALUES ('good', 'SM7', 3700);
INSERT INTO cars (car_model, car_price)
VALUES ('genesis G90', 12000);
-- 넣는 순서를 다 알아야하며, NUll이가능한것도 다 넣어야한다.
INSERT INTO cars VALUES (4, 'moring', 2000, 'cute');
INSERT INTO cars (car_model, car_price)
VALUES
('avante', 2800),
('k5', 3200),
('malibu', 3300);
INSERT INTO cars (car_model, car_price)
VALUES
('k7', 3700),
('porter', 2000);
→ INSERT INTO 테이블명 VALUES (입력할 순서)
: 레코드를 삽입할 때 사용되며, 입력할 순서에 AUTO_INCREMENT가 되어 있는 것은 적지 않아도 된다.
순서에 맞게 값을 적어야 하며, 문자열은 '' 안에 적어준다.
넣는 순서를 적지 않고도 가능하지만 이때는 레코드 생성 시의 열이름 순서를 다 알아야하며, NULL값을 가지는 것도 다 넣어줘야 한다.
그리고 한번에 여러개를 입력하는 것도 가능하다.
SELECT * FROM cars;
--자동차 중에 가격이 3500만원 이상 15000이하인 자동차의 모든정보 구하기
SELECT * FROM cars
WHERE car_price >= 3500 AND car_price <= 15000;
SELECT * FROM cars
WHERE car_price BETWEEN 3500 AND 15000;
-- 가격이 3000만원이 아닌 자동차의 모델명을 구하라.
SELECT car_model FROM cars WHERE car_price <> 3000;
SELECT car_model FROM cars WHERE NOT car_price = 3000;
-- 가격이 3000만원이거나 2000만원인 자동차의 모델명을 구하라.
SELECT car_model FROM cars WHERE car_price = 3000 OR car_price = 2000;
-- 3700,2000,2800,3200 만원인 자동차의 모델과 가격을 구하라.
SELECT car_model, car_price FROM cars
WHERE car_price IN (3700,2000,2800,3200);
→ SELECT 찾을 열이름 FROM 테이블명
1) AND : 두 조건을 '그리고' 로 연결할 때 사용한다.
AND 대신 BTWEEN AND 로 사용해도 된다.
2) <> : 다르다 라는 의미로 이 표현이 표준이다.
<> 대신 WHERE 뒤에 NOT 을 적어 사용해도 된다.
3) OR : 두 조건을 '또한, 이거나' 로 연결할 때 사용한다.
4) IN : 여러 조건이 있을 때 사용한다.
-- 설명(car_desc)이 없는(NULL) 자동차의 모델명과 가격을 구하라.
SELECT car_model, car_price FROM cars WHERE car_desc IS NULL;
-- 설명(car_desc)이 있는(NULL) 자동차의 모델명과 가격을 구하라.
SELECT car_model, car_price FROM cars WHERE NOT car_desc IS NULL;
SELECT car_model, car_price FROM cars WHERE car_desc IS NOT NULL;
-- 자동차를 가격이 높은 순으로 정렬하라.
-- DESC 를 안 붙이면 낮은 순으로 된다.
SELECT * FROM cars ORDER BY car_price DESC;
-- 자동차를 가격이 낮은 순으로 정렬하라.
SELECT * FROM cars ORDER BY car_price;
SELECT * FROM cars ORDER BY car_price ASC;
1) IS NULL : 값이 NULL인 것을 말한다.
NULL이 아닌 것을 구할 때는 IS NOT NULL이라 써도 되고 WHERE NOT이라고 써도 된다.
2) 정렬 : 기본적으로 낮은 순으로 정렬된다. (아무것도 안쓰면 기본으로 낮은 순으로 정렬된다.)
ASC 는 낮은 순으로 정렬을 해주며, DESC 는 높은 순으로 정렬을 해준다.
ORDER BY : 뒤에 무엇을 기준으로 정렬을 할 것인지 써주면 된다.
-- LIMIT : 위에서 부터 3개만 가지고 와라.
SELECT * FROM cars LIMIT 3;
-- 가격 높은 순으로 정렬해서 위에서 3개를 가져와라.
SELECT * FROM cars ORDER BY car_price DESC LIMIT 3, 3;
-- 자동차 중에서 5번째로 비싼차는 무엇인가? 모델명을 구하라.
SELECT car_model FROM cars ORDER BY car_price DESC LIMIT 4, 1;
→ LIMIT : 해당 수까지 구해라는 의미이다.
대부분 ORDER BY 와 함께 사용하며, LIMIT는 끝에 붙는다.
위의 LIMIT 3,3 에서 앞의 3은 쉽게 생각해서 인덱스의 개념을 의미하고, 뒤의 3은 위에서 3개까지 값을 가져와라는 의미이다.
-- 모델명이 's'로 시작하는 자동차의 정보를 구하라.
SELECT * FROM cars WHERE car_model LIKE 's%';
-- 모델명 중 'a'가 포함되는 모든 자동차를 구하라.
SELECT * FROM cars WHERE car_model LIKE '%a%';
-- 두번째 글자가 o인 6글자 자동차
SELECT * FROM cars WHERE car_model LIKE '_o____';
→ % : 0 ~ 무한대를 의미한다.
만약에 s로 시작하고 y로 끝나는 글자를 찾고 싶으면 's%y' 라고 적어주면 된다.
→ _ : 1글자를 의미한다.
위에서 보면 _o____ 는 o를 기준으로 앞에는 한글자, 뒤에는 4글자가 온다는 의미이다.
SELECT car_model cheap_model FROM cars WHERE car_price < 2500;
SELECT car_model AS cheap_model FROM cars WHERE car_price < 2500;
→ 열 이름을 이해하기 힘들거나 너무 길때 주로 사용한다.
→ 별칭달기 : 열 이름 뒤에 그냥 적어도 되고 아니면 AS를 쓰고 뒤에 적어도 된다.
-- DELETE FROM cars : 이러면 안에 있는 테이블이 다 삭제된다.
DELETE FROM cars WHERE car_id = 6;
→ DELETE FROM 테이블명 : 이때, 테이블명만 쓰고 WHERE로 삭제할 레코드를 쓰지 않으면 테이블 안에 있는 모든게 다 지워지므로 주의해야한다!
UPDATE cars SET car_desc = 'nice' WHERE car_id = 8;
→ UPDATE 테이블명 SET 수정할 내용 WHERE 조건
: 위를 예로 설명하자면 cars 테이블에 car_desc의 내용을 바꾸는데 car_id가 8번인 걸 바꾸라는 의미이다.
집계함수에는 총합, 평균, 개수, 최대값, 최소값 이 있다.
→ 1개의 레코드를 대상으로 하는 것이 아니다.
→ WHERE 절에 사용할 수 없다.
→ 스칼라 : 값 자체만을 의미하는 수학적인 명칭으로, 단일 값을 가진다.
-- 자동차의 판매금액의 총합은?
SELECT SUM(car_price) FROM cars;
-- 자동차의 평균가격은?
SELECT AVG(car_price) FROM cars;
-- 총 자동차 수는?
-- NULL인 값은 카운터 되지 않는다.
SELECT COUNT(car_desc) FROM cars;
SELECT COUNT(car_id) FROM cars;
-- 3000만원 이상, 5000만원 이하의 자동차 중 최대값, 최소값울 구하라.
SELECT MAX(car_price) max_price, MIN(car_price) FROM cars
WHERE car_price BETWEEN 3000 AND 5000;
→ SUM : 값들의 총합을 나타낸다.
→ AVG : 값들의 평균을 나타낸다.
→ COUNT : 구하고자하는 것의 총 개수를 나타낸다.
이때, NULL인 값은 카운터 되지 않는다.
→ MAX 와 MIN : MAX 는 값들에서의 최대값을 나타내고, MIN 은 값들에서의 최소값을 나타낸다.
WHERE 절에서는 사용할 수 없다.
서브쿼리 : 쿼리문 안에 쿼리문이 들어간 것을 말한다.
→ 아무 곳에서나 들어올 수 있다.
→ SELECT절에 서브 쿼리가 들어갈려면 값은 하나로 나와야 한다.
(값이 하나라도 여러 열이 오면 안된다.)
→ FROM절이나 WHERE절에서 여러 개의 값에서 일치하는 것을 찾을려면 IN 을 이용하면 된다.
(스칼라 값이 아닌 것에 '=' 오류가 난다. 즉, 1대1 대응이 되어야 한다.)
/*
가장 비싼 자동차의 모델명은 무엇인가?
1. 가장 비싼 가격이 뭔지 구한다.
2. 1의 결과와 같은 가격을 가진 자동차를 구하라.
*/
SELECT MAX(car_price) FROM cars;
SELECT car_model FROM cars
WHERE car_price = (SELECT MAX(car_price) FROM cars);
-- k7 보다 가격이 낮은 자동차의 모델명과 가격을 구하라.
SELECT car_price FROM cars WHERE car_model = 'k7';
SELECT car_model, car_price FROM cars
WHERE car_price < (SELECT car_price FROM cars WHERE car_model = 'k7');