일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 방송대
- 항해99
- redis
- MySQL
- Python
- 코딩테스트
- presignedurl
- 엘리스sw트랙
- 유노코딩
- 코드잇
- 파이썬프로그래밍기초
- 코딩테스트준비
- Cookie
- SQL
- CSS
- 방송대컴퓨터과학과
- nestjs
- TiL
- 중간이들
- 꿀단집
- Git
- 99클럽
- 개발자취업
- JavaScript
- 프로그래머스
- HTML
- 데이터베이스시스템
- 파이썬
- aws
- node.js
- Today
- Total
배꼽파지 않도록 잘 개발해요
방송대 데이터베이스시스템 - 5강. SQL (2) 본문
1. 데이터 삽입, 수정, 삭제
데이터 조작 언어
DML : Data Manipulation Language
정의된 테이블에 레코드를 삽입, 수정, 삭제 및 검색하는데 사용되는 명령어의 집합
명령어의 종류
INSERT | 테이블 스키마에 적합한 레코드를 삽입 |
UPDATE | 테이블에서 조건을 만족하는 특정 레코드의 컬럼값을 수정 |
DELETE | 테이블에 조건을 만족하는 특정 레코드를 삭제 |
SELECT | 조건을 만족하는 레코드를 테이블에서 검색 |
INSERT문
테이블에 새로운 레코드를 삽입하는 명령문
- 테이블에 새로운 레코드를 삽입
- 모든 속성 또는 부분 속성에 대한 속성값을 삽입
값이 나열된 순서가 컬럼이 정의된 순서와 같은 경우 | 값이 나열된 순서가 컬럼이 정의된 순서와 다른 경우 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
컬럼값이 문자나 날짜인 경우 값의 양끝에 작은따옴표를 붙임
UPDATE문
조건을 만족하는 레코드의 특정 컬럼값을 수정
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
UPDATE문에서 WHERE 절을 사용하지 않으면 테이블에 존재하는 모든 레코드를 대상으로 지정된 컬럼의 값을 수정함.
→ MySQL은 SAFE UPDATES 모드를 활성화하여 이러한 SQL문을 실행을 거부함.
→ UPDATE문 실행 전 WHERE 절의 유무를 반드시 확인해야 함.
DELETE문
조건에 일치하는 레코드 집합을 테이블에서 삭제할 때 사용하는 명령어
DELETE문에서 WHERE 절이 생략되면 테이블의 모든 레코드가 삭제됨.
→ MySQL은 SAFE UPDATES 모드를 활성화하여 이러한 SQL문을 실행을 거부함.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
만약 위 사례에서 '행정학개론'이라는 과목 레코드가 과목을 개설한 '행정학과' 교수의 교수번호를 참조하고 있으면 실행오류 발생함.
→ 교수 레코드를 삭제하기 전에 해당 교수번호를 참조하고 있는 과목 레코드부터 우선 삭제해야함.
→ DELETE문 오류 발생시 우선적으로 기본키-외래키 참조 관계 여부를 판단하는 것이 좋음.
SAFE UPDATES 모드
WHERE 절이 없는 UPDATE/DELETE 문은 테이블의 전체 레코드를 변경/삭제함.
의도하지 않은 데이터 변경/삭제 방지를 위해 MySQL은 SAFE UPDATES 모드를 지원함.
기본키가 아닌 컬럼을 대상으로 수정/삭제 조건을 명시할 경우 실행 여부를 결정함.
워크벤치 옵션 | [Edit 메뉴] → [SQL Editor 탭]의 화면에서 콤보 박스를 선택/취소 |
SQL 쿼리패널 구문 | · 비활성화: SET SQL_SAFE_UPDATES = 0 · 활성화: SET SQL_SAFE_UPDATES = 1 |
2. 데이터 검색 (1)
SELECT문 구문형식
한 개 이상의 테이블에서 주어진 조건에 만족하는 레코드를 출력하는 명령문
관계 대수의 셀렉션, 프로젝션, 조인, 카디션 프로덕트 연산자의 기능을 모두 포함하는 명령문
필수적 절인 SELECT 절과 부가적인 목적으로 사용할 수 있는 여러 절을 혼합하여 검색 기능을 구체화
SELECT 절 | 결과에 포함되는 컬럼을 지정 관계대수의 프로젝션 연산자와 같음 |
FROM 절 | 질의를 적용할 테이블을 지정 |
ON/WHERE 절 | 조인 조건/검색할 레코드 조건을 지정 |
GROUP BY 절 | 레코드를 그룹화하기 위한 그룹 조건을 지정 이를 위해 SELECT절에 집계함수 사용(COUNT, MIN, MAX, SUM, AVG) |
HAVING 절 | GROUP BY 절이 적용된 결과에 대한 조건을 지정 (GROUP BY가 존재해야 사용 가능) |
ORDER BY 절 | 검색 결과의 정렬 기준을 지정 |
· ON 절 : 조인에 대한 조건
· WHERE 절 : 레코드에 대한 조건
· HAVING 절 : GROUP BY 절에 의한 그룹에 대한 조건문
단순질의문
레코드를 제한하지 않고 전체 테이블을 검색하는 SELECT문으로 WHERE 절이 없는 질의문
![]() |
![]() |
|
![]() |
교수 테이블의 전체 레코드를 출력 | |
![]() |
![]() |
![]() |
중복을 허용 O | 중복을 허용 X | |
![]() |
![]() |
![]() |
조건질의문
산술연산식, 함수 등을 사용하여 표현한 조건을 WHERE 절에 기술하여 조건을 만족하는 레코드만 검색하는 SELECT문
산술연산자, 비교연산자, 논리연산자
WHERE 절은 UPDATE, DELETE 문에서도 동일하게 적용
산술연산자
SELECT 절 또는 WHERE 절에 사용되어 컬럼값 또는 상수와의 산술 계산을 위한 연산자
DIV | 컬럼명 DIV 상수(또는 컬럼명) | 정수 나눗셈 |
/ | 컬럼명 / 상수(또는 컬럼명) | 나눗셈 연산자 |
- | 컬럼명 - 상수(또는 컬럼명) | 뺄셈 연산자 |
%, MOD | 컬럼명 % 상수(또는 컬럼명) | 나머지 연산자 |
+ | 컬럼명 + 상수(또는 컬럼명) | 덧셈 연산자 |
* | 컬럼명 * 상수(또는 컬럼명) | 곱셈 연산자 |
비교연산자
컬럼값과 상수 또는 컬럼값과 다른 컬럼값과의 크기를 비교하는 연산자
숫자, 문자, 날짜 및 시간에도 적용 가능함.
· 문자 : 사전순서 (ex. 성별 = '남')
· 날짜 및 시간 : 과거에서 미래 순으로 순서가 결정 (ex. 생년월일 < '2000-1-1')
= | 컬럼_이름 = X | 컬럼값과 X와 같은 |
< | 컬럼_이름 < X | 컬럼값이 X보다 작은 |
<= | 컬럼_이름 <= X | 컬럼값이 X보다 작거나 같은 |
> | 컬럼_이름 > X | 컬럼값이 X보다 큰 |
>= | 컬럼_이름 >= X | 컬럼값이 X보다 크거나 같은 |
!= or <> | 컬럼_이름 <> X | 컬럼값이 X와 같지 않은 |
논리연산자
두 개 이상의 조건이 기술되는 질의문에서 조건식 간의 관계를 정의하는 연산자
AND or && | 조건1 AND 조건2 | 조건1과 조건2를 동시에 만족하는 |
OR or || | 조건1 OR 조건2 | 조건1과 조건2를 적어도 하나 만족하는 |
NOT or ! | NOT 조건1 | 조건1이 참이 아닌 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
데이터 정렬
ORDER BY 절을 사용
검색 결과를 특정 컬럼에 대해 오름차순(ASC) 또는 내림차순(DESC)으로 정렬
![]() |
|
![]() |
![]() |
![]() |
![]() |
집합 연산
UNION(합집합), INTERSECT(교집합), EXCEPT(차집합)
집합 연산을 적용할 때에는 반드시 두 SELECT문의 결과 스키마가 동일해야함(컬럼개수, 데이터타입 동일).
MySQL에서는 INTERSECT와 EXCEPT 연산을 지원하지 않음.
• UNION : 여러 SELECT문의 결과를 하나로 통합, 중복 레코드 X
• UNION ALL : 여러 SELECT문의 결과를 하나로 통합, 중복 레코드 O
(SELECT 교수번호
FROM 과목
WHERE 과목명 = '컴퓨터의 이해')
UNION
(SELECT 교수번호
FROM 과목
WHERE 과목명 = '데이터베이스 시스템')
특수연산자
범위 포함 여부, 부분 일치 여부, 포함 여부 등 관계형 데이터베이스에서만 사용되도록 고안된 연산자
BETWEEN | 컬럼명 BETWEEN V1 AND V2 | 컬럼값이 V1 ~ V2 사이에 존재하는지 검사 |
LIKE | 컬럼명 LIKE V1% | V1으로 시작하는 문자열 검사 |
컬럼명 LIKE %V1 | V1으로 끝나는 문자열 검사 | |
컬럼명 LIKE %V1% | V1이 문자열 내부에 존재하는지 검사 | |
컬럼명 LIKE V1_ | V1뒤에 한 문자만 일치하는지 검사 | |
IN | 컬럼명 IN (V1, ..., Vn) | 컬럼값이 V1, V2, ..., Vn 중 하나와 일치하는지 검사 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
![]() |
기타 SELECT문
별칭(alias) | SQL문 내부에서 테이블이나 컬럼의 이름을 임시로 변경 AS는 생략 가능함. |
변경전 이름 AS 변경후 이름 ex. 주소 AS 홈페이지주소 |
NULL | 공백 문자열 (X), 숫자값 0(X) 아직 알 수 없는 값 (미정) '=' 대신 IS를 사용함. |
ex. WHERE 이수학점 IS NULL; ex. WHERE 이수학점 IS NOT NULL; |
함수
특정 목적을 수행하도록 사전에 정의된 연산 및 기능을 수행한 후 결과값을 반환하는 명령어 집합
상용 DBMS는 검색결과가 사용자에게 여러 형태로 사용되도록 여러 데이터 타입에 대한 다양한 함수를 제공 (MySQL 기준)
※ 함수의 세부적인 기능에 대해서는 출제하지 않음.
숫자함수
삼각함수, 상수, 올림과 버림, 난수 등의 숫자 데이터 타입에 적용할 수 있는 계산을 위한 함수
ABS() | ABS(X) | X의 절대값을 반환 | ABS(-5) → 5 |
SIN(), COS() 등 | SIN(X) 등 | X의 삼각함수 값을 반환 | SIN(O) → 0 |
CEILING() FLOOR() |
CEILING(X) FLOOR(X) |
X보다 크지 않은 최소의 정수 X보다 작지 않은 최대의 정수 |
CEILING(3.7) → 4 FLOOR(3.7) → 3 |
LN() | LN(X) | 자연로그 InX의 값을 반환 | |
PI() | PI() | 원주율 값을 반환 | |
POWER() | POWER(X, Y) | 거듭제곱 X의 y제곱 값을 반환 | |
RAND() | RAND() | 0과 1 사이의 임의의 값을 반환 | |
ROUND() | ROUND(X, Y) | X의 Y번째 소수점 위치의 수를 반올림한 값을 반환 | ROUND(3.14159, 2) → 3.14 |
SQRT() | SQRT(X) | X의 제곱근의 값을 반환 | SQRT(25) → 5 |
TRUNCATE() | TRUNCATE(X, Y) | X의 Y번째 소수점 이하를 버림한 값을 반환 | TRUNCATE(3.14159, 2) → 3.14 |
반지름이 8.7인 원의 넓이와 (3^4) * e^(-2)의 절댓값을 출력하라.
SELECT
(PI() * POWER(8.7, 2)) AS 원의_넓이,
ABS(POWER(3, 4) * EXP(-2)) AS 계산값_절댓값
FROM table;
모든 학생이 입학에서 졸업까지 8학기가 걸린다고 가정할 때, 각 학과의 학생이 매 학기마다 평균적으로 이수해야 하는 학점을 계산하여 학과이름과 함께 출력하라. 단, 소수점 이하의 값을 올림한다.
SELECT
학과이름,
CEILING(졸업학점 / 8.0) AS 평균이수학점
FROM 학과;
문자함수
문자열 조작 및 문자 형식 변환 등의 문자와 관련된 다양한 연산을 지원하는 함수
ASCII() | ASCII(X) | X의 맨 왼쪽 문자의 ASCII 코드 값 반환 |
CHAR_LENGTH() | CHAR_LENGTH(X) | X의 글자수를 반환 (한글도 1글자로 계산) |
CONCAT() | CONCAT(X, Y) | X와 Y 문자열을 결합 |
LOWER() | LOWER(X) | X의 문자를 모두 소문자로 변환 |
UPPER() | UPPER(X) | X의 문자를 모두 대문자로 변환 |
SUBSTRING() | SUBSTRING(X, A, B) | X의 A번째 문자부터 B개의 문자열을 반환 |
INSERT() | INSERT(S1, x, y, S2) | 문자열 S1의 x번째 문자부터 y길이만큼 문자열 S2로 대체한 값을 반환 |
REPLACE() | REPLACE(S1, S2, S3) | 문자열 S1 내의 S2를 S3으로 대체한 값을 반환 |
TRIM()/LTRIM()/RTRIM() | TRIM(X)/LTRIM(X)/RTRIM(X) | 양쪽/왼쪽/오른쪽 공백 문자를 제거하고 반환 |
학생의 학생번호, 학생이름, 성별, 생년월일을 출력하라. 단, 학생번호는 앞 6자리만 출력하고 성별 뒤에는 '성'을 붙여라.
SELECT SUBSTRING(학생번호, 1, 6), 학생이름, CONCAT(성별, '성')
FROM 학생
이름과 성을 컬럼으로 가지고 있는 Name 테이블에서 이름의 첫 글자와 성을 결합한 새로운 Full_Name 열을 생성하라.
SELECT CONCAT(SUBSTRING(이름, 1, 1), 성) AS Full_Name
FROM Name;
문자열 'Hello World!'의 6번째 위치에 문자열 'beautiful '을 삽입하라.
SELECT
INSERT('Hello World!', 6, LENGTH('beautiful '), 'beautiful ') AS 결과;
→ Hello beautiful World!
문자열 'Hello World!'에서 'World'를 'Universe'로 대체하라.
SELECT REPLACE('Hello World!', 'World', 'Universe') AS 결과;
→ Hello Universe!
날짜 및 시간함수
날짜 및 시간 데이터 타입에 적용되어 산술 연산 및 시간 형 변환 등의 조작을 위한 함수
ADDDATE() | ADDDATE(X, INTERVAL Y 단위) | X에 Y 단위의 시간을 더한 날짜를 반환 |
ADDTIME() | ADDTIME(X, Y) | X와 Y 시각을 더한 날짜를 반환 |
CURDATE(), CURRENT_DATE() | CURDATE(), CURRENT_DATE() | 현재 날짜를 반환 |
CURTIME(), CURRENT_TIME() | CURTIME(), CURRENT_TIME() | 현재 시간을 반환 |
DATE() | DATE(X) | X에서 날짜(년, 월, 일)을 반환 |
YEAR() | YEAR(X) | X에서 년 값을 반환 |
학생의 학생이름과 생년월일을 출력하라. 단, 생년월일은 태어난 달에 '월'을 붙여서 출력한다.
SELECT 학생이름, CONCAT(MONTH(생년월일), '월')
FROM 학생
2022년 9월 15일 14시 30분 30초를 기준으로 한 달(30일) 이내에 수강신청된 수강 데이터의 학생번호, 과목코드, 경과시간을 출력하라. 단, 경과시간은 내림차순으로 수강 레코드를 정렬하여 출력한다.
SELECT
학생번호,
과목코드,
TIMESTAMPDIFF(DAY, 신청시각, '2022-9-5 14:30:30') AS 경과시간
FROM 수강
WHERE TIMESTAMPDIFF(DAY, 신청시각, '2022-9-5 14:30:30')
BETWEEN 0 AND 30
ORDER BY 경과시간 DESC
SELECT
학생번호,
과목코드,
DATEDIFF('2022-09-05 14:30:30', 신청시각) AS 경과시간
FROM 수강
WHERE DATEDIFF('2022-09-05 14:30:30', 신청시각) BETWEEN 0 AND 30
ORDER BY 경과시간 DESC;
'방송대 컴퓨터과학과 > 데이터베이스시스템' 카테고리의 다른 글
방송대 데이터베이스시스템 - 7강. 정규화 (0) | 2023.05.27 |
---|---|
방송대 데이터베이스시스템 - 6강. SQL (3) (1) | 2023.05.27 |
방송대 데이터베이스시스템 - 4강. SQL (1) (0) | 2023.05.26 |
방송대 데이터베이스시스템 - 3강. 관계형 모델 (1) | 2023.05.25 |
방송대 데이터베이스시스템 - 2강. 데이터베이스 모델링 (0) | 2023.05.20 |