A. 기본 문법
SELECT 열_이름
FROM 테이블_이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
순서: FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER
회원 테이블 만들기
USE market_db;
CREATE TABLE member -- 회원 테이블
( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number INT NOT NULL, -- 인원수
addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
phone1 CHAR(3), -- 연락처의 국번(02, 031, 055 등)
phone2 CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
height SMALLINT, -- 평균 키
debut_date DATE -- 데뷔 일자
);
* CHAR: 고정형 - 8개가 들어오지 않아도 8글자 저장
* VARCHAR: 가변형 - 들어오는 글자만큼 저장, 저장 효율 good
구매 테이블 만들기
CREATE TABLE buy -- 구매 테이블
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
mem_id CHAR(8) NOT NULL, -- 아이디(FK)
prod_name CHAR(6) NOT NULL, -- 제품이름
group_name CHAR(4) , -- 분류
price INT NOT NULL, -- 가격
amount SMALLINT NOT NULL, -- 수량
FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);
데이터 조회
USE문
-- USE 사용
SELECT * FROM product;
USE shop_db;
-- USE 사용 안하려면
SELECT * FROM shop_db.product;
- shop_db 데이터베이스를 대상으로 할거야.
- 이렇게 명시하지 않으면 모든 SQL문은 마지막으로 작업했던 DB에서 동작한다.
관계연산자, 논리연산자 사용
SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;
BETWEEN ~ AND: 범위값 구하기
SELECT mem_name, height, mem_number
FROM member
WHERE height BETWEEN 163 AND 165;
IN()
SELECT mem_name, addr
FROM member
WHERE addr IN('경기', '전남', '경남');
LIKE: 문자열의 일부 글자 검색
SELECT *
FROM member
WHERE mem_name LIKE '우%';
- 제일 앞 글자가 '우'이고 그 뒤는 무엇이든(%) 허용한다.
- 한 글자와 매치하기 위해서는 언더바(_)를 사용한다.
SELECT *
FROM member
WHERE mem_name LIKE '__핑크';
- 앞 두 글자는 상관 없고 뒤는 '핑크'인 회원을 검색한다.
서브 쿼리
SELECT mem_name, height FROM member
WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');
ORDER BY
- WHERE절과 함께 사용할 수 있다.
- 다만 WHERE절을 먼저 사용해줘야 한다.
SELECT mem_id, mem_name, debut_date
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;
정렬
- ASC 오름차순
- DESC 내림차순
LIMIT
- 출력하는 개수를 제한한다.
- 전체 중 앞에서 n개까지만 조회
SELECT *
FROM member
LIMIT 3;
- LIMIT 시작, 개수
SELECT mem_name, debut_date
FROM member
ORDER BY debut_date
LIMIT 3, 2;
- 3번째부터 2건
DISTINCT
- 중복된 결과를 제거
SELECT DISTINCT addr FROM member;
GROUP BY
- 그룹으로 묶어준다.
- 그룹을 묶어 집계한다.
집계 함수
- SUM()
- AVG()
- MIN()
- MAX()
- STDDEV() : 표준편차
- VARIANCE() : 분산
- COUNT()
- COUNT(DISTINCT)
SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수"
FROM buy GROUP BY mem_id;
SELECT COUNT(*) FROM member;
- 집계함수는 WHERE절과 함께 사용할 수 없다.
- 대신 HAVING절을 사용한다.
- HAVING절은 반드시 GROUP BY 뒤에 나와야 한다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM market_db.buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000;
데이터 입력
INSERT
INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)
- 테이블 이름 다음에 나오는 열은 생략 가능
- 열 이름을 생략할 경우 VALUES 뒤에 나오는 값들의 순서 및 개수는 테이블을 정의할 때 열 순서 및 개수와 동일해야 한다.
USE market_db;
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO hongong1 VALUES (1, '우디', 25);
- 만약 age는 입력하고 싶지 않다면 테이블 이름 뒤에 입력할 열의 이름을 써줘야 한다.
INSERT INTO hongong1 (toy_id, toy_name) VALUES (2, '버즈');
- age 열에는 NULL 값이 들어감
AUTO_INCREMENT : 자동으로 증가
- 열을 정의할 때 1부터 증가하는 값을 입력해준다.
- INSERT에서는 해당 열이 없다고 생각하고 입력한다.
- 주의: 지정한 열은 꼭 PRIMARY KEY로 지정!
CREATE TABLE hongong2 (
toy_id INT AUTO_INCREMENT PRIMARY KEY,
toy_name CHAR(4),
age INT);
- 자동증가하는 부분은 NULL 값으로 채워 놓으면 된다.
INSERT INTO hongong2 VALUES (NULL, '보핍', 25);
INSERT INTO hongong2 VALUES (NULL, '슬링키', 22);
INSERT INTO hongong2 VALUES (NULL, '렉스', 21);
SELECT * FROM hongong2;
- 계속 입력하다가 현재 어느 숫자까지 증가되었는지 확인이 필요할 때
SELECT LAST_INSERT_ID();
만약 AUTO_INCREMENT로 처음부터 입력되는 값을 100으로 지정하고, 다음 값은 3씩 증가하도록 하려면
ALTER TABLE hongong2 AUTO_INCREMENT=100;
SET @@auto_increment_increment=3;
더보기
시스템 변수!
- MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수
- SHOW GLOBAL VARIABLES : 전체 시스템의 종류를 보여줘
- SELECT @@시스템변수 : 실행
여러 줄을 한 줄로 작성할 수도 있다.
INSERT INTO hongong2 VALUES (NULL, '보핍', 25), (NULL, '슬링키', 22), (NULL, '렉스', 21);
INSERT INTO ~ SELECT : 다른 테이블의 데이터를 한 번에 입력
- 주의: SELECT 문의 열 개수는 INSERT할 테이블의 열 개수와 같아야 한다.
INSERT INTO 테이블_이름 (열_이름1, 열_이름2, ...)
SELECT문;
CREATE TABLE city_popul (city_name CHAR(35), population INT);
INSERT INTO city_popul
SELECT Name, Population FROM world.city;
데이터 수정
UPDATE 문의 기본 문법
UPDATE 테이블_이름
SET 열1=값1, 열2=값2, ...
WHERE 조건;
city_popul 테이블의 도시이름(city_name) 중에서 'Seoul' -> '서울'로 변경
USE market_db;
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';
SELECT * FROM city_popul WHERE city_name = '서울';
도시이름(city_name)인 'New York'을 '뉴욕'으로 바꾸면서 동시에 인구(population)는 0으로 설정
UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';
SELECT * FROM city_popul WHERE city_name = '뉴욕';
주의: UPDATE 문에서 WHERE 절은 생략 가능하지만, 생략하면 테이블의 모든 행의 값이 변경된다.
UPDATE city_popul
SET population = population / 10000;
SELECT * FROM city_popul LIMIT 5;
데이터 삭제
DELETE
DELETE FROM 테이블 이름 WHERE 조건;
'SQL' 카테고리의 다른 글
JOIN (0) | 2024.01.23 |
---|---|
NoSQL (1) | 2024.01.23 |
D3. 데이터 자료형 (0) | 2024.01.22 |
Transaction (1) | 2024.01.22 |
D1. 데이터베이스 개요 (1) | 2024.01.10 |