본문 바로가기
computing

20250331_DB4

by greentworkshop 2025. 3. 31.

복습

sql join

색칠된 영역에 정보가 존재하는 값들만 출력(입력되지 않은 목록은 반영x)

left join, right join, inner join,union

step1
CREATE DATABASE day_4_3;

use day_4_3;
------------------------------------------------------------------------------------
*step2표 만들기
CREATE TABLE customer(customer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(10),
address varchar(100), 
phone VARCHAR(15),
age int
);

CREATE TABLE products(product_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
product VARCHAR(30),
brand INT,
price BIGINT
);

step3 표 데이터 수정
------------------------------------------------------------------------------------
--insert into : 데이터 입력
INSERT INTO table_name(column1, column2, column3, …)
VALUES (value1, value2, value3, …);
값의 길이가 열의 개수와 일치하면 column1은 생략가능
INSERT INTO table_name 
VALUES (value1, value2, value3, …);
------------------------------------------------------------------------------------
--select : 데이터 읽기
SELECT column1, column2, …; 
FROM table_name
WHERE condition; (조건절 없이 사용하면 모든 값)
모든 열을 불러오려면 *사용
SELECT * FROM table_name;
------------------------------------------------------------------------------------
--delete : 데이터 삭제
표에 있는 모든 열을 삭제한다
DELETE FROM table_name;
표에 있는 특정 값들만
DELETE FROM table_name WHERE condition;
------------------------------------------------------------------------------------
--update : 데이터 수정
UPDATE table_name
SET column1 = value1, column2 = value2, … 
WHERE condition;
------------------------------------------------------------------------------------
where : 데이터 필터
where condition;
where A > B;
condition : 
<>,!=,|,^ : 같지 않다
between A and B : A값과 B값 사이
Like : 특정 문자열이 들어간 값
IN : 2개 이상의 조건 중 하나라도 만족하는 값
AND : 모든 조건을 만족하는 값
OR : 하나라도 만족하는 값
IS NULL/IS NOT NULL : 컬럼이 null인 값, null이 아닌 값들 불러오기
NOT : 조건이 아닌 것
------------------------------------------------------------------------------------
실습 문제
market테이블에서 작년에 물건을 올린 seller들 중 만원 이상의 물건을 올린 seller들을 구해라
select seller from market where reg_date < '2025.01.01 00:00:00' AND price >= 10000;

market테이블에서 '이'씨성을 가진 seller들의 물건 혹은 우로 끝나는 이름을 가진 seller들의 물건을 구해라;
select product form market where seller like '이%' or seller like '우%'

3월에 등록된 물품 중 천원과 십 만원 사이이고 두 글자인 물건들이거나, 이십 만원 이상의 레코드를 찾으시오.
select product from market where reg_date between '2023-03-01 00:00:00' and '2023-03-31 23:59:59' and ((price between 1000 and 200000)

2월에 올라온 물건들 중 10개 미만의 제품들은 모두 2개씩 팔린 걸 업데이트 하시오.
update market set amount - 2 where reg_date between '2023-02-01 00:00:00' and '2023-02-28 23:59:59' and amount < 10;

홍씨의 성을 가진 seller의 reg_date이 잘못 입력되어서 2022.02.22 22:22:22 으로 업데이트 하시오.
update market set reg_date = '2022-02-22 22:22:22' where seller like '홍%';

올해에 올라온 물건들 중 삼십만원 이상의 물건은 5%을 세금을 추가해서 Table을 업데이트 하시오.
update market set price = price * 1.05 where reg_date > '2023-01-01 00:00:00' and price >= 300000;
-------------------------------------------------------------------------------------
테이블 스키마

ALTER TABLE table_name
ADD column_name datatype;  --  새 column 추가
-------	       
DROP column_name;   --  column 삭제
-------     
RENAME column_name to new_name;  -- column 이름 변경
-------	        
MODIFY COLUMN column_name new_datatype;  --  column datatype 변경
-------
예제 1) cash (BIGINT)추가
ALTER TABLE account ADD cash BIGINT;
예제 2) manner_point datatype 교체
ALTER TABLE account MODIFY COLUMN manner_point FLOAT;
-------------------------------------------------------------------------------------
외래 키(상속 개념)
테이블을 새로 만들 때:
CREATE TABLE table_name(
	column1 datatype,
	column2 datatype,
		…
	FOREIGN KEY (column#) REFERENCES parent_table(key)
);

이미 만들어진 테이블을 수정할 때:
ALTER TABLE table_name
ADD FOREIGN KEY (column_name) REFERENCES parent_table(key);
On Delete
Cascade  부모 데이터 삭제 시 자식 데이터도 삭제
Set null  부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Null로 업데이트
 Set default  부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
 Restrict  자식 테이블이 참조하고 있을 경우, 데이터 삭제 불가
No Action   Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.
On Update
Cascade  부모 데이터 업데이트 시 자식 데이터도 업데이트
Set null  부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Null로 업데이트
 Set default  부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
Restrict   자식 테이블이 참조하고 있을 경우, 업데이트 불가
 No Action  Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.


쿼리 구문 안에서 동작하지 않으면 오류발생?

내장 함수

구분 함수
숫자 함수 ABS, CEIL, COS, EXP, FLOOR, LN, LOG, MOD, POWER, RAND, ROUND, SIGN, TRUNCATE
문자 함수 (문자 반환) CHAR, CONCAT, LEFT, RIGHT, LOWER, UPPER, LPAD, RPAD, LTRIM, RTRIM, REPLACE, REVERSE, RIGHT, SUBSTR, TRIM
문자 함수 (숫자 반환) ASCII, INSTR, LENGTH
날짜·시간 함수 ADDDATE, CURRENT_DATE, DATE, DATEDIFF, DAYNAME, LAST_DAY, SYSDATE, TIME
변환 함수 CAST, CONVERT, DATE_FORMAT, STR_TO_DATE
정보 함수 DATABASE, SCHEMA, ROW_COUNT, USER, VERSION
NULL 관련 함수 COALESCE, ISNULL, IFNULL, NULLIF
집계 함수 AVG, COUNT, MAX, MIN, STD, STDDEV, SUM
윈도우 함수 (혹은 분석 함수) CUME_DIST, DENSE_RANK, FIRST_VALUE, LAST_VALUE, LEAD, NTILE, RANK, ROW_NUMBER

숫자함수

함수 설명 함수 설명
ABS(숫자) 숫자의 절댓값을 반환
ABS(-4.5) => 4.5
SIN | COS | TAN(숫자) 숫자의 삼각함수 값을 계산
TAN(1.75) => -5.52037992250933
CEIL(숫자) 숫자보다 크거나 같은 최소의 정수 반환
CEIL(4.1) => 5
EXP(숫자) 숫자의 e의 거듭제곰을 반환
EXP(1) => 2.718281828459045
FLOOR(숫자) 숫자보다 작거나 같은 최대의 정수 반환
FLOOR(4.1) => 4
LN(숫자) 숫자의 자연로그 값을 반환
LN(2) => 0.6931471805599453
ROUND(숫자, m) 숫자의 반올림 반환, m은 반올림 기준 자릿수
ROUND(5.36, 1) => 5.40
MOD(숫자1, 숫자2) 숫자1을 숫자2로 나누어 나머지를 반환
MOD(18,4) => 2
LOG(n, 숫자) 숫자의 자연로그 값을 반환
LOG(10) => 2.30259
RAND() 01 사이의 무작위 숫자를 반환 (0 ≤ x < 1)
RAND() => 0.6062292536778648
POWER(숫자, n) 숫자의 n제곱 값을 반환
POWER(2, 3) => 8
TRUNCATE(숫자, m) 숫자를 m소수점 자리에서 잘라서 버림 (m Default 값은 0)
TRUNCATE(135.375, 2) => 135.37
SQRT(숫자) 숫자의 제곱근 값을 반환(숫자는 양수)
SQRT(9.0) => 3.0
SIGN(숫자) 숫자가 음수면 -1, 0이면 0, 양수면 1을 반환
SIGN(3.45) => 1

문자함수

반환 구분 함수 설명
문자값
반환 함수


s : 문자열
c : 문자
n : 정수
k : 정수
CONCAT(s1,s2) 두 문자열을 연결, CONCAT('마당', '서점') => '마당 서점'
LOWER(s) | UPPER(s) 대상 문자열을 모두 소문자 | 대문자로 변환
LOWER('MR. SCOTT') => 'mr. scott'|   UPPER('mr. scott') => 'MR. SCOTT'
LPAD(s,n,c) | RPAD(s,n,c) 대상 문자열의 왼쪽 | 오른쪽부터 지정한 자리수까지 지정한 문자로 채움
LPAD('Page 1', 10, '*') => '****Page 1
REPLACE(s1,s2,s3) 대상 문자열의 지정한 문자를 원하는 문자로 변경
REPLACE('JACK & JUE', 'J', 'BL') => 'BLACK & BLUE'
CHAR(ASCII) 대상 아스키 코드 값을 알파벳 문자를 반환
CHAR(68) => 'D'
SUBSTR(s,n,k) 대상 문자열의 지정된 자리에서부터 지정된 길이만큼 잘라서 반환
SUBSTR('ABCDEFG', 3, 4) => 'CDEF'
TRIM(c FROM s) 대상 문자열의 양쪽에서 지정된 문자를 삭제(문자열만 넣으면 기본값으로 공백 제거)
TRIM('='FROM '==BROWNING==') => 'BROWNING'
LTRIM(s) | RTRIM(s) 대상 문자열의 왼쪽 | 오른쪽에서 공백 삭제
LEFT(s, n) | RIGHT(s, n) n 문자 수만큼 대상 문자열의 왼쪽 | 오른쪽을 반환
LEFT('SQL tutorial', 3) => 'SQL'
REVERSE(s) 대상 문자열을 역분으로 반환
REVERSE('SQL') => 'LQS'
숫자값
반환 함수
ASCII(c) 대상 알파벳 문자의 아스키 코드 값을 반환
ASCII('D') => 68
LENGTH(s) 대상 문자열의 Byte 반환, 알파벳 1byte, 한글 3byte (UTF8)
LENGTH('CANDIDE') => 7
CHAR_LENGTH(s) 문자열의 문자 수를 반환, CHAR_LENGTH('데이터') => 3
INSTR(s1, s2) 주어진 문자열 s1에서 s2문자열이 처음 나온 위치값(index)을 반환

날짜함수

함수 반환형 설명
STR_TO_DATE(string, format) DATE 문자열(STRING) 데이터를 날자형(DATE)으로 반환
STR_TO_DATE('2019-02-14', '%Y-%m-%d') => 2019-02-14
DATE_FORMAT(date, format) STRING 날짜형(DATE) 데이터를 문자열(VARCHAR)로 반환
DATE_FORMAT('2019-02-14', '%Y-%m-%d') => '2019-02-14'
ADDDATE(date, interval) DATE DATE 형의 날짜에서 INTERVAL 지정한 시간만큼 더함
ADDDATE('2019-02-14', INTERVAL 10 DAY) => 2019-02-24
DATE(date) DATE DATE 형의 날짜 부분을 반환
SELECT DATE('2003-12-31 01:02:03');
=> 2003-12-31
DATEDIFF(date1, date2) INTEGER DATE 형의 date1 – date2 날짜 차이를 반환
SELECT DATEDIFF('2019-02-14', '2019-02-04') => 10
(시험문제)SYSDATE DATE DBMS 시스템상의 오늘 날짜를 반환하는 함수
SYSDATE() => 2018-06-30 21:47:01
인자 설명
%w 요일 순서(0~6, Sunday=0)
%W 요일(Sunday~Saturday)
%a 요일의 약자(Sun~Sat)
%d 1달 중 날짜(00~31)
%j 1년 중 날짜(001~366)
%h 12시간(01~12)
%H 24시간(00~23)
%i (0~59)
%m 월 순서(01~12, January=01)
%b 월 이름 약어(Jan~Dec)
%M 월 이름(January~December)
%s (0~59)
%Y 4자리 연도
%y 4자리 연도의 마지막 2 자리

실습

더보기

기본코드

CREATE DATABASE day_5;

USE day_5;

CREATE TABLE customer(customer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(10),
address VARCHAR(100), 
phone VARCHAR(15),
age INT
);

INSERT INTO customer(name, address, phone, age)
	VALUES ('손흥민', '영국 런던', '010-5001-0001', 30);
INSERT INTO customer(name, address, phone, age)
	VALUES ('유재석', '대한민국 서울', '010-6001-0001', -50);
INSERT INTO customer(name, address, phone, age)
	VALUES ('BTS 진', '대한민국 강원도', '010-7001-0001', 30);
INSERT INTO customer(name, address, phone, age)
	VALUES ('김하성', '미국 샌디에고', '010-8001-0001', 27);
INSERT INTO customer(name, address, age) VALUES ('김영진', '대한민국 서울', -25);

CREATE TABLE products(product_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
product VARCHAR(100),
brand VARCHAR(100),
price INT
);

INSERT INTO products(product, brand, price) VALUES ('양말', '아디다스', 7000);
INSERT INTO products(product, brand, price) VALUES ('긴바지', '무신사', 13000);
INSERT INTO products(product, brand, price) VALUES ('농구공', '나이키', 22000);
INSERT INTO products(product, brand, price) VALUES ('축구화', '나이키', 35000);
INSERT INTO products(product, brand, price) VALUES ('모자', '아디다스', 8000);
INSERT INTO products(product, brand, price) VALUES ('티셔츠', '아디다스', 6000);
INSERT INTO products(product, brand, price) VALUES ('와이셔츠', '스파오', 20000);
INSERT INTO products(product, brand, price) VALUES ('후드티', '스파오', 13000);
INSERT INTO products(product, brand, price) VALUES ('팬티', '캘빈클라인', 7500);
INSERT INTO products(product, brand, price) VALUES ('보온병', '노스페이스', 13000);

CREATE TABLE orders(order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
product_id INT,
sale_price INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);

INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (1, 1, 6000, '2023-03-01');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (1, 3, 21000, '2022-12-03');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (2, 5, 8000, '2022-12-03');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (3, 6, 6000, '2023-03-04');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (4, 7, 20000, '2023-03-05');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (1, 2, 12000, '2023-03-11');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (4, 8, 13000, '2023-02-26');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (3, 10, 12000, '2023-01-08');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (2, 10, 7000, '2023-03-09');
INSERT INTO orders(customer_id, product_id, sale_price, order_date) VALUES (3, 8, 13000, '2023-02-10');

실습1

--제시문--
customer 테이블에 다음 password 칼럼을 추가해라
password 칼럼은 VARCHAR(20)의 datatype,
FLOOR, RAND 를 이용한 랜덤한 수 지정


USE day_5;
/*SET SQL_SAFE_UPDATES = 0;*/

ALTER TABLE customer;
ADD password VARCHAR(20);

UPDATE customer
SET password = FLOOR(RAND() * 10000);

/*에러
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.  
To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
where문이 들어가지 않으면 전체를 수정할 수 있는 우려가 있기에 자동으로 차단(safe update mode)
*/

실습2

--제시문--
customer 테이블에 음수로 잘못 입력된 나이를 수정해라

UPDATE customer
SET age = ABS(age);

실습3

--제시문--
orders 테이블에서 각 주문의 order_date를 년, 월, 일로 각각 나누어라 (문자 함수 이용)
그리고 orders 테이블을 customer과 합하여 주문 고객, 주문 년도, 월, 일을 구해라


SELECT name '주문 고객', SUBSTR(order_date, 1, 4) '주문 년도',
SUBSTR(order_date, 6, 2) '주문 월', SUBSTR(order_date, 9, 2) '주문 일'
FROM orders, customer
WHERE orders.customer_id = customer.customer_id;

실습4

--제시문--
orders 테이블에서 각 주문의 order_date를 yy-mm-dd 형식으로 표현해라 (날짜 함수 이용)

SELECT order_id, order_date, DATE_FORMAT(order_date, '%y-%m-%d') 'yy-mm-dd'
FROM orders;

실습5

--제시문--
주문한 후 10일 후에 배달이 된다면 각 주문이 언제 도착하는지 구해라
※HINT: ADDDATE 함수 이용하기

SELECT order_id, order_date, ADDDATE(order_date, INTERVAL 10 DAY) '배달일'
FROM orders;

NULL 함수

이론
NULL함수
IFNULL(속성, 값) : 속성 값이 NULL이면 값으로 대치하여 출력
NULL 값을 확인하는 방법 – IS NULL, IS NOT NULL
NULL 값을 찾을 때는 '='연산자가 아닌 ‘IS NULL'을 사용, 
NULL이 아닌 값을 찾을 때는 '<>’ 연산자가 아닌 'IS NOT NULL'을 사용

- 실습 -
customer 테이블의 전체를 불러오는데 NULL인 값이 있으면 '[속성] 없음'으로 표기해라

SELECT customer_id '고객 번호',
IFNULL(name, '이름 없음') '이름',
IFNULL(address, '주소 없음') '주소',
IFNULL(phone, '전화번호 없음') '전화번호'
FROM customer;
-----------------------------------------------------------------------------

 


부속질의(Subquery)

쿼리의 중첩 (괄호 내부 쿼리)

main query > subqyery

주질의(외부질의) > 부속질의(내부질의)

다른 테이블에서 필요한 값만 가져옴

명칭 위치 영문 및 동의어 설명
스칼라 부속질의 SELECT scalar subquery SELECT 절에서 사용되며 단일 값을 반환하기 때문에 스칼라 부속질의라고 함.
인라인 FROM inline view,
table subquery
FROM 절에서 결과를 (view) 형태로 반환하기 때문에 인라인 뷰라고.
중첩질의 WHERE nested subquery,
predicate subquery
WHERE 절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용됨. 상관 혹은 비상관 형태.

 

술어 연산자 반환 행 반환 열 상관
비교 =, , , =, =, <> 단일 단일 가능
집합 IN, NOT IN 다중 단일 가능
한정(quantified) ALL, SOME(ANY) 다중 단일 가능
존재 EXISTS, NOT EXISTS 다중 다중 필수

 

평균 주문금액 이하의 주문에 대해서 주문번호와 금액을 보이시오

SELECT order_id, sale_price
FROM orders
WHERE sale_price <= (SELECT AVG(sale_price)
FROM orders);
--------------------------------------------------------------
각 고객의 평균 주문금액보다 큰 금액의 주문 내역에 대해서 주문번호, 고객번호, 금액을 보이시오

SELECT 	order_id, customer_id, sale_price
FROM orders od
WHERE sale_price > (SELECT AVG(sale_price)
FROM orders so
WHERE od.customer_id=so.customer_id);

서술형 70

기본기능 + 내장함수

객관식 30

정보처리 산업기사 필기

 몇 문제 정도? 필기구로 샤프도 괜찮은지?

'computing' 카테고리의 다른 글

java중간고사 정리  (0) 2025.04.03
20250401_OS5  (0) 2025.04.01
20250327_java4 (자바 자료형, 연산자, 형변환 핵심요약)  (1) 2025.03.27
20250325_OS4  (1) 2025.03.25
20250324_DB3  (2) 2025.03.24