[MySQL] 쿼리문, 포트 확인
1. 쿼리문 연습
/* root 계정으로 JIN 데이터베이스 생성, 계정 이름 YOUNG 생성 */
DROP DATABASE IF EXISTS JIN; /*만약에 JIN 데이터베이스가 존재한다면 지워라*/
DROP USER IF EXISTS young@localhost; /*localhost에 young이라는 유저가 있다면 지워라*/
create database jin;
/*localhost에 young이라는 유저를 생성하고 비밀번호는 young으로 설정한다.*/
create user young@localhost identified with mysql_native_password by 'young';
/*jin 데이터베이스의 모든 권한을 young 계정에게 주겠다.*/
grant all privileges on jin.* to young@localhost with grant option;
commit; /*권한 설정을 최종 저장*/
/*jin 데이터베이스를 선택한다. 더블 클릭해서 볼드 효과주는 것과 같은 역할*/
use JIN;
/*테이블 생성*/
create table Book(
bookID integer primary key,
bookName varchar(40),
publisher varchar(40),
price integer);
create table Customer(
custID integer primary key,
name varchar(40),
address varchar(40),
phone varchar(20));
create table Orders(
orderID integer primary key,
custID integer,
bookID integer,
saleprice integer,
orderDate DATE,
FOREIGN KEY (custID) REFERENCES Customer(custID),
FOREIGN KEY (bookID) REFERENCES Book(bookID)
);
/* drop table oder; 잘못 생성한 테이블 지우기*/
/*테이블에 자료 입력*/
INSERT INTO Book VALUES(1, '축구의 역사', '굿스포츠', 7000);
INSERT INTO Book VALUES(2, '축구아는 여자', '나무수', 13000);
INSERT INTO Book VALUES(3, '축구의 이해', '대한미디어', 22000);
INSERT INTO Book VALUES(4, '골프 바이블', '대한미디어', 35000);
INSERT INTO Book VALUES(5, '피겨 교본', '굿스포츠', 10000);
INSERT INTO Book VALUES(6, '역도 단계별기술', '굿스포츠', 6000);
INSERT INTO Book VALUES(7, '야구의 추억', '이상미디어', 20000);
INSERT INTO Book VALUES(8, '야구를 부탁해', '이상미디어', 13000);
INSERT INTO Book VALUES(9, '올림픽 이야기', '삼성당', 7500);
INSERT INTO Book VALUES(10, 'Olympic Champions', 'Pearson', 13000);
INSERT INTO Customer VALUES (1, '박지성', '영국 맨체스타', '000-5000-0001');
INSERT INTO Customer VALUES (2, '김연아', '대한민국 서울', '000-6000-0001');
INSERT INTO Customer VALUES (3, '장미란', '대한민국 강원도', '000-7000-0001');
INSERT INTO Customer VALUES (4, '추신수', '미국 클리블랜드', '000-8000-0001');
INSERT INTO Customer VALUES (5, '박세리', '대한민국 대전', NULL);
INSERT INTO Orders VALUES (1, 1, 1, 6000, STR_TO_DATE('2014-07-01','%Y-%m-%d'));
INSERT INTO Orders VALUES (2, 1, 3, 21000, STR_TO_DATE('2014-07-03','%Y-%m-%d'));
INSERT INTO Orders VALUES (3, 2, 5, 8000, STR_TO_DATE('2014-07-03','%Y-%m-%d'));
INSERT INTO Orders VALUES (4, 3, 6, 6000, STR_TO_DATE('2014-07-04','%Y-%m-%d'));
INSERT INTO Orders VALUES (5, 4, 7, 20000, STR_TO_DATE('2014-07-05','%Y-%m-%d'));
INSERT INTO Orders VALUES (6, 1, 2, 12000, STR_TO_DATE('2014-07-07','%Y-%m-%d'));
INSERT INTO Orders VALUES (7, 4, 8, 13000, STR_TO_DATE( '2014-07-07','%Y-%m-%d'));
INSERT INTO Orders VALUES (8, 3, 10, 12000, STR_TO_DATE('2014-07-08','%Y-%m-%d'));
INSERT INTO Orders VALUES (9, 2, 10, 7000, STR_TO_DATE('2014-07-09','%Y-%m-%d'));
INSERT INTO Orders VALUES (10, 3, 8, 13000, STR_TO_DATE('2014-07-10','%Y-%m-%d'));
use jin; /*데이터베이스 선택*/
/* <>같지 않다 연산자, between ~와~사이 연산자 in ~에 있다 연산자 not in ~에 없다 연산자
Like 조건 연산자, is null 널이냐? 연산자, is not null, AND, OR, NOT
*/
select * from book where price < 20000;
update Book set price=10000 where bookid = 5; /*update는 primary key를 where로 설정해야 수정할 수 있다.*/
select * from book where price between 10000 and 20000; /*10000원 이상 20000원 이하*/
/*where로 select 범위나 조건을 지정할 수 있다.*/
select * from book where publisher = '굿스포츠' or publisher = '대한미디어' or publisher = '이상미디어';
select * from book where publisher in ('굿스포츠', '대한미디어', '이상미디어');
select * from book where publisher not in ('굿스포츠', '대한미디어', '이상미디어');
/* like는 전체가 같은 경우(등호)가 아니라 일부분만 같을 경우 사용한다.*/
/* like 조건에서 %를 사용하면 해당 키워드만 포함된 자료를 찾을 수 있다.*/
/* _(언더바)는 %보다 좁은 범위로 검색하고 싶을 때 사용한다.*/
select * from book where bookname like '%역사%';
select * from book where bookname like '%구%';
select * from book where bookname like '_구%'; /*두번째 글자만 '구'인것을 찾아 보여줌*/
select * from book where bookname like '__의%';
select * from book where bookname like '__의%' and bookname like '%역%';
select * from book where bookname like '%축구%' and price >= 20000;
/*order by는 오름차순 및 내림차순으로 정렬해서 보여줄 때 사용한다.*/
/* desc는 내림차순, asc는 오름차순 정렬이다.*/
select * from book order by bookname;
select * from book order by price, bookname;/*가격순으로 정렬 후 같은 가격은 이름순으로 정렬한다.*/
select * from book order by price, publisher, bookname;
select * from book order by price desc; /*desc는 내림차순으로 정렬*/
select * from book order by price desc, publisher asc;/*가격은 내림차순, 같은 가격일 때 출판사는 오름차순*/
/* sum, avg, min, max, count */
/* 주문한 도서의 총 판매액*/
select saleprice from orders;
select SUM(saleprice) as 총매출 from orders;
select SUM(saleprice) 총매출 from orders; /*버전에 따라 as는 생략 가능하다.*/
select SUM(saleprice) as "전체 매출" from orders;/*큰 따옴표, 작은 따옴표 모두 사용할 수 있다.*/
select max(saleprice) as '최고 매출' from orders;
select sum(saleprice) as 구매액합 from orders where custID = 2;
/*고객이 주문한 도서의 총판매액, 평균값, 최고가, 최저가, 판매수를 구하시오*/
select sum(saleprice) as 총판매액,
avg(saleprice) as 평균값,
max(saleprice) as 최고가,
min(saleprice) as 최저가,
count(saleprice) as 판매수
from orders;
select count(*) from orders; /*데이터가 총 몇개인지 1번째 행에 출력함*/
/*고객 별로 주문한 도서의 총 수량과 총 판매액을 구하시오*/
select custID, count(*) as 도서수량, sum(saleprice) as 총액 from orders group by custID;
select custID, count(*) as 도서수량, sum(saleprice) as 총액 from orders;
/*가격이 8천원 이상인 도서를 구매한 고객에 대해 고객별 주문 도서의 총 수량.
단, 두권 이상 구매한 고객만 구하시오.*/
select custID, count(*) as 도서수량 /*5 select에 order by가 있다면 마지막에 실행 됨*/
from orders /*1*/
where saleprice >= 8000 /*2*/
group by custID /*3*/
having count(*) >= 2; /*4*/
/*고객의 이름과 고객이 주문한 도서의 판매가격을 검색하시오.*/
select name, saleprice
from customer, orders /*두개의 테이블을 불러 옴*/
where customer.custID = orders.custID; /*FK를 연결할 땐 where뒤에!, 테이블명.컬럼명으로 명시해준다. */
/*고객별 판매액, 고객 이름순으로 정렬하시오.*/
select name, sum(saleprice)
from customer, orders
where customer.custID = orders.custID
group by customer.name
order by customer.name;
/*고객의 이름과 고객이 주문한 도서의 이름을 구하시오.*/
select customer.name, book.bookName
from customer, book, orders
where customer.custID = orders.custID AND orders.bookID = book.bookID;
/*도서를 구매하지 않은 고객을 포함.
고객의 이름과 고객이 구매한 도서의 판매가격*/
select customer.name, orders.saleprice
from customer LEFT OUTER JOIN orders /*join : 합치겠다. 왼쪽 테이블엔 있는데 오른쪽 테이블에 기준이 되는 자료가 없을 경우 null로 받겠다.*/
ON customer.custID = orders.custID; /*기준이 되는 것*/
/* 가격이 2만원인 도서를 주문한 고객의 이름과 도서의 이름을 구하시오.*/
select customer.name, book.bookName
from customer, book, orders
where customer.custID = orders.custID AND orders.bookID = book.bookID
AND book.price = 20000;
2. 사용 중인 포트 확인
2.1. 사용 중인 포트 확인
- 명령 프롬프트를 관리자 권한으로 엽니다. 이를 위해 시작 메뉴에서 'cmd'를 검색한 다음, 마우스 오른쪽 버튼으로 클릭하고 '관리자 권한으로 실행'을 선택합니다.
- 명령 프롬프트에 다음 명령어를 입력합니다.여기서 포트번호는 확인하고자 하는 포트 번호로 대체합니다. 예를 들어, 8080 포트를 확인하고 싶다면 findstr :8080이 됩니다.
netstat -aon | findstr :포트번호
- 여기서 PID는 해당 포트를 사용 중인 프로세스의 식별자입니다.
- 이 명령은 지정된 포트를 사용하는 모든 연결을 표시합니다. 출력 결과는 다음과 같은 형식일 것입니다:
TCP 0.0.0.0:포트번호 0.0.0.0:0 LISTENING PID
2.2. PID를 사용하여 프로세스 확인
PID를 통해 어떤 프로그램이 해당 포트를 사용 중인지 확인할 수 있습니다.
- 작업 관리자를 엽니다. 작업 표시줄에서 마우스 오른쪽 버튼을 클릭하고 '작업 관리자'를 선택하거나, Ctrl + Shift + Esc 단축키를 사용합니다.
- '상세 정보' 탭으로 이동합니다.
- PID 열을 찾아 해당 PID에 해당하는 프로세스를 확인합니다. 만약 PID 열이 보이지 않는다면, 열 헤더(예: '프로세스 이름')를 마우스 오른쪽 버튼으로 클릭하고 '열 선택'에서 'PID (프로세스 식별자)'를 체크합니다.
2.3. 프로세스 종료
포트를 사용하는 프로그램을 종료하려면, 먼저 그 프로그램이 중요한 작업을 수행 중이지 않은지 확인해야 합니다. 프로세스를 강제로 종료하면 데이터 손실이나 시스템 불안정을 초래할 수 있습니다.
- 작업 관리자에서 해당 프로세스를 찾습니다.
- 프로세스를 선택하고 '작업 끝내기' 버튼을 클릭합니다.
2.4. 프로세스 종료 명령어
만약 명령 프롬프트에서 직접 프로세스를 종료하고 싶다면, 다음 명령어를 사용할 수 있습니다. 이 명령도 관리자 권한으로 열린 명령 프롬프트에서 실행해야 합니다.
taskkill /F /PID 번호
여기서 /F는 강제 종료 옵션이고, 번호는 종료하려는 프로세스의 PID입니다.
이러한 단계를 통해 윈도우에서 포트를 사용하고 있는 프로세스를 확인하고 필요한 경우 종료할 수 있습니다. 데이터 손실을 방지하기 위해 프로세스를 종료하기 전에 중요한 작업이 진행 중이지 않은지 항상 확인하세요.
3. HAVING VS GOUP BY
HAVING 절은 주로 GROUP BY 절과 함께 사용되며, 집계 함수의 결과에 대한 조건을 적용할 때 사용됩니다. 예를 들어, 그룹화된 결과의 평균, 합계, 최대값, 최소값 등을 필터링하는 경우에 HAVING을 사용합니다. 반면, 개별 행에 대한 조건을 적용할 때는 WHERE 절을 사용합니다.
WHERE vs. HAVING
- WHERE 절은 집계 전에 개별 행에 대한 조건을 필터링하는 데 사용됩니다. 즉, 데이터가 집계되기 전에 특정 조건을 만족하는 행을 선택합니다.
- HAVING 절은 집계 후에 그룹화된 결과에 대한 조건을 적용하는 데 사용됩니다. 이는 WHERE 절로는 할 수 없는 작업이며, GROUP BY 절과 함께 사용될 때 의미가 있습니다.
SELECT customer.name, book.bookName
FROM customer, book, orders
WHERE customer.custID = orders.custID AND orders.bookID = book.bookID
AND book.price = 20000;
이 쿼리에서 book.price = 20000은 개별 book 행에 대한 조건입니다. 여기서는 집계 함수나 GROUP BY 절이 사용되지 않으므로, HAVING을 사용할 이유가 없습니다. book.price 조건은 특정 도서의 가격을 필터링하기 위한 것이며, 이는 집계 전에 적용되어야 합니다.
HAVING 사용 예시
HAVING 절의 사용 예시는 다음과 같습니다. 도서별로 총 주문 수량이 100을 초과하는 도서의 이름과 해당 도서의 총 주문 수량을 조회하는 쿼리입니다.
SELECT book.bookName, SUM(orders.quantity)
FROM book
JOIN orders ON book.bookID = orders.bookID
GROUP BY book.bookName
HAVING SUM(orders.quantity) > 100;
이 예시에서는 GROUP BY로 도서 이름별로 결과를 그룹화하고, HAVING 절을 사용해 그룹화된 결과 중 총 주문 수량이 100을 초과하는 도서만 필터링합니다. 여기서 HAVING은 SUM(orders.quantity)와 같은 집계 결과에 대한 조건을 적용하기 위해 필요합니다.