728x90
SELECT * FROM TAB;
--SELECT 문
--SELECT [열 이름]
--FROM [테이블 이름]
--[WHERE 조건식]
--[ORDER BY 열 이름]
SELECT *
FROM employees A,
(
SELECT *
FROM departments
WHERE department_id = 20
) B
WHERE a.department_id = B.department_id;
- 위 SELECT 기본문 처럼 읽어보자.
*
전체를 불러오겠다. A 라고 별칭을 정한 employees테이블과 department_id가 20인 departments 태블릿 전체를- 그리고 A의 department_id와 B의 department_id 가 같은 것만 불러오겠다.
- 그럼 employees와 departments 테이블에서 department_id 가 20인 것만 출력된다.
- 위 형식은 쿼리 안에 또 쿼리가 올 수 있음을 뜻한다.
-- employees 테이블에 있는 모든 열을 조회하라
SELECT *
FROM employees;
- employees 테이블로 부터 모든 열(
*
)을 불러오겠다는 뜻이다.
--employees테이블에서 id와 이름만 조회하라
SELECT employee_id, first_name, last_name
FROM employees;
--한 줄로 작성해도 됩니다. 가독성을 위해 절 단위로 구분.
SELECT employee_id, first_name, last_name FROM employees;
- employees 테이블로부터 컬럼(열)의 이름이 employee_id, first_name, last_name 인 것만 불러오겠단 뜻이다.
- 위 쿼리 내용은 한줄로 작성해도 된다.
-- ORDER BY [컬럼명] 순서대로 정렬 DESC 역순으로
SELECT employee_id, first_name, last_name
FROM employees
ORDER BY employee_id DESC;
-- first_name 기준 abc 순으로 정렬해서 조회해주세요.
SELECT employee_id, first_name, last_name
FROM employees
ORDER BY first_name;
- order by 는 원하는 컴럼(열)명을 순서대로 정렬해서 출력한단 의미이다.
- employees 테이블로부터 employee_id, first_name, last_name 을 조회하되 first_name 컬럼(열) 을 기준으로 순서대로 정렬해서 불러오겠단 뜻이다.
-- DISTINCT : 중복된 출력값 제거
SELECT DISTINCT job_id
FROM employees;
- employees 테이블로부터 job_id를 조회하되 해당 칼럼(열)에 중복된 값이 있으면 제외하고 출력하겠단 뜻이다.
-- 별칭 정하기 AS(alias) 접속사
SELECT employee_id AS "직원 번호", first_name AS 성, last_name AS 이름
FROM employees;
- 칼럼(열)명이 너무 길어 줄여 쓰고 싶으면 칼럼 뒤에 AS 를 붙이고 줄여쓰고 싶은 값을 넣으면 칼럼(열)명이 변경되어 출력된다.
- 단, 데이터베이스 자체의 변경점은 없다.
- 이때 변경할 값은 ""으로 감싸주거나 안감싸주워도 된다. 단, '' 로 감싸주면 안된다.
-- 데이터 값 연결하기 연산자 ||
SELECT employee_id, first_name||last_name
FROM employees;
SELECT employee_id, first_name||' '||last_name
FROM employees;
- 여러 칼럼(열)을 한 칼럼(열)으로 출력하고 싶을 때나 칼럼(열)의 값에 추가 값을 넣어 출력하고 싶으면
||
를 쓰면된다. - 첫번째 쿼리는 employees테이블로 부터 employee_id 칼럼(열)과 first_name과 last_name의 값을 합친 칼럼(열)을 출력하겠단 뜻이다.
-- E-mail 주소를 채워주세요. EMAIL@compnay.com
SELECT email||'@compnay.com'
FROM employees;
||
연산자는 특정 칼럼(열)의 값에 직접적으로도 영향을 줄 수 있는데,- 위 쿼리는 employees테이블로부터 email 칼럼(열)을 불러오는데 각 값들 뒤에 @company.com을 붙여서 출력하겠단 뜻이다.
-- 산술연산 가능 + - * / ( )
SELECT employee_id, salary, salary*1.1, salary+500, (salary-1000)/100
FROM employees;
- SQL에서 산술연산도 가능한데 당연히 숫자값만 된다.
- 위 쿼리는 employees테이블로부터 employee_id, salary, 값에 1.1을 곱한 salary, 값에 500을 더한 salary,
- 값에 1000을 뺀후 100을 나눈 salary 를 출력하겠단 뜻이다.
-- WHERE절 조건
--SELECT 열 이름
--FROM 테이블 이름
--WHERE 조건 Condition;
-- employee_id가 100인 사람의 정보 조회
SELECT *
FROM employees
WHERE employee_id = 100;
- where절은 python의 if 문과 비슷하다.
- 위 쿼리는 employees 테이블로부터
*
모든 컬럼을 불러오는데 단, employee_id 컬럼이 100인 행만 불러오겠단 뜻이다.
-- first_name 이 David인 사람만 조회
SELECT *
FROM employees
WHERE first_name = 'David';
- 위 쿼리도 마찬가지로 해석하면된다.
- employees테이블로부터
*
모든 컬럼을 불러오는데 단,first_name이 David(SQL이 대소문자를 구분하진 않지만 값을 써줄땐 구분해야한다.)인 행만 불러오겠단 뜻이다.
-- salary가 10000 이상인 사람만 조회해주세요.
SELECT *
FROM employees
WHERE salary >= 10000;
- employees 테이블로부터 salary 값이 10000이상인 모든 칼럼을 불러오겠단 뜻이다.
-- 조건문 확장 BETWEEN a AND B : A와 B 사이의 값
SELECT *
FROM employees
WHERE salary BETWEEN 10000 AND 15000;
- python의 if 문처럼 연속으로 입력이 가능하다.
- employees테이블로부터 모든 컬럼을 불러오는데 단, salary가 10000과 15000사이인 행만 불러오겠단 뜻이다.
-- 조건문 확장 IN 어느 값이라도 일치하는 것 반환
SELECT *
FROM employees
WHERE salary IN (10000, 20000, 17000);
IN
은 괄호안의 값들 중 어느 값이라도 일치하는 것만 반환한다.- employees테이블로부터 salary 값이 10000, 20000, 17000 중에 하나라도 일치하는 컬럼만 모두 불러온다.
-- 조건문 확장 LIKE ~ 조건을 포함하는
SELECT *
FROM employees
WHERE job_id LIKE 'AD%'; -- %는 모든 문자를 뜻함(WILD CARD)
- employees테이블로부터 job_id 가 LIKE 뒤의 'AD'로 시작하는 모든 행만 불러온다.
%
는 모든 문자를 뜻하는 WILD CARD 이다.
-- JOB_ID가 MAN으로 끝나는 직원을 모두 조회해주세요.
SELECT *
FROM employees
WHERE job_id LIKE '%MAN';
- employees테이블로부터 job_id 가 'MAN'으로 끝나는 모든 행의 모든 칼럼을 불러온다.
-- IS NULL : 데이터 값이 null인 경우를 조회
SELECT *
FROM employees
WHERE manager_id IS NULL;
- employees테이블로부터 manager_id가 NULL 값인 행의 모든 칼럼을 불러온다.
-- AND 두가지 조건 모두 만족, OR 한 가지 조건만 만족
SELECT *
FROM employees
WHERE salary > 5000
AND job_id = 'IT_PROG';
SELECT *
FROM employees
WHERE salary > 5000
AND job_id = 'IT_PROG'
OR job_id = 'FI_ACCOUNT';
- AND 나 OR 로 여러가지 조건을 동시에 쓸 수있다.
- 위 쿼리는 employees테이블로부터 salary가 5000초과이고 job_id 가 'IT_PROG' 인 모든 행의 모든 컬럼을 불러온다.
- 두번째 쿼리는 employees테이블로부터 salary 5000초과이고 job_id가 'IT_PROH'이거나 'FI_ACCOUNT' 인 행의 모든 컬럼을 불러온다.
-- <> 같지 않다. NOT , !=
SELECT *
FROM employees
WHERE employee_id <> 100;
SELECT *
FROM employees
WHERE employee_id != 100;
SELECT *
FROM employees
WHERE NOT employee_id = 100;
- 첫번째 쿼리는 employees테이블로부터 employee_id 가 100초과거나 미만이거나 즉, 100이 아닌 값을 가진 행의 모든 칼럼을 불러온다.
- 두번째 세번째 쿼리도 똑같은 의미이다.
-- GROUP BY 데이터 값을 기준으로 하나의 열로 그룹화하여 함수 적용
SELECT job_id 직무, SUM(salary) 직무별_급여, AVG(salary) 직무별_평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id
ORDER BY 직무별_급여 DESC;
- employees테이블로부터 직무를 별칭으로한 job_id, 직무별_급여를 별칭으로한 각 직무별 salary값을 총합(SUM)한 값,
- 직무별_평균급여를 별칭으로한 각 직무별 salary값의 평균값을 선택해 출력하겠다.
- 이때 기준이 되는 컬럼은 job_id 이고, 순서가 되는 기준은 직무별_급여를 기준으로 하고 순서는 내림차순으로 하겠단 뜻이다.
- GROUP BY 에는 무조건 컬럼명이 와야하고 별칭(별명)이 오면 에러가 뜬다.
- 별칭(별명)은 ORDER BY 에서만 작동된다.
--GROUP BY HAVING 문법
--SELECT 열 이름
--FROM 테이블 이름
--WHERE 조건식
--GROUP BY 열 이름
--HAVING 조건식
--ORDER BY 열 이름;
SELECT job_id 직무, SUM(salary) 직무별_급여, AVG(salary) 직무별_평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id
HAVING SUM(salary) > 30000
ORDER BY 직무별_급여 DESC;
- 조건문 where 과 비슷한 having이 있는데 having도 조건문이지만 where절은 개별 행에 적용되는데 반해,
- having 절은 그룹을 나타내는 결과 집합의 행에만 적용된다.
- 다시말해 where절 수행 후 결과 집합에서 having 이 사용된다는 의미이다.
- 위 쿼리를 해석하면
- employees 테이블로부터 직무를 별칭으로한 job_id, 직무별_급여를 별칭으로한 각 직무별 salary값을 총합(SUM)한 값,
직무별_평균급여를 별칭으로한 각 직무별 salary값의 평균값을 선택해 출력하겠다. - 단, employee_id 가 10 이상인 것만 출력하고 출력 기준은 job_id로 정한다.
- 그 후 결과 집합에서 salary의 총합이 30000인 job_id만 출력한다.
- 출력된 값은 직무별_급여 값의 내림차순으로 출력될 것이다.
- employees 테이블로부터 직무를 별칭으로한 job_id, 직무별_급여를 별칭으로한 각 직무별 salary값을 총합(SUM)한 값,
728x90
'데이터베이스 SQL' 카테고리의 다른 글
SQL 실습 - DML (0) | 2022.11.23 |
---|---|
SQL 실습 - 서브쿼리 (0) | 2022.11.23 |
SQL 실습 - JOIN (0) | 2022.11.23 |
23.데이터베이스 SQL (2) (0) | 2022.11.23 |
22. 데이터베이스 SQL (0) | 2022.11.22 |