ORACLE-SQL SELECT 문 2014-04-12 Blog.ksh123jjang.me
내용 SELECT문이란?... 2 SLELECT문사용하기... 3 모든열선택... 4 특정열검색... 5 SQL문작성방법... 6 열머리글기본값... 7 산술식... 8 NULL... 9 열 alias... 10 연결연산자... 11 대체인용연산자 (q)... 12 중복행제거... 13 테이블구조확인하기... 14 1
SELECT 문이란? 프로젝션 : 쿼리문에의해반홖되는열 (column) 을반홖. 선택 : 쿼리문에의해반홖되는열 (column) 을반홖. 조인 것. : 두테이블사이에링크를지정하여서로다른테이블의데이터를가져오는 그림으로표현하면 트렌젝션 선택 조인 2
SELECT 문의기본적인문법은다음과같다. SLELECT 문사용하기 SELECT * {[DISTINCT] column expression [alias],...} FROM table; SELECT는열 (column) 을식별한다. FROM은그열을포함한테이블을식별한다. * 은모든열을출력하라는의미이다. DISTINCT는중복을제거하라는의미이다. column expression 은열과표현식을의미. alias는해당열을별칭을주어사용할때사용. 3
모든열선택 앞에서도설명했지만, 모든열을선택하기위해서는 * 을사용하면된다. SELECT * FROM scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL ---------- ---------- --------- ---------- ------------------- ---------- COMM DEPTNO ---------- ---------- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 실행결과를보면, 열은 EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO 로 8 개이다. 8 개의열이모두검색된것을볼수있다. 위에결과는일부분이고모두 14 개의 rows 가검색되었다. 4
특정열검색 이번에는모든열이아닌원하는열만검색을해보자. 방법은 * 을사용하는것이아닌원하는열을나열하면된다. SELECT empno, hiredate, sal FROM scott.emp; EMPNO HIREDATE SAL ---------- ------------------- ---------- 7369 1980-12-17 00:00:00 800 7499 1981-02-20 00:00:00 1600 7521 1981-02-22 00:00:00 1250 7566 1981-04-02 00:00:00 2975 7654 1981-09-28 00:00:00 1250 7698 1981-05-01 00:00:00 2850 7782 1981-06-09 00:00:00 2450 7788 1987-04-19 00:00:00 3000 7839 1981-11-17 00:00:00 5000 7844 1981-09-08 00:00:00 1500 7876 1987-05-23 00:00:00 1100 SELECT 다음에원하는컬럼 ( 열 ) 을나열했더니그열만검색이되어화면에출력되었다. 이방법을통해사용자는모든열이아닌특정열만을추려서출력할수있다. 또한, 나열된순서에따라서출력되는열의순서도결정된다. 위에서만약, sal 이앞에있었다면 sal 열부터출력되었을것이다. 5
SQL 문작성방법 SQL문을작성하는방법을알아보자. SQL문은대소문자를구분하지않는다. 따로지정하지않으면대소문자를구분하지않는다. SQL 문은한줄또는여러줄에입력할수있다. 키워드는약어로표기하거나여러줄에걸쳐입력할수없다. 키워드 (SELECT, FROM 등 ) 은보통대문자로사용하고, 열과테이블과같은건소문자로사용. 절은대개별도의줄에입력합니다. SELECT문에들어가는긴문장이있다면다음줄에사용하여읽기편하고관리에편하게한다. 가독성을높이기위해들여쓰기를사용합니다. Ex) SELECT empno, ename, sal FROM scott.emp; SQL Developer에서 SQL 문은선택적으로세미콜론 (;) 으로끝날수있습니다. 세미콜론은여러 SQL 문을실행하는경우에필요합니다. 여러 SQL문을실행할수있는장점이있으나잘못해서사용하지않은것이라면의도하지않는문장들이수행될위험도있다. SQL*plus에서는각 SQL 문이반드시세미콜론 (;) 으로끝나야합니다 6
열머리글기본값 여기서열머리글이란별것아니다. 해당열의이름이라고보면된다. 위에서 SELECT문을실행할때사용된 empno와같은것이다. 출력될때의특징이있는데, 열머리글은대문자로출력이된다. SQL Developer 에서는왼쪽정렬로출력이되고, SQL*Plus 에서는문자 & 날짜는왼쪽정렬이고숫자형에대해서는오른쪽정렬로출력이된다. 아마도각 TOOL 에따라출력되는정렬형태는다른것같다. 7
산술식 이번에는열에어떠한산술식을사용할수있는지알아보자. 산술식이란사칙연산을의미한다. + 더하기 - 빼기 * 곱하기 / 나누기위식에대한의미는다들알것이라생각하고건너뛴다. 산술식을사용해보자. SELECT empno, ename, sal+100 FROM scott.emp; EMPNO ENAME SAL+100 ---------- ---------- ---------- 7369 SMITH 900 7499 ALLEN 1700 7521 WARD 1350 7566 JONES 3075 7654 MARTIN 1350 7698 BLAKE 2950 7782 CLARK 2550 7788 SCOTT 3100 7839 KING 5100 7844 TURNER 1600 7876 ADAMS 1200 위에실행결과를보면열머리글이 SAL+100으로나온것을볼수있다. SELECT문에서사용한그대로열머리글이출력된다. SELECT문은검색을한후에산술을수행하기에실제로데이터가 +100이되는것은아니다. 그저검색결과물에 + 연산을수행하여화면에만보여주는것이다. 변형을하기위해서는 DML작업을해야한다. 그건추후설명할것이다. 사칙연산의우선순위를따르고 ( ) 도사용가능하다. 운선순위가동일하면왼쪽부터연산이실행된다. 8
NULL NULL하면무엇이떠오르는가? 대부분프로그래밍을배운사람이라면 NULL을알것이다. NULL = 쓰레기값, 존재하지않는값 이라고생각한다. SQL에서도크게다르지않다. 널 (NULL) 은공백문자와 0이아니다. 널에대한설명은사용할수없는값, 할당되지않은것, 알수없는것, 적용불가능이라고표현한다. 널은입력값이없다는의미로생각해두면될것이다. 널은존재하지않는값이기에실제로산술연산도되지않는다. EX) SELECT comm * 3 FROM scott.emp; 를수행하면 SQL*Plus에서보면군대군대빈칸이보일것이다. 이것은공백문자가아니라 null값이기때문에연산을처리해도 null이나오기에그렇게나오는것이다. SQL*Plus에서는 (null) 형태로출력되지않고 null은출력하지않는다. 그러나 SQL Developer에서는 (null) 로출력이된다. 또한, null을의미있는값으로변형이가능하다. 방법은 Tools>Preferences -> 대화상자에서노드를확장. -> 오른쪽에 Advanced Parameters -> Display Null value As 에서직접값을입력하면된다. 9
열 alias 맨처음 SELECT문을설명할때 alias에대한말이있었다. 좀더자세히그특징에대해알아보자. 열머리글이름을변경한다. 열에대한 alias를설정하면출력될때열머리글을사용자가지정한이름으로출력하게할수있다. 계산에유용 열이름바로뒤에등장. 열이름 AS alias 열이름 alias 공백이나특수문자를포함하거나대소문자를구분할경우 ( 큰따옴표 ) 가필요하다. SQL> SELECT empno AS enumber, sal + 200 "Salary" 2 FROM scott.emp; ENUMBER Salary ---------- ---------- 7369 1000 7499 1800 7521 1450 7566 3175 7654 1450 7698 3050 보면사용한방법을잘알수있을것이다. 큰따옴표가없으면무조건대문자로출력이되고큰따옴표안에있으면작성한그대로출력이된다. AS Enumber 로사용하면큰따옴표안에있는그대로출력한다. 즉, AS는선택사항이고있어도되고없어도되는것이다. 단, 대문자로만출력할때는 AS만사용하는것이좀더편하지않을까??? 10
연결연산자 연결연산자를이용하면열과열을연결할수있다. 특징은다음과같다. 열이나문자열을다른열과연결. 로사용. _ 로문자열을연결하여하나의열로출력한다. 연결하는열이 null을포함하고있다면연산결과는값을가지고있는열의값만출력이된다. SQL> SELECT empno '_' ename AS employees, ename job as ejob, sal * comm as nextsal FROM scott.emp 2 ; EMPLOYEES EJOB NEXTSAL ----------------------------- ------------------ ---------- 7369_SMITH SMITHCLERK 7499_ALLEN ALLENSALESMAN 480000 7521_WARD WARDSALESMAN 625000 위에실행된결과를보면 의사용방법을알수있을것이다. 는열과열을연결하기에바로붙 여서출력한다. 숫자형도위와같은형식이다. 하지만이어서출력하면무슨의미인지모를수도 있다. 그럴때구분을하기위해서리터럴문자열을사용한다. _ 가바로리터럴문자열을사용한것이다. 작은따옴표안에있는문자열을그대로연결된 열사이에출력하여열과열을구분해서사용자가의미를좀더정확히이해할수있다. 모두같은것이출력되는것처럼 안에사용한문장은각행에대해한번씩사용된다. 따옴표안에는공백문자도포함이가능하다. 11
대체인용연산자 (q) 그러면여기서의문이생길것이다. 작은따옴표를화면에출력하려면어떻게해야할까? 그방법은갂단하다. 대체인용연산자 (q) 를사용하면된다. q [] 형태로사용하는데, [ ] 대싞에 < >, ( ), { } 등사용할수있다. SQL> SELECT ename q'['s Job is ]' job AS "what is his job" FROM scott.emp; 2 what is his job ----------------------------- SMITH's Job is CLERK ALLEN's Job is SALESMAN WARD's Job is SALESMAN JONES's Job is MANAGER MARTIN's Job is SALESMAN BLAKE's Job is MANAGER CLARK's Job is MANAGER SCOTT's Job is ANALYST KING's Job is PRESIDENT TURNER's Job is SALESMAN ADAMS's Job is CLERK 실행결과를보면 가정상적으로출력된것을볼수있다. 이를사용하면다양한형태로글을출력할수있다. 12
중복행제거 SECECT문은기본적으로조건에맞는모든행을출력한다. 그러나필요에따라서는중복된값은제거하고봐야할때가있다. 예를들면부서번호가총몇개가존재하는지를알고싶다거나하는경우이다. SQL> SELECT DISTINCT deptno 2 FROM scott.emp; DEPTNO ---------- 30 20 10 위에결과를보면, 14개의행중에서 3개의행만출력이된것을확인할수있다. 즉 scott.emp 테이블에존재하는 DEPTNO는 10, 20, 30 이렇게 3개만있다는것을확인할수있다. 그러면열 ( 컬럼 ) 이여러개존재하면어떻게처리될까? SQL> SELECT DISTINCT job, deptno 2 FROM scott.emp; JOB DEPTNO --------- ---------- MANAGER 20 PRESIDENT 10 CLERK 10 SALESMAN 30 ANALYST 20 MANAGER 30 MANAGER 10 CLERK 30 CLERK 20 9 rows selected. 실행결과에서나타나듯 job 과 deptno 를조합해서중복되는값을제거하는것을확인할수있다. 또한 DISTINCT 키워드는 UNIQUE 한값만출력되는것이니 UNIQUE 를사용해도된다. 13
테이블구조확인하기 테이블을생성할때구조를미리결정해서생성하는데, 만약다른사람이만든테이블사용할경우어떻게해야할까? DESCRIBE or DESC 키워드를사용하면해결할수있다. DESC[RIBE] tablename SQL> DESC scott.emp; Name Null? Type ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 위를보면, scott.emp 테이블에대한정보를확인할수있다. 각열 (column) 의이름, null값에대한제약조건, 각열에대한데이터형을볼수있다. 여기서는갂략히보면, 열은 8개 EMPNO에는 NOT NULL제약조건 (null값이들어올수없다는의미 ) 이있다. 데이터형은숫자, 가변문자열, 날짜, 소수점이 2개존재하는숫자등이있다. 데이터형에대해서는추후에자세히설명할것이다. 14