Chapter 03 SQL 기본 문법
3. 데이터 입력: INSERT
4. 데이터 수정: UPDATE
5. 데이터 삭제: DELETE
3. 데이터 입력: INSERT
create table hongong1 (
toy_id int,
toy_name char(4),
age int
)default charset=utf8;
insert into hongong1 values(1, '우디', 25);
insert into hongong1 (toy_id, toy_name) values (2, '버즈');
insert into hongong1 (toy_name, age, toy_id) values ('제시', 20,3);
select * from hongong1;
INSERT INTO 테이블명 [칼럼명] VALUES 넣을값
칼럼명 생략시 모든 칼럼에 값을 넣게 됨→칼럼 개수와 순서를 맞춰서 값 입력
칼럼 지정시 일부 칼럼에만 넣거나(빠진 칼럼에는 NULL 입력) 칼럼 순서를 바꿔서 입력 가능
3.1 AUTO_INCREMENT
1부터 1씩 증가하는 값 자동 입력
PRIMARY KEY로 지정, 값 입력시 NULL 입력
중간에 값이 삭제되는 경우 채워지지 않음(1~10까지 있을 때 5가 삭제된 경우, 5는 비워지고 다음 값을 입력하면 11이 됨)
주로 구매 테이블 같은 경우에 사용한다.
CREATE table hongong2(
toy_id int auto_increment primary key,
toy_name char(4),
age int
)default charset=utf8;
insert into hongong2 values(null, '보핍', 25);
insert into hongong2 values(null, '슬링키', 22);
insert into hongong2 values(null, '렉스', 21);
3.1.1 last_insert_id()
AUTO_INCREMENT로 마지막으로 입력된 값 반환
3.1.2 AUTO_INCREMENT의 시작값 변경
alter table hongong2 auto_increment=100;
insert into hongong2 values(null, '재남', 35);
ALTER TABLE로 실행한다. 실행한 이후의 ROW부터 적용된다.
3.2 INSERT INTO~SELECT
다른 테이블의 행을 SELECT로 가져와서 테이블에 입력
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;
select * from city_popul;
4. 데이터 수정: UPDATE
UPDATE 테이블명
SET 컬럼=값1, 컬럼=값2, ...
WHERE 조건;
-- city_name 칼럼의 값이 'Seoul'인 행의 city_name을 '서울'로 변경
update city_popul
set city_name = '서울'
where city_name = 'Seoul';
-- city_name 칼럼의 값이 'New York'인 행의 city_name을 '뉴욕'으로, population을 0으로 변경
update city_popul
set city_name = '뉴욕', population = 0
where city_name = 'New York';
값을 연산할 수 있다.
-- population 칼럼의 값을 10000으로 나눠 저장
update city_popul
set population = population/10000;
5. 데이터 삭제: DELETE
-- where절로 행을 지정하지 않으면 전체 행 삭제
delete from city_popul
where city_name like 'New%';
-- limit로 삭제할 개수 지정 가능
delete from city_popul
where city_name like 'New%'
limit 5;
+테이블 삭제
create table big_table1 (select * from world.city, sakila.country);
create table big_table2 (select * from world.city, sakila.country);
create table big_table3 (select * from world.city, sakila.country);
delete from big_table1;
drop table big_table2;
truncate table big_table3;
DELETE: 오래 걸림, 테이블 남김
DROP: 빠름, 테이블을 남기지 않음
TRUNCATE: 빠름, 테이블 남김
Chapter04 SQL 고급 문법
4.1 MySQL의 데이터 형식
4.2 두 테이블을 묶는 조인
4.1 MySQL의 데이터 형식
1. 데이터 형식
1.1 정수형
데이터 형식 | 바이트 수 | 숫자 범위 |
TINYINT | 1 | -128~127 |
SMALLINT | 2 | -32,768 ~ 32,767 |
INT | 4 | 약 -21억 ~ +21억 |
BIGINT | 8 | 약 -900경 ~ +900경 |
out of range: 데이터 형식의 범위를 벗어난 값을 입력할 경우 발생하는 오류
UNSIGNED: 값의 범위가 0부터 시작. TINYINT의 경우 0~255
예시: height TINYINT UNSIGNED,
1.2 문자형
CHAR: 글자 개수 고정
VARCHAR: 10으로 지정하고 3만큼만 입력하는 경우 3만큼의 메모리만 사용
대량 데이터 형식
데이터 형식 | 바이트 수 | |
TEXT 형식 | TEXT | 1~65535 |
LONGTEXT | 1~4294967295 | |
BLOB 형식 | BLOB | 1~65535 |
LONGBLOB | 1~ 4294967295 |
사진, 동영상: BLOB/LONGBLOB
1.3 실수형
데이터 형식 | 바이트 수 | 설명 |
FLOAT | 4 | 소수점 아래 7자리까지 |
DOUBLE | 8 | 소수점 아래 15자리까지 |
1.4 날짜형
데이터 형식 | 바이트 수 | 설명 |
DATE | 3 | 날짜만 저장. YYYY-MM-DD |
TIME | 3 | 시간만 저장. HH:MM:SS |
DATETIME | 8 | 날짜 및 시간 저장. YYYY-MM-DD HH:MM:SS |
2. 변수의 사용
SET @변수명 = 변수값; -- 변수 선언 및 초기화
SELECT @변수명; -- 변수 값 출력
set @txt = '가수 이름 ==> ';
set @height = 166;
select @txt, mem_name from member where height>@height;
*LIMIT에는 변수 사용 불가
3. 데이터 형 변환
3.1 명시적 형변환
CAST(), CONVERT()
select cast(avg(price) as signed) '평균 가격' from buy;
select convert(avg(price), signed) '평균 가격' from buy;
signed: 부호 있는 정수
unsigned: 부호 없는 정수
cast와 avg 모두 괄호를 사용한다. 헷갈릴 수 있기 때문에, 익숙해지기 전까지는 연습삼아 과정별로 나눠서 입력하는 것도 좋다.
select price '평균 가격' from buy;
SELECT AVG(price) as '평균 가격' from buy;
select cast(avg(price) as signed) '평균 가격' from buy;
select convert(avg(price), signed) '평균 가격' from buy;
날짜형 변환
select cast('2022$12$12' as date);
select convert('2022/12/12', date);
select convert('2022%12%12', date);
select convert('2022@12@12', date);
문자형 변환+concat 사용
-- select num, 가격x수량, 구매액 from buy; 가이드
select num,
price, 'x', amount, '=' '가격x수량',
price*amount '구매액' from buy;
--형변환
select num,
convert(price, char), 'x', convert (amount, char), '=' '가격x수량',
price*amount '구매액' from buy;
--concat
select num,
concat(convert(price, char), 'x', convert (amount, char), '=') '가격x수량',
price*amount '구매액' from buy;
3.2 암시적 형변환
select '100' + '200'; -- 정수로 형변환, 300
select concat (100, '200'); -- 문자열로 형변환, 100200
select 3<'5frogs'; -- 정수 5로 형변환, 1(true)
select 3>'frog'; -- 문자열은 정수 0으로 형변환, 1(true)
4.2 두 테이블을 묶는 조인
1. 내부 조인
2. 외부 조인
3. 기타 조인
1. 내부 조인
두 테이블에 모두 데이터가 있어야 결과 나옴
select * from buy
where buy.mem_id = 'GRL';
이 상태에서 JOIN문을 추가한다고 생각한다.
select * from buy
inner join member
on buy.mem_id = member.mem_id
where buy.mem_id = 'GRL';
where절로 조건을 제한하지 않은 경우
select * from buy
inner join member
on buy.mem_id = member.mem_id;
-- 오류: 두 테이블 모두에 mem_id 컬럼이 있음
select mem_id, mem_name, prod_name, addr, concat(phone1, phone2) '연락처'
from buy
inner join member
on buy.mem_id = member.mem_id;
-- 중복되는 컬럼에 테이블명 명시
select buy.mem_id, mem_name, prod_name, addr, concat(phone1, phone2) '연락처'
from buy
inner join member
on buy.mem_id = member.mem_id;
-- 모든 컬럼에 테이블명을 명시해서 더 명확하게 하고 join했음을 알기 쉽게 함
select buy.mem_id, member.mem_name, buy.prod_name, member.addr, concat(member.phone1, member.phone2) '연락처'
from buy
inner join member
on buy.mem_id = member.mem_id;
-- 테이블명 별칭을 사용해서 간략하게 표현
select b.mem_id, m.mem_name, b.prod_name, m.addr, concat(m.phone1, m.phone2) '연락처'
from buy b
inner join member m
on b.mem_id = m.mem_id;
DISTINCT문 사용
select distinct m.mem_id, m.mem_name, m.addr
from buy b
inner join member m
on b.mem_id = m.mem_id
order by m.mem_id;
2. 외부 조인
한쪽에만 데이터가 있어도 결과 나옴
SELECT 칼럼명
FROM 첫번째테이블(LEFT)
LEFT|RIGHT|FULL OUTER JOIN
ON 조인조건
[WHERE절]
보통 LEFT OUTER JOIN을 사용한다.
-- 구매 이력이 없는 회원도 출력
select m.mem_id, m.mem_name, b.prod_name, m.addr
from member m
left outer join buy b
on b.mem_id = m.mem_id
order by m.mem_id;
RIGHT OUTER JOIN: 기준이 오른쪽 테이블
FULL OUTER JOIN: LEFT+RIGHT 합
3. 기타 조인
3.1. 상호 조인cross join(=카티션 곱cartesian product)
select *
from buy
cross join member;
3.2. 자체 조인self join
select a.emp "직원", b.emp "직속상관", b.phone "직속상관연락처"
from emp_table a
inner join emp_table b
on a.manager = b.emp
where a.emp = '경리부장';
4.3 SQL 프로그래밍
1. IF문
2. CASE문
3. WHILE문
4. 동적 SQL
1. IF문
2. CASE문
3. WHILE문
4. 동적 SQL
'정리노트' 카테고리의 다른 글
[SQL] 인덱스, 스토어드 프로시저 (0) | 2024.01.05 |
---|---|
[SQL] SQL 고급 문법 (0) | 2024.01.04 |
[SQL] 데이터베이스 기본, SQL 기본 문법 (0) | 2024.01.02 |
[JSP] MVC - 비즈니스의 역할 (0) | 2023.12.29 |
[JSP] MVC 연습 (0) | 2023.12.28 |