Oracle

SELECT * FROM TABS;
SELECT * FROM ALL_TAB_COLUMNS;

 

MySQL

SELECT * FROM INFORMATION_SCHEMA.TABLES;
SELECT * FROM INFORMATION_SCHEMA.COLUMNS;

 

두 DBMS에서 가장 큰 차이점은 Oracle의 경우, 'TABS','ALL_TAB_COLUMNS'와 같은 이름으로 바로 조회가 가능하지만

MySQL에서는 INFORMATION_SCHEMA라는 DB명과 그에 맞는 이름을 사용하여 조회를 해야 한다.

Oracle에서는 문자열은 ||을 사용하여 합치면 된다.

 

예시 

select ('2021-01-01' || ' ~ ' || '2021-01-02') as resultDate from dual;

 

MySQL은 CONCAT함수를 사용하여 합쳐야 한다

 

예시

select concat('2021-01-01','2021-01-02') as resultDate from dual;

 

추가적으로 MySQL은 CONCAT_WS([구분자], [인자값1], [인자값2], [인자값3],...)의 함수도 존재한다.

 

예시

select concat_ws(' ','서울특별시','중구','세종대로') as result from dual;

 

 

Oracle에서도 CONCAT함수를 제공한다. 그러나 인자값을 2개만 쓸 수 있으므로 불편한 상황이 발생한다.

 

예를 들면, 기존 SQL에 내용을 추가하게 될 때, 아래 예시 같이 쿼리의 가독성이 떨어지게 된다.

 

따라서, 몇 번의 추가적인 내용이 더 생기게 된다면 쿼리가 무엇을 합치려는지 쉽게 알 수가 없기 때문에 CONCAT함수보다는 ||의 사용을 더 선호한다.

 

예시

SELECT CONCAT('서울시','중구') FROM DUAL;
SELECT CONCAT(CONCAT('서울시','중구'),'세종대로') FROM DUAL;

 

인덱스 용량을 구하되, 해당 인덱스에 특정 컬럼이 포함된 인덱스만 추출하여 인덱스 용량을 계산함

 

SELECT 
    B.TABLE_NAME
    , A.SEGMENT_NAME
    , ROUND(SUM(BYTES)/1024/1024) "SIZE_MB"
    , A.SEGMENT_TYPE
FROM USER_SEGMENTS A, USER_INDEXES B
WHERE A.SEGMENT_NAME = B.INDEX_NAME
AND A.SEGMENT_TYPE IN ('INDEX','INDEX PARTITION')
AND B.TABLE_NAME IN ([테이블명])
AND B.INDEX_NAME IN (
                    SELECT INDEX_NAME 
                    FROM USER_IND_COLUMNS
                    WHERE COLUMN_NAME = [컬럼명]
                    AND TABLE_NAME IN ([테이블명])

                   )
GROUP BY B.TABLE_NAME, A.SEGMENT_NAME, A.SEGMENT_TYPE
;

 

SELECT 문법에서 DBMS에 따라 WHERE에 정규식을 사용하여 데이터를 조회할 수 있다.

 

오라클의 경우 REGEXP_LIKE 함수를 MySQL의 경우 REGEXP 함수를 사용한다.

 

 

ORACLE 10G

SELECT * FROM [테이블명] WHERE REGEXP_LIKE([컬럼명], [정규식]);
SELECT * FROM [테이블명] WHERE NOT REGEXP_LIKE([컬럼명], [정규식]);

 

ORACLE 11G에서는 REGEXP_COUNT 함수가 추가 되었다.

SELECT * FROM [테이블명] WHERE REGEXP_COUNT([컬러명], [정규식] ) > 0;

 

사용 예시

SELECT *
FROM MEMBER
WHERE REGEXP_LIKE(NAME, '[a-z] | [A-Z]');

SELECT *
FROM MEMBER
WHERE NOT REGEXP_LIKE(NAME, '[a-z] | [A-Z]');

SELECT *
FROM MEMBER
WHERE REGEXP_COUNT(NAME, '[a-z] | [A-Z]') > 0;

SELECT *
FROM MEMBER
WHERE REGEXP_COUNT(NAME, '[a-z] | [A-Z]') < 0;

 


MySQL

SELECT * FROM [테이블명] WHERE [컬럼명] REGEXP([정규식] );
SELECT * FROM [테이블명] WHERE [컬럼명] NOT REGEXP([정규식] );

 

사용 예시

SELECT *
FROM MEMBER
WHERE NAME REGEXP('[a-z] | [A-Z]');

SELECT *
FROM MEMBER
WHERE NAME NOT REGEXP('[a-z] | [A-Z]');

 

'데이터베이스' 카테고리의 다른 글

[SQL] 문자열 합치기  (0) 2021.01.15
[SQL]Oracle 인덱스 용량 계산  (0) 2021.01.14
[SQL] 기본 SQL  (0) 2021.01.11
[SQL] 매주 특정 요일의 날짜를 SQL로 계산하기  (0) 2020.12.23
[SQL Template] paging, grid template  (0) 2020.02.04

+테이터베이스 

    - 데이터베이스 목록보기

    show databases;

 

    - 테이터베이스 생성

    create database [테이터베이스명];

 

    - 테이터베이스 삭제

    drop database [테이터베이스명];

 

    - 데이터베이스 사용하기

    use [테이터베이스명];



+테이블

    - 테이블 생성

    create table [테이블명]{

        [컬럼명] [테이터타입] [제약조건]

    };

 

    - 테이블 삭제

    drop table [테이블명];

 

    - 테이블 조회 

    select [컬럼명]

    from [테이블명];

 

    - 데이터 추가

    insert into [테이블명] ( [컬럼명] )

    values ( [데이터] );

 

    - 데이터 삭제

    delte from [테이블명] 

    where [조건];

 

    - 데이터 수정

    update [테이블명]

    set [컬럼명] = [데이터]

    where [조건];

Oracle의 경우, next_day()함수를 사용하면 쉽게 구할 수 있다.

--1:일요일, 2:월요일, 3:화요일, 4:수요일, 5:목요일, 6:금요일, 7:토요일
SELECT
NEXT_DAY(SYSDATE,1)
FROM
DUAL;

 

Mysql의 경우, NEXT_DAY()함수가 존재하지 않기 때문에 별도의 쿼리를 작성하여야 한다.

--0: 일요일, 1: 월요일, 2: 화요일, 3:수요일, 4:목요일, 5:금요일, 6:토요일
SELECT 
CASE
	WHEN T1.choiceDay > date_format(sysdate(),'%w') THEN ADDDATE(SYSDATE(),( T1.choiceDay - date_format(sysdate(),'%w')))
	ELSE ADDDATE( SYSDATE(), (7-date_format(sysdate(),'%w')+T1.choiceDay))
END as resultDay
FROM
( SELECT 6 AS choiceDay FROM DUAL )T1
;

 

오라클은 일요일이 1에서 시작하고, Mysql은 일요일이 0에서 시작하기 때문에 이 부분에 대해서는 유의해야 한다.

'데이터베이스' 카테고리의 다른 글

[SQL] 정규식을 사용한 Select 조회  (0) 2021.01.13
[SQL] 기본 SQL  (0) 2021.01.11
[SQL Template] paging, grid template  (0) 2020.02.04
[SQL] INSERT VALUES((SELECT))  (0) 2016.06.03
MariaDB Connector  (0) 2014.11.17

MyBatis 사용 시, 페이징이나 그리드를 위한 쿼리문 템플릿 예시

 

-- selectData에는 실제 사용될 쿼리문을 사용

<sql id=”selectData”>

 실제 사용될 쿼리문

</sql>

 

-- selectDataList에는 한 페이지에 표시될 내용을 출력

-- ( ※ startNum과 endNum은 VO에 값이 있어야 오류 없이 사용 가능 )

-- 예시 : startNum : 1, endNum : 10이면 총 10개의 row로 구성된 내용을 출력 

<select id=”selectDataList” parameterType=”” resultType=””>

select 

       A.*

    from (

        select rownum rn

          ,A.*

        from (

          <include refid="selectData"/>

          )A

     where 1=1

    ) A

where 1=1

and   rn >=#{startNum} and rn &lt;=#{endNum}

</select>

 

-- selectDataListCount에는 쿼리문에 대한 전체 개수 출력

<select id="selectDataListCount" parameterType="" resultType="int">

    select 

           count(1) cnt 

    from   (

        <include refid="selectData"/>

    )

 </select>

 



INSERT INTO TABLE_NAME VALUES('COLUMN_1','COLUMN_2','COLUMN_3');


일반적인 INSERT문을 사용하면서 COLUMN_1에 자동으로 증가하는 값으로 INSERT를 해야되는 경우,



먼저,


SELECT MAX(COLUMN_1) FROM TABLE_NAME



위와 같이 컬럼의 최대값을 획득하면서 +1 하면서 입력이 되어야 한다.


따라서, 최종적으로


INSERT INTO TABLE_NAME

VALUES ( (SELECT MAX(COLUMN_1) FROM TABLE_NAME) + 1

             , 'COLUMN_2'

             , 'COLUMN_3');


위와 같은 형태로 입력하여, COLUMN_1에 자동으로 최대값을 입력하면서 INSERT가 된다.







MariaDB jdbc

 - MySQL 개발자가 만든 MariaDB다 보니 MySql jdbc파일을 이용하여 무관하였으나,

 - 현재 MariaDB 용 jdbc 파일을 홈페이지에서 다운 받을 수 있으니, 해당 파일을 활용.

 - 홈페이지 주소 : https://downloads.mariadb.org/client-java/



Maria DB  Driver Class

 - 이전에 mysql jdbc 파일을 사용하였을 경우, com.mysql.jdbc.Driver를 입력하여 사용하였으나,

 - 현재 MariaDB jdbc 파일을 사용할 경우, org.mariadb.jdbc.Driver를 입력하여 사용하여야 한다.


MariaDB Connection

 - MySQL jdbc 사용 시, jdbc:mysql://<host>:<port>/<database>

 - MaraiDB jdbc 사용 시, jdbc:mariadb://<host>:<port>/<database>



사용 예시

Class.forName("org.mariadb.jdbc.Driver");

Connection c = DriverManager.getConnection("jdbc:mariadb://localhost:3306/database","root","root");

PreparedStatement ps = c.prepareStatement("select * from table");

ResultSet rs = ps.executeQuery();

rs.close();

ps.close();

c.close();



CLOB 컬럼에 많은 내용이 저장 되어있을 경우,


SELECT문을 사용하여도 모든 내용이 표시되지 않는다.


그 이유는, 오렌지에 Default로 사이즈가 80 Byte로 잡혀있기 때문이다.


따라서, 사이즈를 변경해야만 많은 내용을 표기 할 수 있다.


Option -> Options -> Database 탭으로 이동


Long Size 항목의 값을 변경한다.


최대 32000 Byte까지 설정 가능하다.


32000 Byte를 넘을 경우, Loader를 사용하여 엑셀로 출력해볼것을 권함.



추가 LOB 설명

오라클 8 버전 이후 부터 제공되는 LOB 타입이 있다.


LOB(Large Object) 타입은 대용량 데이터를 저장하기 위한 타입이며, 종류는 아래와 같다.


BLOB : unstructured binary large object를 저장한다.

CLOB : 싱글-바이트 또는 멀티바이트 문자 데이터를 저장한다.
NCLOB : unicode 데이터를 저장한다.
BFILE  : 데이터베이스 외부에 파일형태로 저장한다.




pgAdmin3 내용 추가

- pgAdmin의 경우, Query Editer에서 변경하지 않고, pdAdmin 프로그램에서 변경하여야 한다.

File -> Options -> Query Tool -> Query Editor 로 이동 

Max. characters per column 값이 256으로 세팅되어있고, 본인이 원하는 값으로 변경 하면 된다.
(최대값은 2147483647 인것 같음 )





'데이터베이스' 카테고리의 다른 글

[SQL Template] paging, grid template  (0) 2020.02.04
[SQL] INSERT VALUES((SELECT))  (0) 2016.06.03
MariaDB Connector  (0) 2014.11.17
[iBatis] 부등호 처리  (0) 2012.11.09
[SQL] INSERT INTO SELECT  (0) 2012.07.02