48일차 - SQL (DML, WHERE)

Yohan·2024년 4월 29일
0

코딩기록

목록 보기
70/156
post-custom-banner

2. DML (Data Manipulation Language)

DML (Data Manipulation Language)은 데이터베이스 내의 데이터를 조작하는 데 사용되는 SQL 구문

주요 구문

  1. SELECT
  • 데이터베이스에서 데이터를 조회(검색)
  1. INSERT
  • 데이터베이스에 새로운 데이터를 추가
  1. UPDATE
  • 데이터베이스의 기존 데이터를 수정
  1. DELETE
  • 데이터베이스에서 데이터를 삭제
CREATE TABLE goods (
    id NUMBER(6) PRIMARY KEY,
    goods_name VARCHAR2(10) NOT NULL,
    price NUMBER(10) DEFAULT 1000,
    reg_date DATE
);

-- INSERT
-- 날짜를 넣을 때는 숫자로 넣으면 안됨
INSERT INTO goods
    (id, goods_name, price, reg_date)
VALUES
    (1, '선풍기', 120000, SYSDATE);
    

INSERT INTO goods
    (id, goods_name, price, reg_date)
VALUES
    (2, '세탁기', 2000000, SYSDATE);


INSERT INTO goods
    (id, goods_name, reg_date)
VALUES
    (3, '달고나', SYSDATE);
    
    
INSERT INTO goods
    (id, goods_name)
VALUES
    (4, '계란');


-- 순서가 뒤바뀌어도 VALUES와 순서만 맞춰주면 문제 x
-- price, 암묵적 형변환 O
INSERT INTO goods
    (goods_name, id, reg_date, price)
VALUES
    ('점퍼', 5, SYSDATE, '49000');

-- 컬럼명 생략시 테이블구조 순서대로 자동 기입
INSERT INTO goods
    
VALUES
    (6, '냉장고', 1000000, SYSDATE);
    
    
    
-- UPDATE
UPDATE goods
SET goods_name = '에어컨'
WHERE id = 1
;
    
UPDATE goods
SET price = 9999;
    
    
UPDATE goods
SET id = 11
WHERE id = 4;


UPDATE goods
SET price = null
WHERE id = 3;


UPDATE goods
SET goods_name = '청바지',
    price = 299000
WHERE id = 3;


-- DELETE
-- 조건 없이 delete하면 전체삭제
-- 다만 이 문법은 복구가 가능함
DELETE FROM goods
WHERE id = 11;


TRUNCATE TABLE goods; -- 복구 불가
DROP TABLE goods; -- 복구 불가 + 테이블까지 삭제

SELECT * FROM goods;


-- SELECT 기본
SELECT
    certi_cd,
    certi_nm,
    issue_insti_nm
FROM tb_certi;


-- 컬럼 순서 바뀌어도 상관 X
SELECT
    certi_nm,
    certi_cd,
    issue_insti_nm
FROM tb_certi;


-- DISTINCT: 중복제거
SELECT DISTINCT
    issue_insti_nm
FROM tb_certi;


-- 모든 컬럼 조회
SELECT
    *
FROM tb_certi;


-- 열 별칭 부여
-- AS "별칭" 인데 AS, "" 생략가능, 띄어쓰기 있으면 ""필요
SELECT
    emp_nm 사원명,
    addr "거주지 주소"
FROM tb_emp;


-- 문자열 결합: ||
SELECT
    '자격증: ' || certi_nm AS "자격증 정보"
FROM tb_certi;


SELECT
    certi_nm || ' (' || issue_insti_nm || ')'
FROM tb_certi;
  • INSERT는 다중행 삽입도 가능
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),
       (value4, value5, value6, ...),
       (value7, value8, value9, ...),
       ...;

DELETE FROM 과 TRUNCATE TABLE의 차이

  1. DELETE FROM
  • 특정 조건을 만족하는 행을 삭제할 때 사용
  1. TRUNCATE TABLE
  • 테이블의 모든 데이터를 삭제
    -> 사용자가 작성한 댓글을 삭제할 때 DELETE FROM을 사용하여 특정 댓글만 삭제
    반면에, 일정 기간이 지난 후 사용되지 않는 임시 데이터를 삭제하려면 TRUNCATE TABLE을 사용하여 테이블의 모든 데이터를 빠르게 삭제할 수 있다.

3. WHERE절

데이터베이스 테이블에서 특정 조건에 맞는 행(row)만 선택하여 조회할 때 사용

연산자

  • 비교 연산자
    • =: 값이 같음을 나타냅니다.
    • <> 또는 !=: 값이 다름을 나타냅니다.
    • <: 값이 작음을 나타냅니다.
    • >: 값이 큼을 나타냅니다.
    • <=: 값이 작거나 같음을 나타냅니다.
    • >=: 값이 크거나 같음을 나타냅니다.
  • 논리 연산자
    • AND: 두 개의 조건이 모두 참일 때 참입니다.
    • OR: 두 개의 조건 중 하나 이상이 참일 때 참입니다.
    • NOT: 조건의 결과를 부정합니다.
  • IN 연산자
  • LIKE 연산자
  • BETWEEN 연산자
  • IS NULL 연산자
    • 이 연산자는 해당 열(column)의 값이 NULL인 행(row)을 선택. 예를 들어, employees 테이블에서 commission_pct 열의 값이 NULL인 직원들을 선택
-- WHERE 조건절
-- 조회 행을 제한
SELECT
    emp_no,
    emp_nm,
    addr,
    sex_cd
FROM tb_emp
WHERE sex_cd = 2
;

-- PK로 필터링하면 무조건 1건 이하가 조회됨 (PK는 최대 1개)
SELECT
    emp_no,
    emp_nm,
    addr,
    sex_cd
FROM tb_emp
WHERE emp_no = 1000000003
;


-- 비교 연산자
SELECT
    emp_no,
    emp_nm,
    addr,
    sex_cd
FROM tb_emp
WHERE sex_cd <> 2
;

SELECT
    emp_no,
    emp_nm,
    addr,
    birth_de
FROM tb_emp
WHERE birth_de >= '19800101'
    AND birth_de <= '19891231'
;

SELECT
    emp_no,
    emp_nm,
    addr,
    birth_de
FROM tb_emp
WHERE NOT birth_de >= '19800101'
; 


-- BETWEEN 연산자
SELECT
    emp_no,
    emp_nm,
    birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19900101' AND '19991231'
; 

SELECT
    emp_no,
    emp_nm,
    birth_de
FROM tb_emp
WHERE birth_de NOT BETWEEN '19900101' AND '19991231'
;

-- IN 연산 : OR 연산
SELECT
    emp_no,
    emp_nm,
    dept_cd
FROM tb_emp
WHERE dept_cd = 100002
    OR dept_cd = 100007
;

SELECT
    emp_no,
    emp_nm,
    dept_cd
FROM tb_emp
WHERE dept_cd IN (100002,100007)
;

SELECT
    emp_no,
    emp_nm,
    dept_cd
FROM tb_emp
WHERE dept_cd NOT IN (100002,100007)
;


-- LIKE
-- 검색에서 사용
-- 와일드카드 매핑 (%: 0글자 이상, _: 딱 1글자)
SELECT 
    emp_no,
    emp_nm,
    addr
FROM tb_emp
WHERE addr LIKE '%용인%'
;

SELECT 
    emp_no,
    emp_nm,
    addr
FROM tb_emp
WHERE emp_nm LIKE '이%'
;

SELECT 
    emp_no,
    emp_nm,
    addr
FROM tb_emp
WHERE emp_nm LIKE '이_' -- 이름이 외자인 사람
;

SELECT 
    emp_no,
    emp_nm,
    addr
FROM tb_emp
WHERE emp_nm LIKE '이__' -- 이름이 2글자인 사람
;

SELECT 
    emp_no,
    emp_nm,
    addr
FROM tb_emp
WHERE emp_nm LIKE '%심' -- 이름이 심으로 끝나는 사람
;

SELECT
    email
FROM user
WHERE email LIKE '_A%@%' -- banana@gmail.com
;

-- 성씨가 김씨이면서
-- 부서가 100003, 100004 중에 하나면서
-- 90년대생인 사원의 사번, 이름 생일, 부서코드를 조회
SELECT
    emp_no,
    emp_nm,
    birth_de,
    dept_cd
FROM tb_emp
WHERE 1=1 -- 주석처리의 편의성을 위해서 무조건 true인 1=1을 붙인다.
    AND emp_nm LIKE '김%'
    AND dept_cd IN (100003, 100004)
    AND birth_de BETWEEN '19900101' AND '19991231'
;


-- NULL값 조회
-- 반드시 IS NULL로 조회할 것!
SELECT
    emp_no,
    emp_nm,
    direct_manager_emp_no
FROM tb_emp
WHERE direct_manager_emp_no IS NULL
;

-- NULL이 아닌 것 조회
-- IS NOT NULL을 제외하고 모두 앞에 NOT이 붙음
-- NOT IS NULL (x)
SELECT
    emp_no,
    emp_nm,
    direct_manager_emp_no
FROM tb_emp
WHERE direct_manager_emp_no IS NOT NULL
;


-- 연산자 우선 순위
-- NOT > AND > OR
SELECT 
	EMP_NO ,
	EMP_NM ,
	ADDR 
FROM TB_EMP
WHERE 1=1
	AND EMP_NM LIKE '김%'
	AND (ADDR LIKE '%수원%' OR ADDR LIKE '%일산%')
;

문자열타입 CHAR와 VARCHAR의 비교


  • CHAR 타입끼리 비교했을 경우 길이가 서로 다르면 작은 쪽에 공백을 추가해서 큰 쪽과 길이를 같게 함
  • 한쪽이 VARCHAR 타입일 때 비교하는 것의 길이가 다르다면 짧은 것이 끝날 때 까지만 비교한 후에 길이가 긴 것이 크다고 판단
-- CHAR 타입은 남은 byte를 공백으로 채운다.
CREATE TABLE CHAR_COMPARE (
    sn CHAR(10),
    char_4 CHAR(4),
    char_6 CHAR(6)
);

INSERT INTO char_compare VALUES ('101', 'SQLD', 'SQLD');
INSERT INTO char_compare VALUES ('102', 'SQLD', 'SQLA');
INSERT INTO char_compare VALUES ('103', 'SQLD', '  SQLD');

SELECT * FROM CHAR_COMPARE;

SELECT * FROM CHAR_COMPARE
WHERE sn = '103'
    AND char_4 = char_6
;

SELECT * FROM CHAR_COMPARE
WHERE sn = '102'
    AND char_4 > char_6
;


-- 한쪽이 VARCHAR타입일 경우의 비교
DROP TABLE VARCHAR_COMPARE;

CREATE TABLE VARCHAR_COMPARE (
    sn CHAR(10),
    char_4 CHAR(4),
    varchar_6 VARCHAR2(6)
);

INSERT INTO varchar_compare VALUES ('101', 'SQLD', 'SQLD  ');
INSERT INTO varchar_compare VALUES ('102', 'SQLD', 'SQLA  ');
INSERT INTO varchar_compare VALUES ('103', 'SQLD', 'SQLD');
COMMIT;

SELECT * FROM varchar_compare;

SELECT * FROM varchar_compare
WHERE sn = '101'
    AND char_4 = varchar_6
;

-- VARCHAR2 타입은 남은 byte는 없앤다. (= 공백이 생기면 없앰)
SELECT * FROM varchar_compare
WHERE sn = '101'
    AND char_4 = TRIM(varchar_6)
;

-- 상수 문자열 비교
SELECT
    *
FROM varchar_compare
WHERE sn = '101'
    AND char_4 = 'SQLD  ' -- true, char는 더 긴것의 길이만큼 공백을 늘림
;

SELECT
    *
FROM varchar_compare
WHERE sn = '101'
    AND varchar_6 = 'SQLD  ' -- true
;

SELECT
    *
FROM varchar_compare
WHERE sn = '101'
    AND varchar_6 = 'SQLD' -- false, char처럼 공백을 늘리지 않음
;
profile
백엔드 개발자
post-custom-banner

0개의 댓글