본문 바로가기

CS/데이터베이스 DB

[데이터베이스] SQL - select, where 명령어

0. sql 명령어

- 명령어의 마지막은 세미콜론(;)으로 끝나야 한다.

  세미콜론(;)을 쓰지 않고 엔터(enter)키를 쓰면 입력 중인 것으로 인식한다.

- sql은 일반적으로 대소문자를 구분하지 않는다. (대소문자 구분하게 설정할 수도 있다.)

- 데이터가 저장되어 있지 않은 즉 데이터 값이 없는 경우는 null을 쓴다. 

1. select 명령어

select 열1 from 테이블1;

- select 명령은 해당 테이블의 열의 모든 레코드를 가져온다.

- from 뒤에는 테이블명이 들어간다.

select 열1 from 테이블1 where 조건식;

- where 뒤에는 조건식이 들어간다.

  해당 조건을 만족하는 레코드를 추출한다.

  where이 없다면 테이블 내의 모든 레코드가 검색 대상이 된다.

- 위 명령은 (1)테이블 가져오기 (2) 조건에 맞는 레코드 선택 (3) 속성 추출 순으로 동작한다.

- select 구 -> from 구 -> where 구 순으로 적지 않으면 에러가 발생한다.

select 열1, 열2 from 테이블1, 테이블2;

- 콤마(,)을 이용하여 여러 열, 여러 테이블을 지정할 수 있다.

- 열의 순서는 지정할 수 있다.

   열1, 열2와 같이 선언하면 그 순서와 동일한 레코드가 추출된다.

- from 뒤에 테이블이 여러 개가 들어가면 해당 테이블들을 카티전 곱하여 레코드를 추출한다.

select * from 테이블;

- * 은 모든 레코드들을 의미하는 메타문자이다.

   따라서 from 뒤의 테이블의 모든 레코드를 추출한다.

 

2. 조건문 만들기

(1) 산술 연산자 : + - * /

-- 사람 테이블에서 레코드들의 이름과 몸무게(+30)를 추출하기
select 이름, 몸무게+30 from 사람;

- 산술 연산자는 곱하기, 나누기가 더하기, 빼기보다 우선순위가 빠르다.

- 괄호를 사용하여 우선순위를 임의로 바꿀 수 있다.

- 같은 우선 순위의 경우 좌->우 순으로 빠르다.

 

(2) 비교 연산자 : =, !=, <, >, <=, >=, <>

-- 사람 테이블에서 나이가 10살 이상인 사람의 레코드들의 이름 추출하기
select 이름 from 사람 where 나이 > 10;

(3) 논리 연산자 : and, or, not

- and 연산자 : 두 조건을 모두 만족해야 참인 경우

- or 연산자 : 두 조건 중 하나를 만족해야 참인 경우

- not 연산자 : 조건을 만족하지 않으면 참인 경우

-- 사람 테이블에서 이름이 현서이고 나이가 100인 레코드의 속성 모두 추출하기
select * from 사람 where 이름 = '현서' and 나이 = 100;

(4) 기타 연산자 : in, like, between a and b, is null, any, some, all

- in 연산자 : 여러 개의 조건 중 하나만 만족하면 참인 경우

-- 수강내역 테이블에서 과목번호가 a100이거나 b200인 레코드 모두 추출하기
select * from 수강내역 where 과목번호 in ('a100', 'b200');

- between a and b : 범위를 가진 조건을 검색해야 하는 경우

-- 사람 테이블에서 나이가 10~100 사이인 레코드 추출하기
select * from 사람 where 나이 between 10 and 100;

- is null : null 값을 가진 칼럼을 검색하는 경우

-- 사람 테이블에서 이름 값이 없는(null) 레코드 모두 추출하기
select * from 사람 where 이름 is null;

- like : 조건 값을 정확히 알지 못하는 경우 → 패턴 검색

-- 사람 테이블에서 이름이 현서인 레코드의 성별 추출하기
select 성별 from 사람 where 이름 = '현서';

이와 같이 문자열 데이터가 완전히 동일한지 비교할 수도 있고

-- 사람 테이블에서 이름에 '김'이라는 문자가 들어가는 레코드 모두 추출하기
select * from 사람 where 이름 like '김%';

이와 같이 특정 문자나 문자열이 포함되어 있는지를 조건으로 주고 싶다면

like와 %를 써서 패턴 검색을 할 수 있다.

 

3. select에 쓰는 키워드

(1) 중복된 레코드

  - distinct : 중복된 레코드는 하나만 추출한다.

  - all : 중복된 레코드들도 그대로 추출한다. (디폴트는 all 이다.)

select distinct 열 from 테이블
select all 열 from 테이블

(2) 정렬하기
  - 특정 속성 값을 기준으로 정렬해서 레코드를 추출할 수 있다.

  - order by 속성 asc/desc

    (asc : 오름차순, desc : 내림차순)

-- 이름 오름차순 정렬해서 레코드 추출하기
select * from 사람 order by 이름 asc;

-- 이름 내림차순 정렬해서 레코드 추출하기
select * from 사람 order by 이름 desc;

 (3) 속성에 이름 지정하기

  as 키워드로 속성의 이름을 붙혀서 레코드를 추출할 수 있다.

select 이름 as 학생_이름 from 학생;

 

4. 자연조인하기

자연조인(natural join) : 두 테이블을 카티전곱한 후 공통 속성을 가진 레코드들만 추출하는 것.

 

(1) select문 이용하기

- 두 테이블의 공통속성으로 조건식을 만든다.

 select 열1.*, 열2.* from 테이블1, 테이블2 where 열1.공통속성 = 열2.공통속성;

(2) natural join 이용하기

select * from 테이블1 natural join 테이블2