SELECT ALL


동영상 설명은 아래에 있습니다.

모든 Datatype의 데이터(키)를 조회

이전까지는 select 문에서 datatype을 지정해서 조회를 했습니다.
Datatype에 ALL을 지정하면 모든 데이터(키)를 조회할 수 있습니다.
SELECT * FROM ALL.*;
아래 Example 쿼리에서 조회하는 데이터(키)는 String, List, Set, Zset, Hash, Stream에서 입력한 것입니다.
All의 컬럼은 key 하나입니다. Value는 조회할 수 없습니다.

주의
  • 이 경우 항상 키 전체를 스켄(scan)합니다. 그러므로 키가 많을 경우 사용하지 않는 것이 좋습니다. Where 조건을 사용해도 마찬가지 입니다. 키 개수가 수천개 이내일 경우 사용하는 것을 권장합니다.
  • 키 조건은 where를 사용하세요. All.key* 이런 조건은 적용되지 않습니다.
  • 키가 정렬(sort)되어 있지 않습니다. 필요하면 order by key를 사용하세요.
    Datatype을 지정했을 경우 내부적으로 ZSet에서 데이터(키)를 조회하고 All을 지정하면 Dict(hash table)에서 조회합니다. ZSet은 정렬된 상태를 유지하는 구조이고 Dict은 순서없이 저장되는 구조입니다.

SELECT

Example

명령>select * from all.*;   opcode
결과> 0) key
1) myset2
2) sensor_1
3) mystr5
... 중간 생략 ...
35) subject1
36) mynum2

ORDER, LIMIT

Order by 또는 Limit를 사용할 수 있습니다.

Example

명령>select * from all.* order by key;   opcode
결과> 0) key
1) myint1
2) myint2
3) myint3
... 중간 생략 ...
35) subject3
36) subject4
명령>select * from all.* order by key desc;   opcode
결과> 0) key
1) subject4
2) subject3
3) subject2
... 중간 생략 ...
35) myint2
36) myint1
명령>select * from all.* limit 10;   opcode
결과> 0) key
1) myset2
2) sensor_1
3) mystr5
... 중간 생략 ...
9) myzset2
10) mylist1
명령>select * from all.* order by key limit 10;   opcode
결과> 0) key
1) myint1
2) myint2
3) myint3
... 중간 생략 ...
9) myname1
10) myname2
명령>select * from all.* order by key limit 5,10;   opcode
결과> 0) key
1) mylist1
2) mylist2
3) mylist3
... 중간 생략 ...
9) mynum1
10) mynum2

FUNCTION

  • Count(), min(), max()같은 일반적인 function을 사용할 수 있습니다.
  • Valcnt(), len(), card()는 모두 동일하게 value의 개수를 리턴하는 function입니다.
    사용 편의를 위해서 여러 이름으로 만들었습니다.
  • Count(key)보다 count(*)가 더 빠릅니다.
    Count(*)는 키 전체 개수를 한번에 가져오고, count(key)는 키를 하나씩 일일이 셉니다.

Example

명령>select count(*) from all.*;   opcode
결과> 0) count(*)
1) 36
명령>select count(key) from all.*;   opcode
결과> 0) count(key)
1) 36
명령>select key, valcnt(key), len(key), card(key) from all.*;   opcode
결과> 0) key|valcnt(key)|len(key)|card(key) 1) myset2|5|5|5
2) sensor_1|5|5|5
3) mystr5|1|1|1
... 중간 생략 ...
35) subject1|4|4|4
36) mynum2|1|1|1
명령>select min(key), max(key) from all.*;   opcode
결과> 0) min(key)|max(key)
1) myint1|subject4
명령>select key, upper(key), length(key) from all.*;   opcode
결과> 0) key|upper(key)|length(key)
1) myset2|MYSET2|6
2) sensor_1|SENSOR_1|8
3) mystr5|MYSTR5|6
... 중간 생략 ...
35) subject1|SUBJECT1|8
36) mynum2|MYNUM2|6

WHERE

  • All에서는 all.key*와 같이 사용할 수 없습니다. Where key = 'key1' or key glob 'key*'와 같이 사용하세요. 이 경우에도 full scan 합니다.

Example

명령>select * from all.* where key <= 'myint3';   opcode
결과> 0) key
1) myint1
2) myint3
3) myint2
명령>select * from all.* where key > 'myint3';   opcode
결과> 0) key
1) myset2
2) sensor_1
3) mystr5
... 중간 생략 ...
32) subject1
33) mynum2
명령>select * from all.* where key = 'myint3';   opcode
결과> 0) key
1) myint3
명령>select * from all.* where key != 'myint3';   opcode
결과> 0) key
1) myset2
2) sensor_1
3) mystr5
... 중간 생략 ...
34) subject1
35) mynum2

GLOB, LIKE

  • Glob는 와일드카드(wildcard)로 '*'를 사용하고, 대소문자를 구분합니다.
  • Like는 '%'를 사용하고 대소문자 구분없이 비교합니다.

Example

명령>select * from all.* where key glob 'sub*';   opcode
결과> 0) key
1) subject2
2) subject3
3) subject4
4) subject1
명령>select * from all.* where key like 'sub%';   opcode
결과> 0) key
1) subject2
2) subject3
3) subject4
4) subject1

BETWEEN, IN

  • Between, Not between 사용 가능합니다.
  • IN, Not in 사용할 수 있습니다.

Example

명령>select * from all.* where key between 'myset1' and 'mystr5';   opcode
결과> 0) key
1) myset2
2) mystr5
3) mystr3
... 중간 생략 ...
7) mystr4
8) myset1
명령>select * from all.* where key not between 'myset1' and 'mystr5';   opcode
결과> 0) key
1) sensor_1
2) mynum1
3) sensor_3
... 중간 생략 ...
27) subject1
28) mynum2
명령>select * from all.* where key in ('myint1','myint3');   opcode
결과> 0) key
1) myint1
2) myint3
명령>select * from all.* where key not in ('myint1','myint3');   opcode
결과> 0) key
1) myset2
2) sensor_1
3) mystr5
... 중간 생략 ...
33) subject1
34) mynum2

GROUP

Example

명령>select left(key,5), count(*) from all.* group by left(key,5);   opcode
결과> 0) left(key,5)|count(*)
1) myint|5
2) mylis|3
3) mynam|5
... 중간 생략 ...
9) senso|3
10) subje|4
명령>select left(key,5), min(key), max(key) from all.* group by left(key,5);   opcode
결과> 0) left(key,5)|min(key)|max(key)
1) myint|myint1|myint5
2) mylis|mylist1|mylist3
3) mynam|myname1|myname5
... 중간 생략 ...
9) senso|sensor_1|sensor_3
10) subje|subject1|subject4

REDIS FUNCTION

  • updatetime(): 키 생성/수정 일시를 리턴합니다.
  • type(): 키의 datatype을 리턴합니다.
  • encoding(): 키의 내부 datatype을 리턴합니다.
  • memory(): 키의 메모리 사용량(value 포함)을 리턴합니다.
  • 기타 여러 function을 사용할 수 있습니다.

Example

명령>select key, updatetime(key) from all.*;   opcode
결과> 0) key|updatetime(key)
1) myset2|2022-04-07 14:50:00
2) sensor_1|2022-04-07 14:50:00
3) mystr5|2022-04-07 14:50:00
... 중간 생략 ...
35) subject1|2022-04-07 14:50:00
36) mynum2|2022-04-07 14:50:00
명령>select key, type(key), encoding(key) from all.*;   opcode
결과> 0) key|type(key)|encoding(key)
1) myset2|set|intset
2) sensor_1|stream|stream
3) mystr5|string|embstr
... 중간 생략 ...
35) subject1|hash|ziplist
36) mynum2|string|embstr
명령>select key, type(key), encoding(key) from all.* order by type(key), encoding(key);   opcode
결과> 0) key|type(key)|encoding(key)
1) myname2|hash|ziplist
2) subject2|hash|ziplist
3) subject3|hash|ziplist
... 중간 생략 ...
35) myzset2|zset|ziplist
36) myzset1|zset|ziplist
명령>select key, memory(key) from all.*;   opcode
결과> 0) key|memory(key) 1) myset2|74
2) sensor_1|721
3) mystr5|65
... 중간 생략 ...
35) subject1|105
36) mynum2|62
명령>select key, memory(key) from all.* order by memory(key);   opcode
결과> 0) key|memory(key)
1) myint5|56
2) myint1|56
3) myint3|56
... 중간 생략 ...
35) sensor_1|721
36) sensor_2|835

EXPIRE

Expire를 입력합니다.

Example

명령>expire myint1 86100
명령>expire myint2 86200
명령>expire mylist1 86300
명령>expire mylist2 86400
명령>expire myname1 86500
명령>expire myname2 86600
명령>expire myset1 86700
명령>expire myset2 86800

  • TTL(key): 만료 시간을 초로 리턴합니다.
  • TTLDATE(key): 만료 시간을 일시로 리턴합니다. 예) 2022-04-08 14:56:40

Example

명령>select key, ttl(key), ttldate(key) from all.*;   opcode
결과> 0) key|ttl(key)|ttldate(key)
1) myset2|86800|2022-04-08 14:56:40
2) sensor_1|-1|1970-01-01 09:00:00
3) mystr5|-1|1970-01-01 09:00:00
... 중간 생략 ...
35) subject1|-1|1970-01-01 09:00:00
36) mynum2|-1|1970-01-01 09:00:00
명령>select key, ttl(key), ttldate(key) from all.* where ttl(key) > 0;   opcode
결과> 0) key|ttl(key)|ttldate(key)
1) myset2|86800|2022-04-08 14:56:40
2) mylist2|86400|2022-04-08 14:50:00
3) mylist1|86300|2022-04-08 14:48:20
... 중간 생략 ...
7) myname1|86500|2022-04-08 14:51:40
8) myset1|86700|2022-04-08 14:55:00

동영상 설명

Redis SQL Select All


OPCODE


OPCODE는 SQL의 실행 계획(execution plan)입니다.

select * from all.*;

select * from all.* order by key;

select * from all.* order by key desc;

select * from all.* limit 10;

select * from all.* order by key limit 10;

select * from all.* order by key limit 5,10;

select min(key), max(key) from all.*;

select key, upper(key), length(key) from all.*;

select count(*) from all.*;

select count(key) from all.*;

select key, valcnt(key), len(key), card(key) from all.*;

select * from all.* where key <= 'myint3';

select * from all.* where key > 'myint3';

select * from all.* where key = 'myint3';

select * from all.* where key != 'myint3';

select * from all.* where key between 'myset1' and 'mystr5';

select * from all.* where key not between 'myset1' and 'mystr5';

select * from all.* where key glob 'sub*';

select * from all.* where key like 'sub%';

select * from all.* where key in ('myint1','myint3');

select * from all.* where key not in ('myint1','myint3');

select left(key,5), count(*) from all.* group by left(key,5);

select left(key,5), min(key), max(key) from all.* group by left(key,5);

select key, updatetime(key) from all.*;

select key, type(key), encoding(key) from all.*;

select key, type(key), encoding(key) from all.* order by type(key), encoding(key);

select key, memory(key) from all.*;

select key, memory(key) from all.* order by memory(key);

select key, ttl(key), ttldate(key) from all.*;

select key, ttl(key), ttldate(key) from all.* where ttl(key) > 0;


<< Date functions Select ALL Select Expires >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.