Gom3rye 2025. 5. 20. 09:46

1. 데이터베이스

  • 효율적인 데이터 관리를 위한 조건
    • 데이터를 통합해서 관리
    • 일관된 방법으로 관리
    • 데이터 누락 및 중복 제거 (성능 때문에 중복을 허용하는 경우도 있긴 하다.)
    • 여러 사용자가 공동으로 실시간 사용이 가능해야 한다.
    • 데이터베이스조차도 서비스에 따라 다르게 분리한다. (ex. data-service 1, data-service 2, data-service 3) ⇒ 동기화의 문제, 불가피한 중복의 문제 ⇒ 하나의 서비스에 문제가 생겨도 다른 서비스에는 영향 안 감

서비스를 나눌 때 : CQRS (읽기와 쓰기를 분리해라.)

(kafka나 순차적인 처리를 해줄 수 있는 배치 처리 시스템이나 쓸 줄 알아야 한다.)

  • 데이터베이스
    • 자료의 집합 또는 자료를 관리하는 기술
    • 데이터를 통합하고 저장하고 운영 가능하고 동시에 사용할 수 있도록 해주는 기술
  • 현대적인 데이터베이스가 갖추어야 할 조건
    • 대용량
    • 효율성
    • 무결성(Integrity): 데이터를 결함 없이 사용하도록 하는 것
    • 활용성
    • 공유성
    • 보안성
  • DBMS(Database Management System)
    • 데이터를 편리하게 관리하고 효율적으로 저장하고 검색할 수 있는 환경을 제공해주는 소프트웨어
    • 필요성
      • 생산성 향상
      • 기능성 향상
      • 신뢰성 향상: 확장성(Scalability)과 부하 분산(Load Balancing)을 구현
    • 3가지 기능을 갖추어야 한다.
      • 정의 기능: 데이터 구조에 관련된 기능
      • 조작 기능: 데이터 조작(직접 관리하는 것)
      • 제어 기능: 보안, 무결성, 회복 등
    • DBMS의 역사
      • 1960년대: 파일 시스템, Flat-File(,로 구분된 플랫 파일: csv) (그때 그때 변경 가능한 파일: xml, json / 변경 안 해도 되는 파일: csv)
      • 1970년대: 네트워크 DBMS, 계층형 DBMS
      • 1980년대: 관계형 DBMS
      • 1990년대: 관계형 DBMS, 객체 지향형 DBMS, 객체 관계형 DBMS
      • 2000년대: 분산 파일 시스템(Hadoop), NoSQL(Key-Value(redis), Document(몽고db), Big Table 형식 등)
  • RDBMS
  • 테이블의 집합으로 설명하는 데이터베이스 관리 시스템
  • 종류
    • 상용 RDBMS(대기업 ex. 삼성) - 오라클 유지 보수 비용이 너무 비쌈(억 단위, 유지 보수 비용 따로), SAP의 HANA DB, MS의 MS-SQL server, access(인터넷 상담 정도만 해주고 유지 보수 비용 최대로 싸게), Sybase, Tibero(경찰청), IBM의 DB2 (금융권은 대부분 오라클 쓴다, 현대-하나db, 네이버-MySQL(오픈 소스 버전), 카카오-MariaDB)
    • 오픈 소스 RDBMS(중견 기업 ex. 카카오) - Maria DB(MySQL fork), PostgreSQL(위치 정보 저장하는 거 강력), SQLite(휴대폰), MySQL(오픈 소스 버전) 등
  • 구성
    • relation: 테이블
    • attribute: 속성(테이블의 열)
    • domain: 속성이 가질 수 있는 값들의 집합- 자료형이나 값의 집합
    • tuple: 테이블의 행, row, record
    • cardinality: 하나의 테이블에서 행의 개수나 서로 다른 테이블 사이에 대응되는 수 (0, n→ 대응되는 게 없을 수도 있다.) optional
    • degree: 속성의 개수
    • constraint: 데이터 무결성을 지키기 위해서 데이터를 저장할 때 실행되는 검사 규칙
  • Key
    • 각 튜플들을 유일하게 식별할 수 있는 속성 또는 속성의 집합
    • Super Key: 속성의 개수에 상관없이 다른 튜플과 구분할 수 있는 속성 또는 속성의 집합(학번+이름은 수퍼키 될 수 있다.)
    • Candidate Key: 속성의 개수를 최소로 해서 구분하는 Key(이미 학번이 후보키가 되었으니 다른 속성과 함께 후보키로 x, 이름하고 학과는 둘이 합치면 후보키가 될 수 있다.)
    • Primary Key: 후보키 중에서 하나 선정한 Key (기본키)
    • Alternate Key: Primary Key가 아닌 Candidate Key
    • Foreign Key: 다른 테이블에서 데이터(튜플)를 식별하기 위한 Key 이론상 ⇒ 현재 테이블에서는 아무런 제약이 없지만 다른 테이블에서는 Primary Key여야 한다. 실제 데이터베이스 ⇒ Primary Key 이거나 unique하면 된다.
    설정하는 방법: 양쪽 테이블 사이의 cardinality를 파악해서 설정→ 1:N인 경우: 1쪽 테이블의 기본키를 상대방 테이블의 Foreign Key로 추가
  • → N:N인 경우: 양쪽 테이블의 기본키를 이용해서 별도의 테이블을 생성하고 기본키를 다시 생성 (ex. 수강 테이블에 학생 ID와 강의 ID를 외래키로 추가하고, 이 둘을 합쳐 기본키로 설정((학생ID, 강의ID)).)
  • → 1:1인 경우: 각 테이블의 기본키를 상대방 테이블의 Foreign Key로 설정
  • 제약 조건
    • Entity Integrity(개체 무결성): 기본키는 null이거나 중복될 수 없음(null이면 자료를 찾을 수가 없고 중복되면 유일한 게 아닌 게 되는 거니까)
    • Referential Integrity(참조 무결성): 참조할 수 없는 Foreign Key를 가지면 안됨 → 참조할 수 있는 값을 가지거나 null이어야 한다.
  • 개체
    • Table
    • View: 자주 사용하는 SELECT 구문을 저장해서 테이블처럼 사용하는 객체
    • Index: 데이터를 빠르게 조회할 수 있도록 해주는 개체
    • Synonym: 개체에 대한 별명
    • Sequence: 일련번호
    • Procedure: 코드 블럭
    • Function: 리턴 값이 있는 코드 블럭
    • Trigger: DML 문장을 수행할 때 자동으로 수행되는 개체
  • SQL(Structured Query Language)

: DBMS에 질의를 수행하기 위한 언어

  • 특징
    • 비절차적: 작성한 순서대로 실행되지 않음
    • 처리 단위는 튜플 각각이 아니라 테이블 단위로 처리(튜플들을 집합 단위로 처리)
  • 분류
    • DDL: 데이터 구조 정의(Create), 구조 수정(Alter), 구조 삭제(DROP), 이름 변경(Rename), 데이터만 전체 삭제(Truncate)
    • DCL: Grant(권한 부여), Revoke(권한 취소)
    • (TCL): 트랜잭션 관련 명령어, Commit(작업 완료), Rollback(작업 취소), SavePoint(저장점 생성)
    • DML: Insert(데이터 추가), Update(데이터 수정), Delete(데이터 삭제)
    • (DQL): Select(데이터 조회) → 데이터 조회는 동시에 여러 명 해도 되지만 삽입은 동시에 하면 안됨 (DQL은 동시에 처리해도 되지만 DML은 하나씩만 해야 하니 나누려고 하는 것)

2. Maria DB

  • SQL에 기반을 둔 관계형 DBMS로 Open Source
  • MySQL의 fork: MySQL을 기반으로 생성
  • 작업 단위
    • 데이터베이스 > 테이블
    • 데이터베이스는 사용자와 상관없이 생성되며 사용자에게 권한을 부여해서 사용
    • 하나의 데이터베이스를 여러 사용자가 공유할 수 있다. (오라클이랑 약간 반대)
      • Port: 외부에서 애플리케이션을 구별하기 위한 번호 (0~1023번까지 예약이 돼있다.)
      • 접속 도구 설치: DBeaver 설치
      • 127.0.0.1 루프백: 내가 나한테 들어가서 정상적인지 확인하는 거
      • 루트(로컬)에서는 비밀번호 복구할 수 있지만 원격에서는 x
      • 오라클은 맥에서 안됨
  • 데이터베이스 관련 명령
    • 전체 데이터베이스 확인: show databases;
    • 데이터베이스 생성: create database 이름;
    • 데이터베이스 삭제: drop database 이름;
    • 데이터베이스 사용: use 이름;
    • 데이터베이스 내부 테이블 확인: show tables
  • 유저 생성: create user ‘사용자계정’@’접속위치’ identified by ‘비밀번호’; → 접속 위치는 접속하고자 하는 컴퓨터의 ip인데 %를 설정하면 아무 곳에서나 접속 가능!
  • 권한 부여: grant all privileges on 데이터베이스 이름 to ‘계정’@’접속위치’; → 데이터베이스 이름 대신에 . 하면 모든 데이터베이스가 된다. 이 명령 다음에는 데이터베이스를 다시 실행하거나 flush privileges 명령을 수행해준다.
  • 샘플 데이터 생성

3. SELECT (데이터 조회)

테이블 정보

show databases;
create database autoever;
use autoever;
show tables;

CREATE TABLE tCity
(
	name CHAR(10) PRIMARY KEY,
	area INT NULL ,
	popu INT NULL ,
	metro CHAR(1) NOT NULL,
	region CHAR(6) NOT NULL
);

INSERT INTO tCity VALUES ('서울',605,974,'y','경기');
INSERT INTO tCity VALUES ('부산',765,342,'y','경상');
INSERT INTO tCity VALUES ('오산',42,21,'n','경기');
INSERT INTO tCity VALUES ('청주',940,83,'n','충청');
INSERT INTO tCity VALUES ('전주',205,65,'n','전라');
INSERT INTO tCity VALUES ('순천',910,27,'n','전라');
INSERT INTO tCity VALUES ('춘천',1116,27,'n','강원');
INSERT INTO tCity VALUES ('홍천',1819,7,'n','강원');

SELECT * FROM tCity;

CREATE TABLE tStaff
(
name CHAR (15) PRIMARY KEY,
depart CHAR (10) NOT NULL,
gender CHAR(3) NOT NULL,
joindate DATE NOT NULL,
grade CHAR(10) NOT NULL,
salary INT NOT NULL,
score DECIMAL(5,2) NULL
);

INSERT INTO tStaff VALUES ('김유신','총무부','남','2000-2-3','이사',420,88.8);
INSERT INTO tStaff VALUES ('유관순','영업부','여','2009-3-1','과장',380,NULL);
INSERT INTO tStaff VALUES ('안중근','인사과','남','2012-5-5','대리',256,76.5);
INSERT INTO tStaff VALUES ('윤봉길','영업부','남','2015-8-15','과장',350,71.25);
INSERT INTO tStaff VALUES ('강감찬','영업부','남','2018-10-9','사원',320,56.0);
INSERT INTO tStaff VALUES ('정몽주','총무부','남','2010-9-16','대리',370,89.5);
INSERT INTO tStaff VALUES ('허난설헌','인사과','여','2020-1-5','사원',285,44.5);
INSERT INTO tStaff VALUES ('신사임당','영업부','여','2013-6-19','부장',400,92.0);
INSERT INTO tStaff VALUES ('성삼문','영업부','남','2014-6-8','대리',285,87.75);
INSERT INTO tStaff VALUES ('논개','인사과','여','2010-9-16','대리',340,46.2);
INSERT INTO tStaff VALUES ('황진이','인사과','여','2012-5-5','사원',275,52.5);
INSERT INTO tStaff VALUES ('이율곡','총무부','남','2016-3-8','과장',385,65.4);
INSERT INTO tStaff VALUES ('이사부','총무부','남','2000-2-3','대리',375,50);
INSERT INTO tStaff VALUES ('안창호','영업부','남','2015-8-15','사원',370,74.2);
INSERT INTO tStaff VALUES ('을지문덕','영업부','남','2019-6-29','사원',330,NULL);
INSERT INTO tStaff VALUES ('정약용','총무부','남','2020-3-14','과장',380,69.8);
INSERT INTO tStaff VALUES ('홍길동','인사과','남','2019-8-8','차장',380,77.7);
INSERT INTO tStaff VALUES ('대조영','총무부','남','2020-7-7','차장',290,49.9);
INSERT INTO tStaff VALUES ('장보고','인사과','남','2005-4-1','부장',440,58.3);
INSERT INTO tStaff VALUES ('선덕여왕','인사과','여','2017-8-3','사원',315,45.1);
SELECT * FROM tStaff;

CREATE TABLE DEPT(
DEPTNO INT(2),
DNAME VARCHAR(14) ,
LOC VARCHAR(13),
CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO)
);
CREATE TABLE EMP(
EMPNO INT(4),
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR INT(4),
HIREDATE DATE,
SAL FLOAT(7,2),
COMM FLOAT(7,2),
DEPTNO INT(2),
CONSTRAINT PK_EMP PRIMARY KEY(EMPNO),
CONSTRAINT FK_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);

INSERT INTO DEPT VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES(40,'OPERATIONS','BOSTON');

INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,'1987-7-13',3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,'1987-7-13',1100,NULL,20);

INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,'1981-12-3',950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,'1981-12-3',3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,'1982-1-23',1300,NULL,10);
CREATE TABLE SALGRADE
( GRADE INT,
LOSAL INT,
HISAL INT );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT;

SELECT * FROM DEPT;
SELECT * FROM EMP;
SELECT * FROM SALGRADE;

--회원테이블
create table usertbl(
userid char(15) not null primary key,
name varchar(20) not null,
birthyear int not null,
addr char(100),
mobile char(11),
mdate date)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
--구매테이블
create table buytbl(
num int auto_increment primary key,
userid char(8) not null,
productname char(10),
groupname char(10),
price int not null,
amount int not null,
foreign key (userid) references usertbl(userid) on delete cascade)ENGINE=MyISAM
AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

--데이터 삽입
insert into usertbl values('kty', '김태연',1989,'전주','01011111111', '1989-3-9');
insert into usertbl values('bsj', '배수지',1994,'광주','01022222222', '1994-10-10');
insert into usertbl values('ksh', '김설현',1995,'부천','01033333333', '1995-1-3');
insert into usertbl values('bjh', '배주현',1991,'대구','01044444444', '1991-3-29');
insert into usertbl values('ghr', '구하라',1991,'광주','01055555555', '1991-1-13');
insert into usertbl values('san', '산다라박',1984,'부산','01066666666', '1984-11-12');
insert into usertbl values('jsm', '전소미',2001,'캐나다','01077777777', '2001-3-9');
insert into usertbl values('lhl', '이효리',1979,'서울','01088888888', '1979-5-10');
insert into usertbl values('iyou', '아이유',1993,'서울','01099999999', '1993-5-19');
insert into usertbl values('ailee', '에일리',1989,'미국','01000000000', '1989-5-30');
commit;

insert into buytbl values(null, 'kty', '운동화', '잡화', 30, 2);
insert into buytbl values(null, 'kty', '노트북', '전자', 1000, 1);
insert into buytbl values(null, 'jsm', '운동화', '잡화', 30, 1);
insert into buytbl values(null, 'lhl', '모니터', '전자', 200, 1);
insert into buytbl values(null, 'bsj', '모니터', '전자', 200, 1);
insert into buytbl values(null, 'kty', '청바지', '잡화', 100, 1);
insert into buytbl values(null, 'lhl', '책', '서적', 15, 2);
insert into buytbl values(null, 'iyou', '책', '서적', 15, 7);
insert into buytbl values(null, 'iyou', '컴퓨터', '전자', 500, 1);
insert into buytbl values(null, 'bsj', '노트북', '전자', 1000, 1);
insert into buytbl values(null, 'bjh', '메모리', '전자', 50, 4);
insert into buytbl values(null, 'ailee', '운동화', '잡화', 30, 2);
insert into buytbl values(null, 'ghr', '운동화', '잡화', 30, 1);
commit;

SELECT *
FROM tCity;

SELECT *
FROM tStaff;

SELECT name, popu
FROM tCity;

SELECT popu, name
FROM tCity;

SELECT region, name, area
FROM tCity;

SELECT name 도시명, area "면적(제곱km)", popu as "인구(만명)"
FROM tCity;

SELECT name 도시명, area "면적(제곱km)", popu as "인구(만명)"
FROM tCity
where area=765;

SELECT name 도시명, area "면적(제곱km)", popu as "인구(만명)"
FROM tCity
order by "면적(제곱km)" desc;
  • EMP 테이블 - 사원 테이블
  • EMPNO: 사원 번호 - 정수 4자리, 기본키
  • ENAME: 사원 이름 - 문자
  • JOB: 직무 - 문자
  • MGR: 관리자 사원 번호 - 정수 4자리
  • HIREDATE: 입사일 - DATE
  • SAL: 급여 - 실수 7자리이고 소수 2자리
  • COMM: 상여금 - 실수 7자리이고 소수 2자리(NULL 포함)
  • DEPTNO: 부서 번호 - 정수 2자리 이고 DEPT 테이블의 DEPTNO를 참조
  • DEPT 테이블 - 부서 테이블
  • DEPTNO: 부서 번호 - 정수 2자리 이고 기본키
  • DNAME: 부서 이름 - 문자
  • LOC: 위치 - 문자
  • SALGRADE - 호봉 테이블
  • GRADE: 호봉 - 숫자이고 기본키
  • LOSAL: 최저급여 - 숫자
  • HISAL: 최대급여 - 숫자
  • TCITY - 도시 테이블
  • NAME: 도시이름 - 문자열이고 기본키
  • AREA: 면적 - 정수
  • POPU: 인구수 - 정수
  • METRO: 대도시 여부 - 문자
  • REGION: 도 - 문자
  • TSTAFF - 직원 테이블
  • NAME: 이름 - 문자열이고 기본키
  • DEPART: 부서 이름 - 문자열
  • GENDER: 성별 - 문자열
  • JOINDATE: 입사일 - 날짜
  • GRADE: 직무 - 문자열
  • SALARY: 급여 - 정수
  • SCORE: 고과 점수 - 실수이고 소수 2자리

SELECT 구문 기본 형식

SELECT [DISTINCT] {*, Column 이름 나열 [Alias]…} FROM 테이블이름 나열- 변경된 테이블 이름 사용 가능 [WHERE CONDITION(조건) GROUP BY 그룹화할 조건 HAVING GROUP BY 이후의 CONDITION ORDER BY {칼럼 이름이나 연산식 [ASC | DESC]} ]

  • 실행 순서 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
  • 모든 열 선택 : SELECT에 * 사용해서 조회
    • ex. tCity 테이블의 전체 데이터를 조회해라 SELECT * FROM tCity; ⇒ MySQL, MariaDB는 테이블의 대소문자 구분 x, but Oracle은 구분한다.
  • 테이블의 특정 Column을 검색하고자 하는 경우 SELECT 절에 Column 이름을 ,로 구분해서 나열하면 된다.
    • 조회 순서는 SELECT 뒤에 나열한 순서대로 조회
    • ex. tCity 테이블의 name, popu 컬럼 조회 SELECT name, popu FROM tCity;
    ex. tCity 테이블의 region, name, area 필드 확인 SELECT region, name, area FROM tCity;

Alias

  • SELECT 명령이 출력하는 내용을 Result Set 또는 Row Set 이라고 한다.
  • SELECT 구문의 결과는 하나의 테이블처럼 사용 출력하는 결과의 Field Caption은 테이블에서 정의한 컬럼 이름과 동일한데 별명을 이용해서 변경하는 것이 가능하다.
  • 별명을 붙여서 출력 SELECT 컬럼이름 [AS] 별명
  • 별명을 만들 때 공백이나 특수문자(), 한글 등을 포함한 경우는 “ ”로 감싸야 한다.
  • 별명은 SELECT 구문이 수행된 후 사용 가능
    • tCity 테이블에서 name, area, popu를 열을 조회하는데 각각 도시명, 면적(제곱km), 인구(만명)으로 조회 ⇒ SELECT name 도시명, area “면적(제곱km)”, popu as “인구(만명)” FROM tCity;⇒ SELECT 절에서 붙인 별명은 ORDER BY 절에서만 사용 가능!!
    • SELECT name 도시명, area "면적(제곱km)", popu as "인구(만명)" FROM tCity where "면적(제곱km)"=765; -> 에러 남!! (select 실행하기 전에 where 실행되니까)
  • 계산 값의 출력
    • SELECT 절에서는 컬럼을 가지고 산술 연산이 가능 → 이 경우 대부분 별명을 붙여서 출력
      • ex. tCity 테이블에서 name컬럼과 popu컬럼에 10000을 곱해서 출력해보기
      SELECT name, popu * 10000 as "인구(만명)"
      FROM tCity;
      
      • ex. tCity 테이블에서 name컬럼과 인구수(popu)를 면적(area)을 나누어서 인구 밀도 조회
      SELECT name, popu / area as "인구 밀도"
      FROM tCity;
      
      • select 606024; → 계산식도 가능한데 Oracle은 From 생략할 수 없어서 dual을 써줘야 한다.

컬럼 결합

  • CONCAT(컬럼 이름이나 연산식 나열)
  • ex. EMP 테이블의 ENAME과 JOB을 결합해서 출력
  • SELECT CONCAT(ENAME, ' ', JOB) AS EMPLOYEES FROM EMP;

DISTINCT

  • 컬럼 값 중복 제거
  • SELECT절 맨 앞에 한 번만 나와야 하고 뒤에 컬럼이 여러 개이면 그 모든 컬럼의 값이 중복된 경우 제거된다.
SELECT DISTINCT region
FROM tCity; #-> 중복된 지역 한 번만 나온다.

ORDER BY

  • 데이터 정렬을 위한 절
  • ORDER BY절이 없으면 데이터의 출력 순서는 DBMS의 디폴트 순서를 따른다. (오라클은 레코드의 입력 순서를 기억해두고 그대로 가져오고 SQL Server와 Maria DB는 Primary Key에 대해서 오름차순으로 정렬)
  • SELECT 구문을 이용해서 출력할 때는 출력 순서를 알 수 없으므로 되도록이면 ORDER BY절을 이용해서 데이터를 정렬한 후 출력하는 것이 좋다.
  • 기본은 오름차순 (NULL 값은 제일 나중, 내림차순에서는 제일 먼저)
  • 컬럼 이름 대신 별명, 인덱스, 계산식 이용하는 것 가능
  • 컬럼 이름이나 연산식을 기재하면 앞의 컬럼의 값이 같을 때 뒤의 컬럼의 값을 가지고 정렬
    • ex. tCity 테이블의 모든 데이터를 저장하는데 popu의 내림차순 조회
    • SELECT * FROM tCity ORDER BY popu desc;
    • ex. tCity 테이블의 region, name, area, popu를 조회하는데 region의 오름차순으로 정렬하고 동일한 region의 값이 있을 때는 name의 내림차순으로 조회
    • SELECT region, name, area, popu FROM tCity ORDER BY region, name DESC;
    • ex. 컬럼 순서를 이용한 조회
    • select * from tCity order by area; # 이때 area 컬럼이 2번째에 있으므로 order by 2; 로 해도 된다.

WHERE

  • 조회하고자 하는 데이터의 조건을 지정
  • 이 절이 생략되면 테이블의 모든 데이터를 조회한다.
  • SELECT뿐만 아니라, DELETE, UPDATE 구문에도 사용된다. (조건 지정하는 건 뭐든 다)
  • 비교 연산자 사용 (>,<,≥,≤,=,!=, NOT 컬럼이름 =)
    • 숫자는 그냥 사용하지만 문자열과 날짜 상수는 작은 따옴표로 감싸야 한다.
    • RDBMS에 따라 생략해도 되는 경우가 O
    • 작은 따옴표 대신 큰 따옴표를 사용해도 에러가 아닌 경우가 있다.
    • MySQL과 Maria DB→ 저장할 때는 대소문자 구분하지만 비교할 때는 대소문자 구분 X
  • ex. tCity 테이블에서 popu가 10 미만인 데이터의 name을 조회
  • select name from tCity where popu < 10;
  • ex. tCity 테이블에서 region이 전라인 데이터 조회
  • select * from tCity where region = '전라';
  • ex. tStaff 테이블에서 SALARY가 400이상인 name을 조회
  • select name from tStaff where salary >= 400;
  • ex. tCity 테이블에서 metro가 y인 데이터의 모든 컬럼을 조회
  • select * from tCity where metro = 'y'; # where metro = 'Y' (MySQL과 Maria DB는 대소문자 구분 안해서)
  • NULL 비교 (NULL: 아직 알려지지 않은 데이터)
    • IS NULL과 IS NOT NULL로 비교한다.
    • =로 NULL을 비교하게 되면 값이 NULL인 데이터를 조회한다.
    • ex. tStaff 테이블에서 전체 데이터 조회: score의 값이 NULL인 데이터 확인
    • select * from tStaff where score is NULL;
  • 논리 연산자: AND, OR, NOT
    • 우선 순위: AND > OR
    • AND는 앞의 조건이 F이면, OR는 앞의 조건이 T이면 뒤의 조건 확인 X
  • LIKE (패턴으로 부분 문자열을 검색)
    • 와일드 카드 문자(%: 0개 이상의 문자, _: 1개의 문자) 사용
    • [문자나열]: 문자 리스트 중 하나의 문자와 대응
    • [^문자나열]: 문자 리스트에 포함되지 않은 하나의 문자와 대응
    • 와일드카드 문자를 검색하고자 하는 경우는 ESCAPE를 이용
    • # sale에 30% 가 포함된 데이터 조회 where sale LIKE '%30#%' ESCAPE '#';
    • ex. tCity 테이블에서 ‘천’ 자가 들어가는 도시를 검색
    • select * from tCity where name like '%천%'; # not like -> 천이 들어가지 않는 도시
    • ex. EMP 테이블에서 두 번째 글자가 A인 ENAME 조회
    • select ENAME from EMP where ENAME like '_A%';
    • ex. tStaff 테이블에서 name이 정 으로 시작하는 직원의 모든 정보 조회
    • select * from tStaff where name like '정%';
  • between between 값1 and 값2: 값1부터 값2까지의 데이터를 조회한다. 값1과 값2를 포함하고 반드시 값2가 값1보다 커야 한다.
    • ex. tCity 테이블에서 popu가 50에서 100 사이가 아닌 데이터 조회 (and 연산보다 속도 빠름)
    • select * from tCity where popu not between 50 and 100; # popu >= 50 and popu <= 100 와 동일!
  • in 연산자
    • 여러 개의 값 중 하나를 선택하고자 할 때 사용
    • 서브 쿼리에 사용할 수 있음
    • ex. tCity 테이블에서 region의 값이 경상이나 전라인 데이터를 조회
    • select * from tCity where region in ('경상', '전라'); # region ='경상' OR region ='전라'; 와 동일
  • LIMIT (행의 개수 제한)
    • SELECT 구문의 맨 뒤에 기재해서 행의 개수를 제한
    • 페이지 처리할 때 사용
    • ex. tCity 테이블에서 인구가 많은 5개의 도시 조회
    • select * from tCity order by popu desc limit 5; ### 4,5,6번째 인구 많은 도시 조회 select * from tCity order by popu desc limit 3, 3;
  • OFFSET FETCH (행의 개수 제한)
    • ORDER BY 정렬할 컬럼 OFFSET {건너뛸 행의 개수} ROWS FETCH NEXT {출력할 행의 개수} ROWS ONLY
    • ex. tCity 테이블에서 인구가 많은 5개의 도시 조회
    • select * from tCity order by popu desc OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
  • 연습 문제
    • EMP 테이블에서 COMM이 NULL이 아닌 사원의 모든 정보를 조회하는 SELECT문 작성
    • select * from EMP where COMM is not NULL;
    • EMP 테이블에서 COMM이 SAL보다 10% 이상 많은 사원에 대하여 ENAME, SAL, COMM를 조회하는 SELECT문 작성
    • select ENAME, SAL, COMM from EMP where COMM >= SAL*1.1
    • EMP 테이블에서 JOB이 CLERK이거나 ANALYST이고 SAL이 1000, 3000, 5000이 아닌 사원의 모든 정보를 조회하는 SELECT 문 작성
    • select * from EMP where (JOB = 'CLERK' OR 'ANALYST') AND (SAL != 1000 OR 3000 OR 5000); ---- where JOB IN ('CLERK', 'ANALYST') AND SAL NOT IN(1000, 3000, 5000);
    • EMP 테이블에서 ENAME에 A와 E가 포함되어 있는 데이터의 ENAME과 SAL을 조회하는 SELECT문 작성
    • select ENAME, SAL from EMP where ENAME LIKE '%A%E%';
    • EMP 테이블에서 (ENAME에 L이 두 자 이상 포함되어 있고 DEPTNO가 30)이거나 MGR이 7782인 사원의 모든 정보를 조회하는 SELECT문 작성
    • select * from EMP where (ENAME LIKE '%L%L%' AND DEPTNO=30) OR (MGR = 7782);
728x90
반응형