개발/Database

수업정리(2022.07.05)-MySQL order by, join, sum, count, group by 및 응용

eeee 2022. 7. 5. 20:10

자료 보고 직접 테이블 만들기

 

create table pay(

pay_no int(8) not null auto_increment,

pay_place varchar(100) not null,

pay_code varchar(250) not null,

pay_time datetime not null default '0001-01-01 01:00:00',

pay_card varchar(50) not null,

pay_monthly char(30) not null,

pay_cost bigint not null,

pay_recipt char(5) not null,

primary key(pay_no)

);

 

create table pay(

pidx int(8) not null auto_increment,

parea char(100) not null,

pno varchar(13) not null,

pdate datetime not null default '0001-01-01 01:00:00',

pcard char(100) not null,

pm char(40) not null,

money int(7) not null,

presult enum('Y', 'N') not null default 'Y',

primary key(pidx)

);

 

※테이블 생성 시 상품코드 같은경우는 숫자로 구성되어있더라도 int같이 숫자형으로 설정하면 안됨( 맨앞에 0 이들어갈수있어서), char, varchar같이 문자형 사용할것.

 

  

테이블 정렬

오름차순 : select * from tablename order by fieldname asc;

 

내림차순 : select * from tablename order by fieldname desc;

 

 

order by - 정렬기준

 

group by 필드명 : 해당 필드값이 같은 것 끼리 모아서 추출- sum, count 등의 명령어 사용 가능

 

해당 같은 이름을 가진 그룹별로 각각 값을 합친 데이터를 출력하는 sql 명령어

select 필드명, sum(필드명) as 가상의 필드명 from 테이블명 group by 필드명;

같은이름가진 그룹의 갯수 세는 명령어

select 필드명, count(*) as 가상의 필드명 from 테이블명 group by 필드명; 

  

mysql> select pcard, sum(money) as totalmoney, count(*) as number from pay group by parea; 

 

 

 

카드사별 결제 건수 

select pcard, count(*)as cno from pay group by pcard; 

 

 

 

 

 

 새로운 테이블 생성-join에사용

create table product(

pd_no int(8) not null auto_increment,

pd_code  char(13) not null,

pd_name varchar(250) not null,

pd_cost int(7) not null,

pd_result enum('Y' , 'N') not null default 'Y',

primary key(pd_no)

);

 

insert into product values  ('0','9203101937988','토니모리 원더 세라미이드 500ml','37000','Y');

insert into product values('0','0612329255417','토니모리 토니 랩 에이씨 컨트롤 500ml','19000','Y');

insert into product values('0','9210233222339','토니모리 원더 퀵 카밍 토너 4종 세트','118000','Y');

insert into product values('0','3611264692414','토니모리 토니 랩 에이씨 컨트롤 5종세트','248000','Y');

insert into product values('0','2456781123245','토니모리 토니 랩 에이씨 컨트롤 토너 180ml','154800','Y');

insert into product values('0','5678818234496','토니모리 알로에 99% 수딩젤 250ml','24000','Y');

insert into product values('0','7656462265410','토니모리 어성초시카 퀵 카밍 패드 200ml 4개','61000','Y');

insert into product values('0','1263656514459','토니모리 어성초시카 퀵 카밍 수딩 젤 300ml','76000','Y');

insert into product values('0','8766545233212','토니모리 슈퍼 인텐스 골드 24K 140ml','58900','Y');

insert into product values('0','7612323337489','토니모리 바이오이엑스 골드 솔루션 토너 130ml','32500','Y');

insert into product values('0','9331312245524','토니모리 바이오이엑스 골드 기초화장품 2종  세트','228700','Y');

 

 

테이블 join

select a.필드명,b.필드명 from 본테이블 as a별명명칭 join 비교테이블 as b별명명칭 on a별명명칭.필드명 = b별명명칭.필드명  -> from뒤에 쓴 테이블 기준으로 데이터 가져옴 , on 비교

 

 

 

select p.pno,z.pd_name,p.parea,p.pdate,p.money from pay as p join product as z on p.pno=z.pd_code; 

 
응용문제) 상품 코드명 9203101937988 해당사항에 대한 총 매출 금액을 출력. 출력방식은 상품코드, 상품명, 총판매금액
mysql> select p.pno,z.pd_name,sum(p.money) from pay as p join product as z on p.pno=z.pd_code where p.pno='9203101937988'; 
 
 
응용문제)각 상품별 판매 갯수를 출력하시오.
상품 코드, 상품명, 판매갯수
select p.pno,z.pd_name,count(*) from pay as p join product as z on p.pno=z.pd_code group by z.pd_name; 
 
수량으로 정렬하려면 count에도 이름을 붙여주면 가능.
 
 
 
응용 문제) 5월 22일 날짜에 대한 판매 상품을 확인하고 싶어합니다.
상품코드, 상품명, 판매점,판매일자, 판매금액
select p.pno, z.pd_name, p.parea, p.money  from pay as p join product as z on p.pno=z.pd_code where p.pdate>="2022-05-22 00:00:00" and p.pdate<="2022-05-22 23:59;59"; 
 
 
테이블 3개 만들기
members payok points
 
create table members( 
m_no int(8) not null auto_increment,
 m_id varchar(100) not null,
m_name varchar(100) not null,
m_phone varchar(13) not null,
m_email varchar(200) not null,
m_date datetime not null default '0001-01-01 01:00:00',
m_area varchar(50) not null,
primary key(m_no, m_id),
unique key(m_id)
 );
 
create table payok(
pa_no int(8) not null auto_increment,
pa_code varchar(8) not null,
pa_product tinytext not null,
pa_id varchar(200) not null,
pa_cost int(7) not null,
pa_card varchar(200) not null,
pa_result enum('Y','N') not null default 'Y',
primary key(pa_no)
);
 
create table points(
po_no int(8) not null auto_increment,
po_id varchar(100) not null,
po_point int(6) not null,
po_use enum('Y','N') not null default 'Y',
po_date datetime not null default '0001-01-01 01:00:00',
primary key(po_no)
);
 
 
point테이블에서 적립포인트와 사용포인트를 한번에 보도록 추출
select sum(po_point),(select sum(po_point) from points where po_id='kmin_lee' and po_use='N')as usepoint from points where po_id='kmin_lee' and po_use='Y'; 
 
 
응용문제)조기현님 포인트 적립 및 사용금액을 출력하세요. 아이디, 적립금액, 사용금액
1.아이디 먼저 검색
select m_id from members where m_name = '조기현'; 
 
2.테이블 조인 (members +points)
select * from members as m join points as p where m.m_name='조기현'; 
 -> 비교를안해서 데이터가 많이 나옴
3. 멤버테이블의 id필드 와 포인트 테이블의 id필드 비교해서 같은값만 출력 
select * from members as m join points as p on m.m_id =p.po_id where m.m_name='조기현'; 
  
4. 사용한 포인트 확인
select p.po_id, sum(p.po_point) from members as m join points as p on m.m_id = p.po_id where m.m_name='조기현' and po_use='Y'; 
 
5. 사용한 포인트와 적립된 포인트 확인
select p.po_id, sum(p.po_point) as plus_point, (select sum(p.po_point) from members as m join points as p on m.m_id = p.po_id where m.m_name ='조기현' and p.po_use ='N') as loss_point from members as m join points as p on m.m_id = p.po_id where m.m_name ='조기현' and p.po_use ='Y'; 
 
 
>내가 풀어본 방법
select (select m_id from members where m_name='조기현') as id, sum(po_point) as savepoint, (select sum(po_point) from points where po_id='kihyun_top' and po_use='N')as usepoint from points where po_id='kihyun_top' and po_use='Y'; 
 
응용문제2)해당 사용자가 결제한 내역을 확인하는 부분
이진형님이 결제한 내역을 검색하게 됩니다.
아이디, 이름, 상품코드,상품명,결제금액, 결제카드
 -> members + payok
 1. 이진형님 이름 검색
select * from members where m_name = '이진형'; 
 
 2. 테이블 조인(members+payok)
select *from members as m join payok as p on m.m_id = p.pa_id where m_name='이진형'; 
 
 
3. 주어진 조건에 맞게 보여지는 필드 수정
select p.pa_id,m.m_name,p.pa_code,p.pa_product,p.pa_cost,p.pa_card from members as m join payok as p on m.m_id = p.pa_id where m_name='이진형'; 
 
 
Table join 형태
select 필드명 from 테이블명 as a가상의필드명 join 테이블명 as b가상의테이블명 on a가상의테이블명.필드명=b가상의테이블명.필드명 where 가상의테이블명.필드명;

 

 
mssql
express 다운로드
ssms설치
 
MSSQL 포트 1433 
각각의 db들은 고유 포트를 가지고있음 -> 백엔드는 기본상식으로 알고있어야 함
 
(tcp기준)
★☆★☆★외울것★☆★☆★
http:80
https:443
FTP:21
SSH:22  -> 100%사용. db에 들어가서 자료확인하려면 필요
SMTP(메일발송):25
POP3(PC 다운로드):110
IMAP(PC 다운로드 + 서버에 Mail 저장):143
MYSQL:3306
MSSQL:1433
★☆★☆★☆★☆★☆★ 
 
 
주로 맨위에 Database Engine 사용 (내부)
Analysis - 연습용
Reporting - 거의안씀
 
 
서버에 연결하면 두번째 선택칸 내용 바뀜
 
 
 
 
 
Windows에는 root 없음. 관리자모드 사용(mysql의 root와 같음) . windows 인증으로 사용
 
 
 
 
 
 
 
 
 
 
MSSQL는 자료형이 다름
int(8) -> INT 
varchar(100) -> varchar
자리수 넣지않음. 자동으로 크기 잡힘.
 
auto_increment 는 자동적용. 키값을 따로 부여해야함.
 
 
 
디자인으로 보면서 테이블에 컬럼 추가도 가능
 
nvarchar-> mysql과 다르게 n이 붙어있음.
 
 
 
primary 키도 필드명을 우클릭해서 설정 및 해제 가능함
 
 
테이블 삭제
 
 
테이블 생성
 
 
 
 
 
빨간줄떠도 실행은됨