본문 바로가기
SQL

SQL 02. DML 기본 명령어

by JoyfulS 2019. 9. 27.

1. SELECT : 데이터의 조회

SELECT의 구문 형식

SELECT select_expr

   [FROM table_references]

   [WHERE where_condition]

   [GROUP BY {col_name | expr | position}] 

   [HAVING where_condition]

   [ORDER BY {col_name | expr | position}]

 

WHERE : 특정한 조건의 데이터만 조회

# select 칼럼명 from 테이블_이름 where 조건식 ; 

# as : 열 이름의 별칭을 지정할 때 사용 ex. select name as 이름, gender 성별, hire_date '회사 입사일'

  * 중간에 공백 있으면 꼭 홀따움표('')로 별칭 감싸주기

# 조건 연산자 (=,<,>,<=,>=,<>,!= 등)dhk 관계 연산자 (not, and, or 등) 사용 가능

# where 칼럼명 between 180 and ~ 185 ;  ( = where 칼럼명 >= 180 and 칼럼명 <= 185 ) ;

# where 칼럼명 in ('x', 'y', 'z') ;  ( = where 칼럼명='x' or 칼럼명='y' or 칼럼명='z') ;

# where 칼럼명 like '김%' ;  - 문자열 내용 : %는 무엇이든 몇글자든 허용, _는 한 글자와 매치

 

ANY/ALL/SOME 그리고 서브쿼리(SubQuery, 하위쿼리)

# 서브쿼리 : 쿼리 안에 있는 쿼리로, select문으로 형성됨

# any (서브쿼리) : 서브쿼리의 여러 개의 결과 중 한 가지만 만족해도 됨 = some

# all (서브쿼리) : 서브쿼리의 여러 결과를 만족시켜야 함

# '= any (서브쿼리)' 는 = 'in (서브쿼리)' 와 동일

 

ORDER BY : 원하는 순서대로 정렬하여 출력

# select 칼럼1, 칼럼2, ... from 테이블_이름 order by 칼럼1 (asc) ;  - 기본적으로 오름차순

# select 칼럼1, 칼럼2, ... from 테이블_이름 order by 칼럼1  desc ; - 내림차순

# select 칼럼1, 칼럼2, ... from 테이블_이름 order by 칼럼1 desc, 칼럼2 asc ; - 여러 개로 정렬 가능 

# order by절은 select, from, where, group by, having 중에서 제일 뒤에 와야 한다.

 

DISTINCT : 중복된 것은 하나만 남김

# select distinct 칼럼 from 테이블_이름 ; - 중복된 것은 1개씩만 보여주면서 출력됨

 

LIMIT : 출력 개수 제한

# select 칼럼1 from 테이블_이름 order by 칼럼2 desc limit 10 ;

   - 칼럼2를 기준으로 내림차순으로 나타나는 칼럼1 데이터를 10개만 출력

# limit 시작, 개수   =   limit 개수 offset 시작

# select 칼럼1 from 테이블_이름 order by 칼럼2 desc limit 0, 10 ;  - 위와 똑같이 10개 출력

 

CREATE TABLE ... SELECT : 테이블 복사

# create table 새로운_테이블 (select 복사할칼럼 from 기존_테이블) ;

# create table newone (select * from oldone) ; - oldone 테이블을 newone 테이블에 그대로 복사

  * 기존에 지정된 Primary Key 및 Foreign Key 등의 제약 조건은 복사되지 않는다.

# 여기서 잠깐, Primary Key 추가 방법 :

ex.

create table memberTbl (select userID, name, addr from userTbl limit 3) ; -- 3건만 가져옴

alter table memberTbl

    add constraint pk_memberTbl primary key (userID) ; -- PK 지정

 

GROUP BY 및 HAVING 그리고 집계 함수

# select 칼럼1, sum(칼럼2) from 테이블_이름 group by 칼럼1 ;

# 별칭 사용 : select 칼럼1 as '아이디', sum(칼럼2) as '총합' from 테이블_이름 group by 칼럼1 ;

 

# 집계함수

 - avg( ), min( ), max( ) : 평균, 최소값, 최대값

 - count( ), count(distinct) : 행의 개수, 행의 개수(중복은 1개만 인정)

 - stdev( ), var_samp( ) : 표준편차, 분산

ex. 가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력하는 쿼리 (서브쿼리와 조합하는 것이 수월)

select name, height from userTable

    where height = (select max(height) from userTable)

          or height = (select min(height) from userTable) ; 

 

# where절에는 집계 함수를 사용할 수 없다 => having절 사용!

# having절은 where절과 비슷하게 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한한다.

# having절은 꼭 group by절 다음에 나와야한다!

ex. 총 구매액이 1,000 이상인 사용자에게만 사은품을 증정하고 싶다면?

select userID as '사용자', sum(price * amount) as '총구매액' from buyTable

   group by userID

   having sum(price * amount) > 1000 

   ( order by sum(price * amount ) ) ;

 

WITH ROLLUP : 총합 또는 중간합계가 필요할 때 group by절과 함께 쓰임

# select 칼럼1, 칼럼2, sum(칼럼3*칼럼4) from 테이블_이름

      group by 칼럼2, 칼럼1

      with rollup ; 

 

2. INSERT : 데이터의 삽입

# insert into 테이블_이름(칼럼1, 칼럼2, ... ) values (값1, 값2, ...) ;

# 테이블_이름 뒤에 오는 칼럼은 생략이 가능하지만, 생략할 경우에 value 다음에 오는 값들의 순서와 개수가 테이블에 정의된 열 순서 및 개수가 동일해야 함

# AUTO_INCREMENT : 자동으로 1부터 증가하는 값 입력 ( CREATE TABLE 할 때 칼럼 속성에 지정 )

# auto_increment 지정 시엔 꼭 primary key 또는 unique로 지정해줘야 하고, 데이터형은 숫자형만 사용 가능

# 테이블의 속성이 auto_increment로 지정되어 있다면 insert에서는 해당 칼럼(열)이 없다고 생각하고 입력하면 됨

ex. 

create table testTable

   ( id int auto_increment primary key,

   userName char(3),

   age int ) ;

insert into testTable values (null, '조이', 23) ; - id는 제외하고 이름과 나이만 입력

# SELECT LAST_INSERT_ID() ; => 마지막에 id에 입력된 값을 보여줌

# 이후에 입력값을 100부터 입력되도록 변경하고 싶다면

# alter table testTable auto_increment=100 ;

# 증가값을 지정하려변 서버 변수인 @@auto_increment_increment 변수를 변경

ex. 초깃값을 1000으로 하고 증가값은 3으로 변경

alter table testTable auto_increment = 1000 ;

set @@auto_increment_increment = 3;

 

INSERT INTO ... SELECT : 대량의 샘플 데이터 생성

# insert into 테이블_이름 (칼럼1, 칼럼2, ... ) select문 ;

# select문의 결과 칼럼수는 insert 할 테이블의 칼럼수와 일치해야 함

# create table ... select 구문도 있음

# create table 새로운테이블 (select 칼럼1, 칼럼2, ... from 기존_테이블) ; 

# select * into 새로운테이블 from 기존_테이블 ; 

 

# INSERT IGNORE문 : PK 중복이더라도 오류를 발생시키지 않고 무시하고 넘어간다 (다음 데이터 입력되도록)

# insert ignore into 테이블_이름 values (값1, 값2, ... ) ;

 

# ON DUPLICATE KEY UPDATE : 기본 키 중복 시 데이터 새 값으로 수정

# insert into 테이블_이름 values(값1, 값2, 값3)

     on duplicate key update 칼럼2=값2, 칼럼3=값3 ; 

 

 

3. UPDATE : 데이터의 수정

# update 테이블_이름 set 칼럼1=값1, 칼럼2=값2 ... where 조건 ;

# 매우 주의! where절을 생략할 경우 테이블의 전체 행이 변경된다.

# where절 없이 입력하여 특정 칼럼이 모두 특정 값으로 변경된 경우 복구 불가능하거나 매우 복잡한 절차가 필요

# 그러나 가끔 전체 테이블 내용을 변경하고 싶은 경우 where절 생략

ex. 구매 테이블에서 현재의 단가가 모두 1.5배 인상

update buyTable set price = price * 1.5 ;

 

 

4. DELETE FROM : 데이터의 삭제

# delete from 테이블_이름 where 조건 ;

# where절이 생략되면 전체 데이터를 삭제한다.

 

대용량의 테이블 삭제 : DELETE / DROP / TRUNCATE

# delete from bigTable1 ;

# drop table bigTable2 ; 

# truncate table bigTable3 ;

# 위 세개중에 delete만 시간이 오래 걸림 - DML문으로, 트랜잭션 로그를 기록하기 때문

# drop과 DDL문으로 트랜잭션 발생시키지 않고 바로 테이블을 삭제

# truncate문의 효과는 delete와 동일하지만 트랜잭션 로그를 기록하지 않아서 속도가 무척 빠름

# 즉 대용량 테이블 삭제 시, 테이블 자체가 필요없으면 drop, 테이블 구조는 남겨놓고 싶다면 truncate로 삭제

'SQL' 카테고리의 다른 글

SQL 변수와 내장 함수  (0) 2019.10.01
MySQL의 데이터형식(자료형)  (0) 2019.09.29
SQL 01. DDL 기본 명령어  (0) 2019.09.27
SQL의 분류 : DML / DDL / DCL / TCL  (0) 2019.09.26
RDBMS 기본 개념과 사용법  (0) 2019.09.26

댓글