SQL
SQL 데이터베이스 04
RedisKim
2019. 2. 7. 17:54
데이터베이스 & SQL
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 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 | -- 19.02.01 -- Additional SELECT 02 -- 그룹 함수 (SUM, AVG, MIN, MAX, COUNT) -- SUM : 합계 (중복 [DISTINCT] 제거 후, 총합) -- AVG : 평균 (중복 [DISTINCT] 제거 후, 총합 평균) -- null값 카운팅을 하지 않는다. -- nvl(해당 컬럼, 0) 값 치환 -- MIN / MAX -- : 해당 컬럼의 최소값/ 최대값 -- COUNT : Result Set 행 수 반환, Low 개수, null 값 카운팅하지 않는다. SELECT count(bonus_pct), count(*) FROM employee; SELECT * FROM employee; SELECT count(*), count(job_id), count(distinct job_id) FROM employee WHERE dept_id = '50' OR dept_id is null; -- 직급별 급여의 평균을 출력하시오. -- 출력항목 : 직급코드, 평균코드 SELECT avg(salary) FROM employee; SELECT avg(salary) FROM employee WHERE job_id = 'J7'; -- ORDER BY : 정렬 - 오름차순( asc, 기본값), 내림차순(desc) SELECT dept_id, job_id, emp_name FROM employee order by dept_id asc, job_id desc, emp_name asc; -- GROUP BY : 그룹화 함수 => 그룹화해야한다. -- WERER 불가, GROUP BY 컬럼 이름만 SELECT dept_id, avg(salary), avg(nvl(salary, 0)) FROM employee group by dept_id; -- 직급별 평균급여를 구하시오. SELECT job_id, avg(salary) FROM employee group by job_id; -- 부서별, 직급별 평균급여를 구하시오. SELECT dept_id, job_id, emp_name, avg(salary) FROM employee group by dept_id, job_id, emp_name; SELECT max( sum(salary) ) FROM employee group by dept_id; -- 직급별 급여의 합계가 500만원 이상인 부서의 부서명과 급여의 합을 출력하세요. SELECT dept_id, sum(salary) FROM employee -- WHERE sum(salary) >= 5000000 그룹함수는 WHERE 조건 불가 group by dept_id having sum(salary) >= 5000000 order by 1; -- HAVING : GROUP BY의 조건절(그룹화된 함수의 조건절) -- WORKSHOP 02 -- 09. SELECT trunc(avg(point), 1) as "평점" FROM tb_grade group by student_no having student_no = 'A517178'; -- 10. SELECT distinct department_no as "학과번호", count(department_no) as "학생수(명)" FROM tb_student group by department_no order by 1; -- 11. SELECT count(*) as "count(*)" FROM tb_student group by coach_professor_no having coach_professor_no is null order by 1; -- 12. SELECT substr(term_no, 1, 4) as "년도", round(avg(point), 1) as "년도 별 평점" FROM tb_grade WHERE student_no = 'A112113' group by substr(term_no, 1, 4) order by 1; -- 13. SELECT department_no as "학과코드명", sum( decode(absence_yn, 'Y', 1, 0) ) as "휴학생 수" FROM tb_student group by department_no order by 1; --SELECT absence_yn, -- decode(absence_yn, 'Y', 1, 0) --FROM tb_student; -- 14. SELECT student_name as "동일이름", count(*) as "동명인 수" FROM tb_student group by student_name having count(*) > 1 order by 1; -- 15. SELECT substr(term_no, 1, 4) as "년도", substr(term_no, -2) as "학기", round( avg(point), 1 ) as "평점" FROM tb_grade WHERE student_no = 'A112113' group by rollup( substr(term_no, 1, 4), substr(term_no, -2) ) order by 1, 2; SELECT substr(term_no, 1, 4), avg(point) FROM tb_grade group by rollup (substr(term_no, 1, 4)) -- 누적 평점 order by 1; -- ADDITIONAL SELECT : OPTION -- WORKSHOP 03 -- 01. SELECT student_name as "학생 이름", student_address as "주소지" FROM tb_student order by 1, 2; -- order by student_name asc; -- 02. SELECT student_name, student_ssn FROM tb_student WHERE absence_yn = 'Y' order by 2 desc; -- order by student_ssn desc; -- 03. SELECT student_name as " 학생이름 ", student_no as " 학번 ", student_address as " 거주지 주소 " FROM tb_student WHERE (student_address like '%경기%' OR student_address like '%강원%') AND student_no not like 'A%' order by 1 asc; -- order by student_name asc; -- 04. SELECT professor_name, professor_ssn FROM tb_professor WHERE department_no = '005' order by 2 asc; -- order by professor_ssn asc; SELECT department_no, department_name FROM tb_department WHERE department_name = '법학과'; -- 05. SELECT student_no, to_char(point, '9.00') -- '9.99' 도 가능 FROM tb_grade WHERE term_no = '200402' AND class_no = 'C3118100' order by 2 desc; -- order by point desc; -- JOIN : 오라클 구문 SELECT emp_name, salary, dept_name FROM employee, department; -- 가능하지만, 무작위이다. 원하는 것과 매칭이 되지 않는다. -- 모든 경우의 수를 다 보여준다. SELECT emp_name, salary, dept_name FROM employee e, department d -- 변수 선언하듯, 임의로 지정 가능. WHERE e.dept_id = d.dept_id ; -- WHERE employee.dept_id = department.dept_id ; SELECT emp_name, dept_name, --dept_id, --job_id, job_title FROM employee e, department d, job j -- join 작업 WHERE e.dept_id = d.dept_id AND e.job_id = j.job_id; -- 컴퓨터 공학과에 다니는 학생의 이름과 학번, 학과명을 출력하세요. SELECT student_name, student_no, department_name FROM tb_student s, tb_department d WHERE s.department_no = d.department_no AND department_name = '컴퓨터공학과'; -- [JOIN : ANSI 표준 구문] -- join 테이블 명 using (해당 컬럼, 공통되는 컬럼명) SELECT student_name, department_name FROM tb_student join tb_department using (department_no); -- 대리 직급 사원의 이름과 부서명을 출력하시오. -- 오라클 구문 형식 SELECT emp_name, dept_name FROM employee e, department d, job j WHERE e.dept_id = d.dept_id AND e.job_id = j.job_id AND job_title = '대리'; -- ANSI 구문 형식 SELECT emp_name, dept_name FROM employee join department using (dept_id) join job using (job_id) WHERE job_title = '대리'; -- join on : 사용하고자 하는 컬럼명이 다를 경우 SELECT dept_name, loc_describe FROM department join location on (loc_id = location_id); SELECT dept_name, loc_describe FROM department d, location l WHERE d.loc_id = l.location_id; -- 06. SELECT student_no, student_name, department_name FROM tb_student join tb_department using (department_no) order by 2 asc; -- order by student_name asc; SELECT student_no, student_name, department_name FROM tb_student s, tb_department d WHERE s.department_no = d.department_no order by 2 asc; -- order by student_name asc; -- 07. SELECT class_name, department_name FROM tb_class join tb_department using (department_no) order by 2; -- order by class_name asc, department_name asc; SELECT class_name, department_name FROM tb_class c, tb_department d WHERE c.department_no = d.department_no order by 2; -- order by class_name asc, department_name asc; -- 10. SELECT s.student_no as "학번", student_name as "학생 이름", round(avg(point), 1) as "전체 평점" FROM tb_student s, tb_grade g, tb_department d WHERE s.student_no = g.student_no AND d.department_no = s.department_no AND department_name = '음악학과' group by s.student_no, student_name order by 3 desc; -- order by point desc; SELECT student_no as "학번", student_name as "학생 이름", to_char(round(avg(point), 1), '9.0') as "전체 평점" FROM tb_student join tb_grade using (student_no) join tb_department using (department_no) WHERE department_name = '음악학과' group by student_no, student_name order by 3 desc; -- order by point desc; | cs |