SQL란?

관계형 데이터베이스에서 표의 정의, 데이터의 검색·추가·갱신·삭제, 권한의 제어 등을 수행하기 위한 표준 언어. ISO/IEC(일본에서는 JIS)로 규격화되어 있다. SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, GRANT 등의 문이 있다.

일본어 명칭: SQL

SQL은(는) 데이터베이스 기초, 정보 보안 기초, IC 설계 흐름과 EDA 등 3개 분야의 연습 문제 15개에 나와요.

분야: 데이터베이스 기초

SQL 문의 종류

SQL 문은 역할에 따라 크게 세 가지로 나뉩니다. 데이터 정의어(DDL)는 CREATE, ALTER, DROP처럼 표, 뷰, 인덱스 등의 구조를 정의합니다. 데이터 조작어(DML)는 SELECT, INSERT, UPDATE, DELETE처럼 표 안의 데이터를 다룹니다. 데이터 제어어(DCL)는 GRANT나 REVOKE처럼 권한을 제어합니다. 트랜잭션을 확정하는 COMMIT이나 취소하는 ROLLBACK은 DCL에 포함하기도 하고, 트랜잭션 제어문으로 따로 나누기도 합니다.

SELECT 문의 절과 처리 순서

SELECT 문은 SELECT 열 FROM 표 WHERE 조건 GROUP BY 열 HAVING 조건 ORDER BY 열처럼 절을 나열하여 씁니다. 쓰는 순서와는 달리, 처리는 FROM(표를 정하고 조인한다), WHERE(행을 고른다), GROUP BY(그룹으로 묶는다), HAVING(그룹을 고른다), SELECT(열을 꺼내고 집계 함수를 계산한다), ORDER BY(정렬한다)의 순서라고 생각하면 이해하기 쉬워집니다. WHERE에 집계 함수를 쓸 수 없고 그룹의 조건을 HAVING에 쓰는 것은 이 때문입니다.

선언적 언어와 NULL의 취급

SQL은 어떤 결과를 원하는지를 쓰는 선언적 언어로, 결과를 얻기 위한 절차는 DBMS의 옵티마이저가 정합니다. 값이 알려지지 않았음을 나타내는 NULL의 취급에는 주의가 필요합니다. NULL과의 비교는 참도 거짓도 되지 않으며(알 수 없음), = NULL이 아니라 IS NULL로 조사합니다. SUM이나 AVG 등의 집계 함수는 NULL을 무시하고, COUNT(*)는 행의 수를, COUNT(열)은 그 열이 NULL이 아닌 행의 수를 셉니다.

도전해 보기: SQL 관련 문제

SQL 문은 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 나뉜다. DDL로 분류되는 것은?

  1. AUPDATE 사원 SET 부서 = '개발' WHERE 사원번호 = 5
  2. BCREATE TABLE 부서 (부서ID INTEGER PRIMARY KEY, 부서명 CHAR(10))
  3. CGRANT SELECT ON 사원 TO 다나카
정답과 해설 보기

정답: B. CREATE TABLE 부서 (부서ID INTEGER PRIMARY KEY, 부서명 CHAR(10))

DDL(Data Definition Language)은 표, 뷰, 인덱스 같은 데이터베이스의 구조를 정의하는 문으로, CREATE, ALTER, DROP이 있습니다. DML(Data Manipulation Language)은 표 안의 데이터를 다루는 문으로, SELECT, INSERT, UPDATE, DELETE가 있습니다. DCL(Data Control Language)은 권한 등을 제어하는 문으로, 이용자에게 권한을 주는 GRANT, 권한을 취소하는 REVOKE가 있습니다. 트랜잭션을 확정하는 COMMIT이나 취소하는 ROLLBACK은 DCL에 포함하기도 하고, 트랜잭션 제어문으로 따로 나누기도 합니다. 선택지 중 표를 만드는 CREATE TABLE이 DDL입니다.

SQL에서 DELETE FROM 사원을 WHERE 절 없이 실행했을 때의 결과로 올바른 것은?

  1. A사원 표의 모든 행이 삭제되고 빈 표가 남는다
  2. B표 자체가 삭제되어 표의 정의도 없어진다
  3. CWHERE 절이 없으므로 오류가 되어 아무것도 삭제되지 않는다
정답과 해설 보기

정답: A. 사원 표의 모든 행이 삭제되고 빈 표가 남는다

DELETE는 표에서 행을 삭제하는 DML 문입니다. WHERE 절로 조건을 붙이면 그 조건에 맞는 행만 삭제되지만, WHERE 절을 생략하면 모든 행이 삭제 대상이 됩니다. DELETE로 행이 없어져도 표의 정의(열 이름이나 형, 제약)는 남으므로 그 후에도 INSERT로 행을 추가할 수 있습니다. 표 자체를 정의째 삭제하는 것은 DDL인 DROP TABLE 사원입니다. UPDATE도 마찬가지로, WHERE 절을 깜빡 빠뜨리면 모든 행이 바뀌므로 실행하기 전에 조건을 확인하는 것이 중요합니다. 트랜잭션 안이라면 COMMIT하기 전에 ROLLBACK으로 취소할 수 있습니다.

자주 묻는 질문

SQL의 WHERE 절과 HAVING 절은 어떻게 다른가요?

WHERE 절은 그룹으로 묶기 전의 한 행씩에 대한 조건으로, 집계 함수는 쓸 수 없습니다. HAVING 절은 GROUP BY로 묶은 뒤의 그룹에 대한 조건으로, HAVING SUM(금액) >= 1000처럼 집계 함수를 사용할 수 있습니다.

SQL에서 NULL인 행을 찾으려면 어떻게 하나요?

WHERE 열 IS NULL이라고 씁니다. WHERE 열 = NULL은 NULL과의 비교가 참이 되지 않으므로 한 행도 선택되지 않습니다. NULL이 아닌 행은 IS NOT NULL로 고릅니다.

해설 속 SQL

SQL이(가) 나오는 문제 (15)

  1. SQL 문은 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 나뉜다. DDL로 분류되는 것은?
  2. SQL에서 DELETE FROM 사원을 WHERE 절 없이 실행했을 때의 결과로 올바른 것은?
  3. 사원 표(사원번호, 부서, 급여)에서 부서별 평균 급여가 300 이상인 부서와 그 평균 급여를 구하려고 한다. 올바른 SQL 문은?
  4. 고객 표(고객ID, 이름)와 주문 표(주문ID, 고객ID, 금액)에서 한 번도 주문하지 않은 고객의 이름을 구하려고 한다. 올바른 SQL 문은?
  5. SQL 표준 규격이 정하는 격리 수준 중 READ COMMITTED에서 일어날 수 있는 현상의 조합으로 올바른 것은?
  6. RTL 설계에서 주로 사용되는 하드웨어 기술 언어는?
  7. 로그인 화면에서 비밀번호 칸에 ' OR '1'='1 같은 문자열을 입력하면 비밀번호를 몰라도 로그인할 수 있게 되는 웹 애플리케이션이 있다. 이 공격의 이름은?
  8. SQL 인젝션 대책으로서 플레이스홀더를 사용하는 프리페어드 스테이트먼트(매개변수화 쿼리)가, 입력 안의 위험한 문자를 제거하는 방법보다 근본적인 대책으로 여겨지는 이유로 올바른 것은?
  9. 관계형 데이터베이스의 용어에서 표(릴레이션)의 한 행에 해당하는 것은?
  10. 관계형 데이터베이스의 표에서 기본 키로 지정하는 열(또는 열의 조합)이 반드시 만족해야 하는 조건은?
  11. 수강 표(학생번호, 과목번호, 성적)는 어느 학생이 어느 과목을 수강하여 어떤 성적을 받았는지를 기록한다. 한 학생은 여러 과목을 수강하고, 한 과목은 여러 학생이 수강한다. 같은 학생이 같은 과목을 두 번 등록하는 일은 없을 때, 이 표의 기본 키로 적절한 것은?
  12. 시험 표의 점수 열에 80, NULL, 70, 90의 4개 값이 있다(NULL은 미응시를 나타낸다). SELECT AVG(점수) FROM 시험의 결과는?
  13. 재고 표에서 어떤 상품의 재고 수는 10이다. 트랜잭션 T1은 재고 수를 읽어 3을 뺀 값을 쓰고, T2는 재고 수를 읽어 5를 뺀 값을 쓴다. 락을 걸지 않고 T1의 읽기, T2의 읽기, T1의 쓰기, T2의 쓰기 순서로 실행되었을 때 최종 재고 수는 얼마가 되는가?
  14. 트랜잭션을 동시에 실행했을 때 일어나는 문제 중 더티 리드에 대한 설명으로 올바른 것은?
  15. 트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?

관련 용어

트랜잭션(Transaction) 격리 수준(Isolation Level) 기본 키(Primary Key) SQL 인젝션(SQL Injection) 관계형 데이터베이스(Relational Database) 인덱스(Index) RTL(레지스터 전송 레벨) 하드웨어 기술 언어(HDL) Verilog SystemVerilog

용어집으로 돌아가기