● SUBSTR()
1. SUBSTR(컬럼명, 시작번호, 길이)
- 시작 번호부터 길이만큼 자르기
2. SUBSTR(컬럼명, 시작번호)
- 시작 번호부터 마지막까지 자르기
● DCL(Data Control Language) : 데이터 제어어
1. GRANT
- 권한 부여
2. REVOKE
- 권한 해제
실습(종합 정리)
1. PLAYER 테이블에서 키가 NULL인 선수들은 키를 170으로 변경하여 평균 구하기(NULL 포함)
SELECT ROUND(AVG(NVL(HEIGHT, 170)), 2) "평균 키" FROM PLAYER;
2. PLAYER 테이블에서 팀 별 최대 몸무게
SELECT TEAM_ID, MAX(WEIGHT) || 'kg' "최대 몸무게" FROM PLAYER
GROUP BY TEAM_ID
ORDER BY 1;
3. AVG 함수를 쓰지 않고 PLAYER 테이블에서 선수들의 평균 키 구하기(NULL 미포함)
SELECT SUM(HEIGHT) / COUNT(HEIGHT) "평균 키" FROM PLAYER;
4. DEPT 테이블의 LOC별 평균 급여를 반올림한 값과 각 LOC별 SAL 총 합을 조회
SELECT ROUND(AVG(SAL)) "평균 급여", SUM(SAL) "총 합" FROM DEPT D JOIN EMP E
ON D.DEPTNO = E.DEPTNO
GROUP BY LOC;
5. PLAYER 테이블에서 팀별 최대 몸무게인 선수 검색
SELECT *
FROM PLAYER P JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
AND (P.TEAM_ID, P.WEIGHT) IN (SELECT TEAM_ID, MAX(WEIGHT) FROM PLAYER GROUP BY TEAM_ID)
ORDER BY P.TEAM_ID;
6. EMP 테이블에서 HIREDATE가 FORD의 입사년도와 같은 사원 전체 정보 조회
- SUBSTR() 사용
SELECT * FROM EMP
WHERE HIREDATE LIKE (SELECT SUBSTR(HIREDATE, 1, 2) FROM EMP WHERE ENAME = 'FORD') || '%';
- WHERE 사용
SELECT * FROM EMP
WHERE TO_CHAR(HIREDATE, 'YYYY') = (SELECT TO_CHAR(HIREDATE, 'YYYY') FROM EMP WHERE ENAME = 'FORD');
- JOIN 사용
SELECT *
FROM EMP E1 JOIN (SELECT HIREDATE FROM EMP WHERE ENAME = 'FORD') E2
ON TO_CHAR(E1.HIREDATE, 'YYYY') = TO_CHAR(E2.HIREDATE, 'YYYY');
7. SUBSTR()
- SUBSTR 사용
SELECT SUBSTR('BUSAPPLEBANANA', 1, 3) FROM DUAL;
SELECT SUBSTR('BUSAPPLEBANANA', 4, 5) FROM DUAL;
SELECT SUBSTR('BUSAPPLEBANANA', 9) FROM DUAL;
- SUBSTR, SYSDATE, TO_CHAR 사용
/*DATE 타입은 문자열로 형변환 시 DEFAULT 서식이 'YYYY/MM/DD'와 같다.*/
/*SYSDATE : 현재 시각*/
/*만약 형식을 바꾸고 싶다면, TO_CHAR(DATE, 'YYYY')와 같이 변경한 뒤 사용한다.*/
SELECT SUBSTR(SYSDATE, 1, 2) FROM DUAL;
SELECT SUBSTR(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 1) FROM DUAL;
8. TRUNC()
/*
* TRUNC(DATE, 'FORMAT')
* DATE에서 FORMAT에 작성한 부분 이후부터 버림(초기화)
*/
SELECT TRUNC(SYSDATE, 'Y') FROM DUAL;
SELECT TRUNC(SYSDATE, 'MM') FROM DUAL;
실습(DCL)
- 문제
SCOTT 계정에 있는 테이블 중에서 SALGRADE를 복사한 후 GRADE 컬럼명을 LEVEL로 변경
※ 값을 반대로 바꾸기
1 -> 5
2 -> 4
3 -> 3
4 -> 2
5 -> 1
- 진행 순서
1. localhost를 scott 계정으로 로그인한 후 SALGRADE 테이블 확인
2. localhost를 HR 계정으로 로그인한 후 테이블 생성
3. 복사한 테이블의 데이터 추가 및 수정
- 쿼리
CREATE TABLE COPY_SALGRADE AS SELECT * FROM SCOTT.SALGRADE;
ALTER TABLE COPY_SALGRADE RENAME COLUMN GRADE TO "LEVEL";
UPDATE COPY_SALGRADE
SET "LEVEL" = 6 - "LEVEL";
실습(DCL(CMD))
> sqlplus system/1234
SQL> show user
USER is "SYSTEM"
SQL> @C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql
SQL> show user
USER is "SCOTT"
SQL > conn system/1234
SQL > select tablespace_name, status, contents from dba_tablespaces;
SQL > create tablespace baby datafile 'C:\oraclexe\app\oracle\oradata\XE\BABY.DBF' size 200M autoextend on next 5M maxsize 300M;
SQL > select file_name, tablespace_name, autoextensible from dba_data_files;
SQL > grant create user to scott;
SQL > alter user scott identified by tiger;
SQL > conn scott/tiger
SQL > create user baby identified by baby;
SQL > conn baby/baby
ORA-01045: user BABY lacks CREATE SESSION privilege; logon denied
SQL > conn system/1234
SQL > grant create session to baby;
SQL > conn baby/baby
SQL > conn system/1234
SQL > alter user baby default tablespace baby quota unlimited on baby;
SQL > conn baby/baby
SQL > create table test001(id varchar2(10), pw varchar2(10), constraint pk_baby primary key(id));
ORA-01031: insufficient privileges
SQL> conn hr/hr
SQL> grant select on emp to baby;
SQL> conn baby/baby
SQL> create table copy_emp as select * from hr.emp;
SQL> drop user baby cascade;
SQL> drop tablespace baby;
'웹 개발 > DBMS' 카테고리의 다른 글
[Web_DBMS_MySQL] 01 (0) | 2022.05.25 |
---|---|
[Web_DBMS] 12 (0) | 2022.04.10 |
[Web_DBMS] 10 (0) | 2022.04.08 |
[Web_DBMS] 09 (0) | 2022.04.07 |
[Web_DBMS] 08 (0) | 2022.04.06 |