Darren's Devlog

[불친절한SQL] 기초쿼리, SELECT문 - 1 본문

SQL

[불친절한SQL] 기초쿼리, SELECT문 - 1

Darren Gwon 2022. 11. 17. 01:14
반응형

● SELECT문

용어 설명 예시
키워드(keyword) 개별적인 SQL 요소 DISTINCT
절(clause) SQL의 한 부분 SELECT DISTINCT
문(statement) 2개 이상의 절이 결합된 문장 SELECT DISTINCT depto FROM emp;

 

SELECT문은 데이터를 조회하는 구문이다.

SELECT문은 SELECT절FROM 절로 구성된다.

SELECT deptno FROM emp;

FROM절이 수행된 후 SELECT절이 수행된다.

 

○ SELECT절

조회할 열(column)이나 표현식을 기술할 수 있다.

애스터리스크, 열, 열 별칭, DISTINCT 키워드를 알아보자.

SELECT	[{{DISTINCT ¦ UNIQUE} ¦ ALL}] {* ¦ {t_alias.* ¦ expr [[AS] c_alias]} [, {t_alias.* ¦ expr [[AS] c_alias]}]···}

 

 

애스터리스크를 기술하면 전체 열(column)이 조회된다.

SELECT * FROM dept;

 

SELECT절에 조회할 열(column)을 기술할 수 있다. 여러 개일 경우 쉼표로 구분한다.

위 쿼리는 아래 쿼리로 해석된다.

SELECT dname, deptno FROM dept;
SELECT dept.dname, dept.deptno FROM dept;

 

애스터리스크와 열을 함께 사용하려면 애스터리스크를 테이블로 한정해야한다.

SELECT dept.*, deptno FROM dept;

 

열(column)은 별칭(alias)을 지정할 수 있다. 별칭을 지정하면 열이나 표현식을 간결하게 사용할 수 있다.

제약사항들이 있지만 큰 따음표(")로 감싸면 회피할 수 있다.

expr [[AS] c_alias]

AS 키워드를 사용을 권장한다. 큰 따음표는 사용하지 않는 편이 바람직하다.

SELECT deptno dept_no, dname AS dept_nm, loc AS "Location" FROM dept;

 

DISTINCT 또는 UNIQUE 키워드를 기술하면 중복 행(row)이 제거된 결과가 반환된다.

기본 값은 ALL이다.

위 쿼리는 전체, 아래 쿼리는 deptno에 대한 중복 행이 제거된 결과가 반환된다.

SELECT deptno FROM emp;
SELECT DISTINCT deptno FROM emp;

 

○ FROM절

조회할 테이블을 기술할 수 있다. 테이블은 쉼표(,)로 구분한다.

2개 이상의 테이블을 기술하면 조인이 수행된다.

FROM [schema.]table [sample_clause] [t_alias]

 

테이블에 스키마(schema)를 지정하면 해당 스키마의 테이블을 조회할 수 있다.

스키마를 지정하지 않으면 현재 사용자의 테이블, 전용 synonym, 공용 synonym 순서로 구문이 해석된다.

 

현재 사용자가 SCOTT인 경우 상단 쿼리는 하단 쿼리로 해석된다.

열은 테이블, 테이블은 스키마에 종속된 구조다.

SELECT deptno FROM dept;
SELECT deptno FROM scott.dept;
SELECT dept.deptno FROM dept;
SELECT dept.deptno FROM scott.dept;
------------------------------------------
SELECT scott.dept.deptno FROM scott.dept;

 

테이블도 별칭을 지정할 수 있다.

scott.dept가 a로 대체된다. 별칭을 사용하면 가독성을 높일 수 있다.

[schema.]table [t_alias]
SELECT a.deptno FROM dept a;
SELECT * FROM dept a, emp b WHERE b.deptno = a.deptno;

 

아래 쿼리는 scott.dept가 a로 대체되어 열(row)을 한정할 수 없기 때문에 에러가 발생한다.

SELECT dept.deptno FROM a;

deptno 열이 어느 테이블의 열인지 알 수 없기 때문에 아래 쿼리도 에러가 발생한다.

SELECT * FROM dept, emp WHERE deptno = deptno;
반응형
Comments