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만 출력한다.
    • 출력된 값은 직무별_급여 값의 내림차순으로 출력될 것이다.
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

+ Recent posts