SQL(Structured Query Language) 개요 및 쿼리문 기본 문법.
SQL(Structured Query Language)
- 데이터를 관리하는 공통적인 표준 언어.
- 쿼리(Query)는 DBMS에게 요청한다는 뜻이며 한국말로는 "질의"로 번역.
- SQL은 대화식 언어이다. 범용 언어는 명령의 집합을 작성해 놓고 일괄 실행하는데 비해 SQL은 명령을 내리는 즉시 실행하여 결과를 돌려준다.
- SQL은 선언적인 언어이다. 일반 언어는 작업에 대한 구체적인 절차를 일일이 명령으로 기술한 후 실행한다. 문제를 푸는 과정은 생략하고 무엇을 원한다는 것만 밝힌다.
SQL 쿼리(Query)문의 분류
DDL(Data Definition Language) | DB 오브젝트를 생성, 삭제, 변경한다. CREATE, DROP, ALTER 등의 명령이 있다. DB를 디자인하는 관리자가 이 부류의 명령을 주로 사용한다. |
DML(Data Manipulation Language) | DB를 조회, 삽입, 삭제, 변경한다. SELECT, INSERT, DELETE, UPDATE 명령 등이 있다. 응용 프로그램 개발자가 주로 사용한다. |
DCL(Data Control Language) | 사용자와 권한을 관리하는 GRANT, DENY, REVOKE 등의 명령이 있다. DBA가 주로 사용하며 일반 개발자는 사용할 일이 드물다. |
SQL 검색 질의
- SQL에서 하나의 질의는 6개의 절로 구성
- SQL SELECT 문의 기본 형식은 사상(mapping) 또는 SELECT-FROM-WHERE블록이라고 부른다.
- 필수적으로 질의에 나타내야 하는 두개의 절은 SELECT와 FROM 절임
-
SELECT 절은 결과에 포함될 애트리뷰트들이나 함수를 나열함
-
FROM 절은 질의에서 필요한 모든 릴레이션(별명)들을 명시함–중첩 질의들에 사용되는 릴레이션들은 명시하지 않음
- WHERE 절은 조인조건을 포함하여 FROM 절에 명시된 릴레이션들로부터 튜플들을 선택하기 위한 조건들을
- GROUP BY절은 그룹화 애트리뷰트를 명시
- HAVING 절은 선택된 튜플들의 그룹들에 대한 조건을 명시
- ORDER BY절은 질의 결과를 출력하는 순서를 명시
- 질의는 WHERE절, GROUP BY절과 HAVING절의 순서로 적용함으로써 평가됨
검색 질의 1: < SELECT ... FROM >
SELECT 필드목록 FORM 테이블; ---- 기본 SELECT문
SELECT * FROM EMP; ---- 별침
SELECT 수식 FORM dual; ---- 간단한 계산기
- 별침( * )기호를 쓰면 테이블의 모든 필드를 출력한다. (ALL 또는 몽땅이라고 읽는다.)
- SELECT 명령이 출력하는 내용을 결과셋(Result Set) or 로우셋(Row Set)이라고 하는데 형태가 테이블과 똑같다.
- 꼭 테이블에 있는 필드만 출력할 수 있는 것도 아니다. 단순한 계산식도 출력이 가능하다.
- FORM문을 빼고 SELECT 문만 적으면 필수 구문이 빠졌다는 에러 메세지를 출력한다. (But, SQL Server는 FROM절의 생략을 허용하여 수식만 적을 수 있다.)
검색 질의 2: < WHERE >
- WHERE 절이 없으면 모든 레코드를 다 조회한다.
- DELETE, UPDATE 등의 명령과 함께 삭제 및 변경할 레코드를 선택할 때도 사용한다.
검색질의 3: < ORDER BY >
ORDER BY 필드 [ ASC : DESC ]
범위 변수 정렬 키워드(ascending, descending)
- 데이터의 정렬을 수행하며, 기본 정렬은 오름차순 입니다. orderby절을 실행하지 않으면 정렬 되지 않고 출력 됩니다.
- 널값은 오름차순에서는 가장 마지막에 나타나고, 내림차순에서는 가장 앞에 나타남.
검색질의 4: < GROUP BY >
그룹화 - GROUP BY 애트리뷰트(그룹화 애트리뷰트)에 동일한 값을 갖는 투플들이 각각 하나의 그룹으로 묶임.
- 각 그룹에 대하여 결과 릴레이션에 하나의 투플이 생성됨
- SELECT절에는 각 그룹마다 하나의 값을 갖는 애트리뷰트, 집단 함수, 그룹화에 사용된 애트리뷰트들만 나타날 수 있음
검색질의 5: < HAVING >
HAVING 어떤 조건을 만족하는 그룹들에 대해서만 집단 함수를 적용할 수 있음.
- 각 그룹마다 하나의 값을 갖는 애트리뷰트를 사용하여 각 그룹이 만족해야 하는 조건을 명시함
- HAVING절은 그룹화 애트리뷰트에 같은 값을 갖는 투플들의 그룹에 대한 조건을 나타내고, 이 조건을 만족하는 그룹들만 질의 결과에 나타남
- HAVING절에 나타나는 애트리뷰트는 반드시 GROUP BY절에 나타나거나 집단 함수에 포함되어야 함
# Q. 모든 사원들에 대해서 사원들이 속한 부서번호별로 그룹화하고, 평균 급여가 2500000원이상인 부서에 대해서 부서번호, 평균 급여, 최대 급여를 검색해라.
SELECT DNO, AVG(SALARY), MAX(SALARY)
FROM EMPLOYEE
GROUP BY DNO
HAVING AVG(SALARY) <= 2500000;
테이블 생성 및 삭제 1: CREATE TABLE 문
테이블을 생성하는 명령어이다.
CREATE TABLE 테이블이름
(
필드 정보(필드이름 타입 [제약]),
필드 정보(필드이름 타입 [제약]),
....
);
테이블 생성 및 삭제 2: DROP TABLE 문
DROP은 테이블을 삭제하는 명령어이다. 정말 삭제할 것인지 확인도 하지 않고 군말없이 지우기 때문에 확인 후 테이블을 지우도록 하자!
DROP TABLE 테이블 이름;
데이터 정의 1: INSERT문
- 기존의 릴레이션에 투플을 삽입
- 참조하는 릴레이션에 투플이 삽입되는 경우에는 참조 무결성 제약조건을 위배할 수 있음
- 릴레이션에 한 번에 한 투플씩 삽입하는 것과 한 번에 여러 개의 투플들을 삽입할 수 있는 것으로 구분
- 릴레이션에 한 번에 한 투플씩 삽입하는 INSERT문
INSERT
INTO 릴레이션(애트리뷰트1, ..., 애트리뷰트n)
VALUES (값1, ..., 값n);
----------------------------------------------
INSERT
INTO 릴레이션(애트리뷰트1, ..., 애트리뷰트n)
SELECT ... FROM ... WHERE ...;
데이터 정의 2: DELETE문
- 삭제 연산은 한 릴레이션으로부터 한 개 이상의 투플들을 삭제함
- 참조되는 릴레이션의 삭제 연산의 결과로 참조 무결성 제약조건이 위배될 수 있음
- DELETE문의 구문
DELETE
FROM 릴레이션
WHERE 조건;
데이터 정의 3: UPDATE문
- 한 릴레이션에 들어 있는 투플들의 애트리뷰트 값들을 수정
- 기본 키나 외래 키에 속하는 애트리뷰트의 값이 수정되면 참조 무결성 제약조건을 위배할 수 있음
- UPDATE문의 구문
UPDATE 릴레이션
SET 애트리뷰트 = 값 또는 식[, …]
WHERE 조건;
SQL 별칭(alias) - AS
서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 속해 있을 때 애트리뷰트의 이름을 구분하는 방법이다. 별명은 어디까지나 문자열일 뿐이므로 명칭 규칙에 영향을 받지 않는다.
계산 필드처럼 테이블에 존재하지 않는 값을 가공하여 출력할 때는 별명이 꼭 필요하다.
- 오라클: 별명에 큰 따움표만 쓸 수 있다.
- SQL Server: 작은 따옴표, 큰 따옴표, [ ] 기호로 별명을 감싼다. 별명 = 필드 형식도 지원한다.
- MariaDB: 작은 따옴표, 큰 따옴표로 별명을 감싼다.
필드명 [AS] "별명"
범위를 사용하는 검색 - BETWEEN AND
# Q. 굽여가 300000원 이상이거, 4500000이하인 사원들의 이름, 직급, 급여를 검색하라.
SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 300000 AND 4500000;
WHERE SALARY >= 300000 AND SALARY <= 4500000 ;
널값 - NULL
- NULL은 값이 아니라 상태이다. 때문에 = 연산자로 비교할 수 없다.
- 널값을 포함한 다른 값과 널값을 +, - 등을 사용하여 연산하면 결과는 널이 됨
- COUNT(*)를 제외한 집단 함수들은 널값을 무시함
- 어떤 애트리뷰트에 있는 값이 널인가 비교하기 위해서 "EMP = NULL" 처럼 나타내면 안됨 "EMP IS NULL"이 옳바른 표현이다.
- 어떠한 비교 결과는 모두 거짓이다.
- 선언문 뒤에 NULL이 있으면 이 필드는 값을 입력하지 않아도 된다는 뜻이다. (NULL, NOT NULL)
LIKE
= 비교 연산자는 완전히 일치하는 조건식을 표현하는데 비해 LIKE 연산자는 패턴으로 부분 문자열을 검색한다.
반대 연산자는 NOT LIKE
IN
BETWEEN 연산자는 연속된 범위만 검색할 수 있으며 불연속적이고 임의적인 값 여러 개를 조사하기는 어렵다. 그래서 주로 수치값 검색에 사용한다. 이에 비해 IN연산자는 불연속적인 값 여러 개의 목록을 제공하여 이 목록과 일치하는 레코드를 검색한다.
IN연산자 뒤의 괄호 안에 콤마로 구분된 값 목록을 나열하여 이 중 하나에 해당하는지 점검한다. 값 개수에는 제한이 없어 얼마든지 많은 값을 넣을 수 있다.
DISTINCT
중복된 값을 제거할 때의 키워드이다. DISTINCT 키워드가 있는 필드는 중복값을 합쳐 한 번만 출력한다.
SQL 주석
- 한 줄 주석: --
- 블록 주석: /* */
Reference.
도서 1. 김상형의 SQL 정복: 소문난 명강의 (무료특별판) | 한빛미디어
도서 2. 면접을 위한 CS 전공지식 노트 | 길벗