연결 연산자와 중복 제거
|| : pipe line 두개로 구성
select ename||sal 이름_급여 : 이름과 급여 column을 붙여서 출력한다 그러나 출력 결과물에는 공백이 없어 구분하기 쉽지 않다. 따라서 select ename||' '||sal 이름_급여 : 표시하면 출력 결과물에도 공백이 생겨 확인하기 쉽다.
DB의 data출력은 읽는 사람이 보기 쉽게 출력하는것이 옳다.
이런 작업을 java같은 프로그램에서도 가능하지만 하게 되면 디버깅이 어렵고 생산성이 떨어져 이런 작업은 DB안에서 하는 것이 좋다. ||는 우선순위가 높아 ||와 사칙연산을 하게되면 먼저 계산된다. 또한 ||를 하게되면 합쳐진 값은 문자열로 인식한다.
중복제거는 출력된는 data를 기준으로 확인된다. select 옵션 칼럼 from 테이블;로 구성되는데 중복제거 옵션은 default가 all이고 distinct가 있다.distinct는 중복을 제거하여 정렬을 수행하는것이다. 여기서 사번처럼 데이터 갯수가 pk가 비슷하게 되면 기수가 높다 라고 하고, 성별처럼 데이터 갯수가 pk늘어나는것과는 무관하게 크게 변동이 없는 데이터를 기수가 낮다 라고 한다.
1. '____학과인___학생의 현재 평점은 ___입니다.'의 형태로 학생의 정보를 출력한다.
2. '____과목은___학점 과목입니다.'의 형태로 과목의 정보를 출력한다.
3. '____교수은___학과 소속입니다.'의 형태로 교수의 정보를 출력한다.
4. 학교에는 어떤 학과가 있는지 검색한다(학생테이블기반으로)
5. 학교에는 어떤 학과가 있는지 검색한다(교수테이블기반으로)
6. 교수의 지위는 어떤 것들이 있는지 검색한다.
7. '___학생의 4.5 환산 평점은 ___입니다.'형태로 학생의 환산 평점을 출력한다.
8. '___과목의 담당 교수 번호는 ___입니다.' 형태로 과목의 정보를 출력한다.
9. 학교에 개설된 과목들은 몇 학점짜리인지 검색한다.
10. 학생들이 수강중인 과목의 과목번호를 검색한다.
--------------------------------------------------------------------------------------------------
정렬을 이용한 자료 검색과 묶음 검색 : 순서대로 입력 x
select 옵션1 칼럼 from 테이블 order by 칼럼 옵션2;로 구성된다.
옵션1에서는 distinct인지 all인지를 결정하는 것이고 옵션2는 asc 오름차순인지 desc 내림차순인지 결정하는것이다. 옵션2에서 asc가 default이다
order by 뒤에는 순차적으로 정렬이 진행된다.
order by 뒤에 select에 적지 않은 column을 사용해도 해당 데이터를 이용해서 정렬한다.
order by 뒤에 수식을 적어 사용해도 그 값을 이용해 정렬한다.
order by 뒤에 별명을 적어 사용할때는 별명을 정확하게 지정해서 사용해야한다.
select에서 확인하는 컬럼 순서로 order by에서 정렬에 사용할 컬럼을 숫자로써 표현할수있다.
1. 성적순으로 학생의 이름을 검색한다.
2. 학과별 성적순으로 학생의 정보를 검색한다.
3. 학년별 성적순으로 학생의 정보를 검색한다.
4. 학과별 학년별로 학생의 정보를 성적순으로 검색한다.
->학과별로 정렬하고 학년별 정렬시 오름차순 내림차순 성적순도 오름차순 내림차순 따로 정렬비교
5. 학점 순으로 과목 이름을 검색한다.
6. 각 학과별로 교수의 정보를 검색한다.
7. 지위별로 교수의 정보를 검색한다.
8.각 학과별로 교수의 정보를 부임일자 순으로 검색한다.
9. 급여가 10%인상된 경우 부서별로 각 사원의 연봉을 연봉순으로 검색한다.
10. 보너스가 100%인상된 경우 업무별로 각 사원의 연봉을 연봉순으로 검색한다.
--------------------------------------------------------------------------------------------------
행을 제한해서 출력한다.
조건으로 검색될때 이름에 정렬조건을 확인할수있게 '급여가 4000이상인 직원'이라고 적어주는 것이 좋다.
literal은 문자, 숫자 두가지 밖에 없다. 문자열일때는 ' '(인용부호)를 사용해야한다.
조건중에 번호(숫자로된 문자)를 숫자로 표현하게 되면 결과 출력은 되지만 sql이 전체를 숫자로 한번 검색하고 조건부를 숫자로 변환한뒤 검색을 한다. 따라서 퍼포먼스 증가로 비효율적이다.
NULL이 있는 컬럼에서 숫자로 정렬을 하게 되면 null값 자체는 문자열이기 때문에 제외된다. 물론 nvl을 이용해서 숫자로 변환도 가능하지만 보안측면에서는 부정이기 때문에 금기시해야한다,
ALTER SESSION SET nls_date_format='YYYY/MM/DD'
=> 수정해라 / 세션을 / (뒤에 나오는 부분의)형식을 / parameter을 'YYYY/MM/DD'형식으로
명령어는 현재 세션에서만 유효 하다 세션을 벗어났다 다시 접속하면 해제되어 있다. 또한 시간은 원래 YYYY/MM/DD/HH/MI/SS/의 형태를 갖는데 YYYY/MM/DD로 선언하면 자동적으로 뒤의 값은 00/00/00이 된다.
=> 이는 Y2K문제도 있지만 연도, 월, 일을 보다 쉽게 구분하기 위함이다.
예제에서 WHERE hdate >= '1996/01/01'이라고 되어있는데 여기서 중요한 점은 우리가 적은 1996/01/01은 Oracle이 볼때는 문자열(원래 oracle에서 날짜는 serial로 이루어져 있다)이다 다만 이것을 nls_date_format에서 형식에 맞게 변형하여 출력하는 것이다.
NULL값은 비교 연산 자체를 할수없다. 단지 IS NULL, IS NOT NULL과 같이 있다 없다라고만 확인할수있다.
왠만해서는 NULL값 자체는 없는것이 좋다 왜냐하면 NULL값은 전체적인 퍼포먼스(속도)를 떨어뜨리기 때문이다.
1. 화학과 학생을 검색한다.
2. 평점이 2.0 미만인 학생을 검색한다.
3. 권현 학생의 평점을 검색한다.
4. 정교수의 명단을 검색한다.
5. 화학과 소속 교수의 명단을 검색한다.
6. 송강 교수의 정보를 검색한다.
7. 학년별로 화학과 학생의 성적을 검색한다.
8. 2000년 이전에 부임한 교수의 정보를 부임일 순으로 검색한다.
9. 담당 교수가 없는 과목의 정보를 검색한다.
10. 보너스가 급여의 10% 이상인 사원을 검색한다.
'교육 > SQL' 카테고리의 다른 글
Day 17 (SQL) (0) | 2019.12.10 |
---|---|
Day 16 (SQL) (0) | 2019.12.09 |
Day 15 (SQL) (0) | 2019.12.06 |
Day 14 (SQL) (0) | 2019.12.05 |
Day 13 (SQL) (0) | 2019.12.04 |