2026-06-11
select
| 형식: SELECT * 칼럼명( ) FROM 테이블 |
SELECT 값, 컬럼명,함수, sub query
FROM 절 = 셀렉트 절
: 테이블명, sub query
| 기본 출력 |
| select 1+2; -- *.exe SELECT * FROM employees; SELECT employee_id, first_name, salary from employees; |



| --column의 alias(별명) |
| select employee_id as empno, first_name as name, salary sal from employees; select employee_id as 사원번호, first_name as 이름, salary 월급 from employees; //에러에러! select employee_id as "사원 번호", first_name as 이름, salary 월급 from employees; -- 사원 번호 사이를 띄어쓰면 에러 발생 이럴 때는 "사원 번호" 이렇게 사용 |


//에러에러!

| -- 더하기+ 빼기- 곱하기* 나누기/ |
| SELECT employee_id, first_name, salary, salary * 1.1 FROM employees; //에러에러! SELECT employee_id, first_name, salary, salary /0 --에러 발생 0으로는 나누기 불가 FROM employees; |

//에러에러!

| -- 문자열 or 칼럼을 합해서 하나의 컬럼에 출력하기 |
| SELECT concat(last_name,first_name) --성이름 FROM employees; SELECT concat(last_name, ' ',first_name) --성 ^ 이름 --concat가 칼럼명 FROM employees; SELECT concat('성: ', last_name, '이름',first_name) --성과 이름을 따로 출력 FROM employees; SELECT last_name || ' ' || first_name as fullname --fullname이 칼럼명이 되었다 from employees; 1. NULL 값이 섞여 있을 때 (가장 중요! ⭐)데이터베이스를 다루다 보면 값이 비어있는 상태인 NULL을 자주 만나게 돼. 이때 || 연산자와 concat 함수는 완전히 다르게 작동해.
|




재미니 미니 과제
📝 PostgreSQL 기본 SELECT 미니 과제
|
SELECT concat(last_name,' ', first_name) as "사원 전체 이름"
FROM employees; ⭕
SELECT employee_id as "사원 번호" ,first_name as 이름 ,salary "현재 월급" , ((salary *12) + 500) as 연봉
from employees; ⭕
SELECT concat('안녕하세요, 사원번호 ', employee_id ' 번 ' ,last_name,' ', first_name, '님!' )
from employees; ❌
❌ 정답해설
|
강사님 과제 Work1
| -- 문제1) EMPLOYEES Table의 모든 자료를 출력하여라. -- 문제2) EMPLOYEES Table의 컬럼들을 모두 출력하라. -- 문제3) EMPLOYEES Table에서 사원 번호, 이름, 급여, 담당업무를 출력하라. -- 문제4) 모든 회사원의 급여를 $300증가 시키기 위해서 덧셈 연산자를 사용해서 출력하라. -- 문제5) EMPLOYEES 테이블에서 사원번호, 이름, 급여, 보너스, 보너스 금액을 출력하라. -- (참고로 보너스는 월급 + (월급*커미션)) -- 문제6) EMPLOYEES 테이블에서 LAST_NAME을 이름으로 SALARY을 급여로 출력하라. -- 문제7) EMPLOYEES 테이블에서 LAST_NAME을 Name으로 SALARY * 12 를 Annual Salary(연봉)로 출력하라 -- 문제8) EMPLOYEES 테이블에서 이름과 업무를 연결하여 출력하라. -- 문제9) EMPLOYEES 테이블에서 이름과 업무(job_id)를 "KING is a AD_PRES" 형식으로 출력하라. -- 문제10) EMPLOYEES 테이블에서 이름과 연봉을 "KING: 1 Year salary = 60000" 형식으로 출력하라. |
내 풀이
-- 문제1) EMPLOYEES Table의 모든 자료를 출력하여라.
SELECT *
from employees; ⭕
-- 문제2) EMPLOYEES Table의 컬럼들을 모두 출력하라.
--칼럼명만 출력하라는 건가??
SELECT *
from employees; ❌
|
-- 문제3) EMPLOYEES Table에서 사원 번호, 이름, 급여, 담당업무를 출력하라.
select employee_id as 사원번호, (last_name,first_name) as 이름 ,salary as 급여 ,job_id as 담당업무
from employees; ⭕
-- 문제4) 모든 회사원의 급여를 $300증가 시키기 위해서 덧셈 연산자를 사용해서 출력하라.
SELECT salary + 300
from employees; ⭕
-- 문제5) EMPLOYEES 테이블에서 사원번호, 이름, 급여, 보너스, 보너스 금액을 출력하라.
-- (참고로 보너스는 월급 + (월급*커미션))
select employee_id as 사원번호, concat(last_name,first_name) as 이름 ,salary as 급여 ,commission_pct as 보너스금액, (salary +(salary*commission_pct)) as 최종급여
from employees; ❌
📌 딱 한 줄 요약!coalesce(컬럼명, 대체할값) 은 컬럼에 들어있는 NULL을 내가 원하는 숫자나 문자로 바꿔서 에러나 데이터 증발을 막아주는 최고의 방어 함수다!SELECT employee_id AS 사원번호, concat(last_name, first_name) AS 이름, salary AS 급여, coalesce(commission_pct, 0) AS 보너스, salary * coalesce(commission_pct, 0) AS "보너스 금액", salary + (salary * coalesce(commission_pct, 0)) AS 최종급여 FROM employees; ⭕ 💡 COALESCE(코알레스) 함수란?한마디로 "데이터가 NULL일 때 내가 지정한 다른 값으로 채워 넣어줘!"라고 말하는 함수야.우리가 방금 concat 함수 배울 때, 실무 데이터에는 값이 비어있는 상태인 NULL이 정말 많다고 했잖아? 숫자 계산을 할 때 이 NULL이 들어가면 아주 무시무시한 일이 벌어져. 🚨 NULL의 무서운 성질: "나랑 계산하면 무조건 다 NULL이야!"숫자 1000에 NULL을 더하거나 곱하면 어떻게 될까? 결과는 1000이 아니라 똑같이 NULL이 되어버려.
🔍 강사님 코드 분석하기-- 1. 보너스율이 NULL이면 0으로 바꾼다!
coalesce(commission_pct, 0) -- 2. 그래서 보너스 금액을 안전하게 계산한다! salary * coalesce(commission_pct, 0) -- 3. 최종 급여(월급 + 보너스 금액)를 구한다! salary + (salary * coalesce(commission_pct, 0))
|
-- 문제6) EMPLOYEES 테이블에서 LAST_NAME을 이름으로 SALARY을 급여로 출력하라.
select last_name as 이름 ,salary as 급여
from employees;
-- 문제7) EMPLOYEES 테이블에서 LAST_NAME을 Name으로 SALARY * 12 를 Annual Salary(연봉)로 출력하라
SELECT last_name as name, salary * 12 as "Annual Salary (연봉)"
from employees;
-- 문제8) EMPLOYEES 테이블에서 이름과 업무를 연결하여 출력하라.
SELECT concat(last_name,first_name , ' ' ,job_id )
FROM employees;
-- 문제9) EMPLOYEES 테이블에서 이름과 업무(job_id)를 "KING is a AD_PRES" 형식으로 출력하라.
SELECT concat(last_name , ' is a ' , job_id )
FROM employees;
-- 문제10) EMPLOYEES 테이블에서 이름과 연봉을 "KING: 1 Year salary = 60000" 형식으로 출력하라.
SELECT concat(last_name , ' : 1 Year salary ' ,salary * 12 )
FROM employees;
💡 연산자 활용! 아주 간단하게 두 글자를 붙일 때나, NULL이 절대 들어올 리 없는 시스템 코드, 날짜 형식(예: 년 || 월 || 일) 등을 조합할 때는 타자가 빠른 ||를 가볍게 쓰기도 해. 재미나의 실무 팁 📌 "헷갈릴 때는 그냥 속 편하게 concat() 함수를 쓰자!" 라고 생각하면 코딩 인생이 편해진단다. 😎 💡null 값이 예상될 때는 concat! |
where
| 형식 |
| select first_name, last_name, salary from employees where first_name = 'Julia'; |
where : 조건절 == if
select 값, 컬럼, 함수, from 테이블
where <- 조건
비교연산자: > , < , >= , !+ ,== , <>-> 같지 않다
( ) 를 사용해 우선순위를 매길 수 있다
null 일때 == null, is null ,
null 이 아닐 때 == is not null
not, and, or 을 사용할 수 있다
&& , || 사용 할 수 없다
*/
| --'Julia' 와 'julia' 결과의 차이 : 대소문자 구분 |
| select first_name, last_name, salary from employees where first_name = 'Julia'; select first_name, last_name, salary from employees where first_name = 'julia'; |


| --9000불보다 많이 받는 사람들만 출력 |
| SELECT first_name, salary FROM employees WHERE salary >= 9000; |

| --'Shanta' 보다 아스키 코드 값이 큰 사람들만 출력 --검색 기능이 자바보다 좋다 |
| SELECT first_name FROM employees WHERE first_name >= 'Shanta'; |

| --a 보다 큰 건 아무것도 안 나와야 함 ! (그런데 왜 나오지..) |
| SELECT * from employees where first_name >= 'a'; |

| --is null 일때 |
| SELECT * from employees WHERE manager_id is null; |

| --is not null 일때 |
| SELECT * from employees WHERE manager_id is not null; |

| -- and 로 그리고 |
| SELECT * from employees WHERE first_name = 'Shanta' and first_name = 'John'; //아무것도 안 나온다 ! |

| -- or 로 또는 |
| SELECT * from employees WHERE first_name = 'Shanta' or first_name = 'John'; |

| -- 이름은 John이고 월급이 5000이상인 사원 |
| SELECT first_name, salary from employees WHERE first_name = 'John' and salary >= 5000; |

| --2017년 12월 31일 이후에 입사한 사원들을 출력하라 |
| select first_name,hire_date from employees WHERE hire_date > '2017-12-31'; |

| --all(and), any(or) |
| --all사용시 출력 안 됨 --SELECT salary from employees where first_name = 'Julia' 만 실행할 경우 드래그 하고 알트+f5 select first_name,salary from employees WHERE salary = all (SELECT salary from employees where first_name = 'Julia') -- any 사용시 출력 됨 확인 select first_name,salary from employees WHERE salary = any (SELECT salary from employees where first_name = 'Julia') --or 사용하기 select first_name,salary from employees WHERE salary =3200 or salary = 3400; |



| --in,not in |
| --in 8000,3200,6000인 사람들 출력 select first_name, salary from employees where salary in (8000,3200,6000); ---not in 8000,3200,6000이 아닌 사람들 출력 select first_name, salary from employees where salary not in (8000,3200,6000); --'Julia', 'John' 이 이름인 사람들 출력 SELECT first_name FROM employees WHERE first_name in('Julia', 'John'); |



| --between 범위 연산자 |
| --6000보다 크거나 같고 9000보다 작거나 같은 SELECT first_name, salary from employees where salary >= 6000 and salary <= 9000; --6000보다 크거나 같고 9000보다 작거나 같은 SELECT first_name, salary from employees where salary BETWEEN 6000 and 9000; --6000보다 --하고 9000보다 컸을 때 SELECT first_name, salary from employees where salary not BETWEEN 6000 and 9000; |



| --like |
| -- like : 지정 글자를 포함하는 조건 == 자바 containes 기능과 같다 SELECT first_name FROM employees WHERE first_name like 'G_ra_d'-- 언더바 _의 역할 -> 언더바 위치에 무엇이 오든 출력한다 --맨 앞의 철자가 k 인 사람을 출력한다 --몇글자인지 상관 없다 SELECT first_name FROM employees where first_name like 'K%'; --에러에러! 안 나옴 --이유: 자료들을 살펴봤을 때 이름의 첫글자가 대문자로 되어있어서 나오지 않는다 SELECT first_name FROM employees where first_name like 'k%'; -- 뒤에 붙는 건 나옴 ! SELECT first_name FROM employees where first_name like '%k'; --맨앞만 아니면 a가 어디에 와있어도 된다 찾으면 출력해라 SELECT first_name FROM employees where first_name like '%a%'; --이름에 소문자 a나 첫글자에 A 가 들어가는 사람 출력 SELECT first_name FROM employees where first_name like '%a%' or first_name like '%A%'; --알파벳을 대문자로 변경해서 비교 SELECT first_name FROM employees where upper (first_name) like '%A%'; |


//에러에러!





강사님 미니 과제 liike를 사용해서 출력해보기
| --2016년도에 입사한 사원들 출력 --방법 1 select first_name,hire_date from employees WHERE hire_date >= '2016-01-01'and hire_date <= '2016-12-31'; --방법2 --에러에러! select first_name,hire_date from employees WHERE hire_date like '2016%'; --to char 활용해서 사용해주기 --정상작동 확인 select first_name,hire_date from employees WHERE to_char (hire_date, 'YYYY-MM-DD') like '2016%'; |
재미니의 복합 미니 과제
🏆 재미나의 복합 미니 과제: "진짜 연봉 협상 대상자를 찾아라!"[미션] 회사에서 연봉 협상을 하려고 해. employees 테이블에서 **"보너스(commission_pct)가 아예 없는(NULL) 사원들"**만 골라서, 그들의 사원번호, 이름, 그리고 현재 월급에 300달러를 더한 인상 급여를 조회해 줘! [상세 조건]
|
SELECT employee_id as 사원번호 , concat(last_name,' ', first_name) as 사원_이름, (salary + 300) as 인상_급여
FROM employees
WHERE commission_pct is null; ⭕
강사님 미니 과제 2
| -- 문제1) EMPLOYEES 테이블에서 급여가 3000이상인 사원의 정보를 사원번호, 이름, 담당업무, 급여를 출력하라. -- 문제2) EMPLOYEES 테이블에서 담당 업무가 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라. -- 문제3) EMPLOYEES 테이블에서 입사일자가 2017년 1월 1일 이후에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라. -- 문제4) EMPLOYEES 테이블에서 급여가 3000에서 5000사이의 정보를 성명, 담당업무, 급여, 부서번호를 출력하라. --문제5) EMPLOYEES 테이블에서 사원번호가 145,152,203인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자를 출력하라 -- 문제6) EMPLOYEES 테이블에서 입사일자가 2018년도에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라. -- 문제7) EMPLOYEES 테이블에서 보너스가 NULL인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 보너스, 부서번호를 출력하라. -- 문제8) EMPLOYEES 테이블에서 급여가 7000이상이고 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라 -- 문제9) EMPLOYEES 테이블에서 급여가 10000이상이거나 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라 -- 문제10) EMPLOYEES 테이블에서 JOB_ID가 ST_MAN, SA_MAN, SA_REP가 아닌 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라 -- 문제11) 업무가 AD_PRES 이고 급여가 12000이상이거나 업무가 SA_MAN인 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라. -- 문제12) 업무가 AD_PRES 또는 SA_이고 급여가 12000이상이거나 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라. |
-- 문제1) EMPLOYEES 테이블에서 급여가 3000이상인 사원의 정보를 사원번호, 이름, 담당업무, 급여를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name,job_id,salary
from employees
where salary > 3000; ⭕
-- 문제2) EMPLOYEES 테이블에서 담당 업무가 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, department_id
from employees
where job_id like 'ST_MAN'; ⭕
-- 문제3) EMPLOYEES 테이블에서 입사일자가 2017년 1월 1일 이후에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date, department_id
from employees
WHERE hire_date > '2017-01-01'; ❌
❌ [문제 3] 입사일자가 2017년 1月 1日 이후에 입사한 사원 👉 85점! (수정 필요)
|
-- 문제4) EMPLOYEES 테이블에서 급여가 3000에서 5000사이의 정보를 성명, 담당업무, 급여, 부서번호를 출력하라.
SELECT concat(last_name ,' ', first_name) as name, job_id, salary, department_id
from employees
WHERE salary BETWEEN 3000 and 5000 ; ⭕
--문제5) EMPLOYEES 테이블에서 사원번호가 145,152,203인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자를 출력하라
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date
from employees
WHERE employee_id like '145%' or '152%' or '203%'; ❌
✨ 문제 5번 올바르게 고친 쿼리 (둘 중 하나로 고쳐봐!)💡 방법 A : 강추! 실무에서 가장 많이 쓰는 IN 연산자 사원번호가 이 세 개 중에 "포함"되어 있냐고 물어보는 가장 깔끔한 방법이야! 숫자니까 작은따옴표도 필요 없어.SELECT employee_id, concat(last_name, ' ', first_name) as name, job_id, salary, hire_date FROM employees WHERE employee_id IN (145, 152, 203); ⭕ SELECT employee_id, concat(last_name, ' ', first_name) as name, job_id, salary, hire_date
FROM employees WHERE employee_id LIKE '145%' OR employee_id LIKE '152%' OR employee_id LIKE '203%'; ⭕ |
-- 문제6) EMPLOYEES 테이블에서 입사일자가 2018년도에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라.
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,department_id
from employees
WHERE to_char (hire_date, 'YYYY-MM-DD') like '2018%'; ⭕
-- 문제7) EMPLOYEES 테이블에서 보너스가 NULL인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 보너스, 부서번호를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,commission_pct, department_id
from employees
WHERE commission_pct is null; ⭕
-- 문제8) EMPLOYEES 테이블에서 급여가 7000이상이고 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,department_id
from employees
where salary >= 7000 and job_id like 'ST_MAN'; ❌
❌ [문제 8] 급여가 7000이상이고 JOB이 ST_MAN인 사원 정보 출력 👉 90점! (아주 사소한 오타)
|
-- 문제9) EMPLOYEES 테이블에서 급여가 10000이상이거나 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,department_id
from employees
where salary >= 10000 or job_id like 'ST_MAN'; ⭕
-- 문제10) EMPLOYEES 테이블에서 JOB_ID가 ST_MAN, SA_MAN, SA_REP가 아닌 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary,department_id
from employees
where job_id not in ('ST_MAN','SA_MAN','SA_REP'); ⭕
-- 문제11) 업무가 AD_PRES 이고 급여가 12000이상이거나 업무가 SA_MAN인 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라.
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary
from employees
where job_id in ('AD_PRES') and (salary >= 12000 or job_id like 'SA_MAN'); ❌
어디가 문제일까?
|
-- 문제12) 업무가 AD_PRES 또는 SA_이고 급여가 12000이상이거나 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라.
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary
from employees
where job_id like 'AD_PRES' or job_id like 'SA_%' and salary >= 12000; ❌
|
| 11번과 12번 모두 "컴퓨터가 어느 조건을 먼저 계산하게 만들 것인가" 즉, 괄호의 위치와 유무가 정답을 가른 핵심 원인이었어. 👍 컴퓨터(데이터베이스)는 우리 사람처럼 문제를 처음에 읽고 "아, 대충 이런 뜻이겠구나~" 하고 문맥을 파악하지 못하거든. 오직 정해진 규칙대로만 움직이는데, SQL에는 아주 강력한 연산자 우선순위 규칙이 있어. ⚖️ SQL 연산자의 계급장 (AND vs OR)데이터베이스 세상에서는 연산자끼리 힘 싸움을 하면 아래와 같은 순서로 먼저 계산해.
|
'PostgresSQL > PostgresSQL 수강일지' 카테고리의 다른 글
| [수강일지 28] select 5 ( view,sequences) (0) | 2026.06.18 |
|---|---|
| [수강일지 26] select 5 [서브 쿼리문] (0) | 2026.06.16 |
| [수강일지 25] select 4 (join) (0) | 2026.06.15 |
| [수강일지 24] select 3(order by, group by) (0) | 2026.06.12 |
| [수강일지_22] Database,PostgreSQL 설치 , 함수, select 1(from) (0) | 2026.06.10 |