DB

DB 03/07

SangssI 2023. 3. 7. 11:47

2) SELECT : 데이터 조회하기

--사원 테이블에서 이름의 세번째 글자가 a인 사원의 사번 이름 출력

SELECT employee_id, first_name
FROM employees
WHERE first_name LIKE '__a%';

--사원테이블에서 입사년도가 2006년인 사원들의 사번,이름,입사일을 출력

SELECT employee_id, first_name, hire_date
FROM employees
WHERE hire_date LIKE '%2006';

--이름이 H로 시작하면 서 6글자 이상인 사원의 사번,이름을 출력

SELECT employee_id, first_name
FROM employees
WHERE first_name LIKE 'H_____%';


--이름에 소문자 o가 포함되어 있으며 a로 끝나는 사원들의 사번,이름을 출력

SELECT employee_id, first_name
FROM employees
WHERE first_name LIKE '%o%a';

--전화번호가 6으로시작해서 중간에 2가 포함되어 있고 9로 끝나는 사원들의 사번,이름,전화번호를 출력

SELECT employee_id, first_name,phone_number
FROM employees
WHERE phone_number LIKE '6%2%9';

NOT연산자 : 해당 조건을 제외한 자료를 조회

 

1) not을 사용하지 않은 쿼리문

SELECT employee_id, first_name, job_id
FROM employees
WHERE job_id != 'SA_MAN' and job_id != 'IT_PROG' and job_id != 'HR_REP';


2)not을 사용하여 위의 쿼리문을 수정

SELECT employee_id, first_name, job_id
FROM employees
WHERE job_id NOT IN('SA_MAN', 'IT_PROG', 'HR_REP');  -- NOT과 IN을 활용

-- 부서번호가 80이 아닌 부서의 사원들의 정보를 이름, 부서번호 순으로 출력

SELECT first_name, department_id
FROM employees
WHERE department_id != 80;

SELECT first_name, department_id
FROM employees
WHERE department_id NOT IN(80);

SELECT first_name, department_id
FROM employees
WHERE NOT department_id =80;

ORDER BY : 검색 결과에 반환되는 행(row)을 정렬할때 사용

                      언제나 SELECT절의 마지막에 기술 되어야 한다.

 

--오름차순 : ASC( 생략 가능 )
--내림차순 : DESC( 생략 불가 )

--사원테이블에서 급여를 많이 받는 순으로 사번 , 이름 ,급여, 입사일을 출력 하시오
  단, 급여가 같을 경우 먼저 입사한 사람이 위에 나오도록 출력

SELECT employee_id, first_name, salary, hire_date
FROM employees
ORDER BY salary DESC, hire_date ASC;

--급여가 15000이상인 사원들의 이름,급여,입사일을 출력하되 입사일이 빠른 순으로 정렬하여 조회

SELECT first_name, salary, hire_date
FROM employees
WHERE salary >= 15000
ORDER BY hire_date ASC;

-- 입사일이 빠른순으로 이름, 입사일을 출력하되, 입사일이 같다면 이름내림차순으로 조회

SELECT first_name, hire_date
FROM employees
ORDER BY hire_date, first_name DESC;  --ASC 생략

-- 부서번호가 빠른순, 같으면 직종이 빠른순 , 직종까지 같다면 , 급여가 높은순 으로
사번, 이름, 부서번호, 직종 , 급여를 조회

SELECT employee_id, first_name, department_id, job_id, salary
FROM employees
ORDER BY department_id, job_id, salary DESC; --ASC 생략

SET : 중복제거와 관련된 sql 키워드들

--distinct : 중복제거
--union : 중복제거 ,정렬

 

--부서번호가 90이거나 80인 사람들의 이름, 부서번호 오름차순, 급여 오름차순으로 정렬하고 중복을 제거

SELECT distinct  department_id, salary    -- distinct 이용
FROM employees
WHERE department_id IN(80,90)
ORDER BY department_id, salary;

--union을 통해 위의 코드 수정하기

SELECT department_id, salary    
FROM employees
WHERE department_id = 80
union  -- 자동 오름차순 및 중복 제거
SELECT department_id, salary    
FROM employees
WHERE department_id = 90

--union은 서로 다른 테이블의 자원을 동시에 조회하는 것이 가능

SELECT department_id
FROM departments
union                                    -- 자동 오름차순 및 중복 제거
SELECT salary 
FROM employees;

--intersect : 두 결과의 교집합된 행을 반환

 

SELECT salary 
FROM employees
WHERE department_id >90
intersect           -- 위 아래의 sql문의 공통된 결과만 출력하게 해주는 기능, 모든 열의 결과가 같아야만 교집합 인정
SELECT salary
FROM employees
WHERE department_id <= 80;

 

--minus : 첫 번째 select문에 의해 반환되는 행 중에서 두번째 select문이 검색한 내용을 제외하고 출력

 

 

--급여오름차순, 부서번호를 출력하되, 부서번호가 100번인 사원은 제외하고 중복을 제거하시오.

SELECT distinct salary, department_id
FROM employees
WHERE department_id != 100
ORDER BY salary;

-- 위의 코드를 minus를 이용하여 코드 수정

SELECT salary, department_id FROM employees
minus
SELECT salary, department_id FROM employees
WHERE department_id = 100;

<SQL 함수의 종류>

1. 그룹 함수 : 여러개의 행 또는 테이블 전체에 대하여 하나의 결과만을 가져오는 함수

                          그룹함수는 null값은 무시하며 NVL함수를 통해 null 값을 변경해주어야 무시를 하지 않는다.

                          (NVL 함수는 뒤에 기타함수에서 다룸)

 

 

--AVG() : 평균을 구하는 함수
--COUNT() : 행의 갯수를 반환하는 함수 ( null값은 무시함 )
--MAX() : 최대값을 구하는 함수
--MIN() : 최소값을 구하는 함수
--SUM() : 총 합을 구하는 함수

 

--규칙 : 그룹함수와 일반 컬럼은 함께 사용 될 수 없다.

SELECT COUNT(*) 
FROM employees; 

SELECT COUNT(commission_pct), salary   --사용불가, 오류
FROM employees;

SELECT COUNT(commission_pct)   --사용가능
FROM employees;

SELECT COUNT(commission_pct) person   -- AS를 생략하고 별칭도 사용 가능 
FROM employees;                              -- 컬럼 이름이 COUNT(commission_pct) -> person별칭으로 변경

--사원 테이블에서 사번을 가지고 있는 모든 사원의 수를 출력

SELECT COUNT(employee_id) -- 모든 사원 전체 사번을 가지고있으므로 * 과 같은 의미
FROM employees;        -- 모든 사원수를 출력하고 싶다면 * 을 사용하는 것이 훨씬 효율적

--사원테이블에서 상사가 있는 사원의 수를 출력

SELECT COUNT(manager_id) 
FROM employees;

--전체 사원수와 보너스를 받는 사원의 수를 각각 출력

SELECT COUNT(*) allCnt, COUNT( commission_pct) comm
FROM employees;

--직종이 'SA_REP'인 사원들의 수와 평균 급여와 최고급여, 최저급여, 급여의 총 합계를 화면에 출력

SELECT COUNT(job_id) count, AVG(salary) avg, MAX(salary) max, MIN(salary) min, SUM(salary) sum
FROM employees
WHERE job_id = 'SA_REP';

2. 숫자함수

 --round() : 반올림 
 --trunc() : 버림
 --power() : 제곱
 --mod() : 나머지 값

 

--규칙 : 숫자함수와 일반 컬럼은 함께 사용 할 수 있다.

 

--round를 이용한 소숫점 반올림 후 화면에 출력

SELECT ROUND(0.12345678, 2), ROUND(3.141592,3) -- 0.12 와 3.142 표시
FROM dual;

--round()가 avg()를 포함해서 화면에 출력 

SELECT ROUND(AVG(salary), 2)
FROM employees;

--trunc()를 이용한 소숫점을 버린 후 화면에 출력

SELECT TRUNC(3.555, 1)           -- 3.5 표시
FROM dual;

--trunc()가 avg()를 포함해서 화면에 출력 

SELECT TRUNC(AVG(salary), 2)
FROM employees;


--power()를 이용한 4^2를 화면에 출력

SELECT POWER(4,2)  -- 4^2 = 16 
FROM dual;

--mod()를 이용한 10/3의 나머지를 화면에 출력

SELECT MOD(10,3) -- 10/3 -> 나머지 1 출력
FROM dual;

--짝수 사번을 가진 사원들의 사번,이름을 출력

SELECT employee_id, first_name
FROM employees
WHERE MOD(employee_id,2) = 0;
ORDER BY employee_id ASC;    -- 오름차순 정리

--10/3의 몫을 구하고 싶다

SELECT TRUNC((10/3))
FROM dual;

3. 문자함수

 -- initcap() : 첫 문자를 대문자로 변환 
 -- lower() : 대문자 -> 소문자
 -- upper() : 소문자 -> 대문자
 -- substr() : 특정 문장을 잘라낸다
 -- replace() : 필요한 문장을 교체
 -- lenth() : 문장의 길이

 

 --규칙 : 문자함수와 일반 컬럼은 함께 사용 할 수 있다.

 

--initcap()
initcap()은 공백이나 /를 구분자로 인식한다.

SELECT initcap('good morning') -- Good Morning 띄어쓰기를 기준으로 첫문자를 대문자로 변환
FROM dual;

SELECT initcap('good/morning') -- Good Morning / 를 기준으로 첫문자를 대문자로 변환 (/ 구분자)
FROM dual;


--lower()

SELECT lower('GOOD MORNING') -- good morning 출력
FROM dual;

SELECT first_name, lower( first_name )
FROM employees;

SELECT first_name
FROM employees
WHERE lower( first_name ) = 'michael'  --모두 소문자로 만든 후 검색

--upper()

SELECT UPPER('hi hello') -- HI HELLO 출력
FROM dual;

--substr()

SELECT substr('good morning',1,4) -- good 출력 --첫번째 자리부터 4글자 자르기
FROM dual;

-- 문제 모든사원들에 대해 입사일, 입사연도만 출력
SELECT substr(hire_date,1,5), substr(hire_date,7,4) -- 5글자 자름, 4글자 자름 -- 01/02  2001 형태로 출력
FROM employees
ORDER BY substr(hire_date,7,10);

--replace()

SELECT replace('good morning tom', 'o', 'i') -- 'o'를 'i'로 변경
FROM dual;

 

--length()

SELECT LENGTH('hi')
FROM dual;

-- 사원 테이블에서 이름이 6글자 초과인 사원들의 이름만 출력
SELECT first_name
FROM employees
WHERE LENGTH(first_name) > 6;