[데이터베이스개론] - SQL 입문(1)

조재현·2023년 4월 8일
0
post-custom-banner

👍 다양한 SQL 구문들

📜 Rename operation - AS

// select ID, name, salary/12 from instructor
// arithmetic operation을 실행한 attribute는 이름이 없음 

select ID, name, salary/12 as monthly_salary from instructor
  • as는 attribute의 이름을 새로운 이름으로 변경한다.
  • 예시의 경우, arithmetic operation을 실행한 attribute에는 이름이 없으므로 as를 통해 attribute 이름을 변경해주었다.
  • as는 생략이 가능하다.

📜 String operation - like

select name from instructor where name like '%dar%'
// name 문자열에 dar이 포함된 튜플을 찾아 name만 반환 (앞뒤로 어떤 문자열이 와도 상관 X)
select name from instructor where name like '100\%' escape '\'
// '\'을 escape문자로 지정하여 %가 특수 문자가 아닌 실제 '%'로 인식되도록 조정
select name from instructor where name like '___%'
// name 문자열이 최소 3글자 이상인 튜플을 찾아 name만 반환
  • % : 아무 문자열과 matching 가능
  • _ : 아무 문자와 matching 가능
  • escape: 이런 특수문자의 역할이 아닌 실제 저 문자로 인식되게 하고 싶을 때 앞에 escape를 지정시 사용
  • 문자열 연산은 대소문자를 구분한다.```
    코드를 입력하세요
- concatenation 지원 (||)
``` sql
select * from student where dept_name = 'Comp.' || ' Sci.';
// dept_name이 'Comp. Sci'인 학생들을 전부 반환
// OR가 아님에 유의, 진짜 or를 쓰려면 ||가 아닌 or를 써야 함.
  • 대소문자 변경가능 (UPPER, LOWER), 길이(LENGTH()), 문자열 추출(SUBSTRING)

📜 Ordering

select name from instructor order by name
select name from instructor order by name desc
select dept_name, name from instructor order by dept_name desc, name 
// dept_name은 내림차순으로 배열, 같은 dept_name에 대해서만 name은 오름차순으로 배열
  • order by는 알파벳 순으로 데이터의 순서를 조정
  • 오름차순(asc)가 default, 내림차순으로 나열할 때는 desc를 사용
  • 여러가지 attribute를 기준으로도 ordering이 가능하며, 맨 처음 쓴 attribute가 첫 번째 기준이 됨.

📜 Set Operations

(select course_id from section where sem = ‘Fall’ and year = 2009)
union
(select course_id from section where sem = ‘Spring’ and year = 2010)

(select course_id from section where sem = ‘Fall’ and year = 2009)
intersect
(select course_id from section where sem = ‘Spring’ and year = 2010)

(select course_id from section where sem = ‘Fall’ and year = 2009)
except
(select course_id from section where sem = ‘Spring’ and year = 2010)
  • 합집합, 교집합, 차집합 연산할 때는 union, intersect, except를 사용

  • 위의 연산은 set operation이므로 중복을 허용하지 않음. 중복을 허용하게 하고 싶을 때는 뒤에 all을 붙여 union all, intersect all, except all을 사용

    📜 Null

  • tuple들은 null 값을 가질 수 있으며, unknown value나 값이 존재하지 않음을 지칭할 때 사용한다.

  • null 값과의 arithmetic operation은 무조건 null을 반환한다.

  • null 값과의 비교도 무조건 unknown을 반환한다.

  • null 값과의 논리연산은 연산에 따라 다른데,

    • AND
      • true AND unknown => unknown
      • false AND unknown => false
      • unknown AND unknown => unknown
    • OR
      • true OR unknown => true
      • false OR unknown => unknown
      • unknown OR unknown => unknown
    • NOT
      • NOT unknown = > unknown
  • where로 나온 논리 연산 값이 unknown일때, where는 이를 false로 인식한다.

  • is null로 null임을 체크할 수 있다.

📜 Aggregate Functions

  • Aggregate function 들은 null 값을 무시한다.(count는 제외)
    • avg : 평균을 반환
  • min : 최소값을 반환
  • max : 최대값을 반환
  • sum : 합을 반환
  • count : 값의 개수를 반환

예시)

select avg(salary) from instructor where dept_name='Comp. Sci'
// dept_name = 'Comp. Sci'인 instructor의 salary를 찾아 평균을 반환
select count(distinct ID) from course where semester='Spring' and year=2014
// semester = 'Spring'이고 year=2014인 course를 찾아 count(중복 허용 X)
select count(*) from course
// course의 전체 row를 세서 반환
  • group by : 열의 값을 기준으로 결과행을 그룹으로 분리하도록 지정함.
select dept_name, avg(salary) from instructor group by dept_name
// dept_name을 기준으로 나누어 각각의 salary 평균값을 구한후 결과 출력
  • group by를 쓸 때는 aggregate function이 쓰이지 않은 모든 attribute를 group by 해주어야 함.
select dept_name, ID, avg(salary) from instructor group by dept_name, ID;
  • having : group by로 그룹화 한 후의 where 문과 동일하다.
select dept_name, avg(salary) from instructor group by dept_name having avg(salary) > 42000;
// dept_name을 기준으로 나누어 각각의 salary 평균값을 구한후, avg(salary)값이 42000을 넘는 튜플만 출력	

📜 Nested Subqueries

  • SQL query 문이 또 다른 SQL문의 WHERE 문에 사용될 때 Nested subquery라고 한다.
// section의 튜플 등 중 semester='Fall', year='2009' 이면서 semester='Spring', year= 2010인 것을 출력(intersection과 동일)
select distinct course_id 
	from section 
    where semester='Fall' and year=2009 
    and course_id in 
    	(select course_id from section where semester ='Spring' and year = 2010)
// in 뒤의 query의 결과를 바탕으로 바깥 쿼리 결과 도출후 in 연산(intersection) 실행
profile
꿈이 많은 개발자 지망생
post-custom-banner

0개의 댓글