기본 콘텐츠로 건너뛰기

개발 공부 - SELECT(Projection, Group by, Having)

용어 뜻:
SQL의 SELECT 문은 관계대수의 selection, projection, join, cartisian multiple 등을 결합한 것으로 SELECT문은 
관계 데이터베이스에서 가장 자주 사용되며 중요하다.

SELECT문의 형식은 6개로 이루어지며 이들 중에서 SELECT 절과 FROM 절만 필수적인 절이고 나머지는 선택사항이다.
SQL 문은 대문자/소문자를 구분하지 않으며 SELECT 문의 결과는 새로운 relation이다.

기본적인 SELECT 문
1), 2)는 필수이고 3)~7)은 선택이다.

1) SELECT 절
질의 결과에 포함하려는 애트리뷰트들의 리스트를 열거한다.
관계대수의 Projection 연산에 해당한다.
Projection이란 언급된 속성에 한하여 해당 릴레이션의 N개의 컬럼이 결과로 나타나는 것이다.
중복되는 행은 결과에서 제거된다.

2) FROM 절
질의에서 필요로 하는 릴레이션들의 리스트를 열거한다.
SELECT 절에서 사용자가 검색하려는 애트리뷰트들을 포함하고 있는 릴레이션들 뿐만 아니라
WHERE 절의 Predicate에 사용된 애트리뷰트들을 포함하고 있는 릴레이션들도 열거해야 한다.

3) WHERE 절
관계대수의 SELECTION 연산의 predicate(selection 조건)에 해당한다.
From 절에 열거한 릴레이션이 속하는 애트리뷰트들만 사용해서 Predicate를 표현해야 한다.

4) 중첩 질의
중첩 질의는 다른 질의(SubQuery)의 WHERE 절에 포함된 SELECT 문이다.

5) GROUP BY 절
질의 결과에서 GROUP BY 다음에 명시된 애트리뷰트에 동일한 값을 갖는 튜플들을 한 그룹으로 묶는다.

6) HAVING 절
튜플들의 그룹이 만족해야 하는 조건을 나타낸다.

7) ORDER BY 절
결과 튜플들의 정렬 순서를 지정한다. ASC는 오름차순이고 DESC는 내림차순이다.


실행 순서
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
(1SELECT 예제
 
   SELECT * FROM dept ;
 
   SELECT deptno, loc FROM dept ;
 
   SELECT ename, sal, 12 * (sal + 100FROM emp ;
 
   * Null 값과 연산을 하면 Null이 나온다.
 
 
 
(2) Column Alias 예제
 
   SELECT ename AS nme, sal salary
 
   FROM emp ;
 
   SELECT ename "Name", sal*12 "Annual Salary"
 
   FROM emp ;
 
   * 대소문자를 구분하고 공백있는 컬럼 Alias를 만들고 싶을땐 " "로 막는다.
 
   * AS는 안 써도 된다.
 
   * WHERE, GROUP BY절에는 안된다.  ORDER BY 절에는 사용 가능.
 
(3) Concatenation 연산자 (|| : pipeline 2개)
 
   SELECT ename||job "Employees" FROM emp ;
 
   --> ename 데이터와 job 데이터가 붙어서 출력된다.
 
  
 
(4) 문자열을 데이터로 출력할때
 
   SELECT ename||' '||'is a'||' '||job "Employee Details"
 
   FROM emp ;
 
   * 문자열은 ' '로 막고, 컬럼 Alias는 " "로 막는다.
 
  
 
(5) DISTINCT keyword : 중복된 Row를 하나로 만들어 준다. 자동 SORTING[ASC]
 
   SELECT DISTINCT deptno
 
   FROM emp ;
 
   * DISTINCT 대신 UNIQUE를 써도 된다.
 
  
 
(6) 비교연산자
 
   =   : Equal to
 
   >   : Grater than
 
   >=  : Greater than or equal to
 
   <   : Less than
 
   <=  : Less than or equal to
 
   <>  : Not equal to
 
   예) SELECT ename, sal, comm
 
       FROM emp
 
       WHERE sal <= comm ;
 
 
 
(7) 비교연산자 2
 
   BETWEEN A AND B ,   IN(list),   LIKE,   IS NULL
 
 
 
(8) BETWEEN 연산자( NOT BETWEEN )
 
   SELECT ename, sal
 
     FROM emp
 
    WHERE sal BETWEEN 1000 AND 1500 ; --> sal >= 1000 and sal <= 1500
 
 
 
(9) IN 연산자( NOT IN )
 
   SELECT emp, ename, sal, mgr
 
     FROM emp
 
    WHERE mgr IN (790275667788) ; --> mgr = 7902 or mgr = 7566 or mgr = 7788
 
 
 
(10LIKE 연산자( NOT LIKE )
 
   예1) SELECT ename
 
          FROM emp
 
         WHERE ename LIKE 'S%' ;  --> ename이 S로 시작하는 모든 데이터를 찾는다.  
 
   예2) SELECT ename
 
          FROM emp
 
         WHERE ename LIKE '_A%' ;  --> 두 번째 글자가 A인 모든 데이터를 찾는다.
 
   예3) SELECT ename
 
          FROM emp
 
         WHERE ename LIKE '%A/_%B' ESCAPE '/' ;
 
        --> '/'는 Escape문자로 정의되었기 때문에 '_'도 문자로 인식한다.
 
            즉, ename이 A_로 포함하는 모든 데이터를 찾는다.
 
        * ESCAPE는 모든 문자가 가능하다.
 
 
 
(11) IS NULL 연산자
 
   SELECT ename, mgr
 
     FROM emp
 
    WHERE mgr IS NULL ;   --> mgr이 null인 데이터를 찾는다.
 
 
 
(12) Logical 연산자
 
   AND : 두 개의 조건이 모두 만족해야 OK
 
   OR  : 한 개의 조건만 만족하면 OK
 
   NOT
 
 
 
(13) AND 연산자
 
   SELECT empno, ename, job, sal
 
     FROM emp
 
    WHERE sal >= 1100
 
      AND job = 'CLERK' ;
 
 
 
(14) OR 연산자
 
   SELECT empno, ename, job, sal
 
     FROM emp
 
    WHERE (sal >= 1100 OR job = 'CLERK') ;
 
 
 
(15NOT 연산자
 
   SELECT ename, job
 
     FROM emp
 
    WHERE job NOT IN ('CLERK''MANAGER') ;
 
   --> NOT (job = 'CLERK OR job = 'MANAGER')
 
 
 
(16) 연산자 우선순위( 산술 > 문자 > 비교 > 논리 )
 
   1 : 모든 비교 연산자
 
   2 : NOT
 
   3 : AND  --> False > Null > True
 
   4 : OR   --> True > Null > False
 
   예) A AND B에서...
 
       - A가 False이고 B가 Null이면... False 이다.
 
       - A가 True이고 B가 Null이면.... Null이다.
 
 
 
(17) SORT (ORDER BY)
 
    * ASC는 default값이다.(작은 값부터..)
 
    * 값이 Null일 때 가장 큰 값이 된다. (ASC일 때...맨 뒤에 붙는다.)
 
    * column alias도 sorting이 된다.
 
    예1) SELECT ename, job, deptno, hiredate  "Date"
 
           FROM emp
 
         ORDER BY hiredate["Date" or  4 ] ;
 
 
 
    예2) SELECT ename, job, deptno, hiredate
 
           FROM emp
 
         ORDER BY hiredate DESC ;
 
 
 
    예3) SELECT empno, ename, sal*12 annsal
 
           FROM emp
 
         ORDER BY empno, annsal ; * select 절에 없는 열을 기준으로 정렬 가능.
 
    예4) SELECT ename, deptno, sal
 
           FROM emp
 
         ORDER BY deptno, sal DESC
cs



출처:
자바잡아, 2016-10-27, http://hottteokbokki.tistory.com/entry/SQL
엠제이, 2016-10-27, http://emzei.tistory.com/233

댓글

이 블로그의 인기 게시물

Ebook - 전자책 drm 상관 없이 pdf로 만들기

yes24와 교보문고에서 ebook을 구매 해야 했는데 너무 불편하고, 필기가 매우 화날 정도로 안 좋아서 원시적으로 사용하기로 했다. 1. 목적 : ebook에서 필기 및 사용이 불편하여 pdf로 변환  2. 용도 : 개인 사용 목적이며 화질이 다소 저하되어도 필기만 용이하면 상관 없음 3. 방법 1) 휴대폰 및 카메라로 동영상을 촬영했다. DRM 때문에 프로그램으로는 촬영이 안 되는 것을 확인했다. 2) 마우스 클릭 해주는 매크로를 사용했다. (1) key_macro.exe > https://blog.daum.net/pg365/250 듀얼 모니터에서 위치 이탈 현상이 있긴 해도 괜찮았다. (2) AutoClick.exe > http://bestsoftwarecenter.blogspot.com/2011/02/autoclick-22.html 이 걸로 잘 사용했다. 3초마다 한 번 클릭하도록 사용했다. 3) 동영상을 이미지로 변경해주는 프로그램을 사용했다. Free Video to JPG Converter > https://free-video-to-jpg-converter.kr.uptodown.com/windows 일 하면서 듀얼 모니터에 켜 놨는데 속도가 괜찮았다. * Every frame 으로 사용해야 한다. 4) 중복 사진 제거해주는 프로그램을 사용했다. VlsiPics  > http://www.visipics.info/index.php?title=Main_Page 생각보다 느리니 퇴근시에 걸어놓고 가면 된다. 한번 play가 끝나면 Auto-select 하고 Delete 하면 된다. 5) 이미지를 일괄 Crop 작업 해주는 프로그램을 사용했다. JPEGCrops > https://jpegcrops.softonic.kr/ * https://joker1209.tistory.com/11 도 참고했다. View -> Large 로 크게 본 뒤, Edit -> Syncronize Crops 로 일괄 동일하게 적용하는 방식을 사

개발 공부 - json JSONObject 사용 시 백슬래시(\), 원화 표시(\) 제거 및 치환

import org.json.simple.JSONObject; String dataString = new String(authData.toJSONString()); dataString = dataString.replaceAll("\\\\", ""); String 으로 안 바뀌는 가 싶어서 String 으로 변환 해 주고 작업 하였다. 사실 toJSONString 해도 정상 동작 해야 하는데 이유를 잘 모르겠음. 그리고 나서 다시 이클립스 구동 하니 toString 도 먹은 걸로 봐서 이상하다고 생각! String dataString = authData.toString(); dataString = dataString.replaceAll("\\\\", ""); 어쨌든 백 슬래시 제거를 해줘야 하는데 \\ 도 아니고 \\\\를 해야 변환이 가능했다는 결말이었습니다. 참고 : https://stackoverflow.com/questions/15450519/why-does-string-replace-not-work/15450539 test =test.replace("KP", "");  replace 후에 담아 주지 않으면 적용이 안 됩니다!

개발 공부 - OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다.

여러 가지 요인이 있지만 PC 이름 변경시 OracleXETNSListener 서비스 시작이 불가능합니다. 고치는 법은 C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN 와 같은 설치 경로에서 listener.ora와 tnsnames.ora 의 pc명을 바꾼 PC명으로 바꿔주면 됩니다. 그래도 안 된다면 cmd 창에서 services.msc 를 입력 후 OracleXETNSListener 서비스를 시작 시키면 됩니다. 오류명: OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다. 일부 서비스는 다른 서비스 또는 프로그램에서 사용되지 않으면 자동으로 중지됩니다. 참고한 사이트들 1. http://blog.naver.com/visioner7/120165951652 2. http://database.sarang.net/?inc=read&aid=6819&criteria=oracle&subcrit=&id=&limit=20&keyword=ora-12560&page=5 이런 걸 보면 오라클은 앙칼진 시골 아가씨야