KOSTA 14일차) 기본 SQL SELECT문 작성 / 데이터 제한 및 정렬 / 단일 행(row) 함수

해버니·2023년 3월 12일
0

KOSTA

목록 보기
5/32
post-thumbnail

학교에선 MySQL이 무료라 회사는 oracle을 사용한다.
서버관리보단 sql위주로 공부를 할 것이다.






RDBMS 관계형 데이터

오라클, ms-sql, MySQL 등등이 있다.




관계형 데이터 베이스 : 데이터를 표로 표현하는 것.



하나의 테이블을 엔터티라고 부른다 → vo
그리고 테이블을 보고 vo 클래스를 정의할 수가 있다.


❓ 왜 ❓ 똑같으니까!
이름이나 타입을 테이블을 보고 바로 알 수 있으니까



세로줄 : 컬럼 | 이름, 타입, 크기
가로줄 : 로우 | 한 객체에 대한 정보를 가지고 있다.











Oracle 1장

관계형 데이터베이스 개념

E.F.Codd 박사는 1970년에 데이터베이스 시스템을 위한 관계형 모델을 제안했다.






관계형 모델

객체 또는 관계의 모음
관계에 적용되는 연산자 집합
정확성과 일관성을 위한 데이터 무결성







관계형 데이터베이스 정의

관계형 데이터베이스는 관계 또는 2차원 테이블을 사용하여 정보를 저장한다.






엔티티 관계 모델





ER 모델링
업무 사양이나 업무 내용을 설명서를 통해 도출해 낼 수 있으며 시스템 개발 주기의 분석 단계에서 작성된다.




ER 모델링의 장점

조직에 대한 정보를 정확하고 세밀한 형식으로 문서화
요구사항에 대한 명확한 범위를 제공
데이터베이스 설계를 이해하기 쉬운 그림 형태의 맵으로 제공
여러 응용 프로그램을 통합하는 효율적인 구조 제공





기본 키 및 외래 키에 대한 지침

기본 키에 중복 값을 사용할 수 없다.
기본 키는 일반적으로 변경할 수 없다.
외래 키는 데이터 값을 기준으로 하며 물리적 포인터가 아닌 논리적 포인터이다.
외래 키 값은 기존의 기본 키 값 또는 고유 키 값에 일치하거나 널 값이어야 한다.
외래 키는 기본 키 또는 고유 키 열을 참조해야 한다.




SQL 문






SELECT

데이터베이스에서 데이터를 검색한다.



INSERT, UPDATE, DELETE, MERGE

데이터베이스의 테이블에서 새 행 입력, 기존 행 변경 및 필요 없는 행 제거를 수행한다.
이 명령어들을 DML(데이터 조작어)라고 한다.



CREATE, ALTER, DROP, RENAME, TRUNCATE

테이블에서 데이터 구조를 설정, 변경, 및 제거한다.
이 명령어들을 DDL(데이터 정의어)라고 한다.



COMMIT, ROLLBACK, SAVEPOINT

DML 문이 변경한 내용을 관리한다.
데이터에 대한 변경 내용은 논리적인 트랜잭션으로 그룹화될 수 있다.



GRANT, REVOKE

오라클 데이터베이스 및 해당 구조에 대한 엑세스 권한을 부여하거나 제거한다.
이 명령어들을 DCL(데이터 제어어)라고 한다.








SQL문 작성

SQL문은 대소문자를 구분하지 않습니다.
SQL문은 하나 이상의 줄에 입력할 수 있습니다.
키워드는 약어로 쓰거나 여러 줄에 나눠 쓸 수 없습니다.
절은 일반적으로 서로 다른 줄에 씁니다.
들여쓰기를 사용하면 SQL문을 좀 더 읽기 쉽게 작성할 수 있습니다.





산술 연산자 사용

SELECT last_name, salary, salary + 300
FROM employees;





널 값 정의

널 값은 알 수 없는 값, 사용할 수 없는 값, 할당할 수 없는 값, 적용할 수 없는 값을 의미한다.
널은 0 또는 공백과 다르다.




산술식의 널 값

널 값을 포함하는 산술식은 널로 평가된다.

SELECT last_name, 12*salary*commission_pct
FROM employees;


산술식에서 열의 값이 널이면 결과는 널이다.
숫자를 0으로 나누면 오류가 발생하지만 널로 나누면 결과는 이거나 알 수 없다.




열 별칭 사용

공백 또는 특수문자가 있거나 대소문자를 구분할 경우 큰 따옴표를 사용한다.

SELECT last_nams AS name, commission_pct comm	//	 as 생략 가능 
FROM employees;

SELECT last_name "Name", salary * 12 "Annual Salary"
FROM employees;





연결 연산자

SELECT last_name || job_id AS "Employees"
FROM employees;





리터럴 문자열

리터럴은 SELECT 목록에 포함된 문자, 숫자 또는 날짜이다.
날짜 및 문자 리터럴 값은 작은 따옴표로 묶어야 한다.
각 문자열은 각 행(row)이 반환될 때마다 한 번씩 출력된다.


SELECT last_name || ' : 1 Month salary = ' || salary Monthly
FROM employees;








테이블 구조 표시

DESC employees;
DESCRIBE employees;

describe : 말하다, 묘사하다













Oracle 2장

비교 조건

IN 조건 사용

SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 201);





LIKE 조건 사용

SELECT employee_id
FROM employees
WHERE first_name LIKE 'S%';

% : 0개 이상의 일련의 문자를 나타낸다.
- : 문자 하나를 나타낸다.




논리 조건 : AND, OR, NOT

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
AND job_id LIKE '%MAN%';

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
OR job_id LIKE '%MAN%';

SELECT last_name, job_id
FROM employees 
WHERE job_id
NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');





ESCAPE구문

'%'나 '_'가 포함된 문자열만 검색하고자 했는데 인식을 못함 그럴 때 씀


예를들어

NAME
minhyun_
minhyun123
minhyun!!

의 데이터가 있을 때


SELECT name
FROM dummy
WHERE LIKE '%_%"

을 검색하게되면 모든 행을 리턴하게 된다.
minhyun_ 의 데이터만 꺼내오고 싶은데 안 되는 것이다❗❗
따라서 ESCAPE를 사용해야 한다.


SELECT name
FROM dummy
WHERE LIKT '%\_%' ESCAPE '\'

ESCAPE 옵션은 백슬래시(\)를 이스케이프 문자로 식별한다.
근데 아마도 \말고 다른 특수 문자로 넣어도 된다.




ORDER BY 절

ASC : 오름차순, 기본값 (ascending order)
DESC : 내림차순 (descending order)

ORDER BY절은 SELECT문의 가장 끝에 둔다.













Oracle 3장










단일 행 함수

데이터 항목을 조작한다.
인수를 사용하고 값을 하나 반환한다.
반환되는 각 행에 대해 작업한다.
행 당 하나의 결과를 반환한다.
데이터 유형을 수정할 수 있다.
중첩될 수 있다.
열 또는 표현식을 인수로 사용한다.








LOWER : 알파벳 값을 소문자로 변환

UPPER : 알파벳 값을 대문자로 변환

INITCAP : 알파벳 값을 각 단어의 첫문자는 대문자로, 나머지 문자는 모두 소문자로 반환

CONCAT : 첫 번째 문자 값을 두 번째 문자 값에 연결한다.
연결 연산자(||)와 동일하다.

SUBSTR : 문자 값의 위치 m에서 n까지 지정된 문자를 반한환다.
(m이 음수이면 문자 값의 끝부터 세며 n을 생략하면 문자열의 끝까지 모든 문자가 반환)

LENGTH : 표현식의 문자수를 반환

INSTR : 지정된 문자열의 위치를 숫자로 반환
검색 시작 위치 m과 문자열의 발생 횟수 n을 지정할 수 있다.

INSTR('HelloWorld', "W') 
// 6

LPAD : 전체 폭이 n이 되도록 문자 값을 오른쪽으로 정렬하고 빈 곳을 지정한 string으로 채운다.

LPAD(salary, 10, '*')
// *****24000

RPAD : LPAD와 반대

TRIM : 문자열에서 접두어나 접미어 또는 두 가지 모두를 자른다.

TRIM('H', FROM 'HelloWorld')
// elloWorld

REPLACE : 텍스트 표현식에서 문자열을 검색하여 해당 문자열을 발견한 경우 지정된 대체 문자열로 바꾼다.




숫자 함수

ROUND : 지정한 소수점 자리로 값을 반올림
TRUNC : 지정한 소수점 자리까지 남기고 값을 버린다.
MOD : 나눗셈의 나머지를 반환




날짜 사용

기본 날짜 표시형식은 DD-MON-RR이다.




SYSDATE 함수
날짜와 시간을 반환한다.

SELECT SYSDATE
FROM DUAL;





날짜에 산술 연산자 사용

SELECT last_name, (SYSDATE - hire_date) / 7 AS WEEKS
FROM employees
WHERE department_id = 90;

부서 번호 90번인 모든 사원의 이름과 근무한 주 수를 표시
❗과거 날짜에서 현재 날짜를 빼는 경우 차이는 음수값이 된다.








날짜 함수

모든 날짜 함수는 DATE 데이터 유형 값을 반환하며 MONTS_BETWEEN만 숫자를 반환한다.




SELECT employee_id, hire_date, MONTHS_BETWEEN(SYSDATE, hire_date) TENURE, ADD-MONTHS (hire_date, 6) REVIEW, NEXT_DAY (hire_date, 'FRIDAY'), LAST_DAY(hire_date)
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) < 36;

36개월 보다 적게 근무한 모든 사원의
사원 번호, 입사일, 근무한 달 수, 6개월 검토일, 입사 후 첫 금요일, 입사한 달의 마지막 날을 표시




Assume SYSDATE = '25-JUL-95';

ROUND(SYSDATEM 'MONTH')		//	01-AUG-95
ROUND(SYSDATEM 'YEAR')		//	01-JAN-96
TRUNC(SYSDATEM 'MONTH')		//	01-JUL-95
TRUNC(SYSDATEM 'YEAR')		//	01-JAN-95



SELECT employee_id, hire_date, ROUND(hire_date, 'MONTH'), TRUNC(hire_date, 'MONTH')
FROM employees 
WHERE hire_date LIKE '%97';







변환 함수




형변환이란
두 개의 데이터의 데이터 타입이 일치하도록 변환하는 것


명시적(Explicit) 형변환
형변환 함수를 사용해서 데이터 타입을 일치시키는 것

TO_NUMBER(문자열) : 문자열을 숫자로 변환
TO_CHAR(숫자, 날짜, [FORMAT]) : 숫자 혹은 문자를 지정된 FORMAT 문자로 변환
TO_DATE(문자열, FORMAT) : 문자열을 지정된 FORMAT의 날짜형으로 변환



암시적(Implicit) 형변환
개발자가 형변환을 하지 않은 경우 데이터베이스 관리시스템이 자동으로 형변환해주는 것을 의미한다.






날짜에 TO_CHAR 함수 사용

형식 모델은 작은 따옴표로 묶어야 하며 대소문자를 구분한다.

SELECT employee_id, TO_CHAR(hire_date, 'MM/YY') Month_Hired
FROM employees
WHERE last_name = 'Higgins';






SELECT last_name, TO_CHAR(hire_date, 'fmDdspth "of" Month YYYY fmHH:MI:SS AM') HIREDATE
FROM employees;





숫자에 TO_CHAR 함수 사용

SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM employees
WHERE last_name = 'Ernst';





중첩 함수



SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(hire_date, 6), 'FRIDAY'), 'fmDay, Month DDth, YYYY') "Next 6 Month Review"
From employees
ORDER BY hire_date;

입사일로부터 여섯 달 경과 후 첫번째 금요일의 날짜를 표시






일반 함수




NVL : 널 값을 실제 값으로 변환


NVL2 : expr1이 널이 아닌 경우, expr2를 반환.
expr1이 인 경우 expr3를 반환

SELECT last_name, salary, commission_pct, NVL2(commission_pct, 'SAL+COMM', 'SAL') income
FROM employees WHERE department_id IN (50, 80);



NULLIF : 두 표현식을 비교하여 동일한 경우 널 반환
동일하지 않은 경우 첫 번째 표현식을 반환

COALESCE : 표현식 목록에서 널이 아닌 표현식을 반환
이 함수가 NVL 함수보다 좋은 점은 여러 대체값을 사용할 수 있다는 점이다.

SELECT last_name, COALESCE(commission_pct, salary, 10) comm
FROM employees
ORDER BY commission_pct;

COALESCE('min', 'hyun', NULL) 				// 'min'
COALESCE(NULL, 'love' 'min', 'hyun') 		// 'love'
COALESCE(NULL, NULL, NULL, NULL, 'hyun') 	// 'hyun'
COALESCE(NULL, NULL, NULL, NULL) 			// NULL





조건 표현식



CASE : IF-THEN-ELSE문의 역할을 수행하여 조건부 조회를 손쉽게 수행할 수 있다.

SELECT last_name, job_id, salary,
CASE job_id WHEN 'IT_PROG' THEN 1.10*salary
			WHEN 'ST_CLERK' THEN 1.15*salary
            WHEN 'SA_REP' THEN 1.20*salary
     		ElSE salary END "REVISED_SALARY"
FROM employees;




DECODE

SELECT last_name, job_id, salary,
	DECODE(job_id, 'IT_PROG', 1.10*salary,
				   'ST_CLERK',  1.15*salary,
            	   'SA_REP',  1.20*salary,
     	   salary)           
	REVISED_SALARY
FROM employees;









헷갈리지 않게.. 문법 정리

🎈 로그인
SQL> conn hr/hr;


🎈 테이블 보기
SQL> select * from tabs;
SQL> select 테이블명 from tabs;


🎈 SELECT : 검색


🎈 연결연산자 ||
SELECT last_name || job_id AS "Employees" FROM employees;


🎈 주석처리
-- : 단일라인 주석
/* */ : 다중라인 주석


🎈 집합함수
여러 줄을 합쳐서 평균 총점등등 결과값 하나를 만들어내는 함수
Uppercase(last_name)






💥 헷갈리는 것

SELECT DISTINCT job_id FROM employees; (O)
SELECT job_id DISTINCT FROM employees; (X)



SELECT last_name || ' earns '||  TO_CHAR(salary, '$99,999.99') || ' monthly but wants '
|| TO_CHAR(salary*3, '$99,999.99') as "Dream Salaries"
FROM employees;

문자열 넣을 땐 ' 이거 넣어야 하고 테이블 명 지정할 땐 "
이걸 넣어야 함







0개의 댓글