PostgreSQL的實踐一:數據類型(一)

數據類型

clipboard.png
clipboard.png

類型轉換

select bit'10101010';
select int4'123';
select CAST('123' as int4);
select numeric'123.2352342';
select '123'::int4;
select true::BOOLEAN; -- t
select ('f' is true)::BOOLEAN; -- f

數值類型

clipboard.png

數值類型 - 序列類型

不一樣於mysql的自增加,Postgres和Oracle都是序列的方式建立mysql

# 使用SERIAL建立序列
testdb=# create table test2 (id SERIAL, title varchar(20));
CREATE TABLE
testdb=# \d
                  關聯列表
 架構模式 |     名稱     |  類型  |  擁有者
----------+--------------+--------+----------
 public   | test1        | 數據表 | postgres
 public   | test2        | 數據表 | postgres
 public   | test2_id_seq | 序列數 | postgres
(3 行記錄)

testdb=# \d test2
                                  數據表 "public.test2"
 欄位  |         類型          | Collation | Nullable |              Default
-------+-----------------------+-----------+----------+-----------------------------------
 id    | integer               |           | not null | nextval('test2_id_seq'::regclass)
 title | character varying(20) |           |          |

# 使用CREATE SEQUENCE建立序列
testdb=# CREATE SEQUENCE test3_id_seq;
CREATE SEQUENCE
testdb=# CREATE TABLE test3 (id int4 NOT NULL DEFAULT nextval('test3_id_seq'), name varchar(20));
CREATE TABLE
testdb=# ALTER SEQUENCE test3_id_seq OWNED BY test3.id;
ALTER SEQUENCE
testdb=# \d
                  關聯列表
 架構模式 |     名稱     |  類型  |  擁有者
----------+--------------+--------+----------
 public   | test1        | 數據表 | postgres
 public   | test2        | 數據表 | postgres
 public   | test2_id_seq | 序列數 | postgres
 public   | test3        | 數據表 | postgres
 public   | test3_id_seq | 序列數 | postgres
(5 行記錄)


testdb=# \d test3
                                  數據表 "public.test3"
 欄位 |         類型          | Collation | Nullable |              Default
------+-----------------------+-----------+----------+-----------------------------------
 id   | integer               |           | not null | nextval('test3_id_seq'::regclass)
 name | character varying(20) |           |          |

數值類型 - 貨幣類型

貨幣類型能夠存儲固定小數的貨幣數目,於浮點數不一樣,它是徹底保證精度的。其輸出格式和餘燦lc_monetary的設置有關,不一樣國家的貨幣輸出格式不同正則表達式

# 我安裝的是中文版本,默認中國
postgres=# show lc_monetary;
                     lc_monetary
-----------------------------------------------------
 Chinese (Simplified)_People's Republic of China.936
(1 行記錄)


postgres=# select '100.5'::money;
  money
----------
 ¥100.50
(1 行記錄)

# 設置默認美圓
postgres=# set lc_monetary='C';
SET
postgres=# select '100.5'::money;
  money
---------
 $100.50
(1 行記錄)

數值運算

select 4+7; --加

select 4-7; --減

select 4*7; --乘

select 7/3; --除(整數除法講截斷結果)

select 6%4; --求模(求餘)

select 3^3;  --冪(指數運算)

select |/36.0; --平方根

select ||/8.0; --立方根

select 5!;     --階乘

select !!5;    --階乘(前綴操做)

select @-0.5;     --絕對值

select 31&15;  --二進制 AND

select 31|15;  --二進制 OR

select 31#15;  --二進制 XOR

select ~1;  --二進制 NOT

select 1<<8;  --二進制 左移

字符串類型

clipboard.png

select 'Post' || 'greSQL';  -- 字符串鏈接

SELECT BIT_LENGTH('PostgreSQL');  -- 字符串裏的二進制位的個數,位長度

SELECT CHAR_LENGTH('PostgreSQL');  -- 字符串李的字符個數    字符個數

--SELECT CONVERT('PostgreSQL' using iso_8859_l_to_utf8);  -- 使用指定的轉換名字改變編碼

SELECT LOWER('PostgreSQL');  -- 轉小寫

SELECT UPPER('PostgreSQL');  -- 轉大寫

SELECT OCTET_LENGTH('PostgreSQL');  -- 字符串中的字節數

SELECT OVERLAY('PostgreSQL' placing 'hello' from 2 for 4);  -- 替換子字符串

SELECT POSITION('gre' in 'PostgreSQL');  -- 指定的子字符串的位置

SELECT SUBSTRING('PostgreSQL' from 2 for 3);  -- 抽取子字符串

SELECT SUBSTRING('PostgreSQL123' from '\d{1,}$');  -- 抽取匹配POSIX正則表達式的子字符串

SELECT SUBSTRING('PostgreSQL123' from '%#"123#"%' for '#');  -- 抽取匹配SQL正則表達式的子字符串,for '#'爲設置轉移字符

SELECT TRIM(' PostgreSQL ');  -- 從字符串的開頭/結尾兩邊刪除只包含characters中字符(默認是一個空白)最長的字符串

SELECT TRIM('xo' from 'oxPostgreSQLxo');  -- 從字符串的開頭/結尾兩邊刪除只包含characters中字符(默認是一個空白)最長的字符串

位串

# a必須3位,b能夠是少於5的任意位數
create table test5(a BIT(3), b BIT VARYING(5));
INSERT INTO test(a, b) values(B'101', B'1010');
INSERT INTO test(a, b) values(B'101', B'1010');

# 操做
# 十進制轉二進制
select 66::bit(8); -- 01000010
# 十六進制轉二進制
select 'x42'::bit(8);  -- 01000010
# 十六進制轉十進制
select 'x42'::bit(8)::int; -- 66
# 十進制轉十六進制
select to_hex(66); -- 42

日期/時間類型

clipboard.png

clipboard.png

clipboard.png

clipboard.png

postgres=# select date('infinity');
   date
----------
 infinity
(1 行記錄)


postgres=# select current_date;
 current_date
--------------
 2018-11-06
(1 行記錄)


postgres=# select current_time;
   current_time
-------------------
 17:04:57.71863+08
(1 行記錄)


postgres=# select current_timestamp;
       current_timestamp
-------------------------------
 2018-11-06 17:05:01.710637+08
(1 行記錄)


postgres=# select clock_timestamp();
        clock_timestamp
-------------------------------
 2018-11-06 17:05:05.982679+08
(1 行記錄)


postgres=# select now();
              now
-------------------------------
 2018-11-06 17:05:11.710406+08
(1 行記錄)

postgres=# select date'2018-11-06';
    date
------------
 2018-11-06
(1 行記錄)


postgres=# select time '16:51:08';
   time
----------
 16:51:08
(1 行記錄)


postgres=# select time '16:51:08 PST';
   time
----------
 16:51:08
(1 行記錄)


postgres=# select time with time zone'16:51:08 PST';
   timetz
-------------
 16:51:08-08
(1 行記錄)


postgres=# select time '10:51:08 PM';
   time
----------
 22:51:08
(1 行記錄)


postgres=# select time '10:51:08 AM';
   time
----------
 10:51:08
(1 行記錄)


postgres=# select time'10:51:08+8';
   time
----------
 10:51:08
(1 行記錄)


postgres=# select time'10:51:08+6';
   time
----------
 10:51:08
(1 行記錄)


postgres=# select time'10:51:08 CCT';
   time
----------
 10:51:08
(1 行記錄)
                               ^
postgres=# select time with time zone'2018-11-06 10:51:08 Asia/Chongqing';
   timetz
-------------
 10:51:08+08
(1 行記錄)


postgres=# select time with time zone'165408+00';
   timetz
-------------
 16:54:08+00
(1 行記錄)

postgres=# select extract(century from timestamp'2019-11-06 170722');
 date_part
-----------
        21
(1 行記錄)


postgres=# select extract(year from timestamp'2019-11-06 170722');
 date_part
-----------
      2019
(1 行記錄)


postgres=# select extract(decade from timestamp'2019-11-06 170722');
 date_part
-----------
       201
(1 行記錄)


postgres=# select extract(millennium from timestamp'2019-11-06 170722');
 date_part
-----------
         3
(1 行記錄)


postgres=# select extract(month from timestamp'2019-11-06 170722');
 date_part
-----------
        11
(1 行記錄)


postgres=# select extract(quarter from timestamp'2019-11-06 170722');
 date_part
-----------
         4
(1 行記錄)


postgres=# select extract(day from timestamp'2019-11-06 170722');
 date_part
-----------
         6
(1 行記錄)


postgres=# select extract(doy from timestamp'2019-11-06 170722');
 date_part
-----------
       310
(1 行記錄)


postgres=# select extract(hour from timestamp'2019-11-06 170722');
 date_part
-----------
        17
(1 行記錄)

幾何類型

此處不作練習,由於比較複雜,場景也沒有很差演示,固然此類型很重要,咱們後續有場景的話會專文講
你們能夠本身參考百度下幾何類型的操做符幾何類型的函數
clipboard.pngsql

網絡地址類型

clipboard.png

testdb=# select '192.168.10.10/32'::inet;
     inet
---------------
 192.168.10.10
(1 行記錄)


testdb=# select '192.168.10.10'::inet;
     inet
---------------
 192.168.10.10
(1 行記錄)


testdb=# select 'DA01:0000:0000:0000:ABCD:0000:ACBD:0003'::inet;
        inet
---------------------
 da01::abcd:0:acbd:3
(1 行記錄)


testdb=# select '192.168.1.100/32'::cidr;
       cidr
------------------
 192.168.1.100/32
(1 行記錄)


testdb=# select '00e04c757d5a'::macaddr;
      macaddr
-------------------
 00:e0:4c:75:7d:5a
(1 行記錄)
相關文章
相關標籤/搜索