SQL-SELECT(2)

2019. 12. 3. 10:21Security/sql

* 연결 연산자의 사용

 

연결 연산자

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

-> 연결 연산자의 사용. 문장으로 출력할때 많이 사용한다. 연결 연산자의 우선순위가 높기 때문에 산술연산자와 같이 사용할때는 반드시 괄호가 필요하다.

 

[예제]

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

-> 사원의 이름을 급여와 함께 검색. 그러나 가독성이 좋지 않다.

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

-> 사원의 이름을 급여와 함께 검색. 가독성 문제를 ' '를 사용해서 해결.

 

#SQL > SELECT ename||'의 업무는 '||job||'입니다.' FROM emp;

-> [   ]의 업무는 [   ]입니다의 형태로 출력 

 

중복 제거(출력되는 데이터 기준으로)

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

-> DISTINCT가 중복된 데이터를 출력하지 말라는 옵션. 기본 옵션은 ALL로 되어 있음. 

 

[예제]

#SQL > SELECT DISTINCT job 업무 FROM emp;

-> 직원들의 업무는 어떤 것이 있는지 검색.

 

[실습]

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

#SQL > SELECT MAJOR||'학과인 '||sname||' 학생의 현재 평점은 '||avr||'입니다.' from student;

 

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

#SQL > SELECT CNAME||' 과목은 '||ST_NUM||'학점 과목입니다.' from course;

 

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

#SQL > SELECT PNAME||' 교수는 '||SECTION||'학과 소속입니다.' from professor;

 

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

#SQL > SELECT DISTINCT MAJOR 학과 FROM student;

 

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

#SQL > SELECT DISTINCT SECTION 학과 FROM professor;

 

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

#SQL > SELECT DISTINCT ORDERS 지위 FROM professor;

 

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

#SQL > SELECT SNAME||' 학생의 4.5 환산 평점은 '||(avr*4.5/4)||'입니다.' FROM student;

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

#SQL > SELECT PNAME||' 과목의 담당 교수 번호는 '||PNO||'입니다.' FROM professor;

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

#SQL > SELECT CNAME 과목, ST_NUM 학점 FROM course; 

 

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

#SQL > SELECT DISTINCT CNO 과목번호 FROM score; 

 

 

* 정렬을 이용한 자료 검색과 묶음 검색

 

정렬된 데이터 검색

SELECT [DISTINCT | ALL] 컬럼, 컬럼, ... FROM 테이블 ORDER BY 컬럼 [ASC/DESC], 컬럼[ASC/DESC]......

-> ORDER BY는 정렬할때 사용. 디폴트 옵션은 ASC(오름차순)

 

[예제]

#SQL > SELECT eno 사번, ename 이름, sal 급여 FROM emp ORDER BY sal DESC;

-> 사원의 이름을 급여 순으로 검색

 

#SQL > SELECT eno 사번, ename 이름 FROM emp ORDER BY sal*12+NVL(comm,0) DESC;

-> 사원의 사번과 이름을 연봉 순으로 검색. 단, 이렇게 뽑으면 무엇을 기준으로 뽑았는지 알 수 없다.

 

#SQL > SELECT eno 사번 ,ename 이름, sal*12+NVL(comm, 0) 연봉  FROM emp ORDER BY 연봉 DESC;

-> 사원의 사번과 이름을 연봉순으로 연봉이 출력되게 검색.

 

주의

이런식으로 숫자로 ORDER BY를 지정해줄수 있지만 실제로는 사용하지 않는다. 옵션을 사용할때 보면 알 수 있지만 테이블의 컬럼명은 숫자로만 만들수 없다.

 

* 정렬을 이용한 묶음 검색

[예제]

#SQL > SELECT job 업무, eno 사번, ename 이름, sal 급여 FROM emp ORDER BY 업무;

-> 업무별로 사원의 사원의 급여를 검색

 

#SQL > SELECT dno 부서번호, eno 사번, ename 이름, sal 급여 FROM emp ORDER BY 부서번호, 급여 DESC;

-> 각 부서별로 사원의 급여를 많이 받는 사람부터 검색. DESC는 급여에만 해당된다.

 

[실습]

1. 성적순으로 학생의 이름을 검색

#SQL > SELECT SNO 학번, SNAME 이름, AVR 학점 FROM student ORDER BY 학점 DESC;

 

2. 학과별 성적순으로 학생의 정보 검색

#SQL > SELECT SNO 학번, SNAME 이름, SEX 성별, SYEAR 학년, MAJOR 학과, AVR 학점 FROM student ORDER BY 학과, 학점 DESC; 

 

3. 학년별 성적순으로 학생의 정보 검색

#SQL > SELECT SNO 학번, SNAME 이름, SEX 성별, SYEAR 학년, MAJOR 학과, AVR 학점 FROM student ORDER BY 학년 DESC, 학점 DESC; 

 

4. 학과별, 학년별로 학생의 정보를 성적순으로 검색

#SQL > SELECT SNO 학번, SNAME 이름, SEX 성별, MAJOR 학과, SYEAR 학년, AVR 학점 FROM student ORDER BY 학과 DESC, 학년 DESC, 학점 DESC;  

 

5. 학점 순으로 과목 이름을 검색

#SQL > SELECT CNAME 과목명, ST_NUM 학점 FROM course ORDER BY 학점 DESC; 

 

6. 각 학과별로 교수의 정보를 검색

#SQL > SELECT SECTION 학과, PNO 교수번호, PNAME 교수이름, ORDERS 직급, HIREDATE 고용일 FROM professor ORDER BY 학과;

 

7. 직위별로 교수의 정보를 검색

#SQL > SELECT ORDERS 직위, PNO 교수번호, PNAME 교수이름, SECTION 학과, HIREDATE 고용일 FROM professor ORDER BY 직위;

 

8. 각 학과별로 교수의 정보를 부임일자 순으로 검색

#SQL > SELECT SECTION 학과, PNO 교수번호, PNAME 교수이름, ORDERS 직위, HIREDATE 고용일 FROM professor ORDER BY 학과, 고용일;

 

9. 급여가 10% 인상된 경우 부서별로 각 사원의 연봉을 연봉순으로 검색

#SQL > SELECT job 부서, eno 사번, ename 이름, sal*1.1*12 급여, comm 상여, (sal*1.1*12)+NVL(comm, 0) 연봉  FROM emp ORDER BY 부서, 연봉 DESC;

 

10. 보너스가 100% 인상된 경우 업무별로 각 사원의 연봉을 연봉순으로 검색

#SQL > SELECT JOB 업무, eno 사번, ename 이름, sal*12 급여, comm*2 상여, (sal*12)+NVL(comm*2, 0) 연봉 FROM emp ORDER BY 연봉 DESC;

 

'Security > sql' 카테고리의 다른 글

SQL-서브쿼리  (0) 2019.12.06
SQL-모델링, join  (0) 2019.12.05
SQL-관계 연산자와 LIKE 연산자, BETWEEN, IN  (0) 2019.12.04
SQL-WHERE  (0) 2019.12.03
RDB & SQL-SELECT  (0) 2019.12.02