SinoDB 基本语法

DDL

数据库

新建数据库

create database [if not exists] <db_name> [in dbs_name] [with [buffered] log | with log mode ansi] [nlscasesensitive | nlscase insensitive];

重命名数据库

rename database <old_db_name> to <new_db_name>;

删除数据库

drop database [if exists] <db_name>;

DEMO

create database db1

rename database db1 to db2;

drop database db2;

[informix@vm84145 ~]$ dbaccess - -
> create database db1;

Database created.

> rename database db1 to db2;

  359: Cannot drop or rename the current database or any open database.
Error in line 1
Near character position 25
> database testdb;

Database closed.


Database selected.

> rename database db1 to db2;

Database renamed.

> drop database db2;

Database dropped.

> 

新建表

create [standard | raw] table [if not exists] <table_name> (colname1 data_type1, colname2 data_type2, ...);

重命名表

rename table <old_table_name> to <new_table_name>;

删除表

drop table [if exists] <table_name>;

DEMO

create table t1(c_id int,c_name varchar(30));
rename table t1 to t2;
drop table t2;

[informix@vm84145 ~]$ dbaccess testdb -

Database selected.
> create table t1(c_id int,c_name varchar(30));

Table created.

> rename table t1 to t2;

Table renamed.

> drop table t2;

Table dropped.

> 

新增列

alter table <table_name | synonym_name> 
add (new_column_name1 data_type1 [before old_column_name1] [, new_column_name2 data_type2 [before old_column_name2], ...]);

删除列

alter table <table_name | synonym_name> drop (old_column_name1[, old_column_name2, ...]);

重命名列

rename column <table_name>.<old_column_name> to <new_column_name>;

DEMO

drop table if exists tuser;

create table tuser(c_userid int, c_username varchar(20));

insert into tuser values(1, 'sinodb');

select * from tuser;

alter table tuser add (c_adress varchar(20));

select * from tuser;

rename column tuser.c_adress to c_home;

select * from tuser;
alter table tuser drop (c_home);

select * from tuser;
> drop table if exists tuser;

Table dropped.

> create table tuser(c_userid int, c_username varchar(20));

Table created.

> insert into tuser values(1, 'sinodb');

1 row(s) inserted.

> select * from tuser;


   c_userid c_username           

          1 sinodb              

1 row(s) retrieved.

> alter table tuser add (c_adress varchar(20));

Table altered.

> select * from tuser;


   c_userid c_username           c_adress             

          1 sinodb                                   

1 row(s) retrieved.

> rename column tuser.c_adress to c_home;

Column renamed.

> select * from tuser;


   c_userid c_username           c_home               

          1 sinodb                                   

1 row(s) retrieved.

> alter table tuser drop (c_home);

Table altered.

> select * from tuser;


   c_userid c_username           

          1 sinodb              

1 row(s) retrieved.

> 

视图

新建视图

create view [if not exists] <view_name> as <query_define>;

删除视图

drop view if exists <view_name>;

DEMO

create view v_tuser as select * from tuser;
select * from v_tuser;
drop view v_tuser;
> create view v_tuser as select * from tuser;

View created.

> select * from v_tuser;


   c_userid c_username           

          1 sinodb              

1 row(s) retrieved.

> drop view v_tuser;

View dropped.

> 

索引

新建索引

create [unique | distinct | cluster] index [if not exists] <idx_name> 
on <table_name | synonym_name> (<column_name | func_name(column_name)> [asc | desc]);

重命名索引

rename index <old_index_name> to <new_index_name>;

删除索引

drop index [if exists] <idx_name>;

DEMO

create unique index idx_user on tuser (c_userid asc);

rename index idx_user to idx_user01;

drop index idx_user01;
> create unique index idx_user on tuser (c_userid asc);

Index created.

> rename index idx_user to idx_user01;

Index renamed.

> drop index idx_user01;

Index dropped.
>

存储过程

新建存储过程

create procedure [if not exists] <procedure_name>(param1 data_type1, param2 data_type2, ...)
<spl code>
end procedure;

删除存储过程

drop procedure [if exists] <procedure_name> [(data_type1, data_type2, ...)];

DEMO

drop table if exists tarea;

create table tarea(c_areaid int, c_areaname varchar(20));

create procedure pro_area_add(areaid int, areaname varchar(20))
	insert into tarea(c_areaid, c_areaname) values(areaid, areaname);
end procedure;

call pro_area_add(1, 'Beijing');
call pro_area_add(2, 'Shanghai');
call pro_area_add(3, 'Tianjin');
call pro_area_add(4, 'Chongqing');

select * from tarea;

delete from tarea;

execute procedure pro_area_add(1, 'Beijing');
execute procedure pro_area_add(2, 'Shanghai');
execute procedure pro_area_add(3, 'Tianjin');
execute procedure pro_area_add(4, 'Chongqing');

select * from tarea;
> drop table if exists tarea;

Table dropped.

> create table tarea(c_areaid int, c_areaname varchar(20));

Table created.

> create procedure pro_area_add(areaid int, areaname varchar(20))
>       insert into tarea(c_areaid, c_areaname) values(areaid, areaname);
> end procedure;

Routine created.

> call pro_area_add(1, 'Beijing');

Routine executed.
 
> call pro_area_add(2, 'Shanghai');

Routine executed.

> call pro_area_add(3, 'Tianjin');

Routine executed.

> call pro_area_add(4, 'Chongqing');

Routine executed.

> select * from tarea;


   c_areaid c_areaname           

          1 Beijing             
          2 Shanghai            
          3 Tianjin             
          4 Chongqing           

4 row(s) retrieved.

> delete from tarea;

4 row(s) deleted.

> execute procedure pro_area_add(1, 'Beijing');

Routine executed.

> execute procedure pro_area_add(2, 'Shanghai');

Routine executed.

> execute procedure pro_area_add(3, 'Tianjin');

Routine executed.

> execute procedure pro_area_add(4, 'Chongqing');

Routine executed.

> 
> select * from tarea;


   c_areaid c_areaname           

          1 Beijing             
          2 Shanghai            
          3 Tianjin             
          4 Chongqing           

4 row(s) retrieved.

> 

函数

新建函数

create function [if not exists] <function_name>(param1 data_type1, param2 data_type2, ...)
returning data_type1 [as var1] [, data_type2 [as var2], ...]
<spl code>
return var1[, var2, ...];
end function;

删除函数

drop function [if exists] <function_name> [(data_type1, data_type2, ...)];

DEMO

drop function if exists fn_get_ymd;

create function fn_get_ymd(dt date)
returning int as year, int as month, int as day

define y,m,d int;

let y = year(dt);
let m = month(dt);
let d = day(dt);

return y,m,d;
end function;

execute function fn_get_ymd(today);

drop function fn_get_ymd;
> drop function if exists fn_get_ymd;

Routine dropped.

> create function fn_get_ymd(dt date)
> returning int as year, int as month, int as day
> 
> define y,m,d int;
> 
> let y = year(dt);
> let m = month(dt);
> let d = day(dt);
> 
> return y,m,d;
> end function;

Routine created.

> execute function fn_get_ymd(today);


       year       month         day 

       2022           2          17

1 row(s) retrieved.

> drop function fn_get_ymd;

Routine dropped.

> 

同义词

新建同义词

create [public | private] synonym [if not exists] <synonym_name> for <table_name | view_name | sequence_name>;
drop synonym [if exists] <synonym_name>;

DEMO

drop table if exists t_user;

create table t_user(f_userid int, f_username varchar(20));

drop synonym if exists syn_user;

create synonym syn_user for t_user;

insert into syn_user values(1,'sinodb');

select * from t_user;

select * from syn_user;

drop synonym syn_user;

> drop synonym if exists syn_user;

Synonym dropped.

> create synonym syn_user for t_user;

Synonym created.

> insert into syn_user values(1,'sinodb');

1 row(s) inserted.

> select * from tuser;


   c_userid c_username           

          1 sinodb              

1 row(s) retrieved.

> select * from syn_user;


   f_userid f_username           

          1 sinodb              

1 row(s) retrieved.

> drop synonym syn_user;

Synonym dropped.

> 

触发器

触发器三要素

-事件(Event)
对数据库的插入、删除、修改操作。
当声明的事件发生时,触发器开始工作。

-条件(Condition)
当触发器被事件激活时,不是立即执行,而是首先由触发器测试触发条件。如果条件成立,则触发器执行相应的动作,否则触发器不做任何事情。

-动作规则(Action Rule)

新增触发器

create [or replace] tirgger <trigger_name> <insert | update [of column_name] | delete | select> on <target_table_name>
<before | after | for each row>
when <condition>
<action>

DEMO

tirgger.sql
[informix@vm84145 ~]$ vim trigger.sql 

drop table if exists t_log;

create table t_log(f_logid serial, f_message varchar(50), f_operatedate date);

drop table if exists t_sale;

create table t_sale(f_saleid serial, f_productname varchar(20), f_qty int);

create trigger trg_sale_insert insert on t_sale
referencing new as new_item
for each row
(
insert into t_log(f_message, f_operatedate) values(concat('insert:', new_item.f_productname), today)
);


create trigger trg_sale_update update of f_qty on t_sale
referencing old as old_item
for each row
(
insert into t_log(f_message, f_operatedate) values(concat('update: f_qty->', to_char(old_item.f_qty)), today)
);

create trigger trg_sale_delete delete on t_sale
referencing old as old_item
for each row
(
insert into t_log(f_message, f_operatedate) values(concat('delete:f_saleid->', to_char(old_item.f_saleid)), today)
);

create trigger trg_sale_select select on t_sale
referencing old as old_item
for each row
(
insert into t_log(f_message, f_operatedate) values(concat('select:', old_item.f_productname), today)
);

!echo "insert action"

insert into t_sale(f_productname, f_qty) values('tv', 10);
insert into t_sale(f_productname, f_qty) values('a/c', 20);

!echo "search log"

select * from t_log;


!echo "update action"

update t_sale set f_qty = 15 where f_productname = 'tv';

!echo "search log"

select * from t_log;

!echo "select action"

select * from t_sale;

!echo "search log"

select * from t_log;

!echo "delete action"

delete from t_sale where f_productname = 'tv';

!echo "search log"

select * from t_log;

!echo "select action"

select * from t_sale;

!echo "search log"

select * from t_log;

[informix@vm84145 ~]$ dbaccess testdb trigger.sql 

Database selected.


Table dropped.


Table created.


Table dropped.


Table created.


Trigger created.


Trigger created.


Trigger created.


Trigger created.

insert action

1 row(s) inserted.


1 row(s) inserted.

search log



f_logid        1
f_message      insert:tv
f_operatedate  2022 02月 17日

f_logid        2
f_message      insert:a/c
f_operatedate  2022 02月 17日

2 row(s) retrieved.

update action

1 row(s) updated.

search log



f_logid        1
f_message      insert:tv
f_operatedate  2022 02月 17日

f_logid        2
f_message      insert:a/c
f_operatedate  2022 02月 17日

f_logid        3
f_message      update: f_qty->10
f_operatedate  2022 02月 17日

3 row(s) retrieved.

select action


   f_saleid f_productname              f_qty 

          1 tv                            15
          2 a/c                           20

2 row(s) retrieved.

search log



f_logid        1
f_message      insert:tv
f_operatedate  2022 02月 17日

f_logid        2
f_message      insert:a/c
f_operatedate  2022 02月 17日

f_logid        3
f_message      update: f_qty->10
f_operatedate  2022 02月 17日

f_logid        4
f_message      select:tv
f_operatedate  2022 02月 17日

f_logid        5
f_message      select:a/c
f_operatedate  2022 02月 17日

5 row(s) retrieved.

delete action

1 row(s) deleted.

search log



f_logid        1
f_message      insert:tv
f_operatedate  2022 02月 17日

f_logid        2
f_message      insert:a/c
f_operatedate  2022 02月 17日

f_logid        3
f_message      update: f_qty->10
f_operatedate  2022 02月 17日

f_logid        4
f_message      select:tv
f_operatedate  2022 02月 17日

f_logid        5
f_message      select:a/c
f_operatedate  2022 02月 17日

f_logid        6
f_message      delete:f_saleid->1
f_operatedate  2022 02月 17日

6 row(s) retrieved.

select action


   f_saleid f_productname              f_qty 

          2 a/c                           20

1 row(s) retrieved.

search log



f_logid        1
f_message      insert:tv
f_operatedate  2022 02月 17日

f_logid        2
f_message      insert:a/c
f_operatedate  2022 02月 17日

f_logid        3
f_message      update: f_qty->10
f_operatedate  2022 02月 17日

f_logid        4
f_message      select:tv
f_operatedate  2022 02月 17日

f_logid        5
f_message      select:a/c
f_operatedate  2022 02月 17日

f_logid        6
f_message      delete:f_saleid->1
f_operatedate  2022 02月 17日

f_logid        7
f_message      select:a/c
f_operatedate  2022 02月 17日

7 row(s) retrieved.


Database closed.

[informix@vm84145 ~]$ dbaccess testdb trigger.sql 

删除触发器

drop trigger <trigger_name>;

DEMO

drop trigger if exists trg_sale_insert;
drop trigger if exists trg_sale_update;
drop trigger if exists trg_sale_delete;
drop trigger if exists trg_sale_select;
[informix@vm84145 ~]$ dbaccess testdb -

Database selected.
> drop trigger if exists trg_sale_insert;

Trigger dropped.

> drop trigger if exists trg_sale_update;

Trigger dropped.

> 
> drop trigger if exists trg_sale_delete;

Trigger dropped.

> drop trigger if exists trg_sale_select;

Trigger dropped.

> 

DML

insert

insert into <table_name | view_name | synonym_name> [column_name1, column_name2, ...] values(value1, value2, ...);

insert into <table_name | view_name | synonym_name> [column_name1, column_name2, ...] select col_name1, col_name2, ... ;

insert into <table_name | view_name | synonym_name> [column_name1, column_name2, ...] execute function <fn_name([param1, param2, ...])>;

DEMO

drop table if exists tuser1;

create table tuser1(c_userid int, c_username varchar(20));

insert into tuser1 values(1, 'SINODB');

select * from tuser1;

drop table if exists tuser2;

create table tuser2(c_userid int, c_username varchar(20));

insert into tuser2 select * from tuser1;

select * from tuser2;

drop table if exists tuser3;

create table tuser3(c_userid int, c_username varchar(20));

drop function if exists fn_user_add;

create function fn_user_add(user_num int)
returning int as userid, varchar(20) as username
define i int;
define userid int;
define username varchar(20);

for i = 1 to user_num
    let userid = i;
    let username = concat('user_', to_char(i));
    
    return userid, username with resume;
end for;
end function;

insert into tuser3 execute function fn_user_add(10);

select * from tuser3;

> drop table if exists tuser1;

Table dropped.

> create table tuser1(c_userid int, c_username varchar(20));

Table created.

> insert into tuser1 values(1, 'SINODB');

1 row(s) inserted.

> select * from tuser1;


   c_userid c_username           

          1 SINODB              

1 row(s) retrieved.

> drop table if exists tuser2;

Table dropped.

> create table tuser2(c_userid int, c_username varchar(20));

Table created.

> insert into tuser2 select * from tuser1;

1 row(s) inserted.

> select * from tuser2;


   c_userid c_username           

          1 SINODB              

1 row(s) retrieved.

> drop table if exists tuser3;

Table dropped.

> create table tuser3(c_userid int, c_username varchar(20));

Table created.

> drop function if exists fn_user_add;

Routine dropped.

> create function fn_user_add(user_num int)
> returning int as userid, varchar(20) as username
> define i int;
> define userid int;
> define username varchar(20);
> 
> for i = 1 to user_num
>     let userid = i;
>     let username = concat('user_', to_char(i));
>     
>     return userid, username with resume;
> end for;
> end function;

Routine created.

> insert into tuser3 execute function fn_user_add(10);

10 row(s) inserted.

> select * from tuser3;


   c_userid c_username           

          1 user_1              
          2 user_2              
          3 user_3              
          4 user_4              
          5 user_5              
          6 user_6              
          7 user_7              
          8 user_8              
          9 user_9              
         10 user_10             

10 row(s) retrieved.

> 

Update

update <table_name | view_name | synonym_name> set column_name1 = value1[, column_name2 = value2, ... ] [where condition];

DEMO

drop table if exists t_user;

create table t_user(f_userid int, f_username varchar(50), f_age int);

insert into t_user values(1, 'Mary', 18);
insert into t_user values(2, 'Jack', 21);

select * from t_user;

update t_user set f_age = 20 where f_userid = 1;

select * from t_user;
> drop table if exists t_user;

Table dropped.

> create table t_user(f_userid int, f_username varchar(50), f_age int);

Table created.

> insert into t_user values(1, 'Mary', 18);

1 row(s) inserted.

> insert into t_user values(2, 'Jack', 21);

1 row(s) inserted.

> select * from t_user;


   f_userid f_username                                               f_age 

          1 Mary                                                        18
          2 Jack                                                        21

2 row(s) retrieved.

> update t_user set f_age = 20 where f_userid = 1;

1 row(s) updated.

> select * from t_user;


   f_userid f_username                                               f_age 

          1 Mary                                                        20
          2 Jack                                                        21

2 row(s) retrieved.

> 

delete

delete from <table_name | view_name | synonym_name> [where condition];

DEMO

select * from t_user;

delete from t_user where f_userid = 1;

select * from t_user;
> select * from t_user;


   f_userid f_username                                               f_age 

          1 Mary                                                        20
          2 Jack                                                        21

2 row(s) retrieved.

> delete from t_user where f_userid = 1;

1 row(s) deleted.

> select * from t_user;


   f_userid f_username                                               f_age 

          2 Jack                                                        21

1 row(s) retrieved.

> 

merge

merge into <target_table_name> as t
using <source_table_name | source_query> as s
on t.column_name1 = s.column_name2
when matched then update set t.col_1 = s.col_1, t.col_2 = s.col_2, ...
when not matched then insert (t.col_1, t.col_2, ...) values(s.col_1, s.col_2, ...);

DEMO

drop table if exists t_user1;

create table t_user1(f_userid int, f_username varchar(20), f_age int);

insert into t_user1 values(1, 'Tom', 28);
insert into t_user1 values(2, 'Jack', 26);
insert into t_user1 values(4, 'Rose', 18);

select * from t_user1;

drop table if exists t_user2;

create table t_user2(f_userid int, f_username varchar(20), f_age int);

insert into t_user2 values(3, 'Jim', 25);
insert into t_user2 values(4, 'Rose', 23);
insert into t_user2 values(5, 'Mike', 21);
insert into t_user2 values(6, 'Bill', 19);

select * from t_user2;

merge into t_user1 a
using t_user2 b
on a.f_userid = b.f_userid
when matched then update set a.f_age = b.f_age
when not matched then insert (a.f_userid, a.f_username, a.f_age) values(b.f_userid, b.f_username, b.f_age);

select * from t_user1;

[informix@vm84145 ~]$ dbaccess testdb -

Database selected.

> drop table if exists t_user1;

Table dropped.

> create table t_user1(f_userid int, f_username varchar(20), f_age int);

Table created.

> insert into t_user1 values(1, 'Tom', 28);

1 row(s) inserted.

> insert into t_user1 values(2, 'Jack', 26);

1 row(s) inserted.

> insert into t_user1 values(4, 'Rose', 18);

1 row(s) inserted.

> select * from t_user1;


   f_userid f_username                 f_age 

          1 Tom                           28
          2 Jack                          26
          4 Rose                          18

3 row(s) retrieved.

> drop table if exists t_user2;

Table dropped.

> create table t_user2(f_userid int, f_username varchar(20), f_age int);

Table created.

> insert into t_user2 values(3, 'Jim', 25);

1 row(s) inserted.

> insert into t_user2 values(4, 'Rose', 23);

1 row(s) inserted.

> insert into t_user2 values(5, 'Mike', 21);

1 row(s) inserted.

> insert into t_user2 values(6, 'Bill', 19);

1 row(s) inserted.

> select * from t_user2;


   f_userid f_username                 f_age 

          3 Jim                           25
          4 Rose                          23
          5 Mike                          21
          6 Bill                          19

4 row(s) retrieved.

> merge into t_user1 a
> using t_user2 b
> on a.f_userid = b.f_userid
> when matched then update set a.f_age = b.f_age
> when not matched then insert (a.f_userid, a.f_username, a.f_age) values(b.f_userid, b.f_username, b.f_age);

4 row(s) merged.

> select * from t_user1;


   f_userid f_username                 f_age 

          1 Tom                           28
          2 Jack                          26
          4 Rose                          23
          3 Jim                           25
          5 Mike                          21
          6 Bill                          19

6 row(s) retrieved.

> 

DQL

数据准备

drop table if exists t_dept;

create table t_dept(f_deptid int, f_deptname varchar(10), f_parentid int);

insert into t_dept values(0, 'MS', -1);
insert into t_dept values(1, 'Dev', 0);
insert into t_dept values(2, 'Test', 1);
insert into t_dept values(3, 'Market', 0);
insert into t_dept values(4, 'HR', 0);

drop table if exists t_employee;

create table t_employee(f_employeeid int, f_deptid int, f_employeename varchar(10), f_salary money);

insert into t_employee values(1, 1, 'Tom', 6000.00);
insert into t_employee values(2, 1, 'Jack', 8000.00);
insert into t_employee values(3, 1, 'Mary', 6600.00);

insert into t_employee values(4, 2, 'Henry', 5000.00);
insert into t_employee values(5, 2, 'Rose', 7500.00);
insert into t_employee values(6, 5, 'Bill', 6500.00);


insert into t_employee values(7, 3, 'Kate', 5000.00);
insert into t_employee values(8, 3, 'Bob', 9000.00);

单表查询

select [first n] <* | column_name1[, column_name2, ...]> from <table_name>;

select <column_name1[, column_name2, ...], aggr_func1(column_name_n1)[, aggr_func2(column_name_n2), ...]>
from <table_name>
group by column_name_n1[, column_name_n2, ...]
[order by column_name_m1 [asc | desc][, column_name_m2  [asc | desc], ...]];

DEMO

select first 3 * from t_employee;

select f_deptid, max(f_salary) as f_salary from t_employee group by f_deptid order by f_salary desc;

> select first 3 * from t_employee;


f_employeeid    f_deptid f_employeename            f_salary 

           1           1 Tom                    RMB 6000.00
           2           1 Jack                   RMB 8000.00
           3           1 Mary                   RMB 6600.00

3 row(s) retrieved.

> select f_deptid, max(f_salary) as f_salary from t_employee group by f_deptid order by f_salary desc;

   f_deptid            f_salary 

          3         RMB 9000.00
          1         RMB 8000.00
          2         RMB 7500.00
          5         RMB 6500.00

4 row(s) retrieved.

> 

多表关联查询

自连接

select * from <table_name> a, <table_name> b where a.f_column_name1 = b.f_column_name2;

DEMO

select a.*, b.f_deptname as f_parentname from t_dept a, t_dept b where a.f_parentid = b.f_deptid;
> select a.*, b.f_deptname as f_parentname from t_dept a, t_dept b where a.f_parentid = b.f_deptid;


   f_deptid f_deptname  f_parentid f_parentname 

          1 Dev                  0 MS        
          2 Test                 1 Dev       
          3 Market               0 MS        
          4 HR                   0 MS        

4 row(s) retrieved.

> 

内连接

selct table_name1.column_name1, table_name1.column_name2, ... ,
      table_name2.column_name1, table_name2.column_name2, ... 
from <table_name1> a
inner join <table_name2> b
on a.column_name1 = b.column_name2;

DEMO

select a.f_employeeid, a.f_employeename, b.f_deptname
from t_employee a
inner join t_dept b
on a.f_deptid = b.f_deptid;

> select a.f_employeeid, a.f_employeename, b.f_deptname
>from t_employee a
>inner join t_dept b
>on a.f_deptid = b.f_deptid;  


f_employeeid f_employeename f_deptname 

           1 Tom            Dev       
           2 Jack           Dev       
           3 Mary           Dev       
           4 Henry          Test      
           5 Rose           Test      
           7 Kate           Market    
           8 Bob            Market    

7 row(s) retrieved.

> 

左连接

selct table_name1.column_name1, table_name1.column_name2, ... ,
      table_name2.column_name1, table_name2.column_name2, ... 
from <table_name1> a
left outer join <table_name2> b
on a.column_name1 = b.column_name2;

DEMO

select a.f_employeeid, a.f_employeename, b.f_deptname
from t_employee a
left outer join t_dept b
on a.f_deptid = b.f_deptid;

> select a.f_employeeid, a.f_employeename, b.f_deptname
> from t_employee a
> left outer join t_dept b
> on a.f_deptid = b.f_deptid;


f_employeeid f_employeename f_deptname 

           1 Tom            Dev       
           2 Jack           Dev       
           3 Mary           Dev       
           4 Henry          Test      
           5 Rose           Test      
           6 Bill                     
           7 Kate           Market    
           8 Bob            Market    

8 row(s) retrieved.

> 

右连接

selct table_name1.column_name1, table_name1.column_name2, ... ,
      table_name2.column_name1, table_name2.column_name2, ... 
from <table_name1> a
right outer join <table_name2> b
on a.column_name1 = b.column_name2;

DMEO

select a.f_employeeid, a.f_employeename, b.f_deptname
from t_employee a
right outer join t_dept b
on a.f_deptid = b.f_deptid;

[informix@vm84145 ~]$ dbaccess testdb -

Database selected.
> select a.f_employeeid, a.f_employeename, b.f_deptname
> from t_employee a
> right outer join t_dept b
> on a.f_deptid = b.f_deptid;


f_employeeid f_employeename f_deptname 

                            MS        
           1 Tom            Dev       
           2 Jack           Dev       
           3 Mary           Dev       
           4 Henry          Test      
           5 Rose           Test      
           7 Kate           Market    
           8 Bob            Market    
                            HR        

9 row(s) retrieved.

> 

全连接

selct table_name1.column_name1, table_name1.column_name2, ... ,
      table_name2.column_name1, table_name2.column_name2, ... 
from <table_name1> a
full outer join <table_name2> b
on a.column_name1 = b.column_name2;

DEMO

select a.f_employeeid, a.f_employeename, b.f_deptname
from t_employee a
full outer join t_dept b
on a.f_deptid = b.f_deptid;
> select a.f_employeeid, a.f_employeename, b.f_deptname
> from t_employee a
> full outer join t_dept b
> on a.f_deptid = b.f_deptid
> ;


f_employeeid f_employeename f_deptname 

           1 Tom            Dev       
           2 Jack           Dev       
           3 Mary           Dev       
           4 Henry          Test      
           5 Rose           Test      
           6 Bill                     
           7 Kate           Market    
           8 Bob            Market    
                            MS        
                            HR        

10 row(s) retrieved.

> 

子查询

IN

select *
from <table_name1>
where column_name1 in
(select column_name2 from <table_name2>;
select *
from <table_name1>
where column_name1 in <(val1, val2, ...)>;

DEMO

select * from t_employee where f_deptid in (select f_deptid from t_dept);

select * from t_employee where f_deptid in (3, 5);

> select * from t_employee where f_deptid in (select f_deptid from t_dept);


f_employeeid    f_deptid f_employeename            f_salary 

           1           1 Tom                    RMB 6000.00
           2           1 Jack                   RMB 8000.00
           3           1 Mary                   RMB 6600.00
           4           2 Henry                  RMB 5000.00
           5           2 Rose                   RMB 7500.00
           7           3 Kate                   RMB 5000.00
           8           3 Bob                    RMB 9000.00

7 row(s) retrieved.

> select * from t_employee where f_deptid in (3, 5);


f_employeeid    f_deptid f_employeename            f_salary 

           6           5 Bill                   RMB 6500.00
           7           3 Kate                   RMB 5000.00
           8           3 Bob                    RMB 9000.00

3 row(s) retrieved.

> 

EXISTS

select *
from <table_name1>
where exists (select 1 from <table_name2> where table_name1.column_name1 = table_name2.column_name2);

DEMO

select *
from t_employee a
where exists (select 1 from t_dept b where b.f_deptid = a.f_deptid);
> select *
> from t_employee a
> where exists (select 1 from t_dept b where b.f_deptid = a.f_deptid);


f_employeeid    f_deptid f_employeename            f_salary 

           1           1 Tom                    RMB 6000.00
           2           1 Jack                   RMB 8000.00
           3           1 Mary                   RMB 6600.00
           4           2 Henry                  RMB 5000.00
           5           2 Rose                   RMB 7500.00
           7           3 Kate                   RMB 5000.00
           8           3 Bob                    RMB 9000.00

7 row(s) retrieved.

>