[포스코X코딩온 스마트팩토리 개발자과정 1기] Database / SQL 6-7일차

맨 땅에 개발자 되기·2023년 3월 8일
post-thumbnail

SQL ( Structured Query Language ) : 구조적 쿼리 언어 ( 비절차식 )

관계형 데이터베이스에 정보 저장/처리하기 위한 프로그래밍 언어

기능에 따라 ( 대문자로 사용 )

  • 데이터 정의어 ( DDL, Data Definition Language )
    • SELECT : 데이터 조회 및 검색 명령어
    • INSERT : 데이터 삽입 명령어
    • UPDATE : 데이터 수정 명령어
    • DELETE : 데이터 삭제 명령어
  • 데이터 조작어 ( DML, Data Manipulation Language )
    • CREATE : 테이블 관계나 구조 생성 명령어
    • ALTER : 테이블 관계나 구조 수정 명령어
    • DROP : 테이블 관계나 구조 삭제 명령어
  • 데이터 제어어 ( DCL, Data Control Language )
    • GRANT : 데이터베이스 데이터 사용 권한
    • REVOKE : 데이터베이스 데이터 사용 권한 회수

명령어 사용 시 주의할 점 !
문자열은 ‘’ 작은 따옴표 사용
마지막에 ; 세미콜론으로 마무리

*(별표) : all, 모든 데이터를 의미

데이터 정의어

DDL ( Data Definition Language )

SELECT문 : 데이터 검색 ( 질의어 ), 가장 많이 사용됨

SELECT 속성이름 FROM 테이블이름 WHERE 조건

ex) 홍지수 고객의 주소를 찾으시오.

→ SELECT addr FROM customer WHERE custname = ‘홍지수’;

** SELECT문 실행순서

  1. 조회 테이블 확인 ( FROM )
  2. 데이터 추출 조건 확인 ( WHERE )
  3. 컬럼 그룹화 ( GROUP BY )
  4. 그룹화 조건 ( HAVING )
  5. 데이터 추출 ( SELECT )
  6. 데이터 순서 정렬 ( ORDER BY )

DISTINCT : 중복된 데이터 제거

SELECT DISTINCT 속성이름 FROM 테이블이름 WHERE 조건 ORDER BY 속성이름

ex) 고객테이블에 있는 모든 주소를 검색 ( 중복 포함된 결과 )
SELECT addr FROM customer;

ex) 고객테이블에 있는 모든 주소를 검색 ( 중복 제외 ) -> DISTINCT
SELECT DISTINCT addr FROM customer;

WHERE 절 : 검색 조건 설정

SELECT 속성이름 FROM 테이블이름 WHERE 조건

ex) 제품 가격이 4000원 이상인 주문 내역 검색
SELECT * FROM orders WHERE price >= 4000;

비교 조건

= : 같다
: ~보다 크다
= : ~보다 크거나 같다
< : ~보다 작다
< = : ~보다 작거나 같다
! = , ^= , <> : 같지 않다 ( NOT 컬럼명 = ~와 같지 않다 )

ORDER BY : 결과출력 순서변경

SELECT 속성 FROM 테이블 WHERE 조건 ORDER BY 속성

order by 절을 사용하지 않는 경우,

pk기준으로 정렬 ( 인스턴스는 ABC순(오름차순)으로 정렬 )

ASC 오름차순 (기본값) / DESC 내림차순

ex) custname 기준으로 정렬
SELECT * FROM customer ORDER BY custname;

ex) custname 기준으로 내림차순 정렬
SELECT * FROM customer ORDER BY custname DESC;

ORDER BY & WHERE 함께 사용

ex) 2000년 이후 출생자 중에서 주소를 기준으로 내림차순 검색
SELECT * FROM customer WHERE birth >= '2000-01-01' ORDER BY addr DESC;

복합 조건

AND : 앞의 조건과 뒤의 조건이 같이 ‘참’이면 ‘참’
OR : 앞의 조건이나 뒤의조건 둘 중에 하나만 ‘참’이라도 ‘참’
NOT : 뒤의 조건과 반대

ex) 주소지가 대한민국이고, 2000년 이후 출생 고객 검색
SELECT * FROM customer WHERE addr LIKE '대한민국%' AND birth >= '2000-01-01';

ex) 휴대폰 번호 마지막 자리가 4가 아닌 고객 검색
SELECT * FROM customer WHERE phone NOT LIKE '%4';

BETWEEN a AND b : 범위 지정 ( a와 b 값 포함 )

ex) 1995년이상 2000년이하 출생 고객 검색
SELECT * FROM customer WHERE birth BETWEEN '1995-01-01' AND '2000-12-31';

SELECT * FROM customer WHERE birth >= '1995-01-01' AND birth <= '2000-12-31';

IN, NOT IN : 집합

ex) 주소가 서울 혹은 런던인 고객 검색
SELECT * FROM customer WHERE addr = '대한민국 서울' or addr = '영국 런던';

ex) 주소가 서울 혹은 런던 아닌 고객 검색
SELECT * FROM customer WHERE addr != '대한민국 서울' or addr != '영국 런던';

LIKE : 특정 패턴을 포함하는 데이터 검색

% : 0개 이상의 문자
_: 1개의 단일 문자

ex) 고객 이름 두번째 글자가 '지'인 고객 검색

-- 이름이 3글자이며, 두번째 글자가 '지'인 경우만 해당
SELECT * FROM customer WHERE custname LIKE '';

-- 이름 글자 수 제한 없이 두번째 글자가 '지'인 경우
SELECT * FROM customer WHERE custname LIKE '_지%';

-- 이름에 '지'가 들어가는 사람
SELECT * FROM customer WHERE custname LIKE '%지%';

LIMIT : 출력 갯수

주의) LIMIT에서 시작은 0임을 잊지말자 !!
LIMIT 개수 == LIMIT 시작, 개수 == LIMIT 개수 OFFSET 시작
LIMIT 2; == LIMIT 0, 2; == LIMIT 2 OFFSET 0

ex) 고객 테이블 전체 정보를 조회, 앞에 2건만 조회하고 싶은 경우
SELECT * FROM customer LIMIT 2;

ex) 고객 테이블 전테 정보를 조회, 두번째부터 여섯번째 행만 조회하고 싶은 경우
SELECT * FROM customer LIMIT 1, 5;

집계함수 : SELECT문에 조건 걸어둠

SELECT 집계함수 (속성이름) ….

SUM() : 합계
AVG() : 평균 값
MAX() : 최대값
MIN() : 최소값
COUNT() : 행 개수
COUNT(DISTINCT) : 중복 제외한 행 개수

SELECT COUNT(속성명) : 특정 속성의 총 개수를 조회

SELECT COUNT() FROM orders;
SELECT COUNT(
) AS 'number_orders' FROM orders;
SELECT COUNT(orderid) FROM orders;

SELECT COUNT(*) FROM customer; -- 10
SELECT COUNT(phone) FROM customer; -- 9

customer 테이블 phone 속성엔 NULL 값이 1개 있기 때문에 9개가 조회

GROUP BY : 속성이름끼리 묶음

SELECT 속성 FROM 테이블 WHERE 조건 GROUP BY 속성 ORDER BY 속성 LIMIT 개수

-- 고객별로 주문한 주문 내역 건수 구하기
SELECT custid, count(*) FROM orders GROUP BY custid;

orders 테이블에서 custid 별로 주문 건수를 그룹화하여 custid 주문 개수를 카운트 함

HAVING : GROUP BY 절의 결과를 나타내는 그룹을 제한

SELECT 속성 FROM 테이블 WHERE 조건 GROUP BY 속성 HAVING 조건 ORDER BY 속성 LIMIT 개수

  • GROUP BY + HAVING 반드시 같이 사용
  • WHERE 절보다 뒤에 사용

-- 총 주문액이 10000원 이상인 고객에 대해 고객별로 주문한 상품 총수량 구하기
SELECT custid, SUM(priceamount) total_price, SUM(amount) total_amount
FROM orders
GROUP BY custid
HAVING SUM(price
amount) >= '10000';

orders 테이블에서 custid 별로 총 주문액 합계가 10000원이상 총 주문액 합계(total_price)와 총 주문 건수 합계(total_amount)를 조회

MySQL 실행하는 방법

1) MySQL Workbench 사용방법


MySQL Workbench를 사용할 때는 지정해둔 User ID와 PW를 사용하여 시작한다.

2) CMD 사용방법



CMD를 이용해 MySQL가 있는 위치로 변경하고
mysql -u root -p를 통해서 로그인하고 비번을 넣는다.
프롬프트 명령어를 사용하여 명령어를 작성한다.

cd ( change directory ) : 작업 디렉토리의 위치를 변경
프롬프트 ( Prompt ) : 다음 동작에 대한 명령어, 지시어
복사/붙여넣기 단축키 사용가능
주소사이의 공백 인정
이전 명령어 → 방향키 ( 오타났을 때 유용 )

3) Git Bash 사용방법

시스템 환경 변수 편집 -> 미리 설정이 되어있어야 함.


Git Bash를 이용해 MySQL가 있는 위치로 변경하고
mysql -u root -p를 통해서 로그인하고 비번을 넣는다.
프롬프트 명령어를 사용하여 명령어를 작성한다.

복사/붙여넣기 단축키 사용불가능 → 마우스 오른쪽 버튼
주소사이의 공백 불인정 → “ ” 큰 따옴표 사용
이전 명령어 → 방향키 ( 오타났을 때 유용 )

그 밖에 사용된 명령어

테이블의 구조 속성 확인할 때 → DESC 테이블이름;
DESC customer;

테이블의 속성명 바꿀 때 -> AS '바꿀 속성명'
SELECT custid COUNT(*) AS 'total_custid' ... ;

IS NULL -> 속성 값에 빈 값이 있는 경우를 조회
-- 고객 테이블에서 연락처가 존재하지 않는 고객 조회
SELECT * FROM customer WHERE phone IS NULL;

IS NOT NULL -> 속성 값에 빈 값이 없는 경우를 조회
-- 고객 테이블에서 연락처가 존재하는 고객 조회
SELECT * FROM customer WHERE phone IS NOT NULL;

✨ 느낀점
드디어 MySQL을 설치하였고 그동안의 SQL이론들을 바탕으로 테이블들을 만들고 속성들을 채워넣는 실습들을 하게되었다.
옛날에 ERP 프로그램 공부했을 때랑 많이 비슷한 느낌이 들었다. 데이터들을 채워 넣고 그 데이터들을 가지고 이렇게저렇게 필요한 방향으로 구조화시키는 그런 모습이 비슷해 크게 겁먹지 않고 실습에 집중할 수 있었던 것 같다. 겁먹지 말쟈🙌
하지만 중간에 뭐 이상한 버튼 눌렀는데.. 그만 정리했던 코드들이 날아가고야 말았다...✈ 다행이도 노션에 그때 그때마다 정리해둔게 있어서 망정이지 아니였으면 그 날 공부한거 다 날아갈뻔했다. IT쪽 ( PLC, HMI, C++, SQL까지 ) 공부하기로 마음먹고 한 가지 깨달은게 저장... 백업... 너무너무 중요한거 같다.. 한 군데가 아니라 이곳 저곳에 백업을 해놔야 마음이 놓인다랄까? 앞으로도 잘 따라가자 !

profile
완전초보 PLC / HMI / Intouch / C++ / SQL

0개의 댓글