개발 공부/SQL

SQL Developer : SELECT

공부하는개발자_ 2023. 6. 13. 17:13

 

 

SQL (Structured Query Languge) 종류

  • SELECT : 조회
  • DML (데이터조작어) : 추가(INSERT), 수정(UPDATE), 삭제(DELETE)
  • DDL (데이터정의어) : 객체생성(CREATE)/ 객체구조변경(ALTER)/ 객체제거(DROP)
  • DTL (데이터트랜잭션) : 트랜잭션 완료(COMMIT)/ 복구(ROLLBACK)
  • DCL (데이터제어) : 계정생성(CREATE USER), 변경(ALTER USER), 제거(DROP USER)/ 권한부여 (GRANT),취소(REVOKE)

 

 

 

쿼리(Query)란 무엇인가?

쿼리(Query)란 쉽게 이야기해서 데이터베이스에 정보를 요청하는 것
쿼리(Query)를 바로 번역을 하면 '질의'라고 해석이 됨.즉, 질의를 보내고 결과를 얻는 것입니다.

특정DB에서 원하는 조건의 데이터를 조작하는 언어의 집합(문장) 이며, 이러한 쿼리(Query)는 DB를 조작하는 여러 가지 형태로 표현될 수 있으며 데이터를 다루는 프로그램에서는 필수적인 요소이다.
 
DB서버가 구동이 되고 있는 환경에서(Oracle, Cubrid, MsServer, MySQL, Tibero, Altibase 등) DB에 대해 명령문을 작업하게 되는데 이 때의 명령문을 쿼리(Query)라고 생각하면 됩니다.
하지만, 세세히 따지고 들어가면 개념 자체가 명령문과는 사뭇 다르며 그렇기 때문에 질의문(쿼리, Query)라고 부르고 있습니다

 

 

 

F5 : 한 개만 실행 해보고 싶을 때

Ctrl enterl : 여러 개 실행하고 싶을때

 

 

SELECT

SELECT 컬럼명1, 컬럼명2... | *
FROM 테이블

 [WHERE

 GROUP BY

 HAVING

 ORDER BY (컬럼, 별칭, 인덱스 사용가능)

]

ex) SELECT * FROM employees;

      SELECT employee_id, first_name FROM employees;

 

SELECT구문 처리 순서

<------SELECTION: 조건에 맞는 행 검색-------><---PROJECTION : 컬럼선택 출력-->

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

 

자료형 : 숫자 NUMBER, 문자 CHAR/ VARCHAR2, 날짜 DATE

문자형리터럴은 ' ' 로 사용

 

 

별칭 급여 사용 가능한지? 
SELECT employee_id, salary 급여
FROM employees
WHERE 급여>=15000; (x)
-처리 순서가 FROM -> WHERE-> SELECT라서 WHERE절에서 별칭 급여 사용 불가. SELECT이후 부터 사용 가능

 


SELECT employee_id, salary 급여
FROM employees
ORDER BY 급여; (o)

 

 

SELECT employee_id, salary *commission_pct+salary 실급여
FROM employees
ORDER BY 실급여; (o)


SELECT employee_id, salary *commission_pct+salary
FROM employees
ORDER BY 2; (o)
db 인덱스는 1부터 시작함.

 


SELECT employee_id, salary
FROM employees
ORDER BY hire_date; (o)
select하지 않은 컬럼으로도 정렬 가능함

 

 

SELECT절에 사용가능한 연산자

산술 연산자 +, -, *, ./

결합연산자 ||

SELECT employee_id,

       salary, salary+100, salary+salary*commission_pct,

       first_name, last_name, first_name||last_name  

FROM employees;

 

 

 

HEADING 변경: 별칭주기 : " "

SELECT employee_id 사번,
               salary "Salary"  Heading대소문자 구분, 공백허용가능

               salary+100 "salary 더하기 100", salary+salary*commision_pct 실급여,
               first_name, last_name,

               first_name || '~' ||last_name  AS 성명
FROM employees;

 

 

WHERE절; 조건식

WHERE절에서 사용가능한 연산자

  • 산술연산자 ex) WHERE salary+salary*commission_pct >= 15000;
  • 비교연산자 >, >=, <, <=, =, < >(같지 않다)   주의점: NULL값 비교 불가!!
  • 논리연산자 AND, OR, NOT ex) WHERE salary>=15000 AND hire_date< '20/01/01'
    - AND , OR중 AND가 먼저 처리 됨
  • NULL연산자 IS NULL, IS NOT NULL
    ex) SELECT * FROM employee WHERE salary >= 15000;
  • BETWEEN연산자 : 같은컬럼명>=AND 같은컬럼명<=대신 
    ex) WHERE salary>=10000 AND salary <=20000; 
          WHERE salary BETWEEN 10000 AND 20000;


  • IN연산자 : 같은 컬럼명 = OR 같은컬럼명 = 대신한다
    ex) WHERE department_id=50 OR department_id=90;
          WHERE department_id IN(50, 90)

          WHERE NOT(department_id=50 OR department_id=90);
          WHERE department_id NOT IN ( 50, 90)

LIKE 연산자 : %패턴 - 0개이상
                    : _패턴 - 1개

  • 이름에 'E' 또는 'e'를 포함한 사원의 사번, 이름을 출력하시오
    SELECT employee_id, first_name
    FROM employees
    WHERE LOWER(first_name) LIKE '%e%' ; //first_name값이 ABC -> FALSE
                                                                                                    //ABe ->TRUE
                                                                                                    //e      ->TRUE
                                                                                                    //eAB ->TRUE

  • 직무명이 SALES로 시작하는 모든 직무번호와 직무명을 출력하시오
    SELECT job_id, job_title
    FROM jobs
    WHERE job_title LIKE 'SALES%';

  • 직무명이 Manager로 끝나는 모든 직무번호와 직무명을 출력하시오
    SELECT job_id, job_title
    FROM jobs
    WHERE job_title LIKE '%Manager';

  • 사원이름에 an을 포함한 사원의 사번과 이름을 출력하시오
    SELECT employee_id, first_name
    FROM employees
    WHERE first_name LIKE '%an%';


  • 이름이 'J'로 시작하고 n문자를 포함한 사원의 사번과 이름을 출력하시오
    SELECT employee_id, first_name
    FROM employees
    WHERE first_name LIKE 'J%n%' ;


  • 입사월이 11월인 사원 사번, 입사일자를 출력하시오
    SELECT employee_id, hire_date
    FROM employees
    WHERE hire_date LIKE '__/11/__';

 

  • 사원의 사번, 급여를 출력 하시오 (107건)

SELECT employee_id, salary

FROM employees;

 

 

  • 부서번호(department_id컬럼)가 90번인 사원들의 사번, 급여를 출력하시오 ( 3건 )

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id = 90;

 

 

  • 90번 부서를 제외한 사원들 사번, 급여, 부서번호를 출력하시오 (103건)

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id < > 90;

비교연산으로 null or null이 아닌 값은 추출하지 못 함. ( 그래서 1건 누락됨)

 

 

  • 부서배치받은 사원들 사번, 급여, 부서 번호를 출력하시오 (106건)

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id IS NOT NULL;

 

 

  • 부서배치 못 받은 사원들 사번, 급여, 부서 번호를 출력하시오 (1건)

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id IS NULL;

 

 

  • 90번 부서를 제외한 사원들과 부서 배치 못 받은 사원들의 사번, 급여, 부서번호를 출력하시오 (103+1건)

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id < > 90 OR department_id IS NULL;

 

 

  • 90번 부서이고 급여가 20000이상인 사원들의 사번, 급여, 부서번호를 출력하시오.

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id = 90 AND salary >= 20000;

 

 

  • 급여가 10000이상 20000이하인 사원들의 사번, 급여, 부서번호를 출력하시오

SELECT employee_id, salary, department_id

FROM employees

WHERE salary >= 10000 AND salary <= 20000;

 

 

SELECT employee_id, salary, department_id

FROM employees

WHERE salary BETWEEN 10000 AND 20000;

 

 

  • 부서번호가 10, 50, 90인 사원들의 사번, 급여, 부서번호를 출력하시오 (49건)

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id = 10 OR department_id = 50 OR department_id = 90;

 

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id IN (10, 50, 90);

 

 

  • 부서번호가 10, 50, 90인 사원들은 제외하고 사번, 급여, 부서번호를 출력하시오 (57건)

SELECT employee_id, salary, department_id

FROM employees

WHERE department_id <> 10 AND department_id <> 50 AND department_id <> 90;
WHERE NOT(department_id = 10 AND department_id = 50 AND department_id = 90);

 

SELECT employee_id, salary, department_id

FROM employees
WHERE department_id NOT IN (10, 50, 90);

 

  • 급여가 10000이상 20000이하이면서 부서번호가 10, 50, 90인 사원의, 급여, 부서번호를 출력하시오 (2건)

SELECT employee_id, salary, department_id

FROM employees

WHERE (salary >=10000 AND salary <= 20000) AND (department_id = 10 OR department_id = 50 OR department_id = 90) ;

 

 

SELECT employee_id, salary, department_id

FROM employees

WHERE salary BETWEEN 10000 AND 20000 
AND department_id IN(10, 50, 90);

 


ORDER BY절 : 정렬
SELECT employee_id, salary, department_id
FROM employees;

 

  • 모든 사원의 사번, 급여, 부서번호를 적은급여를 받는 사원부터 출력한다 (오름차순)
    SELECT  employee_id, salary, department_id
    FROM employees
    ORDER BY salary ASC;  (ASC는 생략가능)

 

  • 모든 사원의 사번, 급여, 부서번호를 많은 급여를 받는 사원부터 출력한다 (내림차순)
    SELECT  employee_id, salary, department_id
    FROM employees
    ORDER BY salary DESC;  

  • 모든 사원의 사번, 급여, 부서번호를 많은 급여를 받는 사원부터 출력한다, 급여가 같은 경우 작은 사번부터 출력하시오

    SELECT  employee_id, salary, department_id
    FROM employees
    ORDER BY salary DESC,  employee_id;  






'개발 공부 > SQL' 카테고리의 다른 글

제약 조건 / ERD 사용  (1) 2023.06.20
SUBQUERY / DDL/ DML  (5) 2023.06.16
GROUP BY / HAVING/ JOIN/ UNION  (0) 2023.06.15
SQL 함수  (1) 2023.06.14
데이터 베이스 기본 개념  (1) 2023.06.12