SQL_DAY1

이정찬·2023년 1월 13일
0

SQL

목록 보기
1/4

DBMS 개요

3대 RDBMS - MySQL, Oracle DB, MSSQL
Oracle은 무겁고 비싸지만, 아주 안정적이므로 관공서나 은행에서 쓴다.
공통점 - SQL 표준을 공유한다. Data type은 조금씩 다르다.
<-> MongoDB (비정형(비구조화)데이터, Document Store Model)
테이블 자체가 정형화된 데이터이다.

양 많아지면 CSV 많이 쓴다. (엑셀은 무거움)
Database == Schema

클라이언트 - DOS, Program. GL 라이브러리

bin은 표준 폴더 이름이다. 여기 실행 파일 경로가 다 있다.

2 Tier 구조(클라이언트 - DB 서버)는 DBA, 개발자들은 보통 3 Tier(클라이언트(web, 모바일, 태블릿 등등) - 서버 - DB 서버) 구조가 된다.
중간 Middle 서버를 분리 할 수도 있다.
메인프레임(대용량 메모리, 고속처리하는 대형 컴퓨터)에서는 MySQL이 제일 많이 쓰인다.

DBMS 특징 4가지
1. 데이터의 무결성 - PK
2. 데이터의 독립성
3. 보안
4. 데이터 중복 최소화

DBMS가 열심히 발전해서 RDBMS까지 왔다.
행 = row = record
열 = column
교차 지점 = data = field

MySQL

MySQL FK는 MUL로 표기한다.

MySQL에는 curdate()라는 함수가 있다. 현재 날짜 반환해줌

INSERT INTO customer(name, birthday) VALUES ('이정찬', curdate());

VARCHAR(N)은 한글, 영어 상관 없이 N자리수 초과로는 못넣는다고 생각하자.

INSERT INTO customer VALUES (DEFAULT, '와', curdate());

DEFAULT를 넣으면 컬럼 지정 필요없다. 근데 그다지 안쓸듯

INSERT INTO customer(name, birthday) VALUES ('아이유', date_format(now(), '%Y-%m-%d'));

MySQL date_format 사용법

원래 커밋을 해야 한다. MySQL서버는 자동 커밋 지원
@@autocommit은 기본값 1, 자동커밋이 된다. 원하지 않는다면 0으로 바꾸면 된다.

SELECT @@autocommit

util - 유틸 관련된 모든 파일은 여기에 들어간다.

SOURCE C:\${파일 경로}\emp.sql
SQL 파일로 DB 만들때는 이렇게 한다.

MySQL workbench 사용법 - 56p ~ 59p

workbench -> 쿼리 전부 실행은 첫번쨰 번개 버튼
한줄씩 실행은 ctrl + enter
여러 줄 실행은 드래그 하고, ctrl + shift + enter

-- 한 줄 주석
/* 
    여러 줄 주석
*/

Filter Rows: 칸에 뭐 넣으면, 필터링 기능도 된다. 대소문자 구분 X
export, import 기능도 지원한다. -> 2차원 구조가 보장 되는 csv, json 등으로 저장 가능
csv는 엑셀로 열면 그냥 엑셀로 열린다. 메모장으로 열어야 콤마로 구분된 csv 파일의 형태를 지님
import하면 csv 읽어서 자동으로 테이블도 만들어준다.

SQL 실습

SELECTION: 전체 혹은 원하는 행을 가져오는 쿼리문 (WHERE 구문)
PROJECTION: 컬럼명을 지정해서 데이터를 가져오는 쿼리문 (의외로 시간 많이걸림)

SELECT * FROM emp; -- SELECTION, 절대 이렇게 쓰지 말자.
SELECT empno, ename, job, deptno FROM emp; -- PROJECTION

절대 불필요한 컬럼은 사용하지 않는다.
전체를 불러와서 사용하면, 노출되지 않아야 할 정보들이 노출된다.

쿼리문 실행순서: FROM 뒤의 테이블 탐색 -> 조건에 해당하는 행 탐색(WHERE) -> 조건에 해당하는 열 탐색(SELECT)

ORDER BY ASC | DESC (오름차순(기본) | 내림차순)

SELECT ename, sal, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY sal DESC;
SELECT ename, sal, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY 2 DESC;
  • 이 2개의 쿼리문은 동일하게 작동한다. ORDER BY 2가 두번째 컬럼 기준으로 정렬 해달라는 뜻이다. 제로베이스가 아니라는 것에 주의.

column에 연산이 들어가면, 무조건 AS 써준다.

SELECT ename, sal AS s, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY s DESC;
SELECT ename, sal s, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY s DESC; 
-- AS 없어도 작동은 된다. 실제로 많이들 쓰신다.
SELECT ename, sal 기본 급여, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY sal DESC; 
-- 이건 안된다. 기본_급여라고 쓰던가 "기본 급여" 라고 쓰자. 근데 이건 정렬은 안됨.
  • 이것도 역시 동일하게 작동한다. AS로 바꿔준 column name으로도 ORDER BY 가능 FROM, WHERE, SELECT 순으로 실행하고 맨 마지막에 ORDER BY를 하므로 실행이 되는 것이다.

  • AS로 소문자, 특수문자, 공백 등을 구분하고 싶을 때는 반드시 큰따옴표로 묶어주자. 그러나, ORDER BY 뒤에는 못온다.


SELECT DISTINCT(deptno) FROM emp ORDER BY 1;
  • DISTINCTSELECT 바로 뒤에 와야 한다. 중복제거에 쓰임

SQL에서 NULL은 자격없음, 미확정(Unknown)을 의미한다. 0이나 공백을 의미하는 것이 아닌 일종의 값
NULL은 연산, 비교가 불가능하다.
Oracle DB에서 NULL은 가장 큰 값이다. MySQL은 가장 작은 값.
NULL 값을 연산하기 위해서는 ifnull() 함수를 이용해야 한다. is nullis not null로 구분한다.

SELECT ename, (sal + 100) * 2 AS 증가급여 FROM emp ORDER BY 증가급여 DESC;
SELECT ename, (sal + 100) * 2 AS 증가급여, (sal + 100) * 24 AS "AnnualSalary" FROM emp;
  • NULL이 아니라면 이런 연산이 가능하다.
SELECT ename, sal * 12 + IFNULL(comm, 0) AS "AnnualSalary" FROM emp;
SELECT ename, sal * 12 + ifnull(comm, 0) AS "AnnualSalary", comm FROM emp 
	WHERE comm IS NOT NULL ORDER BY comm DESC;
  • NULL이 있다면, 이런식으로 NULL일시 0으로 바꿔주고 연산하면 된다.
  • IS NOT, !=, <> 은 모두 같지만, NULL은 비교가 안되기 때문에 비교연산자를 못 쓴다.
profile
개발자를 꿈꾸는 사람

0개의 댓글