■sql 이란?
-structure Query language의 약자로
데이터 베이스에 구조적 질의 언어
-데이터를 검색하고 조작할 수 있는 언어
■SQL 의 종류?
- Query 문→database 의 데이터를 검색하는 언어
예: select 문의 6가지절
- DML 문→database의 데이터를 조작 및 삭제하는 언어
예: insert, update, delete, merge
data manipulation language
*manipulation 교묘한 처리, 솜씨있는 취급
- DDL 문→database의 테이블과 같은 object를 관리하는 언어
예: create, alter, drop, truncate, rename
data definition language
- DCL 문→database의 사용자들의 권한을 관리하는 언어
예: grant, revoke
data control language
- TCL 문→database의 data를 저장할 지 아니면 저장하지 않고 취소할지를 결정하는 언어
예: commit, rollback, savepoint
Tool command language
■Query 문
**도스창을 이용한 sqlplus 는 안좋다 보안상 취약. sqlgate 를 쓰는게 좋다.
문제8. 사원 테이블 전체를 다 검색하시오.
select * from emp;
*sqlgate 는 컨트롤+엔터
■ SELECT 문의 산술, 비교, 논리 연산자
(책1-10)
※오라클의 연산자
1. 산술 연산자: * / + - (곱하기 나누기 덧 뺄)
2. 비교 연산자: > , <, >=, <=, =, <>, !=, ^= (뒤 세가지가 '같지않거나')
3. 논리 연산자: and, or, not
문제10. 이름, 월급, 커미션, 월급+커미션을 출력하시오!
*4주차 공부중인 내가 이 문제를 잠깐 고민했던 건
월급+커미션이 과연 그룹일까 였던 건데,
행 자체내 합계는 그룹과 상관없다.
select ename, sal, comm, sal+comm from emp;
*이 때, 커미션 없는 사람들의 월급조차 안나온다.
비어있는 부분을 null 값 지정해줘야 함
>>고치면
select ename, sal comm, nvl(comm,0) from emp;
comm 값 없는 사람들 sal도 보고 싶으면
select ename, sal, comm, nvl(comm, 0), sal+nvl(comm, 0)
from emp;
※설명: comm 에서 비어있는 부분을 null 값 이라고 한다.
*null 값이란?
1. 데이터가 없는 상태
2. 알 수 없는 값
ex) 3000+ null(알 수 없는 값) = 알 수 없는 값
*0과 공백과는 다르다.
■nvl 함수
null 값 대신에 지정된 다른 값을 출력하는 함수
예: select ename, sal, comm, nvl(comm,0)
from emp;
comm 이 없는 사람은 0 으로 출력해라 라는 뜻
■연결 연산자 ||
문제11. 이름과 월급을 출력하는데 연결연산자를 사용해서 연결해서 출력하시오
select ename|| sal
from emp;
문제12. 이름과 월급을 출력하는데 아래와 같이 문자열로 출력되게 하시오!
scott의 월급은 3000 입니다.
답: select ename || '의 월급은 ' || sal || '입니다'
from emp;
sql gate 에서 한글 괴상하게 나오면
연결해제-유니코드 체크
문제13. 아래와 같이 결과를 출력하시오
scott의 "월급"은 3000 입니다.
select ename || '의 ''월급''은 || sal || '입니다' from emp;
*월급 앞뒤로 "(큰 따옴표) 한번 또는 ''(작은따옴표) 두번
q 안쓰고 가능
문제14. dept 테이블의 구조를 확인하시오
desc dept
*describe의 약자
■컬럼명 지정
select ename as 이름, sal as 월급 from emp;
*퀄럼별칭
※ as는 생략 가능하다. 공백문자나 특수문자를 컬럼 별칭으로 사용하려면 양쪽에 더블 쿼테이션 마크를 사용해야한다.
대소문자를 구분하고자 할 때도 더블 쿼테이션 마크를 사용해야 한다
문제15. 이름과 월급과 직업을 아래와 같이 출력하시오
employee name salary job
--------------------- -------- -----
SCOTT 3000 ANALYST
: : :
: : :
select ename as "employee name", sal as "salary", job as "job" from emp;
*employee name 와 같이 띄어쓰기가 들어가는데 하나의 덩어리로 인식시켜야 하므로 쿼테이션 써줌.
*job 이라고 설정 안해주면 대문자로 나옴.[원하는 문자가 아님]
*as 뒤에 한글쓰는건 구별되니까 쿼테이션 안쓰는데
같은 영어로 쓸 땐 구분을 위해 쿼테이션 붙여야함.
*1장에서 배운 내용 정리
1. 기본 select 문
2. distinct (중복제거 키워드)
3. 산술 연산자
4. 컬럼 별칭 사용법
5. describe (테이블 구조 확인)
6. 연결 연산자 (||)
7. null 값이 무엇인지
■2장. where 절과 order by 절 사용법
select ename, sal --컬럼명
from emp --테이블명
where sal = 3000; --검색조건
내가 보고자 하는 데이터만 설정하기 위해
where 절 사용
예: where sal = 3000;
월급이 3000인 사람만 갖고와봐 라는 명령어
select ename, sal from emp;
where sal=3000;
문제16. 커미션이 300인 사원의 이름과 커미션과 직업을
출력하시오
select ename, comm, job from emp;
where comm=300;
문제17. 이름이 scott 인 사원의 이름과 월급을 출력하시오
select ename, sal from emp
where ename='SCOTT';
에러뜸
같은 영어문자라서.
대문자로 써야함.
※숫자, 한글과는 다르게 문자와 날짜는 양쪽에 싱글 쿼테이션 마크를 사용해야 한다.
그리고 데이터가 대문자로 저장 되어있으면 대문자로 검색해야 한다.
select ename, sal from emp
where ename='SCOTT';
문제18. 직업이 SALESMAN 인 사원들의 이름과 직업을 출력하시오
select ename, job from emp
where job='SALESMAN';
문제19. 부서번호가 10번인 사원들의 이름과 월급과 직업과 부서번호를 출력하시오
select ename, sal, job, deptno
from emp
where deptno=10;
문제20. 1981년 11월 17일에 입사한 사원의 이름과 입사일을 출력하시오
select ename, hiredate
from emp
where hiredate='1981 11 17';
*날짜니까 싱글쿼테이션 써야함
※SQL gate 에서 위의 sql이 에러가 난다.
이유는 날짜 형식이 SQL*PLUS(cmd작업)와 달라서 이다.
*현재 세션의 날짜 형식을 확인하는 방법
미국식의 dd-mm-yy(일-월-년) 으로 셋팅되어있어서.
select * from nls_session parameters;
*nls=national language support
select * from emp
where hiredated='17-NOV-81';
sql gate 안되는데???????????
국내 개발자가 만든건데 문제가 많다고 한다
문제21. (점심시간 문제)
월급이 1500 이상인 사원들의 이름과 월급을 출력하시오
select ename, sal from emp
where sal>=1500;
*작업시 sqlgate 말 안들으면
/*~~~~~~*/
슬래쉬와 * 을 이용해서 무효화
문제22. 나이가 27살인 학생들의 이름과 나이와 전공을 출력하시오
select age, major varchor2 from emp2 where age = '27';
문제23. sk 텔레콤을 사용하는 학생들의 이름과 나이와 텔레콤을 출력하시오
select ename, age, telecom from emp2
where telecom='sk';
**만약 학생 중 sk를 대문자로 작성했다면
where telecom='sk' or telecom='SK';
문제24. 30살 이상인 학생들의 이름과 나이를 출력하시오
select ename, age from emp2
where age >='30';
문제25. 컴퓨터 공학과인 학생들의 이름과 전공을 출력하시오
select ename, major from emp2 where major = '컴퓨터공학과';
문제26. 통계학과인 학생들의 이름과 전공을 출력하시오
select ename, major from emp2 where major='통계학과';
*응용통계학과 학생도 포함 시키고 싶다면
■기타 비교 연산자(between, like, in, is null)
(94페이지)
1. between...and
2. like
3. in
4. is null
■between...and 연산자
문제27. 월급이 1000 에서 3000 사이인 사원들의 이름과 월급을 출력하시오
select ename, sal from emp where sal between 1000 and 3000;
**주의: 낮은값 먼저 써야 함
문제28. 나이가 25 에서 30살 사이가 아닌 학생들의 이름과 나이를 출력하시오
select ename, age from emp2 where age not between 25 and 30;
또는
where age < 25 and age >30;
*where age>30 and age<25 는 안나옴. 작은값부터 써야 함
문제29. 전공에 통계가 포함되어져 있는 학생들의 이름과 전공을 출력하시오
select ename, major from emp2 where major like '%통계%';
※설명: like ~처럼, ~일 거 같은
즉 like '%통계%' >>>>>>>>>>>통계 앞뒤 자리에 뭐가 와도 관계없다, 갯수가 몇개가 와도 관계없다(wild card)
*****만약에 in을 써서 찾으려면
select ename, major from emp2
where major in ('통계학과');
**'통계' 까지만 쓰면 부분이라 컴터가 못읽음
그래서 like 를 이용해서 부분검색으로도 잡아내는 것임.
문제30. 서울에서 사는 학생들의 이름과 주소를 출력하시오
select ename, address from emp2 where address like '%서울%';
문제31. 이름에 첫 글자가 S로 시작하는 사원들의 이름을 출력하시오
select ename from emp where ename like 'S%';
문제32. 이름의 끝글자가 진으로 끝나는 학생들의 이름을 출력하시오
select ename from emp2 where ename like '%진';
※설명: %가 특수문자 %가 아닌 wild card로 인식하려면
연산자를 반드시 = 가 아닌 like를 사용해야한다.
문제33. 이름의 두번째 글자가 '혜' 자인 학생들의 이름을 출력하시오
select ename from emp2 where ename like '_혜_';
**%혜% 로 하면 '혜'가 위치 상관없이 다 들어간 학생들이 출력된다.
※설명: 98페이지
%: 이 자리에 뭐가 와도 관계없고 철자의 갯수도 관계없다
_: 이 자리에 뭐가 와도 관계없는데 철자의 갯수는
딱 한개여야 한다.
문제34. 이름의 세번째 철자가 L 인 사원들의 이름을 출력하시오
select ename from emp where ename like '__L%';
insert into emp(empno, ename, sal)
values(2121, 'A%B', 3400);
commit;
문제35. 이름의 두번째 철자가 %인 사원의 이름을 출력하시오
select ename from emp where ename like '_%%';
*근데 뭐 다나옴;;;;
특수문자로 인식시키고
wild card로 인식시키고 싶으면
select ename from emp
where ename like '_m%%' escape 'm';
*m은 임의 문자. k나 딴걸로 해도 상관없음.
※설명:
m 바로 다음에 나오는 %는 wild card 가 아니라 특수문자 %로 인식해라 라는 뜻.
insert into emp(empno, ename, sal)
values(1343, 'A%%B', 4000);
commit;
문제36. 이름의 두번째 철자도 %이고 세번째 철자도 %인 사원들의 이름을 출력하시오
select ename from emp
where ename like '_m%m%%' escape 'm';
문제37. 통계관련 학과가 아닌 학생들의 이름과 전공을 출력하시오
select ename, major from emp2
where major not like '%통계%';
*만약 not like '통계' 라고만 쓰면 25개 과가 다 나온다.
문제38. 네이버 메일 사용하는 학생들의 이름과 이메일을 출력하시오
select ename, email from emp2
where email like '%naver%' or email like '%NAVER%';
문제39. 사원번호가 7788 번인 사원의 사원번호와 이름을 출력하시오
select ename, empno from emp
where empno = '7788';
문제40. 사원번호가 7788, 7902, 7369 번인 사원의 사원번호와 이름을 출력하시오
(= 을 이용해서 쿼리짜시오)
select ename, empno from emp
where empno = 7788 or empno = 7902 or empon = 7369;
또는
select ename, empno from emp
where empno in (7788, 7902, 7369);
**
만약
where empno=7788, 7902, 7369 라고 쓰면 이 3가지를 동시에 만족시키는 값이여야 하기때문에 안됨.
= 는 단일연산자 입니다.
문제41. 직업이 SALESMAN 이거나 ANALYST 인 사원들의 이름과 직업을 출력하시오
select ename, job from emp
where job in ('SALESMAN', 'ANALYST');
*영어문자라서 작은따옴표 꼭.
문제42. 부서번호가 10번, 20번이 아닌 사원들의 이름과 부서번호를 출력하시오
select ename, deptno from emp
where deptno not in (10, 20);
■is null 연산자
문제43. 커미션이 null인 사원들의 이름과 커미션을 출력하시오
select ename, comm from emp
where comm is null;
*where comm = null; 이라고 쓰면 안되는 이유는
null이 알 수 없는 값이라 비교가 안된다. (= 는 비교연산자)
그래서 비교연산자가 아닌
is null 이라고 한다.
문제44. 커미션이 null이 아닌 사원들의 이름과 커미션을 출력하시오
select ename, comm from emp
where comm is not null;
■연산자 3가지
1. 산술연산자
2. 비교 연산자
3. 논리 연산자: and, or, not
■논리연산자
문제45. 직업이 SALESMAN 이고 월급이 1000 이상인 사원들의 이름과 월급과 직업을 출력하시오
select ename, sal, job from emp
where job = 'SALESMAN' and sal>=1000;
*****************and 와 or 의 차이가 내용을 다르게 한다
select ename, sal, job from emp
where job = 'SALESMAN' or sal>=1000;
※설명: true and true = true
ture and false = false
true and null = null
*null 이 true/false 냐를 모르니까.
true or false = true
true or null = true
*null 이 true/false 둘 중 하나니까.
false or null = null
*null 이 true/false 둘 중 하나니까 null
false and null = false
*null 이 true 면 false (and 니까!)
null 이 false 면 false
언제 or 를 쓸지 and 를 쓸지 잘 정해야 한다. 중요하다.
■and, or 연산자의 우선순위
문제46. 직업이 SALESMAN 이거나 CLERK 이고 월급이 1000 이상인 사원들의 이름과 월급과 직업을 출력하시오
select ename, sal, job from emp
where job ='SALESMAN' or job ='CLERK' and sal>=1000;
*or, and 이런거 중 어떤게 먼저 수행되는지 알아야 한다.
*만약 and 보다 or를 먼저 하고 싶으면 괄호로 묶어주면 된다.
select ename, sal, job from emp
where (job ='SALESMAN' or job ='CLERK') and sal>=1000;
문제47. 통신사가 kt 이거나 lg 이고 나이가 25 이상인 학생들의 이름과 나이와 통신사를 출력하시오
select ename, age, telecom from emp2
where telecom = 'kt' or telecom='lg' and age>=25;
괄호를 묶으면
select ename, age, telecom from emp2
where (telecom = 'kt' or telecom='lg') and age>=25;
그 값이 달라진다.
문제48.(마지막 문제)
아래와 같이 결과를 출력하시오
엄한솔 학생은 27살이고 전공이 프랑스어학과이며 sk 통신사를 사용하고 있습니다.
.........이런식으로...........
우리반 전부 출력하시오
select ename ||' 학생은 '||age||'살 이고 전공이 '||major||'이며'||telecom||'통신사를 사용하고 있습니다.' from emp2;
■order by 절(109페이지)
데이터를 정렬하는 절
ex) select ename, sal from emp
order by sal asc;
※설명: 이름과 월급을 출력하는데 월급이 낮은 값부터 출력하시오
(오름차순)
※옵션: asc->>낮은값부터 출력
dsc->>높은값부터 출력(내림차순)
월급 높은값부터 출력하려면
select ename, sal from emp
order by sal desc;
문제49. 우리반 테이블에서 이름과 나이를 출력하는데
나이가 높은학생부터 출력하시오
select ename, age from emp2
order by age desc;
문제50. 직업이 SALESMAN 인 사원들의 이름과 직업과 입사일을 출력하는데 최근에 입사한 사원부터 출력하시오
select ename, job, hiredate
from emp
where job ='SALESMAN'
order by hiredate desc;
※설명: SQL 작성 규칙(페이지 64)
▪대소문자를 구분하지는 않으나 현업에서 대부분 소문자를 쓴다.
▪한 줄에 연속 입력해도 상관없으나, 줄 바꿈 해줌으로서 에러잡기
편하게 습관들이는게 좋다.
▪가독성을 높이기 위해 들여쓰기를 사용하라
ex) select ename, sal
from emp
where job='SALESMAN'
order by sal desc;
문제 51. 통계학과인 학생들의 이름과 나이와 전공을 출력하는데
나이가 높은 학생부터 출력하시오
select ename, age, major
from emp2
where major like '%통계%'
order by age desc;
※오라클 내부적 실행순서
from>> where>> select>> order
증명을 위한 비교 실험
select ename, age, major
from emp2
where major like '%통계%'
order by age desc;
select ename, age as 나이, major
from emp2
where major like '%통계%'
order by age desc;
*문제없이 된다. select가 영향을 미치는 건 order by 뿐이니까.
select ename, age as 나이, major as 전공
from emp2
where 전공 like '%통계%'
order by age desc;
*select 에서 설정한 값이 where 에서 안 먹히는 이유가
select가 나중에 실행되기 때문이다.
그렇게 순서 증명 ㅇㅋ
문제52. 직업, 이름, 월급을 출력하는데 직업은 abcd 순으로 정렬해서
출력하고 직업이 abcd 순서로 정렬되어 있는 것을 기준으로
월급은 높은순으로 출력하시오
select job, ename, sal
from emp
order by job asc, sal desc;
**알파벳도 오름, 내림차순 가능하다
※컬럼column 활용
select job, ename, sal
from emp
order by 1 asc, 3 desc;
컬럼(column)이란 관계형 데이터베이스 테이블에서 특정한 단순 자료형의 일련의 데이터값과 테이블에서의 각 열을 말한다
문제53. 월급이 1000에서 3000 사이인 사원들의
이름과 월급을 출력하는데
월급이 높은 사원부터 출력하시오
select ename, sal from emp
where sal between 1000 and 3000
order by sal desc;
■치환변수 &
같은 SQL 인데 값만 다르게 해서 반복 수행해야하는 작업을 할 때
작업을 쉽게 할 수 있는 키워드
예)
select ename, sal, job
from emp
where empno= &empno;
**sqlplus 에서는 먹히고
sqlgate 에서는 안 먹힘
(안중요 하다고 하심.)
■서울시 물가 데이터 테이블 생성 후 데이터 입력
select * from price;
총 몇 건인지 세고 싶으면
select count (*) from price;
문제54. 남대문 시장에서 파는 물건과 가격을 출력하는데
가격이 높은것 부터 출력하시오
select a_name, a_price, a_unit
from price
where m_name='남대문시장'
order by a_price desc;
문제55. m_name(판매처) 을 중복제거해서 출력하시오
select distinct m_name from price;
문제56. 신세계 백화점에서 파는 물건이름과 가격과
단위(a_unit)를 출력하는데 가격이 높은것 부터 출력하시오
select a_name, a_price, a_unit
from price
where m_name = '신세계백화점'
order by a_price desc;
'sql' 카테고리의 다른 글
5. NVL, DECODE, CASE (0) | 2019.03.30 |
---|---|
4. 날짜함수 (0) | 2019.03.30 |
3. 단일행 함수 (0) | 2019.03.30 |
1. SQL 설치 및 테이블, 컬럼 소개 (0) | 2019.03.30 |
오라클 설치 (0) | 2018.12.28 |