데이터베이스 기초(SELECT)

2022. 10. 25. 17:03데이터베이스

SELECT   

 - 테이블에서 행을 검색

 

SELECT [컬럼, 컬럼, .... | * ]      

FROM 테이블; 

 

 - *을 통해 검색된 결과의 컬럼의 순서는 DESC명령으로 검색한 컬럼 순서이다.

 - *는 컬럼과 같이 사용할수 없고 반드시 단독으로 사용한다.

 - * = 사용x ,모든 컬럼을 검색할때 사용한다.

 - SELECT 과 FROM절은 생략할수 없다.

 

 - 네이버를 사용할때 구글을 통해 들어가는 것처럼 오라클은 서버이고 사용하는 프로그램은 client 프로그램이다.

 

SELECT * FROM tab;

 - 현재 스키마(현재 유저)의 모든 테이블 목록을 검색한다.

 - tab는 실제 테이블이 아니라 테이블의 목록을 보여주기 위한 가상 테이블

 - 오라클에서 스키마는 유저와 동일한 의미를 갖는다. 

 

 - SQL문은 반드시 ' ; ' 으로 끝난다.

 - SQL문은 대소문자를 구별하지 않는다.

 - SQL문은 반드시 결과(출력)가 존재한다.

 

SQL> SELECT tname FROM tab;

 

DESC 테이블명

 - 테이블의 구조를 검색한다.

 - 컬럼의 이름, 데이터 타입을 확인한다. 

 

SQL> DESC emp;
 이름                                                  널?      유형
 ----------------------------------------- -------- ----------------------------
 ENO                                                           VARCHAR2(4)       -  문자4개가 들어간다.
 ENAME                                                      VARCHAR2(15)
 SEX                                                            VARCHAR2(4)
 JOB                                                            VARCHAR2(12)
 MGR                                                          VARCHAR2(4)
 HDATE                                                       DATE
 SAL                                                            NUMBER
 COMM                                                      NUMBER
 DNO                                                          VARCHAR2(2)

 

 

SQL> SELECT * FROM emp;
                              

                                                                      (사수번호)
ENO      ENAME                      SEX     JOB      MGR      HDATE         SAL       COMM DNO
-------- ------------------------------ -------- -------------------------------- -------- ----------  ----------  ------
0001     안영희                         여        경영                    91/01/01       4800           0       01
0201     안영숙                         여        지원      0001      91/02/01       3900       2000     01
0202     손하늘                         여       지원       0001      91/12/01       3510        980      01

 

SQL> DESC dept;
이름                널?          유형
----------------  --------      -------------
DNO                             VARCHAR2(2)
DNAME                        VARCHAR2(10)
LOC                             VARCHAR2(6)

 

SQL> SELECT * FROM dept;
DNO DNAME LOC
---- ---------- ------
01       총무    서울
02       회계    서울
10       ERP     서울
.............
.............

 

예제 3. 사원의 이름과 업무를 검색한다. 

SQL> SELECT eno, ename, job FROM emp;
ENO ENAME JOB
-------- ---------- ------
0001 안영희 경영
0201 안영숙 지원
0202 손하늘 지원
.............
............. 

 

예제 4. 사번, 이름, 급여를 검색하고 검색된 데이터에 따라 출력 형식을 비교해본다.

SQL> SELECT eno, ename, sal FROM emp;
ENO     ENAME     SAL
--------   ----------   ----------
0001    안영희         4800
0201    안영숙         3900
0202    손하늘         3510
.............
............. 

 

 - 데이터타입이 문자면 왼쪽정렬 출력 숫자타입이면 오른쪽정렬 출력

emp(사원)
eno
(사번)
ename
(사원이름)
job
(직무)
sal
(임금)
comm
(1년에받는보너스)
deptno
(부서 번호)
12345 홍길동 총무 2100 200 10
           
           
           
           
           
           
           

 

 

INSERT        -     테이블에 행을 입력

UPDATE      -     테이블의 데이터(행)을 수정

DELETE       -     테이블의 행을 삭제

 

 

CREATE       -      테이블을 생성  

ALTER         -       테이블의 구조를 수정

DROP          -       테이블을 삭제

 

GRANT        -      권한을 할당

REVOKE      -      권한을 해제

 

show - 데이터 베이스 목록이나, 테이블 목록 등 다양한 정보를 보기 원할 때 사용

 

sql은 대소문자 구분을 하지 않지만 리퍼럴은 대소문자를 구분한다.

 

실습

1. Student, course, professor, score table의 구조를 검색한다. 

  A) DESC STUDENT;

  A) DESC COURSE; 

  A) DESC PROFESSOR;

  A) DESC SCORE;

 

2. 모든 학생의 정보를 검색한다. 

  A)  SQL> SELECT * FROM STUDENT;

 

3. 모든 교수의 정보를 검색한다. 

  A)  SQL> SELECT * FROM  PROFESSOR;

 

4. 모든 과목의 정보를 검색한다. 

  A)  SQL> SELECT * FROM COURSE;

 

5. 기말고사 시험 점수를 검색한다. 

  A) SQL> SELECT * FROM SCORE;

 

6. 학생들의 학과와 학년을 검색한다. 

  A) SQL> SELECT MAJOR, SYEAR FROM STUDENT;

 

7. 각 과목의 이름을 검색한다. 

    SQL> SELECT CNAME FROM COURSE;

 

8. 모든 교수의 직위를 검색한다. 

    SQL> SELECT ORDERS FROM PROFESSOR;

 

9. 각 과목의 학점수와 담당교수 번호를 검색한다. 

    SQL> SELECT ST_NUM, PNO FROM COURSE;

 

10. 각 학생들이 속한 학과와 학년을 검색한다.

    SQL> SELECT MAJOR, SYEAR FROM STUDENT; 

 

별명을 이용한 검색

SQL> SELECT 컬럼 as "별명", 컬럼 as "별명", ... 
 2 FROM 테이블;

 

예제 1. 각 사원의 이름과 담당업무를 검색해서 결과를 보고한다. 

SQL> SELECT eno 사번, ename 이름, job 업무 FROM emp;
사번 이름 업무
---- --------------- --------
0001 안영희 경영
0201 안영숙 지원
0202 손하늘 지원
.............
............. 

 

 

수식을 이용한 검색

SQL> SELECT 수식 [as 별명], ...
 2 FROM 테이블;

 

예제 2. 각 사원의 연간 수급하는 급여를 검색한다.

SQL> SELECT eno 사번, ename 이름, sal*12 연간_급여 FROM emp;
사번      이름       연간 급여
 ----   ---------------   ----------
0001 안영희            57600
0201 안영숙            46800
0202 손하늘            42120
.............
............. 

 

예제 3. 별명에 반드시 이중 인용 부호가 필요한 경우를 확인한다. 

SQL> SELECT ename 10name FROM emp;

 

SELECT ename 10name FROM emp
                              *
1행에 오류:
ORA-00923: FROM 키워드가 필요한 위치에 없습니다.

 

SQL> SELECT ename "10name" FROM emp;
10name
----------

안영희
안영숙
손하늘
.............
.............

 

예제 4. 사원의 연봉을 검색한다. (연봉 = 12개월분 급여(sal) + 보너스(comm))
SQL> SELECT eno 사번, ename 이름, sal 급여, comm 보너스, sal*12+comm 연봉
 2 FROM emp;
사번   이름    급여       보너스    연봉
---- ----------- -------- ---------- ----------
0001 안영희 4800           0   57600
0201 안영숙 3900     2200   49000
0202 손하늘 3510       980   43100
.............
.............

 

 

NULL 연산을 위한 NVL함수의 사용

NVL (컬럼, 치환 값)
예제 5. 사원의 연봉을 검색한다. 

SQL> SELECT eno 사번, ename 이름, sal*12+NVL(comm,0) 연봉
 2 FROM emp;
사번 이름 연봉
---- --------------- ----------
0001 안영희 57600
0201 안영숙 49000
0202 손하늘 43100
.............
.............

 

 - 덧셈의 항등원은 0 곱셈의 항등원은 1이다.

 - 보너스를 챙겨주지는 않았지만 연봉은 띄워야하기때문에 0으로 바꾼것이다.

 

실습

1. 각 학생의 평균 평점을 검색한다.(별명을 이용)

    A) SELECT AVR 평균_평점 FROM STUDENT;
2. 각 과목의 학점수는 검색한다.(별명을 이용)

    A) SELECT ST_NUM 학점 FROM COURSE;

3. 각 교수의 지위를 검색한다.(별명을 이용)

    A) SELECT ORDERS 지위 FROM PROFESSOR;
4. 급여를 10% 인상했을 때 연간 지급되는 급여를 검색한다.

    A) SELECT SAL 평소급여, SAL*1.1 인상급여 FROM EMP; 

5. 현재 학생의 평균 평점은 4.0 만점이다. 이를 4.5 만점으로 환산해서 검색한다. 

    A) SELECT AVR 평균_평점, AVR*1.125 변경평균_평점 FROM STUDENT;

6. 급여가 10% 인상될 경우 각 사원의 연봉을 검색한다. 

    A) SELECT SAL 평소급여, SAL*1.1 인상급여, SAL*1.1+NVL(COMM,0) 연봉 FROM EMP;

7. 1년 동안 지급되는 급여와 10% 인상되어 1년 동안 지급되는 급여 간에 차액을 검색한다. 

    A) SELECT SAL 평소급여, SAL*1.1 인상급여, (SAL*12*1.1) - (SAL*12) 차액 FROM EMP;

8. 각 학생들의 평균평점을 4.5 만점으로 환산한 경우 각각 평점의 상승폭은 얼마인지 검색한다.

    A) SELECT AVR 평균_평점, AVR*1.125 변경평균_평점, (AVR*1.125) - AVR 상승폭 FROM STUDENT;

 

연결 연산자의 사용

SQL> SELECT 컬럼 || '리터럴' || ......
 2 FROM 테이블;

 

예제 1. 다양한 방법으로 사원의 이름을 급여 또는 업무와 함께 검색한다. 

SQL> SELECT ename||sal 이름_급여
 2 FROM emp;

 

이름_급여
-------------------- 

안영희4800
안영숙3900
손하늘3510
.............
.............


SQL> SELECT ename||' '||sal 이름_급여
 2 FROM emp;

 

이름_급여
-------------------- 

안영희 4800
안영숙 3900
손하늘 3510
.............
............. 

 

SQL> SELECT ename||'의 업무는 '||job||'입니다.' 

2 FROM emp;
ENAME||'의 업무는'||JOB||'입니다.'
----------------------------------- 

안영희의 업무는 경영입니다. 

안영숙의 업무는 지원입니다. 

손하늘의 업무는 지원입니다.
.............
............. 

 

예제 2. 주의해야할 연결 연산자를 이용
SQL> SELECT ename||' '||sal+100 

 2 FROM emp;
SELECT ename||' '||sal+100
 *
1행에 오류:
ORA-01722: 수치가 부적합합니다
아래 두 문장을 비교해 보자.

 

(출력의)중복 제거

SQL> SELECT [DISTINCT | ALL] 컬럼, 컬럼, ... 
 2 FROM 테이블;

 

예제 3. 직원들의 업무는 어떤 것이 있는지 검색한다.(업무의 종류를 검색한다.)

 

SQL> SELECT job 업무 FROM emp;

업무
-------- 

경영
지원
지원
.............
............. 

                             

                       (오라클은 정렬x)

SQL> SELECT DISTINCT job 업무 FROM emp;

업무
-------- 

회계
개발
지원
.............
.............

 

실습

1. '____학과인 ____학생의 현재 평점은 __입니다.' 형태로 학생의 정보를 출력한다. 

    A) SELECT MAJOR||'학과인 '||SNAME||'학생의 현재 평점은 '||AVR||'입니다' FROM STUDENT;

2. '____과목은 ____학점 과목입니다.' 형태로 과목의 정보를 출력한다. 

    A) SELECT CNAME||'과목은 '||ST_NUM||' 학점과목입니다.' FROM COURSE;

3. '____교수는 ____학과 소속입니다.' 형태로 교수의 정보를 출력한다.

    A) SELECT PNAME||'교수는 '||SECTION||' 학과 소속입니다.' FROM PROFESSOR;

4. 학교에는 어떤 학과가 있는지 검색한다.(학생 테이블 기반으로 검색한다.)

    A) SELECT DISTINCT MAJOR 학과 FROM STUDENT;

5. 학교에는 어떤 학과가 있는지 검색한다.(교수 테이블 기반으로 검색한다.)

    A) SELECT DISTINCT SECTION 학과 FROM PROFESSOR;

6. 교수의 지위는 어떤 것들이 있는지 검색한다. 

    A) SELECT DISTINCT ORDERS FROM PROFESSOR;

7. '____학생의 4.5 환산 평점은 ____입니다.' 형태로 학생의 환산 평점을 출력한다. 

    A) SELECT SNAME||'학생의 4.5 환산 평점은 '||AVR*1.125||' 입니다' FROM STUDENT;

8. '____과목의 담당 교수 번호는 ____입니다.' 형태로 과목의 정보를 출력한다. 

    A) SELECT CNAME||'과목의 담당 교수 번호는 '||PNO||' 입니다' FROM COURSE;

9. 학교에 개설된 과목들은 몇 학점짜리인지 검색한다. 

    A) SELECT DISTINCT CNAME 과목, ST_NUM 학점 FROM COURSE;

10. 학생들이 수강중인 과목의 과목번호를 검색한다.

    A) SELECT DISTINCT CNAME 과목, CNO 과목번호 FROM COURSE;