Oracle

[SQL]SQL -Day.1

MoZZANG 2022. 3. 27. 18:11

SQL에서 Table에 저장된 데이터를 조회하고자 할 때 사용하는 질의어DML(Data Manipulation Language)이다. DML문을 이용해 Select(조회), Insert(삽입), Update(수정), Delete(삭제)를 한다.

 

 

DML의 기본 형식은 다음과 같다.

 

쿼리들의 실행순서도 있는데 중요하며 다음과 같다.

 

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 

 

 

 

1. 모든 열 선택

 

SELECT 키워드에 " * " 를 사용하여 모든 열을 조회 할 수 있다.

▲ emp 테이블에서 모든열을 조회 및 출력한다.

 

 

 

 

2. 특정 컬럼 선택

Table의 특정 Column검색하고자 할 경우 Column이름을 " , "로 구분하여 명시함으로써 특정 Column을 출력할 수 있다.

출력순서는 SELECT문 뒤에 기술한 Column의 순서대로 출력된다.

▲ emp테이블에서 ename, sal, job, deptno 열 순서로 조회 및 출력한다.

 

 

 

 

 

3. 산술 표현식

데이터가 출력되는 방식을 수정하거나 계산을 수행하고자 할 때 산술 표현식을 사용한다.  산술 표현식은 열 이름,숫자상수,문자 상수, 산술 연산자를 포함 할 수 잇으며 연산자는 +,  -, *, /,를 사용한다.

 

▲ emp테이블에서 ename, sal, sal의 1.5배(150%) 열 순서로 조회 및 출력한다.

 

 

 

 

 

4. 열(Column)에 별칭 부여

질의의 결과를 출력할 때 사용자가 이해하기 쉽게 열에 이름을 부여 할 수 있다.
- 열 이름 [AS] "별칭"
- 별칭에 공백을 주거나 '을 주고 싶을때는 무조건 "으로 감싸라

 

 

▲ 공백을 주거싶거나 작은 따옴표(Single quotation)을 문자처럼 사용하고 싶으면 큰 따옴표(Double quotation)으로 감싸라.

 

 

 

 

 

 

 

5. 중복행의 제거

 

결과에서 중복되는 행을 제거하기 위해서는 SELECT 키워드 바로 뒤에 distinct를 기술한다.
- DISTINCT라는 키워드는 항상 SELECT 바로 다음에 기술한다.
- DISTINCT뒤에 나타나는 컬럼들은 모두 DISTINCT의 영향을 받는다
- DISTINCT뒤에 여러 개의 컬럼을 기술하였을 때 나타나는 행은 컬럼의 조합(AND조합)들이 중복되지 않게 나타난다.

 

 

▲ 직책별로 하나씩만 출력된다.

 

 

▲ job과 deptno사이에는 보이지 않지만 AND가 있다.

▲ job이 MANGER이면서(AND) deptno가 20인 사람을 중복체크해서 하나만 출력되고, job이 SALESMAN 이면서(AND) deptno가 30인 사람을 중복체크해서 하나만 출력되게하고.... 이런식으로 중복체크를 한다.

 

 

 

 

 

 

 

6. 특정 행의 검색

 

일반적인 경우 테이블에 있는 모든 자료를 조회할 필요 없이 사용자가 원하는 자료를 조회하는 경우 WHERE절을 사용한다.

 

- WHERE절을 사용하여 행(Row)들을 제한할 수 있다.
- WHERE절은 FROM절 다음에 기술한다.
- 조건은 아래의 것으로 구성된다. COLUMN명, 표현식, 상수, 문자, 비교연산자,SQL연산자,논리 연산자등

   비교연산자에는 = ,> ,>=, < , <=, <>(!=) 등이 있고

   SQL 연산자에는 BETWEEN a AND b,  IN ,NOT IN,LIKE,IS NULL(IS NOT NULL),
   ||(문자열 연결시) 등이 있고 논리 연산자에는 AND , OR,  NOT 이 있다.

 

▲emp테이블에서 sal(연봉)이 3000이상인 사람들의 이름, 연봉, 직책을 출력

 

 

▲ 위 코드에서 원한건 직책이 salesman인 사람들의 이름, 연봉, 직책을 출력하려고 한 것이지만 결과는 아무것도 출력되지 않는다. Column명은 대소문자를 가리지 않지만, Column안에 있는 데이터들은 대소문자를 가리기 때문이다.

salesman은 job이라는 Column안에 들어있는 데이터들 중 하나일 뿐이므로 대소문자를 가려서 입력해야한다.

즉, SALESMAN이라고 입력을 해야 한다는 것이다.

 

 

 

▲ != 는 NOT 과 같은 의미이다. 즉, job이 SALESMAN이 아닌 사람들의 이름,연봉,직책을 출력한다.

 

 

 

▲ 첫줄부터 순서대로 연봉이 2500이상이면서 직책이 MANAGER인 사람들의 이름,연봉,직책을 출력, 연봉이 2500이상이거나 또는 직책이 MANAGER인 사람의 이름,연봉,직책을 출력,  마지막으로 직책이 MANAGER가 아닌 사람들의 이름,연봉,직책을 출력

 

 

 

 

 

6-1. SQL 연산자 - BETWEEN a AND b

두 값의 범위에 해당하는 행을 출력하기 위해 사용한다. BETWEEN연산자는  컬럼 >= 값 AND 컬럼 <= 값과 같은 의미이다.

 

▲ 위 두 코드는 동일한 내용이다. 연봉이 2000 과 3000 사이에 있는 사람들의 이름,연봉,직책,고용날짜를 출력

 

 

 

 

 

6-2. SQL 연산자 - IN

목록에 있는 값에 대해서 출력하기 위해  IN연산자를 사용한다. IN 연산자는 OR로 연결된 논리연산자의 결합과 같다.

컬럼명 IN (값1,값2,....) => 컬럼명 =값1 OR 컬럼명 = 값2 OR....

 

 

▲ 위 두 코드는 동일한 내용이다. 직책이 CLECK이거나 또는 MANGER인 사람의 이름,연봉,직책,고용날짜 출력

 

 

 

 

 

6-3. SQL 연산자 - LIKE

% : 임의의 0개 이상의 문자열
_ : 임의의 한글자

LIKE 'A%' : 컬럼이 'A'로 시작하는 데이터들만 검색됩니다. 예) ABC,A123,A     
LIKE '%A' : 컬럼이 'A'로 끝나는 테이터들만 검색됩니다. 예) BCA,123A,A   
LIKE '%KIM%' : 컬럼에 'KIM' 문자가 있는 데이터 들만 검색됩니다. 예) ABCKIM, ABCKIMDEF,KIMABC, KIM
LIKE '_A%' : 컬럼에 'A'문자가 두 번째 위치한 데이터 들만 검색됩니다. 예) DA(O), DDDA(X), A(X)

 

▲ emp테이블에 이름이 S로 시작하는, S로 끝나는, S가 들어가는, A문자가 세번째 위치하는 사람들의 모든 데이터 출력

 

 

 

 

 

 

6-4. SQL 연산자 - IS NULL

 

NULL값은 값이 없거나 ,알 수 없거나,적용할 수 없다는 의미이므로 NULL값을 조회하고자 할 경우에 사용한다.

- NULL은 이용할 수없고 할당되지 않고 알려져 잇지 않고 적용 불가능한 값을 의미한다.
- NULL이란 0이나 공백(SPACE)와 다르다.
- NULL값을 포함한 산술 표현식 결과는 NULL이다.
 컬럼에 데이터 값이 없으면 그 값 자체가 NULL이다.

 

 

 

 

 

7. ORDER BY절

질의 결과에 반환되는 행의 순서는 정의되지 않는다.
ORDER BY절은 행을 정렬하는 데 사용한다.

ORDER BY절을 사용하는 경우 SELECT문의 맨 뒤에 기술 되어야 한다.
 

Order BY 컬럼 내지 표현식 [ASC | DESC]

 - Default 정렬은 오름차순(ASC)이다.
 - 내림 차순으로 정렬하려면 ORDER BY절에서 열 이름 뒤에 DESC 키워드를 명시해야한다.  
 
 - 하나 이상의 열로 질의 결과를 정렬할 수 있다.
 - 주어진 테이블에 있는 컬럼 개수까지만 가능하다
 - ORDER BY절에서 열을 명시하고, 열 이름은 쉼표(,)로 구분한다,

 

 

 

 

 

 

 

 

 

8. 그룹함수

COUNT(* 또는 컬럼명) : 테이블의 전체에서 null이 아닌 레코드(행) 개수를 가져온다.

  예) SELECT COUNT(*) FROM 테이블명

SUM(컬럼명) : 해당 컬럼의 총합을  구한다.

 예) SELECT SUM(컬럼명) FROM 테이블명

AVG(컬럼명) : 해당 컬럼의  전체 평균값을  구한다.

 예) SELECT AVG(컬럼명) FROM 테이블명
MAX(컬럼명) : 해당 컬럼의 가장 큰 값을 구한다.
  예) SELECT MAX(컬럼명) FROM 테이블명
MIN(컬럼명) : 해당 컬럼의 가장 작은 값을 구한다
  예) SELECT MIN(컬럼명) FROM 테이블명
SELECT SUM(컬러명) FROM 테이블명 : 합계 구하기

*그룹함수는 SELECT절에서 단독으로 쓸 수 있으나 다른 칼럼정보를 함께 출력할 수 없다.

단, GRUOP BY를 통해서 그룹화를 한 Column은 그룹함수와 같이 사용할 수 있다.

 

 

 

 

 

 

 

 

9. GROUP BY

WHERE절은 전제 행에 대한 필터링 조건
HAVING절은 그룹에 대한 필터링 조건
     
- GROUP BY는 ORDER BY전에 기술해야 한다.
- 그룹에 대한 조건은 HAVING절에서 기술해야 한다.
- WHERE조건과 함께 쓰면 WHERE조건절에서 먼저 필터링 한후 그룹화 한다.
Group by 구문 : GROUP BY 행을 그룹화 하기위한 기준이 될 Column을 기술

 

 

 

 

▲ deptno로 정렬하면 총 3개의 그룹이, 각각의 그룹에서 MAX니까 또 3개의 그룹, 하지만 job은 12개니까 

3 - 12 - 3과 같은 형태의 Table은 존재할 수 없으므로 error가 난다.

 

 

 

▲ deptno로 먼저 그룹핑을 한 다음 각각의 그룹안에서 다시 job으로 그룹핑을 한다. 

▲ 위와 같이 정렬되고 그룹핑 되는 것이다. 총 9개의 그룹이 만들어지며 각각의 그룹안에서 최대연봉인 사람이 출력된다.

 

 

 

▲ emp테이블에서 연봉이 1000이상인 사람들을 job으로 그룹핑하는데 최소연봉이 2000이상인 사람들만 가지고 그룹핑한다. 그리고 그 사람들의 직책과 최대연봉을 출력

 

 

 

▲ 주의하도록 하자

 

 

 

 

 

11. 서브퀴리(SUBQUERY)

서브쿼리는 다른 하나의 SQL문장안에 기술된 SELECT문장을 말한다.


 - 서브쿼리는 괄호로 묶어야 한다.
 - 서브쿼리만을 단독 실행시 실행이 되어야 한다.
 - 두 종류의 연산자가 서브쿼리에 사용된다.
  =,>,>=,<,<=,<>,!=(단일행 연산자)  혹은 IN, NOT IN(복수행 연산자)등
 - 서브퀴리는 연산자의 오른쪽에 기술 되어야 한다.
 - 단일행 서브 쿼리에는 단일행 연산자를 다중행 서브쿼리에는 복수행 연산자를 사용한다.
 - 서브쿼리는 SELECT절,FROM절 WHERE절등에 위치할 수 있다.

 

▲ emp테이블에서 sal이 sub쿼리인 사람들의 이름과 직책, 연봉을 출력

 

 

▲sal이라는 변수는 하나인데 서브쿼리 안에서 반환되는 값은 12개이므로 error가 발생한다.

▲ 단일행 연산자 뒤에는 무조건 행이 하나가 나오는 쿼리를 사용하자

 

 

 

▲ 위 두 코드는 같은 내용이다. 

 

 

 

▲ 위 두 코드도 같은 내용이다. 

 

'Oracle' 카테고리의 다른 글

[SQL]SQL -Day. 5  (0) 2022.03.31
[SQL]DAY.4  (0) 2022.03.30
[SQL]SQL -Day.3  (0) 2022.03.29
[SQL]SQL -Day.2  (0) 2022.03.28
[SQL]What & why SQL  (0) 2022.03.27