MySQL에서는  두   가지  방법으로   사용자가  정의한  변수를
지원한다.  변수이름은 alphanumeric 문자와 '_', '$', '.'로 
구성된다. 변수에 초기값이 지정되지 않으면, NULL이 디폴트이며, 
integer, real, string 값을 저장할 수 있다. 
변수이름은 버전 5.0부터는 대·소문자 구분이 없다.

방법1)
SET 문을 사용하여 변수를 설정
SET @variable={integer expression | real expression | string expression }
[,@variable=...]

【예제】
mysql> set @t3=5;
mysql> select @t3;
+------+
| @t3 |
+------+
| 5 |
+------+
mysql>

방법2)
@variable:=expr 문을 사용하여 설정
【예제】
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+


출처 - http://flashcafe.org/index.php?mid=mysql_study&listStyle=webzine&document_srl=3999







MySQL 사용자 정의 변수

09 사용자 정의 변수

 

변수의 적용 범위가 서버 전체이면 글로벌 변수 커넥션에 종속적이면 세션 변수

서버 실행중 변경가는한 변수에 따라 동적 변수와 정적 변수로 나눔

MySQL 서버의 설정 파일이나 MySQL 명령헹 인자르 통해 설정된 변수는 시스템변수

사용자 정의 변수는 임의로 이름을 부여할수있다

사용자 변수는 항상 세션변수로 취급하며 값을 변경 가능 하므로 동적 변수이다

사용자변수는 절차적인 목적으로 사용할수 있다

 

9.1 사용자 변수 소개

 

mysql> SET @str := ‘문자열’;

Query OK, 0 rows affected (0.00 sec)

 

mysql> SELECT @str;

+———–+

| @str      |

+———–+

| 문자열    |

+———–+

1 row in set (0.00 sec)

 

mysql> set @rownum=0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select (@rownum=@rownum+1) as rownum, emp_no, first_name from employees limit 5;

+——–+——–+————+

| rownum | emp_no | first_name |

+——–+——–+————+

|      0 |  11800 | Aamer      |

|      0 |  11935 | Aamer      |

|      0 |  12160 | Aamer      |

|      0 |  13011 | Aamer      |

|      0 |  15332 | Aamer      |

+——–+——–+————+

5 rows in set (0.00 sec)

 

mysql> select (@rownum:=@rownum+1) as rownum, emp_no, first_name from employees limit 5;

+——–+——–+————+

| rownum | emp_no | first_name |

+——–+——–+————+

|      1 |  11800 | Aamer      |

|      2 |  11935 | Aamer      |

|      3 |  12160 | Aamer      |

|      4 |  13011 | Aamer      |

|      5 |  15332 | Aamer      |

+——–+——–+————+

5 rows in set (0.00 sec)

 

MySQL 5.0미만의 버전은 변수명의 대소문자를 구분함 그 이상 버전은 구분 하지 않음

사용자 정의 변수를 사용 하는 쿼리는 쿼리 캐시 기능을 사용 못함

초기화되지 않은 변수는 문자열 ‘NULL’값을 가진다

사용자 변수의 연산 순서는 정해져 있지 않다

MySQL 버전 차이에 따라 작동 방식이나 순서에 차이가 있기에 주의해야한다

 

9.2 기본 활용

 

mysql> select (@rownum:=@rownum+1) as rownum, emp_no, first_name

-> from employees, (select @rownum:=0) tab1

-> limit 5;

+——–+——–+————+

| rownum | emp_no | first_name |

+——–+——–+————+

|      1 |  11800 | Aamer      |

|      2 |  11935 | Aamer      |

|      3 |  12160 | Aamer      |

|      4 |  13011 | Aamer      |

|      5 |  15332 | Aamer      |

+——–+——–+————+

5 rows in set (0.00 sec)

 

set 명령어가 아닌 select 쿼리를 사용하여 초기화

 

mysql> set @old_sal:=50000;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select @old_sal, salary, @old_sal:=salary from salaries limit 1;

+———-+——–+——————+

| @old_sal | salary | @old_sal:=salary |

+———-+——–+——————+

|    50000 |  38623 |            38623 |

+———-+——–+——————+

1 row in set (0.00 sec)

 

mysql> set @old_sal:=50000;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select @old_sal, GREATEST(salary, LEAST(-1, @old_sal:=salary)) as salary from salaries limit 1;

+———-+——–+

| @old_sal | salary |

+———-+——–+

|    50000 |  38623 |

+———-+——–+

1 row in set (0.00 sec)

 

GRAETEST()         둘중 높은 값을 반환

LEAST()               둘중 낮은 값을 반환

 

old_sal 값을 salary칼럼 값으로 초기화함과 동시에 salary칼럼 값만 결과 셋으로 가져오는 쿼리임

 

9.3 시용자 변수 적용 예

 

9.3.1 N번째 레코드만 가져오기

 

mysql> select *

-> from departments, (select @rn:=0) x

-> where (@rn:=@rn+1)=3

-> order by dept_name;

+———+———–+——–+

| dept_no | dept_name | @rn:=0 |

+———+———–+——–+

| d002    | Finance   |      0 |

+———+———–+——–+

1 row in set (0.00 sec)

 

mysql> select *

-> from departments, (select @rn:=0) x

-> having (@rn:=@rn+1)=3

-> order by dept_name;

+———+———–+——–+

| dept_no | dept_name | @rn:=0 |

+———+———–+——–+

| d002    | Finance   |      0 |

+———+———–+——–+

1 row in set (0.00 sec)

 

이 예제는 테으블을 풀스캔하며 건수가 많은 테이블에서는 주의해서 사용해야한다.

 

9.3.2 누적 합계 구하기

 

mysql> select emp_no, salary, (@add_sal:=@add_sal+salary) as add_sal

-> from salaries, (select @add_sal:=0) x

-> limit 10;

+——–+——–+———+

| emp_no | salary | add_sal |

+——–+——–+———+

| 253406 |  38623 |   38623 |

|  49239 |  38735 |   77358 |

| 281546 |  38786 |  116144 |

|  15830 |  38812 |  154956 |

|  64198 |  38836 |  193792 |

| 475254 |  38849 |  232641 |

|  50419 |  38850 |  271491 |

|  34707 |  38851 |  310342 |

|  49239 |  38859 |  349201 |

| 274049 |  38864 |  388065 |

+——–+——–+———+

10 rows in set (0.00 sec)

 

*MySQL에서는 파생된 테이블을 만들어 내는 FROM 절의 서브쿼리에 반드시 별칭(‘x’)을 부여해야한다

 

9.3.3 그룹별 랭킹 구하기

 

mysql> select

emp_no, first_name, last_name,

if(@prev_first_name=first_name,

@rank:=@rank+1, @rank:=1+LEAST(0,@prev_first_name:=first_name)) rank

from employees, (select @rank:=0) x1, (select @prev_first_name:=’DUMMY’) x2

where first_name in (‘Georgi’,'Bezalel’)

order by first_name, last_name limit 5;

 

+——–+————+———–+——+

| emp_no | first_name | last_name | rank |

+——–+————+———–+——+

| 297135 | Bezalel    |Acton     |    1 |

|  25442 | Bezalel    | Adachi    |    2 |

| 446963 | Bezalel    | Aingworth |    3 |

| 241970 | Bezalel    | Anandan   |    4 |

| 241885 | Bezalel    | Ananiadou |    5 |

+——–+————+———–+——+

5 rows in set (0.01 sec)

 

 

9.3.4 랭킹 업데이트

 

mysql> create table tb_ranking (

member_id int not null,

member_score int not null,

rank_no int not null,

primary key (member_id),

index ix_mem (member_score)

);

Query OK, 0 rows affected (0.12 sec)

 

mysql> update tb_ranking r set r.rank_no = (@rank:=@rank+1) order by r.member_score DESC;

Query OK, 0 rows affected (0.03 sec)

Rows matched: 0  Changed: 0  Warnings: 0

 

9.3.5 GROUP BY 와 ORDER BY가 인덱스를 사용하지 못하는 쿼리

 

mysql> create table tb_uv (rid varchar(10));

Query OK, 0 rows affected (0.07 sec)

 

mysql> insert into tb_uv values (‘g’), (‘n’), (‘h’), (‘a’), (‘b’);

Query OK, 5 rows affected (0.04 sec)

Records: 5  Duplicates: 0  Warnings: 0

 

mysql> select  rid, @rank:=@rank+1 as rank

-> from tb_uv, (select @rank:=0) x

-> order by rid;

+——+——+

| rid  | rank |

+——+——+

| a    |    1 |

| b    |    2 |

| g    |    3 |

| h    |    4 |

| n    |    5 |

+——+——+

5 rows in set (0.02 sec)

 

mysql> select  rid, @rank:=@rank+1 as rank from tb_uv, (select @rank:=0) x group by rid order by rid;

+——+——+

| rid  | rank |

+——+——+

| a    |    4 |

| b    |    5 |

| g    |    1 |

| h    |    3 |

| n    |    2 |

+——+——+

5 rows in set (0.00 sec)

 

mysql> explain select  rid, @rank:=@rank+1 as rank from tb_uv, (select @rank:=0) x group by rid order by rid;

+—-+————-+————+——–+—————+——+———+——+——+———————————+

| id | select_type | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra                           |

+—-+————-+————+——–+—————+——+———+——+——+———————————+

|  1 | PRIMARY     | <derived2> | system | NULL          | NULL | NULL    | NULL |    1 | Using temporary; Using filesort |

|  1 | PRIMARY     | tb_uv      | ALL    | NULL          | NULL | NULL    | NULL |    5 |                                 |

|  2 | DERIVED     | NULL       | NULL   | NULL          | NULL | NULL    | NULL | NULL | No tables used                  |

+—-+————-+————+——–+—————+——+———+——+——+———————————+

3 rows in set (0.00 sec)

 

mysql> select rid, @rank:=@rank+1 as rank

-> from (

-> select rid from tb_uv

-> group by rid

-> order by rid

-> )x,

-> (select @rank:=0) y;

+——+——+

| rid  | rank |

+——+——+

| a    |    1 |

| b    |    2 |

| g    |    3 |

| h    |    4 |

| n    |    5 |

+——+——+

5 rows in set (0.03 sec)

 

mysql> alter table tb_uv add index ix_rid (rid);

Query OK, 0 rows affected (0.16 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> select rid, @rank:=@rank+1 as rank

-> from tb_uv, (select @rank:=0) x

-> group by rid

-> order by rid;

+——+——+

| rid  | rank |

+——+——+

| a    |    1 |

| b    |    2 |

| g    |    3 |

| h    |    4 |

| n    |    5 |

+——+——+

5 rows in set (0.01 sec)

 

9.4 주의사항

버전간에 호환성을 보장 하지 않는데 버전 업그레이드시 주의


출처 - http://os.raonnet.com/?p=51














'DB > MySQL' 카테고리의 다른 글

linux 에서 mysql rpm version install  (0) 2013.01.03
mysql - join  (1) 2012.10.19
mysql - boolean 데이터 타입  (0) 2012.09.26
mysql - insert 시 있으면 update 없으면 insert  (0) 2012.09.22
mysql - mysql에서 null 처리  (0) 2012.09.22
Posted by linuxism
,


Spring 3.0 @MVC 메소드에서 자동으로 리턴 모델에 추가되는 것들


스프링 @MVC의 편리함과 유연함은 지금까지 나온 어떤 MVC 방식의 프레임워크와 기술도 따라 올 수 없는 것이라고 생각한다. Controller의 계층구조에 존재했던 각종 컨트롤러 클래스들의 장점을 모두 모으고, 몇 배로 편리하게 사용할 수 있도록 만들어 놓은 것이 지금의 @MVC이다.

간단히 정리해보고 싶은 것은 @MVC의 컨트롤러 메소드에서 리턴하는 모델과 뷰 정보에 스프링이 자동으로 추가해주는 정보들이다. @MVC는 매번 번거롭게 ModelAndView를 만들어 리턴하지 않아도 되도록, 간단히 뷰 이름, 모델 맵, 단독 모델 오브젝트 등의 리턴 타입을 허용한다. 이 때 다음 4가지 종류의 오브젝트는 모델에 자동으로 추가된다.

1. @ModelAttribute 또는 커맨드 오브젝트

@MVC 메소드는 String add(@ModelAttribute User user) 또는 String add(User user) 라고 빈 스타일의 오브젝트를 통해서 파라미터나 폼 데이터를 전달 받을 수 있다. 보통 후자는 전통적인 이름을 따서 커맨드 오브젝트라고 부르고, 전자는 모델 애트리뷰트라고 부르지만 사실 내부적으로는 똑 같이 취급된다.

이 모델 애트리뷰트/커맨드 오브젝트는 자동으로 모델 맵에 추가된다. 따라서 따로 모델에 넣어줄 필요가 없다.

2. Map/Model/ModelMap

메소드 파라미터에 위의 세가지 중 한가지 타입을 넣었다면 모델 맵을 따로 생성할 것 없이 파라미터로 받은 오브젝트에 직접 모델을 추가해주면 된다. 당연하게도 이 파라미터에 넣은 모델 오브젝트는 컨트롤러가 리턴하는 모델이 된다. 흥미로운 점은 만약 메소드에서 리턴 값을 ModelAndView나 Model, 또는 단독 모델 오브젝트(String 타입이 아닌 단순 오브젝트는 그 자체로 하나의 모델 값으로 인식된다) 같은 것을 써서 모델 정보를 리턴한다고 하더라도, 이 파라미터 모델 맵의 정보가 무시되는 것이 아니다. 모두 최종적인 모델에 머징된다.

3. @ModelAttribute 메소드

MVC 시절 referenceData() 메소드와 같은 역할을 하는 @ModelAttribute를 메소드 레벨에 부여한 메소드가 있다면 그 결과 값은 항상 나머지 모든 컨트롤러 메소드의 모델에 자동 추가된다. 보통 참조용 데이터, 예를 들면 리스트박스에 뿌리는 코드 값 같은 것에 주로 사용된다.

4. BindResult.모델 이름의 BeanPropertyBindingResult

만약 @ModelAttribute를 명시적으로 또는 암시적으로 사용했다면 모델에는 자동으로 그 바인딩 결과가 담긴 "org.springframework.validation.BindingResult.모델이름"의 오브젝트가 추가된다. 타입은 BeanPropertyBindingResult이다. 이 모델은 스프링의 폼 태그에서 바인딩 결과에 따라서 메시지를 출력하거나 할 때 참조하기 위해서 자동으로 넣어주는 것이다.

컨트롤러 메소드에 Errors나 BindResult 파라미터를 넣었는지 여부와는 상관없이 이 모델은 추가된다.

 

모델 말고 뷰도 생각해 보자면, 뷰 정보를 전혀 생성하지 않았을 경우에는 RequestToViewNameResolver 전략이 적용되서 자동으로 뷰 이름이 생성된다.

오늘의 퀴즈. 다음 메소드를 실행하고 나서 DispatcherSerlvet이나 뷰가 전달 받는 모델 맵에는 몇 개의 엔트리가 있을까?

 

@ModelAttribute(“ref”) String ref() { return “data”;}

@RequestMapping(“/add”) public void add(User user, Model model) {

   model.addAttribute(“mesg”, "ok”);

}


출처 - http://toby.epril.com/?p=982





'Framework & Platform > Spring' 카테고리의 다른 글

spring - JSR-250(@Resource)  (0) 2012.11.01
spring - 스프링 표현 언어(SpEL)  (0) 2012.10.22
spring - placeholder  (0) 2012.10.12
spring - 스프링 3.1 새로운 기능 및 개선 사항  (0) 2012.10.10
spring - spring roo  (0) 2012.10.10
Posted by linuxism
,


말씀하신 Proxy 가 하는 일을 보통 Delegation 이라고 표현하는데요, 우리말로는 '위임'정도 되는지 모르겠네요. 

어떤 오브젝트가 해야 할 일을 다른 오브젝트에게 위임하는 것을 말합니다. 여기에서 위임을 하는 오브젝트가 위임받는 오브젝트에 대한 레퍼런스를 갖고 있게 되므로 place-holder 라고 설명한 것 같네요. 보통은 래퍼(wrapper) 라고 표현합니다. 

예를 들면.. 

public class A {
private B b;
A(B b) { this.b = b }

void work() { return b.work() };
}

요런거죠. (A 가 할 일을 B 가 하고 있습니다)

참고로.. JDK1.4 부터 java.lang.reflect 패키지에 Proxy 라는 클래스가 추가되었습니다. 런타임에 레퍼클래스를 만들어주는데 꽤 편합니다.


출처 - http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=64865645









Posted by linuxism
,