jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Database

[SQL] Day01_1 (Note + Code)

2022. 3. 10. 20:27

2022/3/8

 

데이터 베이스

1.  DBMS: DataBase Management System: 데이터를 관리하는 툴
대표적인 DBMS- Oracle, MySql, mariaDB

 

2.  데이터 베이스: 유용한 데이터의 집합. 파일 자체가 아닌, 파일의 이름이나 위치를 저장하는 것.

 

3.  데이터 베이스가 생겨난 이유: 파일 시스템의 문제점(일관성 저하, 보안성 낮음, 경제성 낮음-> 파일이 많으면 저장용량도 많이 차지함, 백업 동기화가 어렵다)

 

4.  오라클
DB 버전:
8,9 -> I (인터넷의 약자)
10, 11-> g (그리드의 약자.)
12~ -> c (클라우드의 약자)
RDBMS: Relational DBMS. 관계형 데이터 베이스. oracle, mysqul, PostgreSQL.
NoSQL: No Only sql: mongoDB… 키 밸류 형태의 객체 구조를 가지고 있다. RDBMS의 특성도 가지고 있고 여러 특징이 있음.

 

5.  관계형 데이터 베이스 RDBMS
: 행과 열로 표현되는 테이블 간의 관계를 나타낼 때 사용된다.
엑셀을 DB화 시켰다고 보면된다…
행: row, 레코드(DB에서 표현)
열: column,

 

SQL: Structed Query Language: 구조화 질의어
데이터 베이스를 사용할 때, 데이터 베이스에 접근할 수 있는 데이터 베이스 하부 언어. SQL 명령 문장을 query문이라고도 부른다.
CRUD (Create, Read, Update, Delete)

 

SQL 종류
DDL: (Data Definition Language) 데이터 정의어
데이터베이스 객체 (테이블, 뷰, 인덱스……)의 구조정의. (데이터를 저장하는 테이블의 구조적인 것을 바꿀 때)
CREATE: 생성
ALTER: 수정(변경)
DROP: 삭제
RENAME: 객체 이름 변경
TRUNCATE: 삭제 (저장 공간 포함)

DML:
(Data Manipulation Language) 데이터 조작어
데이터의 삽입, 삭제, 갱신 등 데이터 처리. (실제 데이터를 다룰 때)
INSERT: 데이터 저장
DELETE: 데이터 삭제
UPDATE: 데이터 수정

DCL:
(Data Control Language) 데이터 제어어
데이터 베이스 사용자의 권한을 제어함 (DB 관리자만 사용 가능)
GRANT: 권한 부여
REVOKE: 권한 취소

DQL: SELECT: 데이터를 검색
TCL: (Transaction Control Language): 트랜젝션 제어어
트랜젝션 (데이터 처리 단위) -> 은행으로 예를 들자면 송금하면 내 계좌 돈 마이너스, 받는 계좌 돈 플러스 이런 명령 처리를 하나의 단위로 만든걸 트랜잭션이라고 함.
COMMIT: 트랜젝션 정상 종료 처리. 프로그램을 끝내기 전에 반드시 사용해야 한다! 툴에서 Auto Commit을 안 해놓으면 매번 commit 명령어 실행해야 함. 데이터 영구적 반영을 위해 툴에서 간단히 auto commit 옵션을 활성화시키자)
ROLLBACK: 돌아가기 (작업 취소)
SAVEPOINT: 백업 정책

(메모 방식: 명령어는 전체 대문자, [] 안에 있는 건 명령어가 아닌 내가 입력해야 하는 것들)

SELECT
:데이터 조회
SELECT [컬럼명 또는 표현식] FROM [테이블명 또는 뷰명];

(컬럼 명과 명령어 사이에 띄어쓰기 있어야 함. 명령어 앞뒤로는 띄어쓰기 필수!)
*문자열 데이터를 제외한 나머지는 대소문자 구분하지 않는다. 테이블, 명령어 등은 대소문자 구분 x

* 중복 제거: select distinct

*연결 연산자: || 컬럼 붙여서 출력 

SELECT * FROM emp; --emp 테이블에서 전체 조회할거야  
select empno, ename from emp; --emp 테이블에서 원하는 행 조회.

--표현식 (리터럴 상수)은 컬럼 이름 이외에 출력하기를 원하는 내용을 작성하여 출력 가능.
--select 뒤에 ''묶어서 사용
select * from professor;
select name,'good morning' "HELLO" from professor; 
/*데이터는 '' 묶기, 별칭 (alias)는 ""묶기
good moring 쿼리문의 내용 중에서 굿모닝을 추가한것. 
굿모닝이 열에 추가가 된다. hello는 굿모닝에 별칭이 된다. 
*/
select * from dept;
select dname "Department name", 'it''s deptno' "test", deptno"Department number" from dept;
--셀렉트 한번 할때 애칭을 붙여서 다른 행 이름으로 가져오겠다. 
--컬럼 별칭 (Column alias) : 컬럼명 뒤에 ""로 묶어서 별칭을 달 수 있다. (select문 실행할 때만 적용, 원 컬럼명은 변경 되지 않는다.)
select * from emp;
select empno"employee number", ename"employee name", mgr"manager" from emp;

--중복되는 값을 걸러서 몇개의 deptno가 있는지 보기
--주의! 1개 컬럼 앞에 키워드를 작성해도 나열된 모든 컬럼을 기준으로 중복 검사를 함. 
select distinct deptno from emp;
select distinct deptno, ename from emp; --ename이 중복되는게 없어서 전부 다 출력된다. 

--연결 연산자: || 컬럼 붙여서 출력 
select ename, job from emp;
select ename || job from emp; --컬럼 하나에 값 두개가 연결이 되서 나옴
select ename ||' '|| job from emp; --값 띄어쓰기 하고 싶으면 이렇게.

--student 테이블에서 모든 학생의 이름과 ID, 체중을 아래 형태로 출력
--James Seo's ID: 75true, WEIGHT is 72kg
select * from student;
select name||'''s ID: '|| id||', WEIGHT is '|| weight ||'kg' "학생 아이디 및 몸무게" from student;

 

 

WHERE
: 원하는 조건만 골라내기
SELECT [컬럼명 또는 표현식] FROM [테이블명 또는 뷰명] WHERE [조건];
조건은 일반 산수에 사용되는 조건 사용. >, <, =, >=, <=
조건이 여러 개면 and. &&와 동일하다. Between ~ and~.

select * from emp;
select * from emp where empno = 7900; --sql에서는 ==가 =이거다.
select ename from emp where empno = 7900; --empno가 7900인 사람의 이름만 가져오기
select empno, ename, job, sal from emp where sal > 1500;

--ename이 SMITH인 사람의 empno, ename, sal를 emp 테이블에서 가져오기
select empno, ename, sal from emp where ename = 'SMITH';

--sql에서 문자열 값을 표시할때 꼭 홑따옴표로 묶기. 값은 대소문자 구분하니 정확하게 기입.
select empno, ename, hiredate from emp where ename = 'FORD';

--hiredate가 80/12/17인 직원의 empno, ename, job, hiredate를 emp 테이블에서 가져오기
select empno, ename, job, hiredate from emp
where hiredate = '801217'; 
--날짜 포맷을 80-12-17, 1980/12/17, 801217 이런식으로 해도 나옴. 80년12월17일은 안됨.
--검색의 조건에서는 숫자 외에는 꼭 작은 홑따옴표로 묶어서 표시. 대소문자 구분.

--기본 산술 연산자 사용
select ename, sal from emp where deptno =10;
select ename, sal+1000 from emp where deptno =10;
select ename, sal*0.1 "tax" from emp where deptno =10;

--비교연산자
select empno,ename,sal from emp where sal >= 3000;
select empno,ename,sal from emp where ename >= 'R'; --이름 첫글자가 R보다 큰 사람
select empno,ename,sal from emp where hiredate >= '820101';

--숫자 between and
select empno, ename, sal from emp where sal > 2000 and sal < 3000; --조건이 여러개면 and. &&와 동일하다.
select empno, ename, sal from emp where sal between 2000 and 3000; --위 코드와 동일하다. 적혀있는 숫자도 포함 (>=, <=)

--문자 between and
select ename from emp order by ename;
select ename from emp where ename between 'JAMES' and 'MARTIN';

--IN연산자
select empno, ename, deptno from emp
where deptno in (10,20); --in안에 소괄호 안에 10~20 사이에 있는 값

 

 

Like 연산자
: % _ 두 개의 기호와 같이 사용
%: 글자 수 제한 없고 (0개 포함) 어떤 글자가 와도 상관없다.
_: 글자수 한 글자 뜻하며, 어떤 글자이던 상관없다.
WHERE 컬럼명 LIKE '%_이용한 패턴';
값%: 값으로 시작하는. % 값: 값으로 끝나는. % 값%: 값을 포함하는
_값: 두 번째가 값인 것. __값: 세번째가 값인것

select * from emp;
--숫자1로 시작하는 
select empno, ename,sal from emp where sal like '1%'; --sal이 1로 시작하고 뒤에 뭐가 와도 상관없다!
--문자
select empno, ename from emp where ename like 'A%';
--날짜
select empno, ename, hiredate from emp
where hiredate like '81%';
--입사월이 12월인 직원들
select empno, ename, hiredate from emp
where hiredate like '___12%';
--이름에 T가 있는 직원들
select empno, ename from emp where ename like '%T%';
--이름이 N으로 끝나는 직원들
select empno, ename from emp where ename like '%N';

 

 

IS NULL/ IS NOT NULL : 값이 무엇인지 모를 경우

NULL은 어떤 값인지 모른다는 뜻의 데이터 종류이다.

NULL은 = 같다 라는 비교 연산자로 비교할 수 없다. a=null 안됨

sql에서 == null 은 is null,!= null 은 in not null

select * from emp where comm is null;
select * from emp where comm is not null;

 

 

조건식

AND OR 검색할 때 WHERE절 조건식에서 사용.
AND 검색 조건이 모두 만족할 때
OR 조건 중 하나라도 만족할 때

select empno, ename, hiredate, sal from emp
where hiredate >= '820101' and sal >= 2000;

--sal 100 이상이며 comm < 1000 이하 또는 없는 사람들
select * from emp where sal >= 1000 and comm <1000 or comm is null;
--or때문에 때문에 or가 null 인게 다 출력되어버린다. 
select * from emp where sal >= 1000 and (comm <1000 or comm is null);
--and or 같이 쓸때는 이렇게 괄호로 묶기

 

 

정렬

ORDER BY 기준컬럼명 또는 컬럼 번호(옵션);
오름차순: ASC(default) 내림차순: DESC
sql 문에서 가장 마지막에 적어야 함.

select * from emp order by ename desc;
--sal >= 1500, sal 기준 오름차순
select * from emp where sal >= 1500 order by sal;
select * from emp order by deptno asc, sal desc; --deptno로 1차 정렬, 그안에서 sal로 내림차 2차 정렬
select empno, ename, sal, deptno from emp order by 4,3; --dptno(4)로 먼저 정렬하고 그 안에서 sal(3)으로 2차 정렬

 

 

집합 연산자

UNION: 합집합: 두 집합의 결과 합쳐서 제공. 중복 값 제거하고 정렬.

UNION ALL: 합집합+ : 두 집합의 결과 합쳐, 중복제거 안 하고 정렬 안 함

INTERSECT: 교집합: 두 집합의 중복되는 값만 가져오고 정렬.

MINUS: 차집합: 두 집합의 차집합 결과를 가져옴. 정렬. (집합 작성 순서가 중요. 앞에 있는 거에서 뒤에 거를 뺀 나머지)

연산자 사용 시 주의 사항

두 집합의 select 절에 오는 컬럼 수, 데이터 타입이 동일해야 함.

두 집합의 컬럼 명은 달라도 상관없음.

--합집합
select studno, name, deptno1, 1 
from student where deptno1 = 101 --1은 합쳐졌는지 확인 겸
union 
select profno, name, deptno, 2 
from professor where deptno=101;

--중복 비교
select studno, name, deptno1, deptno2 from student where deptno1 =101
union 
select studno, name, deptno1, deptno2 from student where deptno2 =201;

--교집합 intersect
select * from student where deptno1 = 101
intersect 
select * from student where deptno2 = 201;

--차집합 minus. 앞에는 큰 집합 뒤에는 작은 집합
select empno, ename, sal from emp
minus
select empno, ename, sal from emp where sal > 2500;
    'Database' 카테고리의 다른 글
    • [MySQL] Day 05: 쿼리문 정리
    • [SQL] Day02(Note + Code)
    • [SQL] Day01 연습문제
    • [SQL] Day01_2 (Note + Code)

    티스토리툴바