티스토리 뷰

[DESC]

DESC board;

> board 테이블에 어떤 컬럼이 있는지 조회


[SELECT]

SELECT COUNT(*) "NUM" FROM board
WHERE email = 'a@gmail.com';

> board 테이블에서 email이 a@gmail.com인 사람의 숫자(count)를 구하는 것.

뒤에 “NUM”으로 별칭을 주었음.


SELECT num ||' '|| name "num&name" FROM BLOG_MEMBER;

> blog_member 테이블에서 NUM 컬럼과 NAME컬럼을 합친 결과를 보여줌. 원래 ||만 하면 되는데 결과값 사이에 공백을 넣어주고 싶어서 ||’ ‘||을 사용 함. 그리고 뒤에 “NUM+NAME”으로 별칭을 지어줌.


SELECT DISTINCT name FROM BLOG_MEMBER;

> BLOG_MEMBER 테이블에서 NAME값을 가져오는데 “DISTINCT”를 사용하면 중복 값을 제거 한 결과를 보여줌.


SELECT num, name FROM BLOG_MEMBER
WHERE num < 40;

> BLOG_MEMBER 테이블에서 num값이 40 미만인 사람의 num,name값을 보여줌.


[다양한 연산자]

1) 산술 연산자 (+,-,*,/)

SELECT num + 20000 "Plus 2000" FROM BLOG_MEMBER;

> num 컬럼 값에 + 20000을 한 결과가 나옴. 별칭으로 “Plus 2000”을 지정.


2) BETWEEN 연산자

SELECT num,name,email
FROM BLOG_MEMBER
WHERE num BETWEEN 1 AND 40;

> num값이 1과 40 이거나 그 사이인 사람의 num,name,email값이 출력 됨.

> BETWEEN연산자 주의 사항.

  1. 작은 값을 앞에, 큰 값을 뒤에

  2. 두 값을 모두 포함하는 결과를 출력. (두 값을 포함하지 않으려면 쓰면 안됨!)

  3. 속도가 많이 느린 연산자에 속하기 때문에 비교연산자(>,<,>=,<=)를 사용하는것이 좋음.


3) IN연산자

SELECT *
FROM BLOG_MEMBER
WHERE email IN('a@daum.net','b@gmail.com');

> email이 ‘a@daum.net’, ‘b@gmail.com’ 인 사람의 정보가 출력 됨.

> IN연산자는 속도가 빠르기 때문에 현업에서 아주 많이 사용되는 연산자.


4) LIKE 연산자

SELECT *
FROM BLOG_MEMBER
WHERE email LIKE '%daum.net';

> ‘%’기호는 글자수 제한이 없음. ~daum.net인 데이터가 출력 됨.


SELECT *
FROM BLOG_MEMBER
WHERE email LIKE '_@daum.net';

> ‘_’ 기호는 한 글자만 올 수 있음. 즉, a@daum.net 같은 결과가 출력 됨.


5) IS NULL / IS NOT NULL 연산자

SELECT *
FROM BLOG_MEMBER
WHERE GENDER IS NULL;

> GENDER가 NULL인 값이 조회 됨. IS NOT NULL을 쓰면 NULL이 아닌 값이 조회 됨.


6) 검색 조건이 두 개 이상일 경우 (AND, OR)

SELECT name,gender
FROM BLOG_MEMBER
WHERE GENDER IS NOT NULL

AND NUM = 41;

> GENDER이 NULL이 아니고 NUM값이 41인 데이터의 name과 gender을 출력 함.

> OR을 쓰면 둘 중 하나 일 경우 해당되는 값이 출력 됨.


7) ORDER BY 절 (정렬)

SELECT name,gender
FROM BLOG_MEMBER
WHERE gender IS NOT NULL

ORDER BY num DESC;

> gender값이 null이 아닌 값을 ‘num’값을 기준으로 ORDER BY (정렬) 함. DESC는 내림차순, 디폴트가 오름차순 (ASC) 임.

> 정렬해서 결과를 출력하면 깔끔하고 보기 좋지만, 오라클에서 아주 힘든 작업 임.

최대한 정렬하는 ORDER BY 절을 사용하지 않고 SQL을 작성해야 속도가 빨라짐.

-> 그래서 실전에서는 정렬도 하고 속도도 빠른 ‘인덱스를 이용하는 방법’을 사용함.


[집합 연산자]

1) 결과 모아서 출력 (UNION과 UNION ALL)

SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER IS NOT NULL
UNION
SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER = 1;

> 두개의 SELECT 결과 값을 다 보여줌. UNION은 우선 첫 번째 컬럼으로 먼저 정렬한 후 동일한 값이 있을 경우 두 번째 컬럼으로 한 번 더 정렬을 하게 됨.


SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER IS NOT NULL
UNION ALL
SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER = 1;

> UNION과 다르게 정렬되지도 않고 중복된 데이터도 그대로 출력 됨. 일반적으로 UNION은 정렬해야 하기 때문에 속도가 느린 단점이 있음. 그러나 업무 성격상 반드시 UNION을 써야 하거나 UNION ALL을 써야 하는 경우가 있으니 업무에 맞게 선택해서 사용하면 됨.


2) 공통으로 있는 데이터 찾기 (INTERSECT 연산자)

SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER IS NOT NULL
INTERSECT
SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER = 1;

> 두 sql문장의 실행 결과에서 공통으로 있는 교집합 부분을 찾아내는 집합 연산자.

> 정렬을 동반하게 되는 연산자이므로 많은 데이터를 대상으로 할 경우 속도가 느려짐.


3) 특정 결과만 제외한 결과 만들기 (MINUS 연산자)

SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER IS NOT NULL
MINUS
SELECT num,name
FROM BLOG_MEMBER
WHERE GENDER = 1;

> gender이 not null인 값 중에 gender = 1인 값을 제외 한 나머지 결과를 출력.

> MINUS 연산자도 결과 값을 정렬 함. 데이터 량이 많을 경우 시간이 오래 걸림.

> 두 개 쿼리의 칼럼의 갯수가 다르거나 데이터 형이 다르면 에러가 발생함.



'공부 > Oracle' 카테고리의 다른 글

[Oracle] ora-28001 오류  (0) 2018.09.05
oracle 잘 까먹는 기본 기능  (0) 2018.06.19
oracle 현재 날짜,시간 insert 하기  (0) 2018.06.17
댓글