ERD 확인하기
1. 데이터베이스 - 테이블 잘 있나 확인
2. 데이터베이스 간 관계 확인 (ERD)
Database - Reverse Engineer
Stored Connection 에서 선택 - next
ERD 뽑을 schema 선택 - 계속 Next 누르기
ERD 나오는 거 확인
SQL Query 연습
쿼리 한 줄만 조회하고 싶을 때 = Ctrl + Enter
기본 SELECT 문법
SELECT 속성,,,, FROM 테이블 이름;
SELECT * FROM customers;
SELECT * FROM customers;
SELECT customerNumber, customerName, country FROM customers;
WHERE - 특정 조건에 맞는 데이터 조회
SELECT 속성,,, FROM 테이블 이름 WHERE 조건;
- 글자를 비교할 때는 글자를 무조건 ' '로 묶어준다.
- 숫자는 그냥 작성해도 됨
SELECT customerNumber, country FROM customers WHERE country='USA';
= : 같은지 비교, > : 큰지 비교, < : 작은지 비교, <=. >=, NOT : 다른지 비교
SELECT customerNumber, country FROM customers
WHERE NOT country='USA';
SELECT customerNumber, creditLimit FROM customers
WHERE creditLimit >= 10000;
조건 여러 개 같이 사용할 때
- 참 : 1, 거짓 : 0
AND | OR | XOR | |
0, 0 | 0 | 0 | 1 |
0, 1 | 0 | 1 | 0 |
1, 0 | 0 | 1 | 0 |
1, 1 | 1 | 1 | 1 |
country가 USA 이고 creditLimit이 100000보다 큰 customers의 customerNumber, country, creditLimit을 조회
SELECT customerNumber, country, creditLimit FROM customers
WHERE country='USA' AND creditLimit > 100000;
country가 USA 이거나 creditLimit이 100000보다 큰 customers의 customerNumber, country, creditLimit을 조회
SELECT customerNumber, country, creditLimit FROM customers
WHERE country='USA' OR creditLimit > 100000;
LIKE
- 문자를 = 로 조건을 넣으면 완전히 일치하는 것만 조회한다.
- 글자 중에 일부를 포함한 경우를 조회할 때는 LIKE 사용
- 어떤 문자가 와도 상관없을 때 => %로 나타낸다
# 알파벳 a로 시작하는 나라 조회
SELECT customerNumber, country FROM customers
WHERE country LIKE 'a%';
# 알파벳 a로 끛나는 나라 조회
SELECT customerNumber, country FROM customers
WHERE country LIKE '%a%';
# 알파벳 a가 들어간 나라 조회
SELECT customerNumber, country FROM customers
WHERE country LIKE '%a%';
ORDER BY - 정렬
ORDER BY 속성 옵션;
ACS : 오름차순, DESC : 내림차순
기본값 = 오름차순
SELECT customerNumber, country FROM customers
ORDER BY country ASC;
SELECT customerNumber, country FROM customers
ORDER BY country DESC;
LIMIT - 특정 수만큼 조회
LIMIT 데이터의 수 OFFSET 시작 인덱스
LIMIT 시작 인덱스, 데이터의 수
# 3번째 행부터 3개 조회
SELECT customerNumber, country FROM customers
LIMIT 3 OFFSET 2;
SELECT customerNumber, country FROM customers
LIMIT 2, 3;
JOIN
여러 개의 표를 하나로 합쳐서 조회할 때 사용한다.
데이터를 저장할 때 중복이 안 되게 나눠서 조회하기 때문에 한 번에 합쳐서 조회할 때 사용한다.
INNER JOIN과 OUTER JOIN(LEFT JOIN, OUTER JOIN)으로 나뉜다.
INNER JOIN
SELECT 속성... FROM 테이블1
(INNER) JOIN 테이블2
ON 테이블1.속성 = 테이블2.속성
=> JOIN 앞에 INNER 생략 가능
교집합을 만들어서 조회하겠다.
# 회원 테이블과 주문 테이블에서 주문 상태가 Disputed인
# 회원의 회원 번호와 이름과 주문번호, 주문 상태를 조회
SELECT customerNumber, customerName, orderNumber, status
FROM customers
INNER JOIN orders ON customers.customerNumber = orders.customerNumber
WHERE status='Disputed';
위에처럼 쿼리를 작성하면 amiguuous 에러가 뜬다.
=> 속성의 이름은 하나의 테이블에 중복되면 안 된다. JOIN 후 표가 합쳐졌기 때문에 에러가 뜬다.
=> 어느 테이블 꺼를 조회할지 적어줘야 함. (SELECT customers.customerNumber)
LEFT JOIN
SELECT 속성… FROM 테이블1
LEFT JOIN 테이블2
ON 테이블1.속성 = 테이블2.속성
LEFT를 기준으로 같은 값을 옆으로 붙여준다.
SELECT * FROM customers
LEFT JOIN orders
ON customers.customerNumber = orders.customerNumber;
RIGHT JOIN
RIGHT를 기준으로 같은 값을 옆으로 붙여준다. (잘 안 쓴다)
부서 테이블
부서 번호 부서 이름 1 Research 2 Sales 3 Accounting
직원 테이블
직원 번호 직원 이름 부서 번호 10 Kim 1 20 Park 3
직원 테이블과 부서 테이블이 이렇게 있을 때,
INNER JOIN
SELECT * FROM 부서 INNER JOIN 직원 ON 부서.부서 번호 = 직원.부서 번호
부서 번호 부서 이름 직원 번호 직원 이름 1 Research 10 Kim 3 Accounting 20 Park
LEFT JOIN
SELECT * FROM 부서 LEFT JOIN 직원 ON 부서.부서 번호 = 직원.부서 번호
부서 번호 부서 이름 직원 번호 직원 이름 1 Research 10 Kim 2 Sales 3 Accounting 20 Park
JOIN 연습
# 특정 도시에서 주문한 고객들의 주문 번호와 고객 이름 조회
# customers의 city, orders의 orderNumber
SELECT customers.customerNumber, customerName
FROM customers
INNER JOIN orders ON customers.customerNumber = orders.customerNumber
WHERE city='London';
# 주문한 제품의 수량이 35개 이상인 주문의 주문 번호와 고객 이름
SELECT orders.orderNumber, customerName
FROM orders
INNER JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber
INNER JOIN customers ON orders.customerNumber = customers.customerNumber
WHERE quantityOrdered >= 35;
# territory가 APAC에서 근무하는 직원이 담당하는 고객 이름과 고객 번호 목록 조회
SELECT customerName, customers.customerNumber
FROM employees
INNER JOIN offices ON employees.officeCode = offices.officeCode
INNER JOIN customers ON customers.salesRepEmployeeNumber = employees.employeeNumber
WHERE territory = 'APAC';
# 주문 상태가 Shipped인 주문에 포함된 제품의 이름과 주문한 고객의 이름 조회
SELECT productName, customerName
FROM orderdetails
INNER JOIN orders ON orders.orderNumber = orderdetails.orderNumber
INNER JOIN products ON orderdetails.productCode = products.productCode
INNER JOIN customers ON orders.customerNumber = customers.customerNumber
WHERE status='Shipped';
내장 함수
: 일정한 기능을 수행하는 내용을 미리 만들어 둔 것
: 사용자가 일정한 기능을 수행하고 싶을 때 함수를 사용하기만 하면 되는 것
- 집계 함수 : SUM, COUNT, AVG
- 문자 처리 내장 함수 : RIGHT, SUBSTRING_INDEX, UPPER
- 날짜 및 시간 처리 내장 함수 : NOW, CURDATE, CURTIME
GROUP BY
GROUP BY 속성
특정 열 또는 특정 열을 연산한 결과를 집계해서 그 집계값에 따라 그룹을 짓는 연산자
~~ 별 조회할 때 사용
ex) 년도별, 도시별, 나라별,,,
DISTINCT - 중복 제거
SELECT DISTINCT 속성 FROM 테이블
SELECT COUNT(DISTINCT 속성) FROM 테이블 GROUP BY ~~
# 도시 별로 주문한 고객들의 수와 도시 이름
SELECT COUNT(DISTINCT customers.customerNumber), customers.city
FROM customers
INNER JOIN orders ON customers.customerNumber = orders.customerNumber
GROUP BY customers.city;
# 주문한 제품별 제품의 이름과 고객의 수
SELECT products.productName, COUNT(DISTINCT customers.customerNumber)
FROM orders
INNER JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber
INNER JOIN customers ON orders.customerNumber = customers.customerNumber
INNER JOIN products ON products.productCode = orderdetails.productCode
GROUP BY products.productCode
# territory 별 근무하는 직원이 담당하는 고객의 수
SELECT COUNT(customers.customerNumber)
FROM employees
INNER JOIN offices ON employees.officeCode = offices.officeCode
INNER JOIN customers ON customers.salesRepEmployeeNumber = employees.employeeNumber
GROUP BY offices.territory;
HAVING
GROUP BY 결과에 조건을 걸어서 데이터를 조회하고 싶을 때 사용
= GROUP BY 에서 사용하는 WHERE 절 느낌
집계 함수로 뽑은 결과에 조건을 비교하고 싶을 때 사용한다.
# 고객의 수가 30보다 큰 것만 조회
SELECT COUNT(customers.customerNumber)
FROM employees
INNER JOIN offices ON employees.officeCode = offices.officeCode
INNER JOIN customers ON customers.salesRepEmployeeNumber = employees.employeeNumber
GROUP BY offices.territory
HAVING COUNT(customers.customerNumber) > 30;
'CS > DB' 카테고리의 다른 글
[DB] SQL 성능 개선 (0) | 2024.12.02 |
---|---|
[DB] SQL 코테 문제 풀어보기 (프로그래머스) (3) | 2024.11.29 |
[DB] 워드프레스 서버 - DB 서버 연동 실습 (1) | 2024.11.28 |
[DB] SQL 연습 (윈도우 MySQL Workbench) (0) | 2024.11.28 |
[DB] 정규화란? / 정규화 과정 (0) | 2024.11.27 |