본문 바로가기

Data Science/SQL

[SQL] 기본 구문 | SELECT 절, WHERE절, ORDER BY절

select절은 조회, where 절은 행에 제약조건을 거는 것이고, order by절은 컬럼의 정렬기준(ASC,DESC)을 거는 것

SELECT 기본 구문 - 연산자, 컬럼 별칭

select 컬럼명 from 테이블명 [as 별칭]
select 컬럼명, 컬럼명 [, .....] => 조회할 컬럼 지정. *: 모든 컬럼
from 테이블명 => 조회할 테이블 지정.
컬럼명 [as 별칭] ==> 컬럼명에서 조회한 것을 별칭에 저장해서 보여준다

SQL: 대소문자 구분 안함. (값은 구분)

SELECT절 - 조회

use hr; # hr 데이터 베이스를 사용

#emp테이블의 모든 칼럼의 모든 항목을 조회
select * from emp;

#emp테이블의 직원 ID(emp_id), 직원 이름 (emp_name), 업무(job) 컬럼의 값을 조회

select emp_id,
  emp_name,
        job
from emp;
연산자 
산술 연산자 
`- +, -, *, /, %, mod(나머지), div(몫)` - 30 div 5, 30 mod 5
date/time/datetime 
    - +, - : 마지막 항목(date:일, time: 초, datetime: 초)의 값을 +/- => 계산 결과가 정수형으로 반환된다. (ex:20100102)
여러개 값을 합쳐 문자열로 반환
- `concat(값, 값, ...) ` => python의 join

- 피연산자가 null인경우 결과는 null
- 연산은 그 컬럼의 모든 값들에 일률적으로 적용된다.
- 같은 컬럼을 여러번 조회할 수 있다.

select TODO

select emp_id as ID,
emp_name as 이름,
        salary as 급여,
        comm_pct as 커미션_PCT,
        salary * comm_pct as "commission" -- 컬럼 * 컬럼 : 행별로 연산.



#2 . [as 별칭]: 테이블 값을 조회한 result set의 별칭
- select에서 나열되는 컬럼명은 중복되어도 된다 => 조회결과를 저장하는 result set이라는 임시테이블이 일시적으로 생성되는 것이기 때문에 그 테이블의 컬럼명을 지정하는 것

select salary , salary, salary * comm_pct from emp;

--  TODO: EMP 테이블의 업무(job)이 어떤 값들로 구성되었는지 조회 - 동일한 값은 하나씩만 조회되도록 처리

select * from emp;

select distinct job from EMP;

-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 급여(salary), 커미션_PCT(comm_pct), 급여에 커미션_PCT를 곱한 값을 조회

select emp_id as ID,
emp_name as 이름,
        salary as 급여,
        comm_pct as 커미션_PCT,
        salary * comm_pct as "commission" -- 컬럼 * 컬럼 : 행별로 연산
from EMP;


-- TODO:  EMP 테이블에서 급여(salary)을 연봉으로 조회. (곱하기 12)
select salary *12 as "연봉" 
from EMP;

--TODO: EMP 테이블에서 직원이름(emp_name)과 급여(salary)을 조회. 급여 앞에 $를 붙여 조회.

select emp_name as 직원이름 ,
concat('$',salary) as 급여
from EMP;

 


 

WHERE절 : 조회할 행에 대한 선택 조건

SELECT 조회컬럼 [별칭] [,조회컬럼,...]
FROM 테이블이름 [별칭]
[WHERE 제약조건]
[GROUP BY 그룹화할 기준컬럼 ]
[HAVING 조건]
[ORDER BY 정렬기준컬럼 [ASC |DESC]]

WHERE절 검색조건 주요 연산자

  • =, <> (!=)⭐, >, <, >=, <=
    = :같은 것 조회 , != 같지 않은 것 조회 > : 큰 값들 조회 , < : 작은 값들 조회
  • BETWEEN a AND b | a이상 b이하 값 조회
  • IN(list - 쉼표로 값들 구분) | 값 들중 하나와 일치하는 데이터 조회
  • LIKE
  • IS NULL ⭐ | NULL 값을 가진 데이터를 조회

NOT BETWEEN a AND b | a미만 b 초과 값 조회
NOT IN (list) | list 값과 일치하지 않는 데이터를 조회
NOT LIKE | 문자 형태와 일치하지 않는 데이터를 조회
IS NOT NULL |

연산자 우선 순위 :()

AND( OR ) > OR부분을 먼저 연산

# where 절을 이용한 행 선택 
-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
-- -- 컬럼 : emp_name, dept_name -- 행 :emp_id = 110

select emp_name,
dept_name
from emp 
where emp_id = 110; -- 조회 안될 시 빈표 출력

 

실행 순서

1) 데이터 베이스에서 EMP 테이블 존재하는지 확인 : from
2) emp_id = 110 인 행이 존재하는 지 위에서 부터 순차적으로 확인 : where
3) 해당 행의 emp_name, dept_name 값을 불러서 result set에 불러옴 : select

 

 

 where절 예시

select * from emp; -- 테이블 전체 확인용

-- EMP 테이블에서 직원_ID(emp_id)가 110인 직원의 이름(emp_name)과 부서명(dept_name)을 조회
-- -- 컬럼 : emp_name, dept_name -- 행 :emp_id = 110

select emp_name,
dept_name
from emp
where emp_id = 110; -- 조회 안될 시 빈표 출력


-- EMP 테이블에서 'Sales' 부서에 속하지 않은 직원들의 ID(emp_id), 이름(emp_name),  부서명(dept_name)을 조회.
select emp_id,
emp_name,
        dept_name
from emp
where dept_name <> 'Sales';
-- where dept_name != 'Sales';


-- EMP 테이블에서 커미션비율(comm_pct)이 0.2~0.3 사이인 직원의 ID(emp_id), 이름(emp_name), 커미션비율(comm_pct)을 조회.

select emp_id, 
emp_name,
        comm_pct
from emp 
where comm_pct between 0.2 and 0.3;

-- where comm_pct >= 0.2
-- and comm_pct <= 0.3;


--  0.2 초과 0,3 이하 값 조건 => and 연산자 사용
-- where comm_pct between 0.20001 and 0.3;

-- EMP 테이블에서 커미션을 받는 직원들 중 커미션비율(comm_pct)이 0.2~0.3 사이가 아닌 직원의 ID(emp_id), 이름(emp_name), 커미션비율(comm_pct)을 조회.
select emp_id,
emp_name,
comm_pct
from emp
where comm_pct not between 0.2 and 0.3; # comm_pct <0.2 or comm_pct > 0.3

-- EMP 테이블에서 업무(job)가 'IT_PROG' 거나 'ST_MAN' 인 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회.
select emp_id,
emp_name,
        job
from emp
where job in ('IT_PROG', 'ST_MAN'); 
-- where job = 'IT_PROG'
-- or    job = 'IT_MAN';

-- EMP 테이블에서 업무(job)가 'IT_PROG' 나 'ST_MAN' 가 아닌 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회.

select emp_id,
emp_name,
        job
from emp
where job not in ('IT_PROG','ST_MAN');
-- where job <> 'IT_PROG'
-- and  job <> 'ST_MAN';


-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하는 직원의  ID(emp_id), 이름(emp_name)을 조회.
select emp_id,
emp_name
from emp
where emp_name like 'S%'; -- S% = S[0개 이상의 모든 글자] 


-- EMP 테이블에서 직원 이름(emp_name)이 S로 시작하지 않는 직원의  ID(emp_id), 이름(emp_name)을 조회
select emp_id,
emp_name
from emp
where emp_name not like 'S%';


-- EMP 테이블에서 직원 이름(emp_name)이 en으로 끝나는 직원의  ID(emp_id), 이름(emp_name)을 조회
select emp_id,
emp_name
from emp
where emp_name like '%en';

-- EMP 테이블에서 직원 이름(emp_name)의 세 번째 문자가 “e”인 모든 사원의 이름을 조회
select emp_name
from emp
where emp_name like '__e%'; -- '_' : 한개의 모든 글자 

-- EMP 테이블에서 직원의 이름에 '%' 가 들어가는 직원의 ID(emp_id), 직원이름(emp_name) 조회
select emp_id,
   emp_name
from emp
where emp_name like '%#%%' escape '#'; 
-- #%,#_ 
-- %나 _ 자체를 검색하는 문자(상수)로 사용할 경우. 특수문자%, 특수문자_ (특수문자는 escape 다음에 지정)
/*
XX로 시작하는지 : like 'XX%'
XX로 들어갔는지: like '%XX%'
XX로 끝나는지 : like '%XX'
글자수명시 -> '_' like '__AB__BB___가' 
*/



-- 패턴 문자를 조회조건에서 사용해야하는 경우 escape 구문을 이용해 패턴문자를 검색문자로 표시하는 특수문자를 지정한다.
  • 날짜 데이터 제한 조건에 걸기
-- TODO: EMP 테이블에서 2007년 이후 입사한 직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.
-- 참고: date/datatime에서 년도만 추출: year(값). ex) year('2020-10-10') => 2020
-- year(now()), month(now()),day(now()) -- 현재 날짜 정보

select * from emp;
select emp_id,
emp_name,
hire_date
from emp
where year(hire_date) >= 2007;

-- TODO: EMP 테이블에서 2004년에 입사한 직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.

select * from emp;

select emp_id, emp_name, hire_date
from emp
where year(hire_date) = 2004;
-- where hire_date between '2004-01-01' and '2004-12-31';
 ## WHERE 조건이 여러개인 경우 : AND OR

-  참 and 참 -> 참: 조회 결과 행
- 거짓 or 거짓 -> 거짓: 조회 결과 행이 아님.

-  연산 우선순위 : and > or

-  where 조건1 and 조건2 or 조건3
 1. 조건 1 and 조건2
 2. 1결과 or 조건3

 - or를 먼저 하려면 where 조건1 and (조건2 or 조건3)

 ```sql

 --  EMP 테이블에서 업무(job)가 'SA_REP' 이고 급여(salary)가 $9,000인 직원의 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
--      직원의 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.
select emp_id,
emp_name,
job,
        salary
from emp
where job = 'SA_REP'
and salary = 9000;

        --  EMP 테이블에서 업무(job)가 'FI_ACCOUNT' 거나 급여(salary)가 $8,000 이상인 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 조회.

        select emp_id,
                emp_name,
                job,
                salary
        from emp
        where job = 'FI-ACCOUNT' 
        or salary >= 8.000 ;


-- TODO: EMP 테이블에서 업무(job)에 'MAN'이 들어가는 직원들 중 급여(salary)가 $10,000 이하이 거나 2008년 이후 입사한 
--  직원의 ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date), 급여(salary)를 조회

select emp_id, emp_name, job, hire_date, salary
from emp
where job like '%MAN%'
and (salary <= 10000
or year(hire_date) >= 2008);

 

 

 

Order by절 예시

## order by를 이용한 정렬

>- order by절은 select문의 마지막에 온다.
- order by 정렬기준컬럼 정렬방식 [, ...]
    - 정렬기준컬럼 지정 단위: 컬럼이름, 컬럼의순번(select절의 선언 순서)
     select salary, hire_date from emp ...
 에서 salary 컬럼 기준 정렬을 설정할 경우. 
     order by salary 또는 1
    - 정렬방식
        - ASC : 오름차순, 기본방식(생략가능)
        - DESC : 내림차순

>문자열 오름차순 : 숫자 -> 대문자 -> 소문자 -> 한글     
Date 오름차순 : 과거 -> 미래
null 오름차순 : null이 먼저 나온다.
ex) order by salary asc, emp_id desc
  salary로 전체 정렬을 하고 salary가 같은 행은 emp_id로 정렬.


```sql

    --  직원들의 전체 정보를 직원 ID(emp_id)가 큰 순서대로 정렬해 조회

    select * from emp
    order by emp_id desc;

    --  직원들의 id(emp_id), 이름(emp_name), 업무(job), 급여(salary)를 
    --  업무(job) 순서대로 (A -> Z) 조회하고 업무(job)가 같은 직원들은 급여(salary)가 높은 순서대로 2차 정렬해서 조회.

    select emp_id,
            emp_name,
            job,
            salary
    from emp
    order by job asc, salary desc; -- emp_name desc;


    -- 부서명을 부서명(dept_name)의 오름차순으로 정렬해 조회하시오.
    select dept_name
    from emp
    order by dept_name; -- desc;
    -- null은 가장 작은값(정렬에서).
    select dept_name as "부서명"
    from emp
    order by 1;  -- "부서명"


    -- TODO: 급여(salary)가 $5,000을 넘는 직원의 ID(emp_id), 이름(emp_name), 급여(salary)를 급여가 높은 순서부터 조회
    select emp_id, emp_name, salary 
    from emp
    where salary > 5000
    order by salary desc;


 

 

'Data Science > SQL' 카테고리의 다른 글

[SQL] DBMS 구조와 테이블 생성  (0) 2023.12.14