데이터의 집합
1) 🌟integrity (무결성) : 데이터의 오류가 있어서는 안된다.
1) 계층형 database :
2) 네트워크 database : 구현이 안됨
3) 🌟Relational database : IBM (E.F.coo) - 2차원 table로 구현된 DB
4) OO database : 객체지향
5) 객체-관계형 database : 🌟Oralcle🌟
C:\Users\user>cd C:\Users\user\Downloads\employees
C:\Users\user\Downloads\employees>mysql -u root -p
mysql>show databases;
mysql> source employees.sql
: database 안에서 data의 구조, data의 표현방법, type, data의 관계를 특별한 형식 언어를 이용해 정의한 구조
MySQL(MariaDB)에서는 Schema = Database
열 이름(한글) | 영문 이름 | 데이터 형식 | 길이 | NULL 허용 |
---|---|---|---|---|
아이디 | memberID | 문자(CHAR) | 8글자(영문) | X |
회원 이름 | memberName | 문자(CHAR) | 5글자(한글) | X |
주소 | memberAddress | 문자(CHAR) | 20글자(한글) | O |
테이블을 이용할 때에는 Database를 명시해주어야 한다.
1) Database 생성
2) Table 생성, data 입력
3) USE (database 선택)
-- TABLE 생성
CREATE TABLE indexTBL(
first_name VARCHAR(14),
last_name VARCHAR(16),
hire_date DATE
);
-- employees 테이블에서 500개의 데이터를 가져오기
INSERT INTO indexTBL
SELECT first_name, last_name, hire_date
FROM employees.employees
LIMIT 500;
SELECT * FROM shopdb.indextbl;
-- first_name이 Mary인 사람을 찾아서 가져옴
SELECT * FROM shopdb.indextbl WHERE first_name = 'Mary';
SELECT * FROM shopdb.indextbl WHERE first_name = 'Mary';
CREATE INDEX idx_indexTBL_firstname ON indexTBL (first_name); -- index 이름 설정
SELECT
작업에 사용CREATE VIEW v_memberTBL
AS
SELECT memberName, memberAddress FROM memberTBL;
-- 가상의 table인 view를 만들고 memberTBL에서 데이터를 선택하여 그 안에 데이터를 넣음
: 함수 interface를 제공
DELIMITER //
CREATE PROCEDURE myFUNC()
BEGIN
SELECT * FROM memberTBL WHERE memberName = "아이유";
SELECT * FROM productTBL WHERE productName = "냉장고";
END //
DELIMITER ;
CALL myFUNC();
' DELIMITER // ' : 세미콜론(;)을 대체하여 statement를 나누는 기호로 사용
실행 결과
: table에 부착
ex. 회원 table에서 회원정보를 삭제해야 하는 경우
일반적으로 flag 처리 (삭제하지 않고 표시만 해둠)
CREATE TABLE deleteMemberTBL (
memberID VARCHAR(10),
memberName VARCHAR(45),
memberAddress VARCHAR(45),
deleteDate DATE
);
DELIMITER //
CREATE TRIGGER trg_deleteMemberTBL
AFTER DELETE -- trigger가 발동되도록 하는 명령어
ON memberTBL -- 어떤 테이블에 trigger가 부착될 것인지
FOR EACH ROW -- 각각의 행에 대해 trigger 발생 (row의 DELETE가 발생하면)
BEGIN -- trigger의 동작
INSERT INTO deleteMemberTBL VALUES (
OLD.memberID, OLD.memberName, OLD.memberAddress, CURDATE()); -- CURDATE() 함수
END //
DELIMITER ;
USE shopdb;
CREATE TABLE deleteMemberTBL (
memberID VARCHAR(10),
memberName VARCHAR(45),
memberAddress VARCHAR(45),
deleteDate DATE
);
DELIMITER //
CREATE TRIGGER trg_deleteMemberTBL
AFTER DELETE -- trigger가 발동되도록 하는 명령어
ON memberTBL -- 어떤 테이블에 trigger가 부착될 것인지
FOR EACH ROW -- 각각의 행에 대해 trigger 발생 (row의 DELETE가 발생하면)
BEGIN -- trigger의 동작
INSERT INTO deleteMemberTBL VALUES (
OLD.memberID, OLD.memberName, OLD.memberAddress, CURDATE()); -- CURDATE() 함수
END //
DELIMITER ;
DELETE FROM memberTBL WHERE memberName = "아이유";
SELECT * FROM deleteMemberTBL;
1) SQL 구문 자동 생성
2) Query editor 설정
- 예약어 대문자로 변경
- 자동완성 (ctrl + space)
- 주석 처리 (block 잡고 ctrl + /)
- SQL 구문의 표준 형태로 변경 (ctrl + b)
3) 사용자 생성과 권한
➕ role : 역할, 권한을 부여하는 집합
SELECT ~
-- 원하는 column만 추출 가능
select emp_no, title from titles;
-- table의 명세 확인 가능
DESC titles;
-- 사용할 database 선택
USE employees;
-- USE를 이용하여 schema 생략 가능
select * from titles;
-- 원하는 column만 추출 가능
select emp_no, title from titles;
-- table의 명세 확인 가능
DESC titles;
-- Alias를 이용 가능
select first_name AS '이름',
gender AS '성별',
hire_Date AS '입사일'
FROM employees;
-- 조건을 설정하여 데이터 추출 : WHERE
-- where는 index가 걸려있는 table로 하는 것이 효율적
DROP DATABASE IF EXISTS sqldb; -- 만약 sqldb가 존재하면 삭제.
CREATE DATABASE sqldb; -- 데이터베이스 생성
USE sqldb; -- sqldb 사용
CREATE TABLE usertbl
( userID CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 ID(PK)
name VARCHAR(10) NOT NULL, -- 이름
birthYear INT NOT NULL, -- 출생연도
addr CHAR(2) NOT NULL, -- 지역(경기, 서울, 경남, etc)
mobile1 CHAR(3), -- 휴대폰 국번(010)
mobile2 CHAR(8), -- 휴대폰 나머지 전화번호(하이픈제외)
height SMALLINT, -- 키
mDate DATE -- 회원가입일
);
CREATE TABLE buytbl
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK) , AUTO_INCREMENT : record가 추가될 때마다 자동으로 1씩 증가하며 값으로 들어감
userID CHAR(8) NOT NULL, -- 아이디(FK)
prodName CHAR(6) NOT NULL, -- 물품명
groupName CHAR(4), -- 분류
price INT NOT NULL, -- 단가
amount SMALLINT NOT NULL, -- 수량
FOREIGN KEY (userID) REFERENCES usertbl(userID) -- foreign key 설정 -> 두 개의 테이블이 연결됨
);
INSERT INTO usertbl VALUES('LSG', '이승기', 1987, '서울', '011', '1111111', 182, '2008-8-8');
INSERT INTO usertbl VALUES('KBS', '김범수', 1979, '경남', '011', '2222222', 173, '2012-4-4');
INSERT INTO usertbl VALUES('KKH', '김경호', 1971, '전남', '019', '3333333', 177, '2007-7-7');
INSERT INTO usertbl VALUES('JYP', '조용필', 1950, '경기', '011', '4444444', 166, '2009-4-4');
INSERT INTO usertbl VALUES('SSK', '성시경', 1979, '서울', NULL, NULL, 186, '2013-12-12');
INSERT INTO usertbl VALUES('LJB', '임재범', 1963, '서울', '016', '6666666', 182, '2009-9-9');
INSERT INTO usertbl VALUES('YJS', '윤종신', 1969, '경남', NULL, NULL, 170, '2005-5-5');
INSERT INTO usertbl VALUES('EJW', '은지원', 1972, '경북', '011', '8888888', 174, '2014-3-3');
INSERT INTO usertbl VALUES('JKW', '조관우', 1965, '경기', '018', '9999999', 172, '2010-10-10');
INSERT INTO usertbl VALUES('BBK', '바비킴', 1973, '서울', '010', '0000000', 176, '2013-5-5');
INSERT INTO buytbl VALUES(NULL, 'KBS', '운동화', NULL , 30, 2);
INSERT INTO buytbl VALUES(NULL, 'KBS', '노트북', '전자', 1000, 1);
INSERT INTO buytbl VALUES(NULL, 'JYP', '모니터', '전자', 200, 1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '모니터', '전자', 200, 5);
INSERT INTO buytbl VALUES(NULL, 'KBS', '청바지', '의류', 50, 3);
INSERT INTO buytbl VALUES(NULL, 'BBK', '메모리', '전자', 80, 10);
INSERT INTO buytbl VALUES(NULL, 'SSK', '책', '서적', 15, 5);
INSERT INTO buytbl VALUES(NULL, 'EJW', '책', '서적', 15, 2);
INSERT INTO buytbl VALUES(NULL, 'EJW', '청바지', '의류', 50, 1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL , 30, 2);
INSERT INTO buytbl VALUES(NULL, 'EJW', '책', '서적', 15, 1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL, 30, 2);
-- 1970년 이후 출생했거나 신장이 182인 사람의 아이디와 이름 조회
SELECT
userID, name
FROM
usertbl
WHERE
birthYear >= 1970 OR height = 182;
-- 키가 180 ~ 183인 사람의 이름과 키 조회
SELECT
name, height
FROM usertbl
-- WHERE height >= 180 and height <= 183
WHERE height BETWEEN 180 and 183;
-- 지역이 경남, 전남, 경북인 사람의 이름과 지역 조회
SELECT name, addr
FROM usertbl
-- WHERE addr = '경남' OR addr = '전남' OR addr = '경북';
WHERE addr in ('경남', '전남', '경북');
-- 성이 김씨인 사람들의 이름과 키 조회
SELECT name, height
FROM usertbl
WHERE name LIKE '김%' -- '_': 한글자, '%': 와일드카드
-- 김경호보다 키가 크거나 같은 사람의 이름과 키 조회
SELECT name, height
FROM usertbl
WHERE height >= (
SELECT height
FROM usertbl
WHERE name='김경호'
); -- 서브 쿼리
-- 지역이 '경남'인 <strong>사람들</strong>의 키보다 키가 크거나 같은 사람의 이름과 키 조회
SELECT name, height
FROM usertbl
WHERE height >= ANY (
SELECT height
FROM usertbl
WHERE addr = '경남'
);
-- 먼저 가입한 순으로 출력
SELECT name, mDate
FROM usertbl
ORDER BY mDate ASC; -- ASC : 오름차순 DSC : 내림차순
-- 순서대로 : ORDER BY !!!
-- usertbl에서 회원들의 거주 지역이 어디인지 출력
SELECT distinct addr
FROM usertbl;
-- distinct : 중복 제거
-- 먼저 가입한 순으로 4명만 출력
SELECT name, mDate
FROM usertbl
ORDER BY mDate ASC
LIMIT 4; -- 4개로 제한
SELECT name, mDate
FROM usertbl
ORDER BY mDate ASC
LIMIT 1, 3; -- 1~3번째 record
-- 구매 테이블에서 사용자가 구매한 물품의 개수 출력
SELECT userID, SUM(amount)
FROM buytbl
GROUP BY userID -- 그럼 GROUP BY가 가장 먼저 실행되나요??
SELECT userID, sum(price * amount)
FROM buytbl
GROUP BY userID;