2024.02.21
오늘 학습한 내용 : SQL 심화
명령 프롬트를 킨다

파일의 경로를 찾아 복사한다.

1~4를 통해 최종적으로 sql파일을 커맨드 프롬프트를 통해 사용이 가능하다.

숫자 데이터 형식
문자 데이터 형식
날짜와 시간 데이터 형식
SQL도 변수를 선언하고 사용할 수 있다. 형식은 다음과 같다.
형식>
SET @변수이름 = 변수의 값 ; -- 변수의 선언 및 값 대입
SELECT @변수이름 ; -- 변수의 값 출력
-- 1. 변수 사용
USE sqldb;
set @myVar1 = 5;
set @myVar2 = 3;
set @myVar3 = 4.25;
set @myVar4 = '가수 이름 ==>';
select @myVar1, @myVar2; -- mysql 고유 문법임
select @myVar1 + @myVar3;
select @myVar4, name from usertbl; -- 변수를 열과 같이 사용가능

-- 형태
-- avg(amount)값을 integer로 형변환
cast(avg(amount) as signed integer)
-- 형태
-- avg(amount)값을 integer로 형변환
-- cast()와 다르게 convert()는 함수이기에 파라미터처럼 작성
convert(avg(amount) , signed integer)
select avg(amount) from buytbl; -- 결과는 2.9167
select cast(avg(amount) as signed integer) avgAmount from buytbl; -- 결과는 3 ,, 정수형으로 형변환됨.
select convert(avg(amount) , signed integer) avgAmount from buytbl; -- convert()는 함수이기에 cast()와 다르게 파라미터 형식으로 작성
-- 묵시적 형변환 (자동으로 형변환)
-- cast(), convert()를 사용하지 않는 형변환
select '100'+'200';
select concat('100','200'); -- concat은 문자열을 이어주는 함수이기에 문자열이 그대로 문자열이 됨.
select concat(100,'200'); -- 정수와 문자를 연결 -> 정수가 문자로 반환되어 연결됨 (묵시적 형변환)
select 1 > '2mega'; -- 문자가 정수로 자동 형변환 '>' 연산자 때문이다. 결과 -> 1>2는 false 이기에 0 반환
select 3 > '2MEGA'; -- --> 1 반환
SELECT IFNULL(NULL,'널이군요'),IFNULL(100,'널이군요);
SELECT NULLIF(100,100),NULLIF(120,40);
SELECT CASE 10
WHEN 1 THEN '일'
WHEN 5 THEN '오'
WHEN 10 THEN '십'
ELSE '모름'
END AS 'CASE 연습'
한 열에 포함된 여러 값을 출력하고, 이를 여러 열로 변환하여 테이블 반환 식을 회전하고 필요하면 집계까지 수행하는 것.
실습>
-- 1. pivottest를 위한 테이블 만들기
create table pivotTest(
uname varchar(5),
season varchar(2),
amount int
);
-- 2. 테이블에 insert를 통해 실제값 삽입
insert into pivotTest values
('a','봄',20),('b','여름',20),('c','가을',20),
('d','봄',20),('e','겨울',20),('f','여름',20)
;
select * from pivottest;
select
uname,
sum(if(season ='봄', amount, 0)) '봄',
sum(if(season ='여름', amount, 0)) '여름',
sum(if(season ='가을', amount, 0)) '가을',
sum(if(season ='겨울', amount, 0)) '겨울',
sum(amount) as amount
from pivottest
group by 1;
Result>

두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것
select 열목록
from 첫번째 테이블 inner join 두번째 테이블
on 첫번째 테이블명.공통열 =두번째 테이블명.공통열
select *
from usertbl ut inner join buytbl bt on ut.userID = bt.userID -- userID가 공통조건임을 알 수 있음
where ut.name = '바비킴';

select ut.userID, ut.name, bt.prodName, ut.addr
from usertbl ut left outer join buytbl bt on ut.userID = bt.userID
order by ut.userID;

-- cross join ,, 많이 사용은 안함
create table usertbl_copy1
select * from usertbl limit 1;
select *
from usertbl_copy1 cross join buytbl;
-- self join
create table emptbl_1 -- 테이블 생성
(
emp varchar(10),
manager varchar(10),
tel varchar(10)
);
insert into emptbl_1 values -- 생성된 테이블에 값 삽입
('우대리','이부장','111'),('이부장','김전무','222');
select * from emptbl_1;
select * from emptbl_1 A inner join emptbl_1 B on A.emp = B.manager;
Result>
1. emptbl_1 테이블

2. self join

UNION
-- 문장1 과 문장2의 쿼리 결과를 행으로 합친다
SELECT 문장1
UNION[ALL]
SELECT 문장2
NOT IN / IN
NOT IN
IN
데이터의 무결성을 지키기 위한 제한된 조건
특정 데이터를 입력할 때 무조건적으로 입력되는 것이 아닌, 어떠한 조건을 만족했을 때에 입력되도록 제한
a. 기본키(Primary Key) 제약 조건
기본 키에 입력되는 값은 중복될 수 없으며 NULL 값이 입력될 수 없다.
기본 키로 생성된 것은 자동으로 '클러스터형 인덱스'가 생성된다.
테이블에서 기본키를 하나 이상의 열에 설정이 가능하다
설정방법> 예약어 'Primary key'를 이용한다.
USE tabledb;
drop table if exists buytbl, usertbl; -- 조건문 만족시 테이블 삭제
create table usertbl -- 테이블 생성
(
userid varchar(8) not null primary key,
name varchar(10) not null,
birth year int not null
);
Describe문을 통해 테이블 정보를 볼 수 있다.
Describe usertbl;
b. 외래키(Foriegn Key) 제약 조건
c. unique 제약 조건
d. check 제약 조건
e. default 정의
-- view 형태
create view 뷰명 as
select 열1,열2,... from 기존 테이블 명;
-- view 호출 (query문과 동일하게 사용 즉, 뷰를 테이블로 봐도 무방)
select 열1,.. from 뷰명 ;
데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 데이터 구조
즉, 데이터를 조회할 때(특히 select문 - query) 빠르게 접근하도록 도와준다.
Primary Key로 지정한 열은 클러스터형 인덱스 생성
장점
단점
클러스터형 인덱스(clustered index)
보조 인덱스(secondary index)
use sqldb; -- sqldb DB 사용
create table tb1 -- 간단한 테이블 형성
(
a int primary key -- primary key -> 자동으로 클러스터형 인덱스 생성
, b int unique -- secondary key -> 보조 인덱스 생성
, c int unique
);
-- 데이터 삽입
insert into tb1 values(1,2,3);
insert into tb1 values(4,5,6);
insert into tb1 values(10,2,4);
insert into tb1 values(3,1,5);
insert into tb1 values(12,3,1);
-- 데이터 조회
select * from tb1; -- 결과를 보면 a열(Primary key column)이 자동정렬이 된 것을 알 수 있음
show index from tb1; -- show index 구문을 통해 해당 테이블의 인덱스를 볼 수 있다.


인덱스 내부 동작

MySQL에서 제공되는 프로그래밍 기능
'쿼리문의 집합'으로 어떤 동작을 일괄처리하기 위한 용도
프로그래밍에서의 '모듈'이라고 생각하면 된다.
만드는 방법은 2가지 존재
방법1 >
DELIMITER $$
CREATE PROCEDURE 스토어드 프로시저 명 (IN 또는 OUT 파라미터1, .. )
BEGIN
SQL 프로그래밍 코딩 (Query문)
END $$
DELIMITER ;
-- 호출
call 스토어드 프로시저 명();
방법2>


Begin과 End 사이에 Query문을 넣고 apply를 하면 된다.
실습1>
-- birth_date > 1950 직원중에 남성만 추출 --> 파라미터를 넣어서 만들어보기
-- sp : myproc1으로 만들기
call myproc1(1950, 'F'); -- 이런식으로 만들면됨

-- 국가명을 입력하면 수도를 찾아서 수도의 이름을 출력하는 프로시저
select * from world.city where id = 2331;
select * from world.country where code = 'KOR';
-- 조인 (QUERY문 만들기)
select wci.CountryCode Country, wci.name capital from world.city wci inner join world.country wco on wci.CountryCode = wco.code
where wci.CountryCode = 'KOR' and wci.id = wco.Capital;
call country_procedure('ARG');

보완점 >
1,2,3은 주말에 다시 보완해야한다.