CS - DB(10) SQL 데이터 조작

김영현·2024년 11월 13일
0

CS

목록 보기
30/32

SQL의 데이터 조작 기능

이전시간에는 테이블을 만드는 명령어에 대해 배웠다면, 이번시간에는 원하는 데이터를 뽑아내는 명령어에 대해 배운다.


SELECT

검색하고 싶은 속성의 이름과 테이블의 이름을 나열하면 된다.

SELECT [ ALL | DISTINCT /*결과 테이블 튜플 중복 허용 여부*/] 속성_리스트 
/*기존_이름 AS 바꿀_이름 으로 속성 이름 변경하여 출력 가능*/
FROM 테이블_리스트;

결과는 항상 테이블 형태로 반환된다. 관계연산자의 Project가 SQL의 SELECT에 대응된다.

아래 예제를 한번 해결해보자.

간단한 명령어로 완료!

SELECT 고객아이디, 고객이름, 등급
FROM 고객;

그렇다면 아래 예제는 어떨까?

모든 속성을 선택할수 있는 편리한 방법이 없을까?

SELECT *
FROM 고객;

애스터리스크*를 쓸수있다!

참고로 산술연산자도 사용 가능하다.

SELECT 제품명, 단가+500 AS 조정단가
FROM 제품

WHERE

SELECT문은 WHERE키워드와 같이 쓰는 경우가 많다. WHERE키워드는 관계 연산자의 선택 연산자와 대응된다.

SELECT 에스파
FROM 아이돌
WHERE 이름 = '윈터' /*조건을 WHERE키워드에서 사용한다*/

LIKE

부분적으로 일치하는 데이터를 검색할땐 LIKE키워드를 같이 사용한다. 단, 문자열을 이용하는 조건에만 사용 가능하다.

  • LIKE '데이터*' : 데이터라는 문자열로 시작하는 문자열
  • LIKE '*데이터' : 데이터라는 문자열로 끝나는 문자열
  • LIKE '*데이터*' : 데이터가 포함된 문자열
  • LIKE '데이터???' : 데이터로 시작하는 6자 길이의 문자열
    => 물음표기호?를 이용해서 글자 수도 체크할 수 있다.
SELECT 고객이름, 나이, 등급, 적립금
FROM 고객
WHERE 고객이름 LIKE '김*'

IS NULL | IS NOT NULL

특정 속성이 null인지 판별할 수도 있다.

SELECT 에스파
FROM 아이돌
WHERE 나이 [IS NULL | IS NOT NULL]

ORDER BY

결과 테이블을 오름차순, 내림차순으로 정렬할 수 있다.

SELECT 에스파
FROM 아이돌
ORDER BY 나이 ASC /*오름차순*/, 데뷔년도 DESC /*내림차순*/

aggregate function(집계함수)

특정 속성 값을 통계적으로 계산한 결과를 검색할 수 있다.
개수, 합계, 평균, 최대-최소값의 계산 기능이 필요할때 사용한다.
단, null인 속성값은 제외하며 WHERE키워드에서는 사용할 수 없다.

  • COUNT : 속성 값의 개수
  • MAX : 속성 값의 최대값
  • MIN : 속성 값의 최소값
  • SUM : 속성 값의 합계
  • AVG : 속성 값의 평균

이중 SUM, AVG는 숫자 데이터만 사용할 수 있다.

SELECT AVG(나이)
FROM 에스파

GROUP BY

특정 속성 값이 같은 튜플을 모아 그룹을 만들어 검색할 수 있다.

집계함수를 사용할땐 WHERE를 사용할 수 없기에 HAVING키워드와 함께 사용된다.

SELECT 주문고객, 주문제품, SUM(수량) AS 총주문수량
FROM 주문
GROUP BY 주문고객, 주문제품

집계함수나 GROUP BY절에 명시된 속성 외의 속성은 SELECT절에 작성이 불가하니 유의하자.

여러 테이블에 대한 조인 검색

조인검색이란, 여러 테이블을 연결하여 데이터를 검색하는 행위다.(조인 후 검색)
보통 조인 검색이 단순한 검색보다 많이 이루어지기 때문에 잘 알아두자.

  • 조인 속성 : 조인 검색을 위해 테이블을 연결해주는 속성
    연결하려는 테이블 간 조인 속성 이름은 달라도 되지만 도메인(자료형)은 같아야 함.
    일반적으로 외래키가 조인속성으로 이용된다.
  • FROM절에 검색에 필요한 모든 테이블을 나열 해야함
  • WHERE절에 조인 속성 값이 같아야함을 의미하는 조인 조건을 제시해야함
  • 같은 이름의 속성이 서로 다른 테이블에 존재할 수 있기에 속성 이름 앞에 해당 속성이 소속된 테이블의 이름을 표시해야함.

조건이 조금 까다로운데, 예시로 보자.

조인을 이용하여 banana고객이 주문한 제품의 이름을 검색해보자.

SELECT 제품.제품명
FROM 주문, 제품
WHERE 주문.주문고객 = 'banana' AND 제품.제품번호 = 주문.주문제품;

핵심은 JOIN이라는 키워드를 사용하는 게아니다. WHERE절에서 AND로 처리하는 것이다!

부속 질의문

SELECT문 내부에 SELECT문을 포함할 수 있다. 이때 내부 쿼리를 먼저 수행하고 그 결과를 이용해 외부 쿼리를 수행한다.

참고로 sub query는 ORDER BY절을 사용할 수 없다.

SELECT /*main query*/ (SELECT...FROM...  /*sub query*/);

보통 두 쿼리는 비교 연산자로 연결되지만, 다중 행 sub query는 비교 연산자를 사용할 수 없다.
사용할 수 있는 연산자는 아래와 같다.

sub query 결과 값에 따라 달라진다.

  • IN : 일치하는 것이 있으면 검색 조건 참
  • NOT IN : 일치하는 것이 없으면 검색 조건 참
  • EXISTS : 하나라도 존재하면 검색 조건 참
  • NOT EXISTS : 하나라도 존재하지 않으면 검색 조건 참
  • ALL : 전부 비교한 결과가 참이면 검색 조건 참(비교 연산자와 함께 사용)
  • ANY | SOME : 하나라도 비교한 결과 참이면 검색 조건 참(비교 연산자와 함께 사용)

예제로 한번 살펴보자

판매 데이터베이스에서 달콤비스켓과 같은 제초업체에서 제조한 제품명과 단가를 검색하여라

SELECT 제품명, 단가
FROM 판매
WHERE 제조업체 = (SELECT 제조업체
				FROM 제품
                WHERE 제품명 = '달콤비스켓'
);

sub query의 결과는 달콤비스켓의 제조업체 속성을 내보내준다.
main query는 달콤비스켓의 제조업체를 이용하여 WHERE문을 이용해 판매 데이터베이스에서 달콤 비스켓과 같은 제조업체에서 제조한 제품명, 단가속성을 결과로 내준다.

집계함수를 사용하는 예시를 살펴보자

SELECT 고객이름, 적립금
FROM 고객
WHERE 적립금 = (SELECT MAX(적립금) FROM 고객);

위 두 예시처럼 단일행 sub query는 비교 연산자를 사용할수 있지만, 다중행 sub query는 불가능하다.

아래 예시를 살펴보자.

SELECT 제품명, 제조업체
FROM 제품
WHERE 제품번호 IN ( SELECT 주문제품
				  FROM 주문
                  WHERE 주문고객 = 'banana'
)

그룹 쿼리, 조인 검색, sub query부분이 살짝 헷갈리지만 차근차근 쿼리를 작성해 나가면 될 것 같다.


INSERT

데이터를 직접 삽입하는 명령어다.

INSERT
INTO 테이블_이름[(속성_리스트)]
VALUES (속성값_리스트);

이때 속성리스트를 생략하면 테이블을 정의할 때 지정한 속성의 순서대로 값이 삽입된다.

간단하니 예시로 살펴보자

INSERT
INTO 고객(고객아이디, 고객이름, 나이, 등급, 직업, 적립금)
VALUES ('strawberry', '최유경', 30, 'vip', '공무원', 100)

...

SELECT * FROM 고객;

당연하게도 속성 리스트와 속성값 리스트는 일대일 대응 되어야한다.


UPDATE

테이블에 저장된 튜플에서 특정 속성의 값을 수정한다

UPDATE 테이블_이름
SET 속성_이름1 =1, 속성_이름2 =2, ...
[WHERE 조건];

WHERE절을 생략할시 테이블 내 모든 튜플을 대상으로 업데이트가 진행된다.

예시로 살펴보자.

UPDATE 제품
SET 제품명 = '통큰파이'
WHERE 제품번호 = 'p03';

위 쿼리에서 WHERE절을 삭제할 시, 모든 제품명이 통큰파이로 바뀌게 된다.

UPDATE문도 sub query를 사용할 수 있다.

UPDATE 주문
SET 수량 = 5
WHERE 주문고객 IN (
	SELECT 고객아이디
    FROM 고객
    WHERE 고객이름 = '정소화'
);

SELECT * FROM 주문;

DELETE

테이블에 저장된 데이터를 삭제한다.

DELETE
FROM 테이블_이름
[WHERE 조건]; 

DELETE문 역시 UPDATE문처럼 조건을 잘 작성해야한다. 생략시 모든 튜플이 삭제된다.(테이블은 남아있음)


profile
모르는 것을 모른다고 하기

0개의 댓글