데이터 조회에 있어서 SELECT / FROM / WHERE / ORDER BY 와 같은 위의 키워드를 통해서 데이터베이스에 있는 데이터를 조회할 수 있다.
(1) SELECT < col > - 테이블에서 조회 하고 싶은 데이터의 필드 리스트를 기술 - 여러 개의 필드를 읽고 싶다면, 콤마(,)로 구분하여 연결 - 테이블 전체를 조회한다면, select * from ...의 형태 그러나, 필요한 컬럼만 선택적으로 조회해야 한다. (불필요한 데이터 조회 금지)
→ SELECT 함수 맛보기 ♣ Select top 1 from ~ : 조회된 데이터의 1행 반환 ♣ Select top @n from ~ : 조회된 데이터의 변수 행만큼 반환 ♣ Select count(*) from ~ : 조회된 데이터의 ROW 카운트 반환
(2) FROM [ table ] - 데이터가 저장되어 있는 데이블 이름 기술 - 스키마명 적용하여 기술 가능 ( dbo.tbl_x ) > dbo는 스키마 / tbl_x는 테이블 - [테이블] AS [별칭]으로 별명 사용 가능 > 테이블 이름이 복잡하거나 어려울 경우 쉽게 사용하려고 - 링크드 조회시 [링크명].[DB명].[스키마명].[테이블명] 기술 > 다른 서버의 데이터베이스 조회가능
(3) WHERE [ value ] - 필요한 정보만 조회 할 수 있도록 필터 적용. - = / >= / <= / < / > 사용 - AND, OR, IN, NOT IN 사용 - Like 명령을 사용한 구문 검색 사용 가능 > '와일드카드'를 사용할 수 있는 구문로 특정 키워드를 포함하거나 포함하지 않는 문자열을 검색 가능하도록 도와줌 - 범위 검색시 Between 사용 가능
※ 와일드 카드 사용법 WHERE Like '%value%'
- %조건% : 앞위 어느 문자열이 와도 상관없이 조건문에 포함된 데이터 반환 - _(underscore) : _가 적힌 글자 수 만큼 문자수 허용 - [(text)] : []안에 적힌 글자만 허용 - [^(text)] : ^ 뒤에 적힌 글자를 제외한 글자들을 허용
SQL로 조회 ( 사용 예시 )
(1) 테이블의 특정 칼럼 조건 조회
# select * from instant noodles where company = '농심' or company = '삼양' or company = '오뚜기' → instant noodles라는 테이블에서 company 컬럼이 농심/삼양/오뚜기 의 모든 데이터(행)을 조회
# select * from instant noodles where company in ( '농심' , '삼양' , '오뚜기' ) 로 작성해줘도 같은 기능을 한다.
(2) 와일드 카드 사용 조회( Like ~ )
# select * from instant noodles where name like '%라면%' - name 칼럼의 데이터 중에서 앞뒤에 어떤 문자가 와도 '라면'이라는 문자가 있는 데이터(행)을 조회
# select * from instant noodles where name like '%라면' - name 칼럼의 데이터 중에서 앞에 어떤 문자가 와도 '라면'으로 끝나는 문자가 있는 데이터(행)을 조회 < 만약 '라면%' 으로 검색하면 뒤에 어떤 문자가 와도 앞에 '라면'이라는 문자가 있는 데이터(행)을 조회 >
# select * from instant noodles where name like '_라면%' - name 칼럼의 데이터 중 뒤는 어떤 문자가 와도 상관없으며 앞에 어떤 한 글자와 함께 '라면' 문자가 있는 데이터(행)을 출력 ex, ' 진라면 ' < 만약 '--라면%'으로 검색하면 앞에 두 글자가 와야한다. ex, 삼양라면 >
# select * from instant noodles where name like '[진, 신, 열]라면' - name 칼럼의 데이터 중 앞에 '진, 신, 열' 시작하며 '라면'의 문자와 결합된 데이터(행)을 조회
# select * from instant noodles where name like '[^진]라면' - name 칼럼의 데이터 중 앞에 '진'이 포함되지 않으며 '라면'의 문자와 결합된 데이터(행)을 조회
(3) 이스케이프
만약 라면의 영양성분 중 탄수화물에 대한 칼럼에 % 문자가 입력되었고, 이를 조회에서 사용하려면 어떻게 해야할까? 와일드카드를 사용하자니 %라는 문자는 앞뒤에 어떤 문자가 와도 된다는 문법이 적용된다.
이를 위해서 이스케이프라는 문법 기능을 제공한다. 아래를 보자.
# select * from instant noodles where nutrient_탄수화물 like '%100%' 으로 조회하면 nutrient_탄수화물 칼럼의 데이터 중 '100'이라는 문자와 결합된 데이터(행)을 조회한다. 그러나 원하는 것은 '100%'라는 문자가 속한 데이터를 찾는 것이다.
여기에 이스케이프를 적용하면,
# select * from instant noodles where nutrient_탄수화물 like '%100#%% ESCAPE '#' 으로 조회하면 명시적으로 #뒤에 오는 문자는 기존의 % 기능이 아닌 문자 %로 검색에 사용된다.
(4) ORDER BY < col> ... <col n>
특정 컬럼의 데이터를 정렬하여 조회할 필요가 있을 경우 조회하는 방법을 알아보자.
# select * from instant noodles ORDER BY 출시년도 desc, 탄수화물 ASC 으로 조회하면 출시년도를 내림차순( 2023, 2022, 2021 ...)으로 정렬한 데이터의 범주내 탄수화물 성분을 오름차순(1,2,3,4,5 ...)으로 정렬한 데이터를 조회한다.
(5) GROUP BY
데이터의 특정 칼럼 안에 같은 값을 지닌 행끼리 하나의 그룹으로 엮어서 집계할 수 있도록 만들어 주는 문법이다.
예를들어, < + count함수 사용 >
# select 출시년도, count(*) as cnt from instant noodles group by 출시년도 으로 조회하면, instant noodles 테이블에 있는 데이터들의 출시년도에 따른 그룹화를 진행하고 각 그룹의 수를 집계한 값을 조회한다. < ex, 2010년에 출시한 라면의 수( 4개 ) / 2011년에 출시한 라면의 수( 6개 ) ... >
즉, 같은 값을 지닌 행끼리 하나의 그룹으로 뭉쳐주며, 이는 집계 함수( ex, count() / AVG() ...등 )와 함께 사용되어 필요한 정보를 획득한다.
(6) HAVING
GROUP BY 결과에 대한 필터를 위해 사용하는 문법이다. where절이 테이블의 특정 값을 추출하는 필터로 작용함을 앞서 살펴보았는 데, 이와 유사하게 HAVING은 GROUP BY로 나눠진 데이터의 필터링에 쓰인다.
# select 출시년도, count(*) as cnt from instant noodles group by 출시년도 having count(*) >= 3 으로 조회하면, instant noodles 테이블에 있는 데이터들의 출시년도에 따른 그룹화를 진행하고 각 그룹의 수를 집계한 값 중 3 이상의 데이터를 필터링하여 조회한다.
☞ 모든 문법을 종합적으로 사용한 예시
# select 출시년도, count(*) as cnt from instant noodles group by 출시년도 having count(*) >= 3 order by count(*) desc 으로 조회하면, instant noodles 테이블에 있는 데이터들의 출시년도에 따라 그룹화를 진행하고 각 그룹의 수를 집계한 값 중 3 이상의 데이터를 필터링하여 내림차순으로 정렬한다.
DDL 맛보기 ( Data Definition Language )
본 강의는 주로 쿼리로 데이터를 조회하는 DML에 대한 문법 위주로 진행하지만, 테이블을 생성과 데이터의 입력이나 테이블 및 데이터의 삭제에 해당하는 DDL 문법에 대해서도 짧게나마 학습한다.
댓글