MySQL 9

[Mysql] 여러 컬럼 IN문 사용하기

보통 IN문 사용할 때, 한 컬럼에 대한 것으로 주로 검색한다. SELECT * FROM table WHERE id IN (1, 2, 3, 4) 두 컬럼이 unique한데 여러 값을 가져와야할 때는??? 예를들어 id1, id2 컬럼으로 여러 값을 가져와야한다면 아래와 같이 사용한다. SELECT * FROM table WHERE (id1, id2) IN ( SELECT id1, id2 FROM table WHERE (id1=1 AND id2=2) OR (id1=3 AND id2=4) OR (id1=5 AND id2=6) ); IN문 안에 서브쿼리로~ (id1, id2) IN ((1, 2), (3, 4))... 이런식이었으면 좋으련만 ㅋㅋ

개발/Database 2017.05.26

timestamp의 가장 큰 값

Mysql의 timestamp 컬럼을 쓰고 있는데, 큰 수의 년도를 저장하려고 시도했더니 Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: 이런 에러가 발생했다. https://dev.mysql.com/doc/refman/5.5/en/datetime.html Mysql 레퍼런스에 따르면 timestamp는 '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC. 이 시간의 범위를 저장할 수 있다고 한다. 애매한 시간인 2038년 1월 19일까지인 이유는 초를 4byte로 저장하기 때문이고, 그 max 값이 저 날짜이기 때문이다. 현재 timestamp의 가장 ..

개발/Database 2016.09.12

(MyBatis) Mysql tinyint(1) boolean이 integer로 바뀌는 현상

Mysql의 컬럼 타입 중 tinyint(1)은 0이면 false, 0보다 크면 true를 반환하므로, boolean으로 주로 사용하고 있다. query.xml SELECT test_yn FROM test LIMIT 1 DAO.java public Map selectYn() { return sqlSessionTemplate.selectList("selectYn"); } 이해하기 쉽게 boolean 컬럼 한 행을 가져오는 쿼리로 예를 들어봤다. test_yn이 tinyint(1) 이라면 나는 결과 값을 hashmap으로 받았으니 {"test_yn" : false} 이런식으로 받아질 것이고, Boolean으로 캐스팅해서 test_yn 값을 쓸 수 있다. 그런데 쿼리를 아래와 같이 바꿔보았다. SELECT t..

개발/Database 2015.09.17

특정 날짜 하루에 해당하는 데이터를 찾을 때

아래 처럼 날짜를 text box에 입력 받는다. String으로 받아서 select * from 테이블 where dttm = '2013-02-15' 조회를 해보면 데이터가 원하는대로 나오지 않는다. 기본으로 '2013-02-15 00:00:00' 이렇게 들어있기 때문이다. (2월15일의 딱 열두시 00분 00초 인 데이터를 찾는것) 그래서 전에는dttm >= '2013-02-15 00:00:00' AND dttm DTTM >= #{dttm} AND DTTM dttm에는 2013-02-15 00:00:00.0 (타임스템프) 값이 들어있다.interval 1 day로 하루가 더해지면,2013-02-15 00.00.00.0 ~ 2013-02-16 00.00.00.0 사이의 데이터가 보여지게 되는 것이다. ..

개발/Spring 2013.02.15

MySql] JOIN 속도를 빠르게! EXPLAIN, STRAIGHT_JOIN

내가 만든 웹페이지중에 엄청나게 속도가 느린 곳이 있었다.분명 DB에서 SELECT하는데 문제가 있을 것이었다. 문제의 그 쿼리는 3개의 테이블을 JOIN해서 SELECT 하는데, 매우 느렸다. 아래와 같은 방법을 써서 JOIN 하는 쿼리의 속도를 개선시켰다. 1. 쿼리의 성능을 측정(EXPLAIN) 그 쿼리가 어떻게 돌아가는지 보기 위해 EXPLAIN 을 써보았다. EXPLAINSELECT * FROM 테이블명 WHERE 조건 다음과 같은 쿼리를 실행하면, 아래와 같은 항목이 나타난다. id select type table type possible_keys key key_len ref extra 각 항목에 대한 자세한 정보는http://www.mysqlkorea.co.kr/sub.html?mcode=m..

개발/Database 2012.11.18

java + temporary table. 임시테이블 사용하기. MYSQL

임시테이블을 쓰는 경우는 여러가지가 있겠지만,다음 예제는 select시 in문 대신 temporary table을 사용하는 법이다. 만약 id가 1,2,3,4,5 인 것을 가져와야 한다고 하자.쿼리는 이렇게 된다. SELECT * FROM TABLE WHERE ID IN (1,2,3,4,5) 만약 검색할 ID의 개수가 1,000개 이상이라면??... 방안중에 하나로 임시테이블을 쓸 수 있다. IN문에 들어갈 번호들을 임시테이블에 쫙 넣고, 임시테이블과 테이블과 INNER JOIN을 하는것이다. 예제 ㄱㄱ 1. 임시테이블 생성 CREATE TEMPORARY TABLE IF NOT EXISTS TEMP_TABLE ( ID BIGINT(20) NOT NULL ) 2. 임시테이블에 INSERT (일반 INSER..

개발/Database 2012.10.26

MySql] Insert Select 문

INSERT table1 (id, name, status, date) SELECT id, name, 'GOOD', now() /* id, name은 셀렉트된 값이고, 나머지 값은 임의로 넣은것 */ FROM table2 /* insert 의 테이블과 같아도 상관 없다 */ WHERE id=3 HAVING COUNT(*)=0 INSERT SELECT문을 한문장으로 정의하면 SELECT 된 값을 INSERT에 있는 테이블에 삽입하는 것이다. 먼저 SELECT 문을 보자. table2 라는 테이블에서 id가 3인 데이터가 있는지 없는지 검사하고 그 데이터가 몇개인가 검사해서 0개라면 SELECT 옆에있는 값들을 table1에 INSERT 한다.

개발/Database 2012.08.28

[MySql] 같은 컬럼의 행들에 한방에 update 하기

한 컬럼에 여러행들에 update를 한방에 업데이트 하는방법. 이런 경우 말이다. [ TABLE ]id name 1 사자 2 고양이 name컬럼의 값을id가 1이면 "lion"으로, id가 2이면 "cat"으로 바꾸고 싶다. 그럴땐 Case문을 쓰면된다. UPDATE TABLESETname = CASEWHEN id = 1 THEN "lion"WHEN id = 2 THEN "cat"ENDWHEREid IN (1, 2) 그럼 결과는 아래와 같이 나타난다. [ TABLE ] - 결과id name 1 lion 2 cat

개발/Database 2012.08.07

[MYSQL] 가져온 값을 조건에 따라 값 바꾸기(case - when - end 문)

집계 쿼리 만들 때 쓰이는 것... Group by 를 써서 데이터를 가져왔는데그 데이터는 숫자 코드로 되어있다(1 :사과 , 2: 포도) 숫자 코드는 보기 안좋으니까 글자로 바꾸려는데, 쿼리에서 조건문을 쓰려면 어떻게 할까? SELECTCODE,COUNT(*) AS COUNTFROM TESTWHEREDTTM = "20120802";GROUP BY CODE 가져와진 값이 아래와 같다고 치자 CODE COUNT 1 50 270 CODE가 1이면 사과의 합CODE가 2이면 포도의 합이라고 바꾸고 싶으면??? SELECTCASE CODE WHEN 1 THEN '사과의 합' ELSE '포도의 합' END, COUNT(*) AS COUNTFROM TESTWHEREDTTM = "20120802";GROUP BY C..

개발/Database 2012.08.02