👨🏻‍💻 programming/◽ 데이터 베이스

SQL(Structured Query Language) 개요 및 쿼리문 기본 문법.

핑크코냥 2022. 9. 22. 15:53
728x90

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 연산자는 패턴으로 부분 문자열을 검색한다. 

출처: 김상형의 SQL 정복: 소문난 명강의(무료특별판)

반대 연산자는 NOT LIKE

 

IN

BETWEEN 연산자는 연속된 범위만 검색할 수 있으며 불연속적이고 임의적인 값 여러 개를 조사하기는 어렵다. 그래서 주로 수치값 검색에 사용한다. 이에 비해 IN연산자는 불연속적인 값 여러 개의 목록을 제공하여 이 목록과 일치하는 레코드를 검색한다.

IN연산자 뒤의 괄호 안에 콤마로 구분된 값 목록을 나열하여 이 중 하나에 해당하는지 점검한다. 값 개수에는 제한이 없어 얼마든지 많은 값을 넣을 수 있다. 

 

DISTINCT

중복된 값을 제거할 때의 키워드이다. DISTINCT 키워드가 있는 필드는 중복값을 합쳐 한 번만 출력한다. 

 

SQL 주석 

  1. 한 줄 주석: --
  2. 블록 주석: /*  */

 

Reference. 
도서 1. 김상형의 SQL 정복: 소문난 명강의 (무료특별판) | 한빛미디어
도서 2. 면접을 위한 CS 전공지식 노트 | 길벗
728x90