[SQL] DML(데이터 조작어)
Data Manipulation Language
- 테이블의 데이터를 입력/수정/삭제/조회하는 역할
- 입력(
INSERT
), 수정(UPDATE
), 삭제(DELETE
), 조회(SELECT
)
INSERT
- 테이블에 데이터를 신규로 입력할 때 사용
- 신규데이터 입력
INSERT INTO subwayStation T (T.stationNo, T.lineName, T.stationName) VALUES ('00001', '신분당선', '판교'); -- 해당 테이블의 (칼럼)에 ('칼럼값') 입력 COMMIT; -- DB에 최종적으로 커밋(영구저장)
UPDATE
- 테이블 내 행의 칼럼값 수정
- 한번의
UPDATE
문 실행으로 여러 개의 행에 대한 여러 개의 칼럼 수정 가능 - 데이터 수정
UPDATE subwayStation A SET A.lineName = '빨간색', A.stationName = '동판교' WHERE A.stationNo = '00001'; -- 조건에 부합하는 해당 테이블의 (칼럼을 '해당칼럼값')으로 변경한다. COMMIT; -- 커밋
DELETE
- 테이블의 내의 행 삭제
- 한번의
DELETE
문 실행으로 여러개의 행 삭제 가능 - 조건에 부합하는 행을 삭제할 수 있으며, 수행 후 커밋 혹은 롤백이 가능하다.
- 하지만
TRUNCATE TABLE
문은 테이블 전체를 삭제하며, 한 번 실행하면 롤백이 불가능하다. - 데이터 삭제
DELETE FROM subwayStation A WHERE A.stationNo = '00001'; -- 조건에 부합하는 해당테이블의 행을 삭제한다. COMMIT;
SELECT
- 테이블에서 데이터를 조회하는 데 사용
- 데이터 조회
SELECT A.stationNo, A.lineName, A.stationName -- 해당 칼럼을 조회한다. FROM subwayStation A -- 해당 테이블의 WHERE stationName = '동판교' ; -- 역이름이 동판교인(조건)
-
SELECT
문의 조회 순서FROM
절 >WHERE
절 >GROUP BY
절 >HAVING
절 >SELECT
절 >ORDER BY
절
집합 연산자 (SET OPERATOR)
SELECT
문의 결과집합 간의 연산을 수행하는 연산자UNION
,UNION ALL
,MINUS
- 여러개의 SQL문을 하나의 SQL문으로 만드는 연산자
UNION
- 여러 개 SQL문의 결과에 대한 합집합
- 중복된 행에 대해 중복을 제거한 유일한 값을 가진 행 출력
- 정렬 발생 가능하지만 정렬을 보장하기 위해
ORDER BY
문 사용SELECT 문 UNION SELECT 문
UNION ALL
- 여러 개 SQL문의 결과에 대한 합집합
- 중복된 행에 대해 중복을 제거하지 않고 그대로 출력
- 정렬 발생하지 않아 정렬을 보장하기 위해서는
ORDER BY
문 사용SELECT 문 UNION ALL SELECT 문
INTERSECT
- 여러 개의 SQL문에 대한 교집합 출력
- 중복된 행이 있다면 중복을 제거하고 1개의 행으로 출력
SELECT 문 INTERSECT SELECT 문
MINUS
- 위의 SQL문의 결과집합에서 아래의 SQL문의 집합을 뺀 결과 출력
SELECT 문 MINUS SELECT 문
FROM
- 조회 테이블을 참조
WHERE
- 조회 대상 행을 조회
- 테이블에 존재하는 모든 데이터를 조회하는 경우도 있지만, 대부분의 경우에는 필요한 데이터만을 조회, 추출하게 된다.
- 이 경우
WHERE
절을 이용하여 추출되는 행을 제한한다.SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientAdd LIKE '%경기도%';
- 은행고객(bankClient) 테이블에서 고객의 주소(clientAdd) 칼럼의 값이 ‘경기도’라는 단어를 포함하는 행을 출력
SELECT
문 사용 시 사용자들은 원하는 자료만 검색하기 위해WHERE
절을 이용하여 출력 데이터의 행을 제한한다.
연산자
WHERE
절에서 대상 칼럼과 입력값을 비교하는 데 사용한다.
비교연산자
-
숫자 값 혹은 문자 값의 크기를 비교하는데 사용
연산자 연산자의 의미 = ~와 같다. > ~보다 크다. >= ~보다 크거나 같다. < ~보다 작다. <= ~보다 작거나 같다.
SQL 연산자
-
SQL문에서 사용하도록 기본적으로 예약되어 있는 연산자
연산자 연산자의 의미 BETWEEN A AND B A와 B 사이에 있으면 된다. IN (리스트) 리스트에 있는 값 중 하나라도 있으면 된다. LIKE ‘비교문자열’ 비교문자열의 형태와 일치하면 된다. (와일드카드 사용) IS NULL 값이 NULL이면 된다. IS NOT NULL 값이 NULL이 아니면 된다.
LIKE
-
LIKE
연산자 사용 시 퍼센트(%) 라는 와일드카드를 사용해 행을 조회한다.SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientName LIKE '김%';
- 고객 이름(clienName) 칼럼의 값이 ‘김’으로 시작하는 행을 출력
- 첫 시작이 ‘김’이라면 뒤에는 어떤 문자가 오든지 상관없이 조회가 가능하다. (아무런 문자가 오지 않아도 추출)
-
LIKE
연산자 사용 시 언더바(_) 와일드카드를 사용해 행을 조회한다.SQL SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientName LIKE '김_';
- 고객 이름(clienName) 칼럼의 값이 ‘김’으로 시작하고 뒤에 1개의 문자만 존재하는 행을 출력 - ‘김’으로 시작하면서 뒤에 문자가 단 1개만 존재하면 추출 -
퍼센트(%)와 언더바(_) 함께 사용
SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientName LIKE '김_%';
- 고객 이름(clienName) 칼럼의 값이 ‘김’으로 시작하고 뒤에 1개의 문자만 존재하며, 그 뒤에는 어떠한 문자가 오든지 상관없이 행을 출력
- ‘김’으로 시작하면서 뒤에 문자가 1개 이상만 되면 추출
IS NULL
- 칼럼이
NULL
인 행을 조회하는 SQL문 - 특정 칼럼의 값이
NULL
인 데이터를 추출할 경우IS NULL
연산자를 사용SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientAdd IS NULL;
- 고객의 주소(clientAdd) 칼럼의 값이
NULL
인 행을 출력
- 고객의 주소(clientAdd) 칼럼의 값이
- NULL 비교 시 “=” 연산자를 사용하면 데이터가 1건도 나오지 않는 공집합이 리턴
IS NOT NULL
- 칼럼이
NOT NULL
인 행을 조회하는 SQL문SELECT B.clientNo, B.clientName, B.clientAdd FROM bankClient B WHERE clientAdd IS NOT NULL NULL;
- 고객의 주소(clientAdd) 칼럼의 값이
NOT NULL
인 행을 출력
- 고객의 주소(clientAdd) 칼럼의 값이
논리연산자
- 비교 연산자 혹은 SQL 연산자로 이루어진 여러 개의 조건들을 논리적으로 조합하기 위해 사용하는 연산자 |연산자|연산자의 의미| |—|—–| |AND| 앞 조건과 뒤 조건이 모두 참이어야 한다. |OR| 앞 조건과 뒤 조건 중 하나라도 참이어야 한다. |NOT| 조건이 거짓이면 된다.
예시
- 경기도에 존재하는 은행 중 국민은행, 신한은행 매장을 찾는다.
- 하남시에 존재하는 매장은 집합에서 제외한다.
SELECT B.bankName AS 은행명, B.branchName AS 지점이름, B.branchAdd AS 지점주소 FROM bankBranch B WHERE B.branchAdd LIKE '경기도%' AND ( B.bankName LIKE '%국민은행%' B.bankName LIKE '%신한은행%' ) AND NOT B.branchAdd LIKE '%하남시%'
결과 (출력된 지점이름과 지점주소는 실제가 아님)
은행명 | 지점이름 | 지점주소 |
--------------------------------------------
국민은행 | 서현점 | 경기도 성남시 ··· |
국민은행 | 분당점 | 경기도 성남시 ··· |
신한은행 | 야탑점 | 경기도 성남시 ··· |
국민은행 | 야탑점 | 경기도 성남시 ··· |
신한은행 | 용인시청점 | 경기도 용인시 ··· |
신한은행 | 수지구청점 | 경기도 용인시 ··· |
신한은행 | 일산시청점 | 경기도 일산시 ··· |
국민은행 | 수지점 | 경기도 용인시 ··· |
···
부정연산자
- 비교 연산자의 부정표현은 부정 비교 연산자로, SQL 연산자의 부정표현은 부정 SQL 연산자로 가능
부정 비교 연산자
|연산자|연산자의 의미| |—|—–| |!=, <>, ^=|같지 않다.| |NOT 칼럼명 =|~칼럼의 값이 ~와 같지 않다.| |NOT 칼럼명 >|~칼럼의 값이 ~보다 크지 않다. |NOT 칼럼명 <|~칼럼의 값이 ~와 작지 않다.
부정 SQL 연산자
|연산자|연산자의 의미| |—|—–| |NOT BETWEEN A AND B| A와 B의 값 사이에 있지 않다. |NOT IN(LIST)| LIST를 포함하지 않는다. |IS NOT NULL| NULL 값이 아니다.
문자열 비교
CHAR
VS VARCHAR2
- CHAR : 고정 길이 문자열
- VARCHAR2 : 가변 길이 문자열
양쪽이 모두 CHAR 타입
- 길이가 서로 다르면 작은 쪽에 공백을 추가하여 길이를 같게 한다.
- 서로 다른 문자가 나올 때까지 비교한다.
- 달라진 첫 번째 값에 따라 크기를 결정
- 공백의 수만 다르다면 같은 값으로 결정
CREATE TABLE tableChar( charNo char(4), char4 char(4), char5 char(5), CONSTRAINT PK_tableChar PRIMARY KEY(charNo) ); INSERT INTO tableChar(charNo, char4, char5) VALUES ('0001', 'SQLD', 'SQLD '); INSERT INTO tableChar(charNp, char4, char5) VALUES ('0002', 'SQLP', 'SQLP');
SELECT REPLACE(char4, ' ', '_') AS char4, REPLACE(char5, ' ', '_') AS char5 FROM tableChar
결과
char4 | char5 | --------------- SQLD | SQLD_ | SQLP | SQLP_ |
- CHAR(5)에 4개의 문자열만 저장하면 나머지의 자리가 공백으로 채워진다.
CHAR
형 데이터 간 비교
SELECT charNo, REPLACE(char4, ' ','_') AS char4,
REPLACE(char5, ' ','_') AS char5,
FROM tableChar
WHERE char4=SQLD AND char4=char5;
결과
charNo | char4 | char5 | ------------------------ 0001 | SQLD | SQLD_ |
- CHAR 데이터 칼럼끼리 비교할 때 길이가 서로 달라도 공백만 다르다면 같다고 판단
- 데이터 뒤에 있는 공백은 결과집합에 영향을 주지 않는다.
한쪽이 VARCHAR2
인 경우
- 서로 다른 문자가 나올 때까지 비교
- 길이가 다르면 짧은 것이 끝날 때 까지만 비교한 후 길이가 긴 것이 크다고 판단
- 길이가 같고 다른 것이 없다면 같다고 판단
VARCHAR2
는 공백도 문자로 판단CREATE TABLE tbVarChar2 ( varCharNo char(4), char4 char(4), varChar2_5 varchar2(5), CONSTRAINT PK_tbVarChar2 PRIMARY KEY(varCharNo) ); INSERT INTO tbVarChar2(varCharNo, char4, varChar2_5) VALUES ('0001', 'SQLD', 'SQLD '); INSERT INTO tbVarChar2(varCharNo, char4, varChar2_5) VALUES ('0002', 'SQLP', 'SQLP ');
SELECT REPLACE (char4, ' ', '_') AS char4, REPLACE (varChar2_5, ' ', '_') AS varCahr2_5 FROM tbVarChar2;
결과
char4 | varChar2_5 | -------------------- SQLD | SQLD_ | SQLP | SQLP_ |
CHAR
형과 VARCHAR2
타입 비교
CHAR
과VARCHAR2
타입 비교 시,VARCHAR2
는 공백도 문자로 판단하기 때문에 서로 다른 문자라고 판단한다.TRIM
함수를 이용해 문자열을 비교한다.SELECT varCharNo, REPLACE(char4, ' ','_') AS char4, REPLACE(varChar2_5, ' ','_') AS varChar2_5, FROM tbVarChar2 WHERE varCharNo='0001' AND char4 = TRIM(varChar2_5);
결과
charNo | char4 | char5 | ------------------------ 0001 | SQLD | SQLD_ |
상수 값과 비교
- 상수 쪽을 칼럼의 데이터형과 동일하게 바꾸고 비교
- 칼럼이
CHAR
이면CHAR
타입인 경우를 적용(공백은 문자로 판단 X) - 칼럼이
VARCHAR2
이면VARCHAR2
타입인 경우를 적용(공백도 문자로 판단)
ROWNUM
- 특정 테이블에서 데이터가 조회될 때 출력되는 행의 순번을 의미하는 Pseudo 칼럼
-
모든 데이터를 출력할 필요가 없는 경우
WHERE
절에서ROWNUM
조건을 이용하여 결과 행의 건수를 제한SELECT ROWNUM AS RNUM, A.koResident AS 주민번호, A.koName AS 이름, A.koresidence AS 거주지 FROM koPopulation A WHERE ROWNUM <= 10;
- 10개의 행만 출력된다.
GROUP BY
- 대상 행을 그룹화
-
GROUP BY
절은 일반적으로FROM
절 아래에 위치하며,GROUP BY
절에 기재한 칼럼을 기준으로 결과집합을 그룹화한다.GROUP BY 칼럼명
HAVING
- 그룹화한 값에서 조건에 맞는 것을 출력
HAVING
절은WHERE
절과 유사한 기능을 한다.WHERE
절은 테이블에서 추출할 행을 제한HAVING
절은 그룹핑한 결과집합에 대한 조건을 주어 추출할 집계 데이터를 제한HAVING 표현식
SELECT A.popGender, A.popAge, SUB(A.popCount) AS "인구수합계" FROM tbPopulation WHERE A.yearM = '202010' GROUP BY A.popGender, A.popAge HAVING SUM(A.popCount) < 1000000;
- 인구테이블에서 성별구분코드+연령구분코드 칼럼 조합별 인구수 칼럼의 합계를 구하는 쿼리문
- 인구수 합계가 100만 명 미만인 성별구분코드+연령구분코드 조합별 인구수합계를 구하는 쿼리문
ORDER BY
- 출력되는 결과집합을 정렬
ORDER BY
절은SELECT
문에서 조회한 데이터 집합을 특정 칼럼 기준으로 정렬한 후 데이터를 출력- 칼럼명 대신에
SELECT
절에서 사용한 앨리어스명이나 칼럼 순서를 나타내는 정수도 사용 가능 ORDER BY
절에 개재한 칼럼 뒤에 정렬 방식 기재 가능ASC
(오름차순)DESC
(내림차순)- 디폴트 값 오름차순(
ASC
) - 정렬 시
NULL
은 가장 큰 값으로 인식
SELECT
절에 기재하지 않은 칼럼을 기준으로도 정렬 가능GROUP BY
절을 이용한SELECT
문에서ORDER BY
절에 기재하는 칼럼이SELECT
절에 존재하는 칼럼이나 표현식이 아닌 경우 에러 발생
DISTINCT
- SQL문의 결과집합이 중복된 행이 존재하는 상황에서 SELECT절 맨 앞에 DISTINCT를 사용하면 중복된 행이 제거되어 유일한 값을 가진 행만 출력
SELECT DISTINCT A.gender FROM koPopulation A
결과
gender | --------- F | M |
- 2개의 칼럼 출력 : 두 칼럼의 중복을 제거
SELECT DISTINT A.gener, A.livePlace FROM koPopulation A
결과
gender | livePlace | --------|-----------| F | 001 | M | 003 | F | 003 | F | 002 | ···
SELECT *
- FROM절 내 테이블이 가지고 있는 모든 칼럼 출력
SELECT * FROM koPopulation A
AS
(앨리어스)
- 테이블 및 칼럼에 앨리어스를 지정할 수 있다.
SELECT A.gender AS 성별, A.livePlaceName AS 거주지명, A.clientNo AS 회원번호 FROM koPopulation A WHERE livePlaceName = '서울';
결과
성별 | 거주지명 | 회원번호 F | 서울 | 0001 F | 서울 | 0002 M | 서울 | 0007 F | 서울 | 1230 M | 서울 | 0025 ···
DUAL
- 오라클 DB의 기본적인 테이블 DUAL을 이용한 다양한 연산 기능
- 칼럼 DUMMY, 칼럼값 ‘X’
SELECT ((1+9)*5)/2 AS 연산결과 FROM DUAL;
댓글남기기