openGauss易知易會的幾個實用特性

語言: CN / TW / HK

本文將介紹幾個簡單易用的數據庫特性。

  • 單列顯示整行數據
  • where比較列合併
  • 獨立寫布爾列
  • using關鍵字
  • domain

單列顯示整行數據

首先我們準備測試數據表:

create table users(id int,name text,email text,deleted_at timestamp,delete boolean);
insert into users values(1,'jerome','[email protected]',null,false);
insert into users values(2,'sara','[email protected]','2001-09-11',true);
insert into users values(3,'dolores','[email protected]',null,false);
insert into users values(4,'evan','[email protected]',null,false);

通常我們使用如下語句進行查詢

openGauss# select * from users;
 id |  name   |           email            |     deleted_at      | delete 
----+---------+----------------------------+---------------------+--------
  1 | jerome  | chong.peng@enmotech.com    |                     | f
  2 | sara    | lynn.wood@poland.com       | 2001-09-11 00:00:00 | t
  3 | dolores | th000@sky.com              |                     | f
  4 | evan    | rachel.moore@hollywood.com |                     | f
(4 rows)

也可以使用下面的語句進行查詢,尤其是列較多時

openGauss# select users from users;
                         users                         
-------------------------------------------------------
 (1,jerome,chong.peng@enmotech.com,,f)
 (2,sara,lynn.wood@poland.com,"2001-09-11 00:00:00",t)
 (3,dolores,th000@sky.com,,f)
 (4,evan,rachel.moore@hollywood.com,,f)
(4 rows)

上面是將所有列作為行類型返回單列,可以比較簡潔的返回數據。

where比較列合併

假設我們有以下查詢:

select id, name, email
from users
where name = 'dolores'
  and email = '[email protected]';

根據名稱和郵箱查詢用户,有的時候where條件後面可能會出現1=1

select id, name, email
from users
where 1=1
  and name = 'dolores'
  and email = '[email protected]';

應用層需要比較方便進行where條件拼接。

其實可以去掉and,使用如下語句:

select id, name, email
from users
where (name, email) = ('dolores','[email protected]');
可以查詢到同樣的結果

 id |  name   |     email     
----+---------+---------------
  3 | dolores | th000@sky.com
(1 row)

我們還可以使用in來滿足or條件,例如下面的查詢:

select id, name, email
from users
where deleted_at is null
and (
     (name = 'dolores' and email = '[email protected]')
     or
     (name = 'evan' and email = '[email protected]')
);

可以將其縮短為:

select id, name, email
from users
where deleted_at is null
 and (name, email) 
 in (('dolores','[email protected]'),('evan','[email protected]'));

這可以使查詢更短且更易於閲讀。

獨立寫布爾列
接下來的查詢,獲取未刪除的用户,比較常見的是這種寫法:

select id, name, email
from users
where delete =  false;

多數人並不知道布爾值不需要與另一個布爾值進行比較,可以這樣寫:

select id, name, email
from users
where not delete;select id, name, email
from users
where not delete;

這樣閲讀起來也更好,結果如下:

id |  name   |           email            
----+---------+----------------------------
  1 | jerome  | chong.peng@enmotech.com
  3 | dolores | th000@sky.com
  4 | evan    | rachel.moore@hollywood.com
(3 rows)

using關鍵字

當我們做多張表的join連接時,如果join字段的名稱相同可以使用using關鍵字來簡化語句

select ...
  from  t1 
  join  t2
    on  t1.id = t2.id;select ...
  from  t1 
  join  t2
    on  t1.id = t2.id;

可以改寫為:

select …
from t1
join t2
using (id);
多個字段還可以使用逗號進行分隔:

on t1.a = t2.a and t1.b = t2.b
改寫為

using (a,b);

domain

domain也是比較有用的一個特性,例如可以很多需要進行相同限制的列創建自定義類型:

create domain my_addr varchar(100) not null default 'n/a';create domain my_addr varchar(100) not null default 'n/a';

或者是作為別名支持兼容性數據類型:

create domain binary_float as float;

本文總結了幾個有幫助的實用特性,大家在日常使用過程中可以進一步挖掘。

作者:彭衝
openGauss: 一款高性能、高安全、高可靠的企業級開源關係型數據庫。