수업 49일차 파이썬 SELECT 영역에서 사용하는 함수 , Join , View ,Index

유동우·2022년 11월 28일
1

SELECT FROM employees;
SELECT
FROM salaries;
SELECT * FROM titles;

-- MIN()/MAX()
-- 선택한 컬럼의 가장 작은 값/가장 큰 값을 출력
-- SELECT 영역에서 사용하는 함수
-- 사용법 : SELECT MIN(컬럼명)|MAX(컬럼명) FROM 테이블명 WHERE 조건식
SELECT MIN(emp_no) FROM employees;
SELECT MAX(emp_no) FROM employees;

SELECT MIN(emp_no) FROM employees WHERE gender = 'F';
SELECT MAX(emp_no) FROM employees Where first_name = 'mario';

-- COUNT()/AVG()/SUM()
-- COUNT : 지정한 조건과 일치하는 총 행(row)수를 출력, SELECT 절에서 사용
-- 사용법 : SELECT COUNT(컬럼명) FROM 테이블명 WHERE 조건식;
SELECT COUNT(emp_no) FROM employees; -- 총 사원 수
SELECT COUNT(emp_no) FROM employees WHERE gender = 'M'; -- 남자인 사원 수
SELECT COUNT(emp_no) FROM employees WHERE gender = 'F'; -- 여자인 사원 수

-- 문제 1) titles 테이블의 내용을 참고하여 Assistant Engineer 인 사람이 총 몇명인지 출력하세요
SELECT COUNT(title) FROM titles Where title = 'Assistant Engineer';

-- 문제 2) employees 테이블의 내용을 참고하여 성별이 여자인 사람 중 입사일이 1994년 이전인 사람수를 모두 출력하세요
SELECT COUNT(emp_no) FROM employees Where gender = 'F' AND hire_date < '1994-01-01';

-- AVG : 지정한 열(COLUMN)의 평균값을 출력, SELECT 절에서 사용
-- 사용법 : SELECT AVG(컬럼명) FROM 테이블명 WHERE 조건식;
SELECT * FROM salaries Where emp_no = 10009;
SELECT AVG(salary) FROM salaries WHERE emp_no = 10009;
-- 문제 3) 사번이 10009번인 사람이 현재 급여가 얼마인지 출력하세요(salaries테이블)
SELECT AVG(salary) FROM salaries WHERE emp_no = 10009 AND to_date > '2022-11-21';

-- sum : 데이터가 숫자인 열의 총 합을 출력, SELECT 절에서 사용
-- 사용법 : SELECT SUM(컬럼명) FROM 테이블명 WHERE 조건식;
SELECT SUM(salary) FROM salaries WHERE emp_no = 10009;

-- LIKE
-- WHERE 절에 사용, 와일드카드 문자를 사용하여 검색 패턴을 생성하는 명령어
-- wild card : 문자 그 자체로 동작하는 것이 아니라 특수한 기능을 가지고 있는 문자
-- % : 0개 이상의 모든 문자
-- _ : 1개의 모든 문자
-- 사용법 : SELECT 컬럼명1, 컬럼명2, ... FROm 테이블명 WHERE 컬럼명 LIKE 패턴;
SELECT FROM employees WHERE first_name = 'mario';
-- 이름이 ma로 시작하는 모든 사람 검색
SELECT
FROM employees WHERE first_name LIKE 'ma%';
-- 이름이 ko로 끝나는 모든 사람 검색
SELECT FROM employees WHERE first_name LIKE '%ko';
-- 이름 중간에 ri가 들어가는 모든 사람 검색
SELECT
FROM employees WHERE first_name LIKE '%ri';
-- 이름의 총 길이가 5자이고, 시작 글자가 ma인 모은 사람 검색
SELECT FROM employees WHERE first_name LIKE 'ma___';
-- 이름의 총 길이가 5자이고, 끝 글자가 ko인 모든 사람 검색
SELECT
FROM employees WHERE first_name LIKE '_ko';
-- 이름의 총 길이가 5자인 모든 사람 검색
SELECT * FROM employees WHERE first_name LIKE '___
';
-- 이름의 총 길이는 5자이고, 시작 글자는 m, 끝 글자는 o인 사람 검색
SELECT * FROM employees WHERE first_name LIKE 'm___o';

-- 문제 4) 이름이 lu 로 시작하는 사람 중 성별이 여자인 사람만 모두 검색하세요
SELECT * FROM employees WHERE first_name LIKE 'lu%' AND gender = 'F';

-- 문제 5) 이름이 5자 이상인 사람 중 남자만 모두 검색하세요
SELECT * FROM employees WHERE first_name LIKE '%_%' AND gender = 'M';

-- IN 연산자
-- WHERE 절에 사용, 여러가지 값을 지정할 수 있음, 서브 쿼리 사용 가능
-- 사용법 :
-- 1. SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명 WHERE 컬럼명 IN (값1, 값2, ...)
-- 2. SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명 WHERE 컬럼명 IN (SELECT 문)

SELECT FROM employees WHERE first_name = 'mario';
SELECT
FROM employees WHERE first_name = 'luigi';
-- IN을 사용하여 2개의 조건을 사용하여 결과 출력
SELECT FROM employees WHERE first_name IN ('mario', 'luigi');
-- OR을 사용하여 IN문을 사용한 것과 같은 결과 출력
SELECT
FROM employees WHERE first_name = 'mario' OR first_name = 'luigi';

SELECT COUNT(emp_no) FROM employees WHERE first_name IN ('mario', 'luigi') AND gender = 'F';

-- NOT 연산자를 사용하여 지정한 값 이외의 값을 출력
SELECT * FROM employees WHERE first_name NOT IN ('mario', 'luigi') AND hire_date < '1990-12-31';

-- IN을 사용하여 서브 쿼리 사용하기
SELECT * FROM salaries
WHERE to_date > '2022-11-21' AND emp_no IN
(SELECT emp_no FROM employees WHERE first_name = 'luigi');
-- 이름이 luigi인 사람의 현재 급여 정보를 모두 출력하기

SELECT FROM salaries WHERE to_date > '2022-11-21' AND emp_no IN (SELECT emp_no FROM employees WHERE first_name = 'luigi');
-- 위의 쿼리는 아래의 형태로 변경된다고 생각하면 됨
-- SELECT
FROM salaries WHERE to_date > '2022-11-21' AND emp_no IN (12703, 12738, 13099 ...)

-- 문제 6) IN 연산자를 사용하여 이름이 'Parto', 'Elvis', 'Marko' 인 사람의 정보를 모두 출력하세요
SELECT * FROM employees WHERE first_name IN ('Parto', 'Elvis', 'Marko');

-- 문제 7) 문제 6번을 수정하여 OR 연산자를 사용하여 동일한 결과를 출력하세요
SELECT * FROM employees WHERE first_name = 'Parto' OR first_name = 'Elvis' OR first_name = 'Marko';

SELECT * FROM employees WHERE first_name LIKE 'Par' OR first_name LIKE 'El%' OR first_name LIKE '%ar';

SELECT * FROM employees WHERE first_name IN ('Par', 'El%', '%ar');

-- BETWEEN
-- WHERE 절에서 사용, 조건식의 범위를 설정
-- 사용법 : SELECT 컬럼명1, ... FROM 테이블명 WHERE 컬럼명 BETWEEN 값1 AND 값2

SELECT MIN(hire_date), MAX(hire_date) FROM employees;
SELECT * FROM employees WHERE hire_date BETWEEN '1999-01-01' AND '1999-01-31';

-- AND를 사용하여 동일한 결과얻기
SELECT FROM employees WHERE hire_date >= '1999-01-01' AND hire_date <= '1999-01-31';
SELECT
FROM employees WHERE hire_date > '1998-12-31' AND hire_date < '1999-02-01';

-- NOT 연산자를 사용하여 해당 기간을 포함하지 않는 결과 출력
SELECT * FROM employees WHERE hire_date NOT BETWEEN '1999-01-01' AND hire_date <= '1999-01-31';

-- IN 연산자를 함께 사용하기
-- 이름이 'parto'이거나 'marko' 혹은 'elvis'인 사람 중 입사일이 1999-01-01 ~ 31 인 사람을 모두 검색
SELECT * FROM employees WHERE hire_date BETWEEN '1999-01-01' AND hire_date <= '1999-01-31' AND first_name IN ('Parto', 'Marko', 'Elvis');

SELECT FROM employees WHERE last_name BETWEEN 'Bamford' AND 'Cappelletti';
SELECT
FROM employees WHERE last_name BETWEEN 'Bamford' AND 'Cappelletti' ORDER BY last_name ASC;

SELECT * FROM employees;

-- AS
-- SELECT, FROM 절에 사용, 테이블 및 컬럼며의 이름을 임시 이름으롭 변경함, join을 명령을 사용할 때 주로 사용할 때 주로 사용함, 해당 쿼리를 실행할 때만 존재함.
-- 사용법 : SELECT 컬럼명1 AS 별명1, 컬럼명2 AS '별명 2' ... FROM 테이블명 AS 별명;
-- 전체 출력
SELECT * FROM employees;
-- 컬럼명을 전체사용한 출력
SELECT emp_no, birth_date, first_name, last_name, gender, hire_date FROM employees;
-- 컬럼명을 한글로 변경한 전체 출력
SELECT emp_no AS '사원번호', birth_date AS '생일', first_name AS '이름', last_name AS '성', gender AS '성별', hire_date AS '입사일' FROM employees;
-- 테이블명과 컬럼명을 함께 사용한 전체 출력
SELECT employees.emp_no, employess.birth_date, employees.first_name, employees.last_name, employees.gender, employees.hire_date FROM employees;
-- 테이블명을 별명으로 바꾸고 컬럼명과 함께 출력
SELECT a.emp_no, a.birth_date, a.first_name, a.last_name, a.gender, a.hire_date FROM employees;

-- =============================

-- JOIN
-- 2개 이상의 테이블을 관련이 있는 컬럼을 기반으로 결합하여 결과를 출력하는 명령어
-- INNER JOIN(일반적인 JOIN), LEFT JOIN, RIGHT JOIN, CROSS JOIN
-- INNER JOIN : 두 테이블에서 일치하는 값이 있는 데이터(row)만 출력 //주로사용됨
-- LEFT JOIN : 왼쪽 테이블의 모든 데이터를 출력하고 오른쪽 테이블의 일치하는 데이터만 출력
-- RIGHT JOIN : 오른쪽 테이블의 모든 데이터를 출력하고 왼쪽 테이블의 일치하는 데이터만 출력
-- CROSS JOIN : 두 테이블의 모든 데이터를 출력
-- 사용법 :
-- SELECT 테이블1.컬럼명1, 테이블1.컬럼명2, ..., 테이블2.컬럼명1, 테이블2.컬럼명2
-- FROM 테이블1 INNER|LEFT|RIGHT JOIN 테이블2
-- ON 테이블1.동일한 데이터의 컬럼명 = 테이블2.동일한데이터의컬럼명
-- AND 조건식

SELECT FROM employees;
SELECT
FROM salaries;
SELECT * FROM titles;

-- 100100 사원번호를 가진 사람의 현재 급여 정보, 입사일, 전체 이름 검색
SELECT FROM employees WHERE emp_no = 100100;
SELECT
FROM salaries WHERE emp_no = 100100 AND to_date > '2022-11-21';

-- JOIN을 사용하여 100100 사원번호를 가진 사람의 현재 급여 정보, 입사일, 전체 이름을 한번에 검색
SELECT *
FROM employees
JOIN salaries
ON employees.emp_no = salaries.emp_no
AND employees.emp_no = 100100
AND salaries.to_date > '2022-11-21';

SELECT * FROM salaries
JOIN titles
ON salaries.emp_no = titles.emp_no
AND salaries.emp_no = 101010;

SELECT s.emp_no, s.from_date, s.to_date, s.salary, t.title
FROM salaries AS s
JOIN titles AS t
ON s.emp_no = t.emp_no;

-- 문제 7) employees테이블과 salaries 테이블을 join하여 사번이 10101인 사람의 사번, 성, 이름, 성별, 급여, 입사일, 해당 급여 시작일, 해당 급여 종료일을 출력하는 쿼리문을 작성하세요
SELECT emp.emp_no, emp.last_name, emp.first_name, emp.gender, s.salary, emp.hire_date, s.from_date, s.to_date
FROM employees AS emp
JOIN salaries AS s
ON emp.emp_no = s.emp_no
AND emp.emp_no = 10101;

-- 문제 8) 사번이 20000번 인 사람의 사번, 성, 이름, 성별, 현재 직급, 해당 직급으로 진급일을 출력하는 쿼리문을 작성하세요
SELECT emp.emp_no, emp.last_name, emp.first_name, emp.gender, t.title, t.from_date
FROM employees AS emp
JOIN titles AS t
ON emp.emp_no = t.emp_no
AND emp.emp_no = 20000
AND t.to_date > '2022-11-21';

-- 테이블 3개에 대해서 JOIN하기
SELECT * FROM employees
JOIN salaries
JOIN titles
ON employees.emp_no = salaries.emp_no
AND employees.emp_no = titles.emp_no;

SELECT *
FROM employees AS e
JOIN salaries AS s
JOIN titles AS t
ON e.emp_no = s.emp_no
AND e.emp_no = t.emp_no;

-- 문제 9) 사번이 20000번 인 사람의 사번, 성, 이름, 성별, 현재 직급, 현재 급여, 해당 직급의 진급일 을 출력하는 쿼리문을 작성하세요.]
SELECT e.emp_no, e.last_name, e.first_name, e.gender, t.title, s.salary, t.from_date
FROM employees AS e
JOIN salaries AS s
JOIN titles AS t
ON e.emp_no = s.emp_no
AND e.emp_no = t.emp_no
AND e.emp_no = 20000
AND t.to_date > '2022-11-21';

-- 문제 10) 이름이 'ko'로 끝나거나 'pe'로 시작하고 글자수가 7자인 사람의 사번, 성, 이름, 성별, 급여, 직급 정보를 출력하는 쿼리문을 작성하세요
SELECT e.emp_no, e.last_name, e.first_name, e.gender, s.salary, t.title
FROM employees AS e
JOIN salaries AS s
JOIN titles AS t
ON e.emp_no = s.emp_no
AND e.emp_no = t.emp_no
AND (e.first_name LIKE '_ko'
OR e.first_name LIKE 'pe_');

-- ============================

-- VIEW
-- 가상 테이블 생성, 논리적으로만 생성된 가상의 테이블, 실제 행과 열을 가지고 있지만 데이터를 저장하고 있지는 않음, 다른 테이블 및 뷰에 저장되어 있는 데이터를 보여주는 역할만 함
-- 외부 사용자에게 테이블의 사용권한을 주어야 할 경우, 복잡한 쿼리문을 쉽게 사용하고자 할 경우, 복잡한 쿼리문을 쉽게 사용하고자 할 경우
-- 장점 : 사용자의 편의성 향상, 데이터의 보안을 제공, 데이터 수요에 맞는 다양한 구조의 데이터 분석 기반을 구축할 수 있음 (기존 테이블 구조는 그대로임)
-- 단점 : 한번 생성된 뷰는 수정이 불가능, 삽입/삭제/갱신 작업에 제약 사항이 많음, 자신만의 인덱스를 가질 수 없음
-- 사용법 : CREATE VIEW 뷰이름 AS SELECT 쿼리
-- CREATE VIEW 뷰이름 AS SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명 WHERE 조건식

-- DROP VIEW 뷰이름

SELECT * FROM employees WHERE emp_no <= 10100;

CREATE VIEW emp1 AS
SELECT
emp_no, first_name, last_name, hire_date
FROM
employees
WHERE
emp_no <= 10100;

DROP VIEW emp1;

SELECT MIN(birth_date), MAX(birth_date) from employees;
SELECT COUNT(birth_date) from employees where birth_date >= '1960-02-01' and '1960-02-28';

-- 사번, 성, 이름, 성별, 입사일, 급여, 직급
-- 생일이 1960-01-01 ~

CREATE VIEW emp2 ASemp2
SELECT e.emp_no, e.last_name, e.first_name, e.gender, e.hire_date, s.salary, t.title, s.from_date
FROM employees AS e
JOIN salaries AS s
JOIN titles AS t
ON e.emp_no = s.emp_no
AND e.emp_no = t.emp_no
AND e.birth_date BETWEEN '1960-11-01' AND '1960-11-30'
LIMIT 100;

-- INDEX
-- 해당 테이블의 조희 속도를 높이기 위해서 사용하는 명령어
-- 조회 속도는 빨라지지만 UPDATE, INSERT, DELETE의 속도는 저하됨
-- 사용법 :
-- SHOW INDEX FROM 테이블명; // index 확인
-- CREATE INDEX 인덱스 이름 ON 테이블명(컬럼명1, 컬럼명2, ...); // index 처음생성
-- ALTER TABLE 테이블명 DROP INDEX 인덱스명; // 인덱스 삭제
-- ALTER TABLE 테이블명 ADD (UNIQUE) INDEX 인덱스명(컬럼명1, 컬럼명2, ...) // 인덱스 추가

profile
클라우드 엔지니어가 되고싶은 클린이

0개의 댓글