[데이터베이스] 4. SQL - SELECT문을 사용하여 데이터 조회하기

데이터베이스에서는 데이터를 조작하는 일보다 가져오는 작업들이 더 많습니다. 이번 글에서는 데이터베이스를 통해 데이터를 조회하는 방법을 설명하도록 하겠습니다.

 

SELECT 명령

데이터베이스를 통해서 데이터를 가져오는 방법이며,

조건에 맞는 데이터를 검색하는 명령어이고 단일 테이블에 대해서 검색을 합니다.

SELECT 컬럼1, 컬럼2,...,컬럼N 또는 "*"
FROM <테이블명>
where 조건식

 

여기서 select문을 적용할 때 관계대수에서는 중복된 속성이 있는 투플이 출력되지 않는 반면에, sql에서는 중복된 속성이 출력 가능합니다.

💡테이블과 릴레이션의 차이
릴레이션은 중복된 속성이 없지만, 테이블은 있을 수 있습니다.
즉, 테이블은 행에 대해서 칼럼이 다 같은 투플이 나올 수 있습니다.

 

where 조건식

where절을 통해서 조건을 만들어 사용자가 원하는 데이터들만 효율적으로 가져올 수 있습니다.

where 컬럼명 operator(연산자) 값

 

⬇️ where 조건식에 사용되는 논리연산자

연산자 의미
= 같다.
!= , ^= , <> 같지 않다.
> ,  < , >= , <=  크다, 작다, 크거나 같다, 작거나 같다
is null 널값인 경우 True이다.
is not null 널값이 아닌 경우 True이다.

 

🧐 where절의 사용 예

Q. ‘산공’과 4학년 학생들의 이름을 찾아라.

select sname from student where dept='산공' and YEAR=4;

Q. 기말고사 또는 중간고사의 성적이 90점 이상인 학생들의 학번을 찾아라.

select sno from enrol where midterm>=90 or finterm>=90;

 

distinct 명령

위에서 말했다싶이, 테이블은 행에 대해서 컬럼이 같은 투플이 나올 수 있습니다.

따라서 distinct를 통해서 중복된 레코드는 한번만 출력하게 합니다.

select distinct 컬럼1, 컬럼2, 컬럼3,.., 컬럼N 또는 '*'
from <테이블명>
where 조건식

 

order by 구문

select 결과를 정렬해서 출력하게 합니다.

  • asc : 오름차순으로 정렬합니다. sql은 오름차순이 디폴트입니다.
  • desc : 내림차순으로 정렬합니다.
select * from <테이블명> order by <컬럼> asc/desc;

 

like 연산자

문자열 패턴을 검색합니다.

  • % : 임의의 길이 및 임의의 문자를 의미합니다. 정해지지 않은 갯수가 와도 괜찮습니다.
  • _ : 단일한 임의의 문자를 의미합니다. 한 개의 문자가 와야합니다.

 

Q. 과목 이름에 ‘구조’라는 문자열이 포함된 모든 과목을 검색해라.

select * from course where cname like "%구조";

 

in 연산자

주어진 값들에 포함되는 것만을 검색합니다.

select * from student where year in (1,2);

→ 1이거나 2이거나 둘 중 하나만 만족하면 출력합니다. (하나라도 맞는게 있으면 출력)

OR 연산자의 결과와 동일합니다.

 

between 연산자

값의 범위에 따라서 검색합니다. 비교값 포함 여부는 DBMS마다 달라질 수 있습니다.

select * from student where year between 1 and 3;

 

alias 연산자

테이블 또는 컬럼의 이름을 주어진 이름으로 지정합니다.

select sno as 학번,sname as name from student;

 

집계함수

함수명 기능
avg() 평균
count() 갯수
first() 첫번째 값
last() 마지막 값
max() 최대값
min() 최소값
sum() 합계

 

group by 절

컬럼 값이 같은 것들을 묶어서 집계함수를 적용합니다.

group by에 사용된 컬럼은 반드시 select 컬럼으로 사용되어야 합니다.(안해도 상관 X)

 

Q. 학과별로 소속 학생의 수를 출력하라

select DEPT as 학과, count(*) as 학생수 from STUDENT group by DEPT;

-> 여기서 count(*) 은 행의 갯수를 뜻합니다.

 

having 절

group에 대해서 조건식을 적용합니다.

group by 절이 없는 경우에는 전체 테이블이 대상이고, grouping을 하고 난 다음에 조건식을 쓰고 싶으면 사용합니다.

 

Q. 3명 이상 수강하는 과목의 기말평균을 계산해라.

select avg(finterm) as 평균 from ENROL group by cno having count(*)>=3;