window 환경의 HeidiSQL에 대응되는 DB 관리 툴을 찾다가 발견했다.
% brew install --cask dbeaver-community
brew
를 통해 설치할 수 있다.
사진의 아이콘을 클릭하여 DB 서버에 접근할 수 있다.
사용 중인 DB 서버를 선택한다.
Database:
생성해둔 Database 이름을 적어준다
터미널 환경에서 use 데이터베이스 이름
입력과 같은 원리다
- 당연하게도 터미널 환경에서 DB 서버에 접속하여 Database를 만들어둔 상태여야 한다
- 아래의 사용자 이름 및 비밀번호도 마찬가지
Username / Password:
해당 Database에 접근 권한이 있는 계정명과 비밀번호를 입력해준다
Server Time Zone:
DB를 다루면서 기록되는 시간의 기준점을 설정한다
Asia/Seoul 이 있으니 찾아서 설정한다
Test Connection:
말 그대로 연결 테스트 버튼이다
최초 테스트 커넥션 시에 오류가 나올 수 있다
화면에 나올 드라이버 설치
를 해주면 즉시 해결된다
책의 초장에 '사용 테이블'이 명시되어 있다.
정말 간단한 구조지만 나는 이마저도 귀찮았으며, 이를 위한 쿼리를 검색하는 일도 귀찮았다.
한빛미디어 홈페이지에서 쿼리를 찾았다
/* Statement 1.
EMP 테이블의 상위 테이블이 될 DEPT 테이블 생성*/
create table dept(
deptno number(2,0),
dname varchar2(14),
loc varchar2(13),
constraint pk_dept primary key (deptno)
);
/* Statement 2.
DEPT 테이블에 대한 외래 키 참조가 있는 EMP 테이블 생성.
외래 키를 사용하려면 EMP 테이블의 DEPTNO가 DEPT 테이블의 DEPTNO 열에 있어야 합니다.*/
create table emp(
empno number(4,0),
ename varchar2(10),
job varchar2(9),
mgr number(4,0),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2,0),
constraint pk_emp primary key (empno),
constraint fk_deptno foreign key (deptno) references dept (deptno)
);
/* Statement 3. DEPT 테이블에 행을 삽입 */
insert into DEPT (DEPTNO, DNAME, LOC)
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');
/* Statement 4.
TO_DATE 함수를 사용하여 EMP 행 삽입 */
insert into emp
values(
7839, 'KING', 'PRESIDENT', null,
to_date('17-11-1981','dd-mm-yyyy'),
5000, null, 10
);
insert into emp
values(
7698, 'BLAKE', 'MANAGER', 7839,
to_date('1-5-1981','dd-mm-yyyy'),
2850, null, 30
);
insert into emp
values(
7782, 'CLARK', 'MANAGER', 7839,
to_date('9-6-1981','dd-mm-yyyy'),
2450, null, 10
);
insert into emp
values(
7566, 'JONES', 'MANAGER', 7839,
to_date('2-4-1981','dd-mm-yyyy'),
2975, null, 20
);
insert into emp
values(
7788, 'SCOTT', 'ANALYST', 7566,
to_date('13-JUL-87','dd-mm-rr') - 85,
3000, null, 20
);
insert into emp
values(
7902, 'FORD', 'ANALYST', 7566,
to_date('3-12-1981','dd-mm-yyyy'),
3000, null, 20
);
insert into emp
values(
7369, 'SMITH', 'CLERK', 7902,
to_date('17-12-1980','dd-mm-yyyy'),
800, null, 20
);
insert into emp
values(
7499, 'ALLEN', 'SALESMAN', 7698,
to_date('20-2-1981','dd-mm-yyyy'),
1600, 300, 30
);
insert into emp
values(
7521, 'WARD', 'SALESMAN', 7698,
to_date('22-2-1981','dd-mm-yyyy'),
1250, 500, 30
);
insert into emp
values(
7654, 'MARTIN', 'SALESMAN', 7698,
to_date('28-9-1981','dd-mm-yyyy'),
1250, 1400, 30
);
insert into emp
values(
7844, 'TURNER', 'SALESMAN', 7698,
to_date('8-9-1981','dd-mm-yyyy'),
1500, 0, 30
);
insert into emp
values(
7876, 'ADAMS', 'CLERK', 7788,
to_date('13-JUL-87', 'dd-mm-rr') - 51,
1100, null, 20
);
insert into emp
values(
7900, 'JAMES', 'CLERK', 7698,
to_date('3-12-1981','dd-mm-yyyy'),
950, null, 30
);
insert into emp
values(
7934, 'MILLER', 'CLERK', 7782,
to_date('23-1-1982','dd-mm-yyyy'),
1300, null, 10
);
/* Statement 5.
DEPT 테이블 DEPTNO의 기본 키와 EMP 테이블의 DEPTNO 외래 키를 기반으로 하는 DEPT와 EMP 테이블 간의 단순 조인 구문으로 입력된 값 확인 */
select ename, dname, job, empno, hiredate, loc
from emp, dept
where emp.deptno = dept.deptno
order by ename;
/* 아래와 같은 값이 조회됨
ENAME DNAME JOB EMPNO HIREDATE LOC
ADAMS RESEARCH CLERK 7876 23-MAY-87 DALLAS
ALLEN SALES SALESMAN 7499 20-FEB-81 CHICAGO
BLAKE SALES MANAGER 7698 01-MAY-81 CHICAGO
CLARK ACCOUNTING MANAGER 7782 09-JUN-81 NEW YORK
FORD RESEARCH ANALYST 7902 03-DEC-81 DALLAS
JAMES SALES CLERK 7900 03-DEC-81 CHICAGO
JONES RESEARCH MANAGER 7566 02-APR-81 DALLAS
KING ACCOUNTING PRESIDENT 7839 17-NOV-81 NEW YORK
MARTIN SALES SALESMAN 7654 28-SEP-81 CHICAGO
MILLER ACCOUNTING CLERK 7934 23-JAN-82 NEW YORK
SCOTT RESEARCH ANALYST 7788 19-APR-87 DALLAS
SMITH RESEARCH CLERK 7369 17-DEC-80 DALLAS
TURNER SALES SALESMAN 7844 08-SEP-81 CHICAGO
WARD SALES SALESMAN 7521 22-FEB-81 CHICAGO
*/
/* Statement 6.
SQL 문의 GROUP BY 절은 그룹화되지 않은 열의 집계 함수를 허용합니다.
조인은 내부 조인이므로 직원이 없는 부서는 표시되지 않습니다. */
select dname, count(*) count_of_employees
from dept, emp
where dept.deptno = emp.deptno
group by DNAME
order by 2 desc;
/* 그 외 테이블 생성 */
CREATE TABLE T1 (ID INTEGER);
INSERT INTO T1 VALUES (1);
CREATE TABLE T10 (ID INTEGER);
INSERT INTO T10 VALUES (1);
INSERT INTO T10 VALUES (2);
INSERT INTO T10 VALUES (3);
INSERT INTO T10 VALUES (4);
INSERT INTO T10 VALUES (5);
INSERT INTO T10 VALUES (6);
INSERT INTO T10 VALUES (7);
INSERT INTO T10 VALUES (8);
INSERT INTO T10 VALUES (9);
INSERT INTO T10 VALUES (10);
CREATE TABLE T100 (ID INTEGER);
insert into t100 values (1);
insert into t100 values (2);
insert into t100 values (3);
insert into t100 values (4);
insert into t100 values (5);
insert into t100 values (6);
insert into t100 values (7);
insert into t100 values (8);
insert into t100 values (9);
insert into t100 values (10);
insert into t100 values (11);
insert into t100 values (12);
insert into t100 values (13);
insert into t100 values (14);
insert into t100 values (15);
insert into t100 values (16);
insert into t100 values (17);
insert into t100 values (18);
insert into t100 values (19);
insert into t100 values (20);
insert into t100 values (21);
insert into t100 values (22);
insert into t100 values (23);
insert into t100 values (24);
insert into t100 values (25);
insert into t100 values (26);
insert into t100 values (27);
insert into t100 values (28);
insert into t100 values (29);
insert into t100 values (30);
insert into t100 values (31);
insert into t100 values (32);
insert into t100 values (33);
insert into t100 values (34);
insert into t100 values (35);
insert into t100 values (36);
insert into t100 values (37);
insert into t100 values (38);
insert into t100 values (39);
insert into t100 values (40);
insert into t100 values (41);
insert into t100 values (42);
insert into t100 values (43);
insert into t100 values (44);
insert into t100 values (45);
insert into t100 values (46);
insert into t100 values (47);
insert into t100 values (48);
insert into t100 values (49);
insert into t100 values (50);
insert into t100 values (51);
insert into t100 values (52);
insert into t100 values (53);
insert into t100 values (54);
insert into t100 values (55);
insert into t100 values (56);
insert into t100 values (57);
insert into t100 values (58);
insert into t100 values (59);
insert into t100 values (60);
insert into t100 values (61);
insert into t100 values (62);
insert into t100 values (63);
insert into t100 values (64);
insert into t100 values (65);
insert into t100 values (66);
insert into t100 values (67);
insert into t100 values (68);
insert into t100 values (69);
insert into t100 values (70);
insert into t100 values (71);
insert into t100 values (72);
insert into t100 values (73);
insert into t100 values (74);
insert into t100 values (75);
insert into t100 values (76);
insert into t100 values (77);
insert into t100 values (78);
insert into t100 values (79);
insert into t100 values (80);
insert into t100 values (81);
insert into t100 values (82);
insert into t100 values (83);
insert into t100 values (84);
insert into t100 values (85);
insert into t100 values (86);
insert into t100 values (87);
insert into t100 values (88);
insert into t100 values (89);
insert into t100 values (90);
insert into t100 values (91);
insert into t100 values (92);
insert into t100 values (93);
insert into t100 values (94);
insert into t100 values (95);
insert into t100 values (96);
insert into t100 values (97);
insert into t100 values (98);
insert into t100 values (99);
insert into t100 values (100);
근데 문제는 이걸 넣어도 오류가 난다.
keyword
들이 사라졌거나 변경된 모양이다.
그래서 그냥 쿼리를 직접 찾아서 입력해볼 것이다.
DBeaver는 GUI를 가지고 있다.
하지만 쿼리를 공부하는 이상 기본적인 것부터 손에 익히는 게 좋을 것 같다.
쿼리를 써서 data를 입력할 것이다.
데이터베이스는 생성되어 있는 상태이므로 이 다음은 테이블을 생성하면 된다.
테이블을 생성하면서 칼럼(열)도 함께 생성할 것이다
# dept라는 이름의 테이블을 생성한다
CREATE TABLE dept(
# 테이블 내에 칼럼 생성
# 칼럼명 자료형(크기)
deptno int,
dname varchar(100),
loc varchar(100),
# pk 설정은
# 제약조건키워드 제약조건이름 PRIMARY KEY (지정할 칼럼명)
CONSTRAINT pk_dept PRIMARY KEY (deptno)
);
이 내용을 DBeaver의 스크립트 편집기에서 실행하면 테이블과 칼럼이 생성된다.
스크립트 편집기는 아래의 이미지 파일 참조하여 열기
아래의 화면처럼 쿼리를 입력하고 스크립트 실행버튼을 눌러 준다.
쿼리 스크립트가 실행되었음을 알려주는 상태창을 볼 수 있다.
물론 이 작업을 CLI에서 실행해도 문제 없다.
Database Navigator
탭에서 방금 생성했던 테이블의 정보가 나오지 않는다면 우클릭 -> 새로고침
을 해주면 볼 수 있다.
이 방법을 계속 반복하여 예제 Database를 만들 것이다.
int()
나 varchar()
내부의 괄호는 크기를 적는 것으로 알고 있는데, 책을 보여 실습하는 데에는 그냥 숫자를 넉넉하게 잡아 넣어줘도 문제가 없을 것이라 생각한다.
계속해본다.
CREATE TABLE emp(
empno int,
ename varchar(100),
job varchar(100),
mgr int,
hiredate date,
sal int,
comm int,
deptno int,
CONSTRAINT pk_emp PRIMARY KEY (empno),
CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES dept(deptno)
);
잘 들어가는 것을 볼 수 있다.
이번에는 foreign key
즉 외부키
를 하나 넣었다.
외부키
를 생성하는 것이며 대상은 deptno
칼럼이다deptno
칼럼은 dept
테이블의 deptno
를 참조한다이렇게 하면 테이블 생성은 끝났다.
이제 실질적인 데이터(row)를 넣어줄 차례다.
가장 위의 샘플 쿼리에서 'dept' 테이블 데이터의 생성
과 관련된 insert
문들은 잘 돌아간다.
따라서 그대로 복사하여 붙여넣어도 된다.
/* Statement 3. DEPT 테이블에 행을 삽입 */
/* 이 부분은 멀쩡하게 잘 돌아갑니다 */
insert into DEPT (DEPTNO, DNAME, LOC)
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');
하지만 'emp' 테이블의 데이터는 직접 입력해야할 것 같다.
단 14행이니 참아야 한다.
일단 기본 문법 확인하기.
# insert into 테이블명(칼럼1, 칼럼2, ...)
insert into dept(deptno, dname, loc)
# values(칼럼1에 넣을 값, 칼럼2에 넣을 값, ...)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into
를 사용한다'emp' 테이블의 첫 줄만 보면...
empno | ename | job | mgr | hiredate | sal | comm | deptno |
---|---|---|---|---|---|---|---|
7369 | SMITH | CLERK | 7902 | 17-DEC-2005 | 800 | 20 |
이 한 줄만 쿼리로 입력해보겠다.
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(7369, 'SMITH', 'CLERK', 7902, 17-DEC-2005, 800, null, 20)
날짜 포맷이 문제가 되는 것 같다.
여러 방법을 찾아보고 쿼리를 넣어봤지만 오류에 막혔다.
그래서 'emp' 테이블은 DBeaver로 직접 넣기로 했다.
😩😖😣😥😭😰🥶
그림에 나온것처럼 순서대로 눌러주면 data를 입력할 수 있다.
하나씩 입력해주고 하단의 Script
버튼을 누르면 쿼리를 볼 수 있다.
내 쿼리의 문제점은 null
이었다.
공란으로 비워두기 위해서는 해당 칼럼을 제외한 나머지 칼럼에만 값을 주면 되는 것이었다.
# 내가 입력한 테이블 및 칼럼 조건
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(7369, 'SMITH', 'CLERK', 7902, '2005-12-17', 800, null, 20)
#정답
INSERT INTO emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7369, 'SMITH', 'CLERK', 7902, '2005-12-17', 800, 20)
comm
의 값을 주지 않으려고 비워둔 부분에서 Error 발생NULL
입력하면 들어간다!YYYY-MM-DD
형태로 insert
select
시 포맷팅
을 통해 DD-MON-YYYY
형태로 출력할 수 있다피벗 테이블이 남았는데 이건 아직 뭔지도 모르고 책을 읽다가 필요한 순간에 생성하고 정리하려 한다.
이로써 기본적인 실습 준비가 끝났다.
너무 오래 걸렸다.
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7369,'SMITH','CLERK',7902,'2005-12-17',800,NULL,20);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7499,'ALLEN','SALESMAN',7698,'2006-02-20',1600,300,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7844,'WARD','SALESMAN',7698,'2006-02-22',1250,500,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7844,'JONES','MANAGER',7839,'2006-04-02',2875,NULL,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7654,'MARTIN','SALESMAN',7698,'2006-09-28',1250,1400,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7698,'BLAKE','MANAGER',7839,'2006-05-01',2850,NULL,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7782,'CLARK','MANAGER',7698,'2006-06-09',2450,NULL,10);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7788,'SCOTT','ANALYST',7566,'2007-12-09',3000,NULL,20);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7839,'KING','PRESIDENT',NULL,'2006-11-17',5000,NULL,10);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7844,'TURNER','SALESMAN',7698,'2006-09-08',1500,0,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7876,'ADAMS','CLERK',7788,'2008-01-12',1100,NULL,20);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7900,'JAMES','CLERK',7698,'2006-12-03',950,0,30);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7902,'FORD','ANALYST',7566,'2006-12-03',3000,NULL,20);
INSERT INTO sqlcook.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (7934,'MILLER','CLERK',7782,'2007-01-23',1300,NULL,10);