Programming/SQL 34

SQL의 group by 절의 사용이유. 2022-10-11

*공부정리 * group by 절은 집계함수를 사용하여 특정 칼럼 기준으로 select할때 용이함. 만약 group by 절을 쓴다면, group 화한 칼럼이 select 절에 존재 해야 함. 아래예시에서 semester가 무조건 select 에 존재해야함. group by 절에서의 조건은 having 절을 쓰는데 이 having 절의 뒤에는 '집계함수'가 조건으로 와야함. 일반적인 칼럼의 조건은 where 절에 주어야 함. 순서 from (테이블 명) - where(칼럼의 조건) - group by(그룹화할 칼럼) - having( 그룹화할 칼럼 각각 적용될 테이블속 칼럼의 집계함수 조건) -> select dept_name, count(course_id) from course group by dept..

Programming/SQL 2022.10.11

MariaDB를 shell 에서 CLI 환경으로 테이블 설정과정. 2022-09-27

우선적으로, 노트북에는 OS가 window라 WSL2 를 이용한 UBUNTU 20.04 LTS 버전으로 리눅스 shell을 사용하였다. shell 에서 기본적으로 ssh 명령어를 통해 접속하였다. 또한 mysql –u user_201912344 –p 명령어를 통해 Mysql에 접속하였다. 또한 Show databases를 통해 내 테이블(스키마)가 존재하는지 확인하였다. *error 현황: 그 다음에 나는 새로운 연습용(practice_SQL1) 데이터베이스를 만들려고 create database 명령어를 입력했는데, 다음과 같은 에러가 나왔다. 확인해보니 해당 에러는 루트 서버로 접속한게 아니라서, DB를 생성할 권한이 없어서 나오는 애러였다. *error 해결 : 그냥 스키마(DB)를 새로 만들어서 ..

Programming/SQL 2022.09.27

SQL developer에 사용자 계정 추가하기.+ 스키마 개념. 2021-08-26

우선 내가 궁금했던 점은, 분명 오라클 서버에 난 "NEWLEC"이라는 계정을 처음 SQL Developer를 설치할때 사용자 계정으로 만들어서 MEMBER, NOTICE등의 테이블등을 만들었다. 그럼, 만약 내가만든 테이블들을 다른 사람과 공유해서 쓰고 싶다면, 어떻게 해야할까? 처음 내가 생각한 가설은, 같은 접속 서버 PDB계정에 새로운 사용자를 하나 만든뒤에, 기본저장공간과, 임시저장공간을 각각, NEWLEC이 쓰는 테이블 스페이스랑 똑같이 맞춰주면 되지 않을까..?? 였다. 아래에보이는 두 항목을, 내가 공유해서 쓰고자하는 "NEWLEC"계정의 테이블 스페이스랑 동일하게 설정한다면, 같은 공간을 쓰는 것이니, 안의 데이터들도 서로공유되지 않을까?? 였다. 그런데 문제가 생겼다,,!! 사용자 이름..

Programming/SQL 2021.08.26

엔티티 제약조건,(primary key, unique). 시퀀스. 2021-08-24

오라클의 제약조건에는 총 도메인 제약조건, 엔티티 제약조건, 릴레이션 제약조건 등이 있다. 전에배웠던 not null, default, check 제약조건 등은 도메인 제약조건이고, 오늘 배울 primary key, unique는 엔티티 제약조건의 일종이다. 이 제약조건을 간단히 설명하자면 "레코드를 추가할때, 중복된 내용이 오지 못하도록 제약하는것" 이다. primary key, unique 모두 이 특성을 공통으로 가지고 있고 차이점이라면, primary key는 중복 제거가 주 목적이 아니라 "해당 레코드를 식별할수 있는 유일한 키"가 주 목적이기 때문에 null 값은 올 수 없다. 우선 새로운 개념의 적용을 위해 DDL 구문인 CREATE로 새 테이블을 만들었다. CREATE table "test..

Programming/SQL 2021.08.24

정규식 체크 제약조건, 체크 제약조건을 편집툴이 아닌 DDL 쿼리로 넣기.2021-08-18

이전 포스팅 에서는 PHONE의 체크 제약조건으로 단순 패턴비교 연산자를 활용하였다. 하지만 조금더 정교한 비교를 위해서 정규식을 활용해보자. 제약조건을 걸때는 간단하게 테이블 편집기도 사용 가능하지만, 연습하는 의미에서 DDL 쿼리로 직접 만들어 보겠다. ALTER table member modify phone nvarchar2(20) check(REG_EXP(PHONE,"$010-%d{4}-%d{4}^"); 이렇게 ALTER 쿼리를 활용해서 기존의 체크 제약조건을 바꾸어 보았다. 안된다.. 이럴줄 알았다... 편집기 도구에 익숙해져서 쿼리치는 법을 까먹었다...이러면 안된다. **내가 이런식으로 쿼리를 잘못 작성하게 된 이유 후술. 다시 처음부터 차근차근 실행 해 보자. 새로운 제약조건은 칼럼에 주기..

Programming/SQL 2021.08.18

데이터 딕셔너리, 도메인 제약조건 2021-08-17

우선 데이터 딕셔너리란 무엇이냐면, user, all, table 이 3가지 범주로 나누어서, 해당 주체가 가진 테이블 등을 뷰 형태로 볼 수 있는 정보이다. DBMS 내부에 자체적으로 포함되어 있는 정보라고 생각하면 된다. 조금더 정확히 설명하자면, 사용자 계정을 통해 사용자가 DBMS에 접근해서 어떤 테이블을 가져오려고 할때, DBMS는 이런 사용자가 만든 테이블의 위치, 크기 등을 알고 있어야 한다. 이렇게 사용자 서비스를 위한 정보들을 저장하고 있는 것이 데이터 딕셔너리 이다. 또 내가 그 전 포스트에서도 강조하다시피 DBMS는 사용자계정 별로 테이블을 저장하기 때문에, 사용자 의 정보 저장이 중요하다. 또한 이 데이터 딕셔너리는 해당 사용자의 정보를 그대로 보여주는것이 아니라, 뷰 형식으로 보여..

Programming/SQL 2021.08.17

UNION, VIEW. 2021-08-13

우선 union 이라는 개념은 집합 개념이라고 생각하면 쉽다. 일단 union의 종류에는 총 4가지가 있다. 바로 union, union all, intersect, minus 드이 있다. 차례대로, 합집합, 중복을 허용하는 합집합, 교집합, 차집합 으로 설명 가능하다. 또한 집합연산의 대상이 되는 테이블은union 연산자 기준 앞에서 선별된 테이블 들이다. select * from member union select * from student; 이렇게 쿼리를 작성하면, member 테이블의 레코드들과 student 테이블의 레코드 들이 '공통된 부분'을 제외하고 합쳐진다. 그런데 조건이 있다. 각 합쳐지는 레코드들의 칼럼 수가 서로 같아야 한다. 왜냐하면, join 키워드는 테이블 두개를 통채로 서로 ..

Programming/SQL 2021.08.13

외부 조인을 활용한 게시글 수 집계, self 조인. 2021-08-12

일단 저번 포스트에서 보다싶이 나는 member 테이블과 notice 테이블을 만들었다. 이번에는 외부조인이 실질적으로 어떻게 활용되는지 보이겠다. 우선, 내부조인(inner join)을 활용해서 게시물 수를 검색해보자. select m.name,count(n.writer_id) from member m inner join notice n on m.name=n.writer_id group by m.name; --count함수 안에 집계하는 칼럼으로는 조인된 테이블의 칼럼의 필드중 무엇이든 올수 있다. --그러나 집계의 기준, 분류의 기준이되는 group by 의 인자로는 무조건 member테이블의 칼럼이 와야한다. --왜냐하면, 인저사항 별, 그 사람의 게시글수를 집계하는것이 목적이기 때문이다. 어? 그..

Programming/SQL 2021.08.12

INNER 조인,outer 조인, 관계형 데이터 베이스. 2021-08-11

우선 DBMS가 발달하기 전에는 데이터베이스중 일부 칼럼이 중복되더라도 각 각 다른곳에 저장했다. 그런데 단점은, 메모리가 너무 많이 잡아먹는 다는 것이고 결함, 실시간 씽크 등의 무결성 측면에서 문제가 되기 때문에, 공통의 부분은 잘라내고 꼭 필요한 부분만 잘라서 따로따로 DBMS가 관리해주기 시작했다. 이것은 내 오라클 첫 포스트에도 설명했던 관계형 데이터베이스의 탄생 내용이다. 이렇게 각각 따로 나누어서 공통된 부분을 서로 참조관계로만 묶여있던 테이블들을 테이블들을 원래대로 합치는 기능을 하는 것이 바로 조인(join) 이다. 간단하게 그림으로 보여주자면, ID 생년월일 글쓴이. 내용, 최동훈 000.131 최동훈 jdbc의 이해... 최동훈 000.131 최동훈 헬스장을 갔다..... 최동훈 00..

Programming/SQL 2021.08.11

구절의 순서와 페이징(서브쿼리 사용), 순위함수ROW_NUMBER() ,HAVING, 서브쿼리. 2021-08-10

우선 나는 HIT 칼럼을 기준으로 내림차순 정렬을 한 뒤에, ROWNUM을 붙이고 싶다. select ROWNUM, member.* from member where rownum between 1 and 5 order by hit desc; 그래서 이런 쿼리를 썼더니 결과는 정렬된 기준으로 ROWNUM이 붙은 것이 아닌, 정렬하기 전 기준으로 붙여져서 뒤죽박죽이 된다. 이런 문제를 해결할려면 어떻게 해야 할까? 두가지 방법이 있는데 그떄 페이징 할때 처럼 서브쿼리로 미리 정렬된 테이블에 ROWNUM을 붙이던가, 아니면 순서함수인 ROW_NUMBER()을 사용하면 된다. 서브쿼리를 이용해서 미리 줄세워 놓은 테이블에 ROWNUM을 붙이는 방법. select rownum, m.* from (select * f..

Programming/SQL 2021.08.10