[데이터베이스] #5. SQL(2)

bien·2023년 5월 23일
0

데이터베이스

목록 보기
3/17

01. 데이터 삽입, 수정, 삭제

데이터 조작 언어의 개념

  1. DML: Data Manipulation Language
  2. 정의된 테이블에 레코드를 삽입, 수정, 삭제 및 검색하는데 사용되는 명령어의 집합
  3. 명령어의 종류
    • INSERT: 테이블 스키마에 적합한 레코드를 삽입
    • UPDATE: 테이블에서 조건을 만족하는 특정 레코드의 컬럼값을 수정
    • DELETE: 테이블에 조건을 만족하는 특정 레코드를 삭제
    • SELECT: 조건을 만족하는 레코드를 테이블에서 검색

INSERT문

  1. 테이블에 새로운 레코드를 삽입하는 명령문
  • 테이블에 새로운 레코드를 삽입
  • 모든 속성 또는 부분 속성(컬럼)에 대한 속성값을 삽입

구문형식
1. INSERT INTO 테이블이름 VALUES(값1, 값2, ... , 값n)
2. INSERT INTO 테이블이름(컬럼1, 컬럼2, ... 컬럼m) VALUES(값1, 값2, ... 값m)

2번은 각각의 값들이 어느 컬럼에 들어가는지 명시한다.

INSERT문의 사용

질의문 1.
학과이름‘영어영문학과‘, 단과대학‘인문과학대학‘, 주소 ‘http://eng.knou.ac.kr’, 전화번호’02-3668-4510’, 졸업학점 135인 레코드를 학과테이블에 삽입하시오.
=> 레코드의 값들이 컬럼 순서와 의미적으로 동일하다.

SQL INSERT INTO 학과 VALUES('영어영문학과', '인문과학대학',
'http://eng.knou.ac.kr', '02-3668-4510’, 135)


문자는 반드시 ''가 들어가야 한다!

질의문 2.
단과대학'자연과학대학', 학과이름'농학과', 졸업학점140, 전화번호'02-3668-4600',인 레코드를 학과테이블에 삽입하시오.
=> 순서가 테이블 컬럼의 순서와 일치하지 않음 + 웹사이트 주소가 없음.
=> VALUES로 값을 나열하기만 하면 DBMS 입장에서 각가의 값들이 어느 컬럼에 들어가야 할 지 알수없다.
=> 컬럼과 값들을 상응하게 나열해주자!

SQL INSERT INTO 학과(단과대학, 학과이름, 졸업학점, 전화번호) VALUES('자연과학대학', '농학과', 140, '02-3668-4600')

UPDATE 문

  1. 조건을 만족하는 레코드의 특정 컬럼값을 수정

구문형식
1. UPDATE 테이블이름 SET 컬럼1=값1[, 컬럼2=값2, ... , 컬럼n=값n][WHERE 조건]
2. UPDATE 테이블_이름 SET 컬럼1=값1[, 컬럼2=수식2, ... , 컬럼n=수식n][WHERE 조건]

연산도 입력 가능

UPDATE문의 사용

질의문1. 학과이름 '농학과'인 레코드의 주소 컬럼값을 'http://agri.knou.ac.kr'로 수정하시오.

SQL
UPDATE 학과 SET 주소='http://agri.knou.ac.kr' WHERE 학과이름 ='농학과'

학과이름이 농학과인 레코드를 먼저 찾고, 그 레코드에만 update를 진행한다.

질의문2
잔액이 500,000원 이상인 학생 계좌에 2% 이자를 지급하시오.

SQL
UPDATE 학과 SET (현재)잔액=잔액*1.02 WHERE 잔액 >= 500000

DELETE 문

  1. 조건에 일치하는 레코드 집합을 테이블에서 삭제할 때 사용하는 명령어

구문형식
DELETE FROM 테이블이름 [WHERE 조건]

WHERE이 생략되면, 지목된 테이블의 모든 레코드가 싹 다 지워질수도 있음.

DELETE문의 사용

질의문1.
소속학과가 '행정학과'인 교수의 레코드를 삭제하라.

SQL
DELETE FROM 교수 WHERE 소속학과 = '행정학과'

💬 이렇게 하면 삭제가될까?
✔️ 과목테이블의 교수번호를 같이 외래키로 참조시키고 있음. 만약 과목테이블에서 해당 교수의 교수번호를 참조하고 있는 경우, 해당 데이터는 삭제되지 않는다. 참조무결성 제약조건에 의해 삭제되지 않으므로, 참조되는 대상을 먼저 삭제하고나서 구문을 실행하면 삭제가 이루어진다!

질의문2.
모든 강의 레코드를 삭제하시오.

SQL DELETE FROM 강의

실제 DB에 데이터가 있는데, 전체 테이블을 삭제해라? 테스트가 아니라 실제 운용중인 프로그램에서 저런 SQL을 사용할 가능성은 거의 없다. 오히려 누군가 악의적으로 데이터를 모두 제거하려 하거나, 개발자가 실수로 WHERE절은 작성하지 않았을 확률이 더 높다!

=> 이런 상황에 안전핀 역할을 할 SAVE UPDATES 모드를 제공한다!

SAVE UPDATES 모드

  1. WHERE절이 없는 UPDATE/DELETE문은 테이블의 전체 레코드를 변경/삭제
  2. 의도하지 않은 데이터 변경/삭제 방지를 위해 MySQL은 SAFE UPDATES 모드를 지원
  3. 기본키가 아닌 컬럼을 대상으로 수정/삭제 조건을 명시할 경우 실행 여부를 결정

구문형식
SET SQL_SAFT_UPDATES = 0 또는 1

기본적으로 SAFE UPDATES모드가 켜져 있는 상태. 끄기를 원할경우 =0으로 변경합니다!


02. 데이터검색(1)

SELECT문

  1. 한 개 이상의 테이블에서 주어진 조건에 만족하는 레코드를 출력하는 명령문
  2. 관계 대수의 셀렉션, 프로젝션, 조인, 카티션 프로젝트 연산자의 기능을 모두 포함하고 있는 명령문
  3. 필수적인 절은 SELECT절과 부가적인 목적으로 사용할 수 있는 여러 절을 혼합하여 검색 기능을 구체화

SELECT문 구문 형식

SELECT문의 각 절의 기능

  1. SELECT 절: 결과에 포함되는 컬럼을 지정 필수절!
  2. FROM절: 질의를 적용할 테이블을 지정
  3. ON/WHERE절: 조인 조건/검색할 레코드 조건을 지정
  4. GROUP BY절: 레코드를 그룹화하기 위한 그룹 조건을 지정
  5. HAVING 절: GROUP BY 절이 적용된 결과에 대한 조건을 지정
  6. ORDER BY절: 검색 결과의 정렬 기준(순서)을 지정

단순질의문

  1. 레코드를 제한하지 않고 전체 테이블을 검색하는 SELECT문으로 WHERE절이 없는 질의문

구문형식

  • SELECT 컬럼1, 컬럼2, ... , 컬럼n FROM 교수
  • SELECT * FROM 테이블 (테이블의 모든 항목 가져오기)

단순질의문의 사용

질의문 Q1. 교수 테이블에서 '소속학과' 컬럼을 선택하여 출력하시오.

SQL SELECT 소속학과 FORM 교수
SELECT에 기술된 컬럼만을 가져옵니다. 이렇게 가져오면 중복되는 값이 발생할 수 있어용.

SQL SELECT DISTINCT 소속학과 FORM 교수
중복되는 값 없이 하나만 보고 싶습니다! => DISTINCT(중복 배제)

SQL SELECT * FROM 교수
*: 전체를 의미

조건질의문

단순질의문과 달리, 컬럼의 모든 자료가 아니라 몇몇 개의 레코드만을 가져온다.

  1. 산술연산식, 함수 등을 사용하여 표현한 조건을 WHERE 절에 기술하여 조건을 만족하는 레코드만 검색하는 SELECT 문
  • 산술연산자
  • 비교연산자
  • 논리연산자
  1. WHERE절은 UPDATE, DELETE 문에서도 동일하게 적용

산술연산자

  1. SELECT절 또는 WHERE절에 사용되어 컬럼값 또는 상수와의 산술계산을 위한 연산자

비교연산자

  1. 컬럼값과 상수 또는 컬럼값과 다른 컬럼값과의 크기를 비교하는 연산자
    !=쓰는지 <>쓰는지는 DBMS마다 차이가 있으므로, 사용하는 DBMS에 맞춰 알아둘것!

논리연산자

  1. 두 개 이상의 조건이 기술되는 질의문에서 조건식 간의 관계를 정의하는 연산자

조건질의문의 사용

질의문 Q1. 이수구분 '전공필수'인 과목의 과목명, 학점, 선수과목을 출력하시오.

SQL SELECT 과목명, 학점, 선수과목 FROM 과목 WHERE 이수구분='전공필수'

질의문 Q2. 남학생 중 2000년 이전에 태어난 학생의 학생번호, 학생이름, 전화번호, 나이를 출려하시오.

SQL SELECT 학생번호, 학생이름, 전화번호, 나이 FROM 학생 WHERE 성별='남자' AND 생년월일<'2000-1-1'

데이터 정렬

어떤 결과물에 특정 컬럼을 기준으로 결과물을 순서화시키는 것. select, from where 다 집어넣고, 마지막에 order by라고 선택적으로 추가할 수 있는 기능.

  1. ORDER BY 절을 사용
  2. 검색 결과를 특정 컬럼에 대해 오름차순 또는 내림차순으로 정렬
  • 오름차순 : ASC
  • 내림차순 : DESC

질의문 Q1. 학생의 계좌정보를 '잔액'기준으로 각각 오름차순, 내림차순으로 정렬하시오. (선정기준이 없으므로 모두 출력할 것)

SQL SELECT * FROM 계좌 ORDER BY 잔액 ASC(or DESC)

특수연산자

DBMS에서만 사용하려고 특별히 고안된 연산자라서 특수 연산자

  1. 범위 포함 여부, 부분 일치 여부, 포함 여부 등 관계형 데이터베이스에서만 사용되도록 고안된 연산자

특수연산자의 사용

질의문 Q1. 잔액이 20만원 이상 40만원 이하인 계좌의 계좌번호, 잔액, 학생번호를 출력하시오.

SQL SELECT 계좌번호, 잔액, 학생번호 FROM 계좌 WHERE 잔액>=200000 AND 잔액 <= 400000

묘사력이 떨어짐. 더 직관적인 연산자 사용해지면 더 선명해진다!

SQL SELECT 계좌번호, 잔액, 학생번호 FROM 계좌 WHERE 잔액 BETWEEN 200000 AND 400000

질의문 Q2. 소속학과가 '컴퓨터과학과', '행정학과', '법학과'인 교수의 교수이름, 직위, 소속학과를 출력하시오.

SQL SELECT 교수이름, 직위, 소속학과 FROM 교수
WHERE 소속학과 ='컴퓨터과학과' OR 소속학과 ='행정학과' OR 소속학과 ='법학과'

=>너무 중복되는 부분이 많고, 직관적으로 와닿지 않음.

SQL SELECT 교수이름, 직위, 소속학과 FROM 교수
WEHRE 소속학과 IN('컴퓨터과학과', '행정학과', '법학과')

질의문 Q3. 과목코드가 'COM'으로 시작하는 과목의 과목코드, 과목명, 이수구분을 출력하시오.

WHERE 과목코드 = 'COM' 하면 될까?
=> 아무것도 출력하지 않음. COM만 포함하면 되, 라는 의미가 아니라 COM과 완전히 일치하는 데이터만 출력함.

부분일치 => "LIKE + %"를 이용해 표현!

%: 0개의상의 모든 문자를 의미.
COM%: COM뒤에 어떤 문자가 오든 상관없어.
%COM: 앞에는 뭐가 오든 상관없어, 근데 반드시 COM으로 끝나야해.
%COM%: COM만 들어있으면 다 해당되는 거야.

구글검색, 카페 검색 등에 모두 LIKE검색을 사용합니다!

SQL SELECT 과목코드, 과목명, 이수구분 FORM 과목
WHERE 과목코드 LIKE'COM%'

함수

함수의 개념

  1. 특정 목적을 수행하도록 사전에 정의된 연산 및 기능을 수행한 후 결과값을 반환하는 명령어 집합
  2. 상용 dbms는 검색결과가 사용자에게 여러 형태로 사용되도록 여러 데이터 타입에 대한 다양한 함수를 제공 (MySQL 기준)
  • 문자함수
  • 숫자함수
  • 날짜 및 시간함수

숫자함수

  1. 삼각함수, 상수, 올림과 버림, 난수 등의 숫자 데이터 타입에 적용할 수 있는 계산을 위한 함수

이 함수들을 다 일일이 외울 필요 없음.숫자함수들이 있다. 숫자 조작 하고 싶으면, 숫자함수를 찾아보면 된다. 정도만 알면 됨.

문자함수

  1. 문자열 조작 및 문자 형식 변환 등의 문자와 관련된 다양한 연산을 지원하는 함수

날짜함수

  1. 날짜 및 시간 데이터 타입에 적용되어 산술 연산 및 시간 형 변환 등의 조작을 위한 함수.

함수의 사용

질의문 Q1. 학생의 학생번호, 학생이름, 성별을 출려하시오. 단 학생번호는 앞 6자리만 출력하고 성별 뒤에는 '성'을 붙이시오.

profile
Good Luck!

0개의 댓글