informix的常⽤SQL语句
1、创建数据库
eg1. 创建不记录⽇志的库testdb,参考语句如下:
CREATE DATABASE testdb;
eg2. 创建带缓冲式的记录⽇志的数据库testdb(SQL语句不⼀定在事务之中,拥有者名字不被⽤于对象的解析),参考语句如下:
CREATE DATABASE testdb WITH BUFFERED LOG;
eg3. 创建⽆缓冲式的记录⽇志的数据库testdb(SQL语句不⼀定在事务之中,拥有者名字不被⽤于对象的解析),参考语句如下:
CREATE DATABASE testdb WITH LOG;
eg4. 创建ANSI的数据库(记录⽇志时⽆缓冲,SQL总在事务之中,拥有者名字被⽤于对象的解析),参考语句如下:
CREATE DATABASE testdb WITH LOG MODE ANSI;
2、创建普通数据表
普通数据表⼜被称为持久数据表,它在system catalog⾥注册。⼀个普通数据表可对多个session和connection。创建时可以指定dbspace。
eg1、如下语句创建了⼀个集团信息表cti_vccinfo:
create table cti_vccinfo(
vccid CHAR(6) not null,
vccname VARCHAR(255),
effective INTEGER default0not null,
agentmax INTEGER default0not null,
ivrmax INTEGER default0not null,
updatekey VARCHAR(30),
primary key (vccid) constraint PK_CTI_VI
);
3、创建临时数据表
临时数据表不在system catalog⾥注册。⼀个临时数据表只对对应的某个session或connection可见,在对应的session或connection结束时被⾃动清除。如果dbspace存在的话,临时数据表将建于临时dbspace中。缺省情况下,是没有⽇志的。临时数据表⽀持索引。
eg1:如下创建⼀个customer_temp的表,语句如下:
CREATE TEMP TABLE customer_temp (
num SERIAL NOT NULL,
name CHAR(15),
create_time DATETIME YEAR TO FRACTION(3)
);
eg2:也可以将正式表中customer中的数据通过into temp语句将数据导⼊到临时表中,如下实例创建了⼀个正式的表customer,并插⼊了三条数据,接着通过into temp语句将这个正式表中的数据导⼊到临时表customer_temp。
⾸先,创建customer普通数据表,建表语句如下:
CREATE TABLE customer (
num SERIAL NOT NULL,
name CHAR(15),
create_time DATETIME YEAR TO FRACTION(3)
);
接着,在普通数据表customer中插⼊三条记录,语句如下:
insert into customer (name, create_time) values('amigo', '2010-11-17 15:41:00'
);
insert into customer (name, create_time) values('xiexingxing', '2010-11-17 15:42
:00');
insert into customer (name, create_time) values('amigoxie', '2010-11-17 15:43:0
0');
最后,通过into temp语句将普通数据表customer中的数据导⼊到临时表customer_temp中(注意:需要保证
customer_temp表不存在,操作成功后,customer_temp中的字段为select出的字段),参考语句如下所⽰:
SELECT num, name, create_time FROM customer into TEMP customer_temp;
4、创建主键约束
1)主键约束定义在⼀个数据列或⼀组数据列上;
2)主键的值是不允许重复的;
3)主键的值不允许为NULL。
在2中的实例,创建了cti_vccinfo表,并指定了vccid为其主键,并将其取名为PK_CTI_VI,以⽅便进⾏删除操作。
接下来看⼀个使⽤复合主键的实例,如下语句创建了cti_humantaskgroup表,该表的serviceid和agentid组成联合主键,⾸先看下该表的建表语句:
create table cti_humantaskgroup (
serviceid VARCHAR(30) not null,
agentid VARCHAR(30) not null,
priority INTEGER default0not null,
updatekey VARCHAR(30)
);
如下的语句为该表的serviceid和agentid创建了唯⼀索引:
create unique index Index_CTI_HTG on cti_humantaskgroup(
serviceid ASC,
agentid ASC
);
5、创建引⽤约束
1)⼀个数据表的主键可以被同⼀个数据表或其它数据库表使⽤。主键被引⽤的数据表被称为⽗表,引⽤了附表的主键的数据表被称为⼦表;
2)如果在定义引⽤约束时使⽤了ON DELETE CASCADE,当把⽗表的数据⾏删除时,⼦表的相关数据⾏也会被⾃动删除。
在4中的实例中,cti_humantaskgroup表中的serviceid为cti_humantask中的主键,引⽤约束可在创建表的时候指明,也可以创建完成后通过alter语句创建,参考语句如下:
alter table cti_humantaskgroup
add constraint foreign key (serviceid)
references cti_humantask (serviceid) on delete cascade
constraint FK_CTI_HTG_HT;
读者可以注意点,如上语句加上了on delete cascade,表⽰在删除cti_humantask表时,数据库系统会⾃动删除⼦表
cti_humantaskgroup中serviceid与之相同的数据。
6、检查约束
定义了检查约束后,数据库将数据赋给⼀个数据列之前将根据检查约束检查数据是否满⾜条件。
例如创建⼀个student表,该表有id(学号)、name(姓名)、age(年龄)和birthday(出⽣⽇期)4个字段,age必须在5到35之间,则在创建该表时需要添加检查约束,建表语句参考如下:
create table student (
id VARCHAR(10) not null,
name VARCHAR(10) not null,
age INTEGER default0not null check (age between5and35),
birthday VARCHAR(8)
);
若通过如下语句插⼊⼀条不满⾜age的检查约束的数据:
insert into student values('1234', 'amigo', 40, '19821121');
运⾏后会出现如下提⽰信息:
530: Check constraint (ines.c2209_13601) failed.
7、创建视图
1)创建视图时使⽤select语句;
2)视图在system catalog⾥注册;
3)视图数据不被存储在磁盘上;
4)对于⼀些数据表,可为不同的⽤户建⽴不同的视图;
5)可配置存取权限。
例如,创建⼀个student_age的视图,查出age在20~25的学⽣,语句如下:
CREATE VIEW student_age
(id, name, age, birthday)
AS SELECT id, name, age, birthday FROM student WHERE age>=20and age<
=25
若要查询视图中的数据,例如得到student_age视图中的数据,可通过select语句进⾏查询,参考如下:
常用的sql查询语句有哪些select*from student_age;
若要删除student_age视图,语句如下:
drop view student_age;
8、查询语句
我们使⽤select语句从数据库中查询数据,select语句的使⽤语法如下所⽰:
SELECT 字段列表(各个字段之间⽤英⽂逗号隔开)
FROM 表列表(多个表之间⽤英⽂逗号隔开)
[WHERE 查询条件]
[GROUP BY 字段列表]
[HAVING 条件]
[ORDER BY 字段列表]
[INTO TEMP 临时表的名称]
例如查询student表中的所有数据,语句参考如下:
select*from student;
查询student表中的记录,语句参考如下:
select count(*) from student;
查询student表中的name和age字段,语句参考如下:
select name, age from student;
在查询语句中,可以使⽤关系运算符,可使⽤的关系运算符如下:
1)=
例如查询出student表中姓名为amigo的字段,语句参考如下:
select*from student where name='amigo';
2)!=或<>
例如查询出年龄不为23的记录,语句参考如下:
select*from student where age!=23;
3)>
例如查询出年龄⼤于23的记录,语句参考如下:
select*from student where age>23;
4)>=
⼤于等于,与⼤于使⽤⽅法类似。
5)<
⼩于,与⼤于使⽤⽅法类似。
6)<=
⼩于等于,与⼤于使⽤⽅法类似。
在where语句中,可使⽤的关键字如下所⽰:
1)AND(逻辑与)
例如,当需要在student表中查出name为amigo,并且学号为1000的记录,此时可以使⽤AND,参考语句如下:
select*from student where name='amigo'and id='1000';
2)OR(逻辑或)
例如,需要查询name为amigo,或者name为xingxing的记录,因为是或的关系,所以可以使⽤OR,参考语句如下:
select*from student where name='amigo'or name='xingxing';
3)[NOT] BWTWEEN([不]在......之间)
例如,查student表中age在24和30之间的记录的id、name和age字段,参考语句如下:
select id, name, age from student where age between24and30;
4)[NOT] IN([不]在....中)
[NOT] IN后可以是⼀个具体的值,也可以是⼀个⼦查询。
例如,查student表中的name不在“amigo”和“xingxing”的记录的id和name字段,参考语句如下:
select id, name from student where name not in ('amigo', 'xingxing');
5)IS [NOT] NULL:[不]是NULL
例如需要查询出student表中birthday不为空的记录,参考语句如下:
select*from student where birthday is not null;
6)[NOT] MATCHES:[不]匹配
“?”表⽰匹配单个字符,“*”表⽰0到正整数个字符。
例如,查总共为5个字符,⽽且后4个字符为migo的记录,参考语句如下:
select id, name from student where name matches '?migo';
例如,查student表中以go结尾的任意长度的记录,参考语句如下:
select*from student where name matches '*go';
7)[NOT] LIKE:[不]匹配
使⽤⽅法与[NOT] MATCHES类似,但是是使⽤“_”表⽰单个字符,“%”表⽰0到正整数个字符。
GROUP BY
我们可以使⽤group by对查询结果进⾏分组。分组后我们可以得到各个分组的统计消息,例如平均值、总和、数据⾏数等。
例如,需要根据detail(详细情况分类)分组查询CTI_CallStat表中taskid为000001200002111864的记录,并将每种detail的数量显⽰出来,语句参考如下:
select detail, count(*) as ratio from CTI_CallStat where taskid='00000120000
2111864'group by detail
CASE⼦句
我们可以使⽤CASE表达式对返回值进⾏转换,CASE表达式的语法如下:
CASE (expr)
WHEN expr1 THEN result1
WHEN expr2 THEN result2
ELSE result_else
END
上⾯的CASE表达式的意思是:
当expr为expr1时,返回result1;
当expr为expr2时,返回result2;
...
当expr为其它情况时,返回result_else.
例如查询student表,当age为1时,显⽰为too little,100时,显⽰为too old,其余的情况显⽰为normal,参考语句如下:
select id, name, age,
case age
when1then'too little'
when100then'too old'
else'normal'
end
ageinfo
from student;
DECODE
我们可以使⽤DECODE函数对返回值进⾏转换,DECODE函数的语法如下:
DECODE (expr,
expr1, result1,
expr2, result2,
…
result_else)
上⾯的DECODE函数的意思搜:
当expr为expr1时,返回result1;
当expr为expr2时,返回result2;
...
当expr为其它情况时,返回result_else。
该函数能达到CASE⼦句类似的功能,例如达到前⾯的功能,可使⽤如下的DECODE语句:
SELECT id, name, age,
DECODE (age,
1, 'too little',
100, 'too old',
'normal')
ageinfo
FROM student;
UNION和UNION ALL
如果两个或多个select语句的结果相似,我们可以⽤“union”或“union all”把这些select语句合并起来。“union”和“union all”的区别是:“union”将去掉结果中的⾮第⼀次出现的值,⽽“union all”将保留结果中的⾮第⼀次出现的值。
表连接的语法
我们可以使⽤两种⽅式进⾏数据表连接:
1)数据表之间使⽤逗号,连接条件前使⽤WHERE;
2)数据表之间使⽤JOIN,连接条件前使⽤ON。
第⼀种⽅式的参考实例如下:
SELECT order_num, order_time, c.customer_num
FROM customer c , orders o
WHERE c.customer_num = o.customer_num;
第⼆种⽅式的参考实例如下:
SELECT order_num, order_time, c.customer_num
FROM customer c JOIN orders o
ON c.customer_num = o.customer_num;
外连接
例如,有两个表,员⼯表和项⽬表,员⼯可以负责项⽬,项⽬也可以有负责⼈(员⼯)。
若想知道:那个员⼯负责哪个项⽬,哪些员⼯不负责项⽬,可以使⽤左外连接,参考语句如下:
ployee_num, employee_name, project_num, project_name
from employee e LEFT OUTER JOIN project p ployee_ploye
e_num
若想知道:哪个员⼯负责哪个项⽬,哪些项⽬没有⼈负责,可以使⽤右外连接,参考语句如下:
ployee_num, employee_name, project_num, project_name
from employee e RIGHT OUTER JOIN project p ployee_plo
yee_num
若想知道:哪个员⼯负责哪个项⽬,哪些员⼯不负责项⽬,哪些项⽬没有⼈负责,可以使⽤全连接,参考语句如下:
ployee_num, employee_name, project_num, project_name
from employee e FULL OUTER JOIN project p ployee_ploy
ee_num
⼦查询
⼦查询分两种:相关⼦查询和不相关⼦查询。在相关⼦查询中,⼦查询中涉及到⽗查询的数据列;在不相关⼦查询中,⼦查询中不涉及到⽗查询的数据列。
相关⼦查询实例:
select*from customer
where exists
(select*from vip
where vip.customer_num = customer.customer_num);
不相关⼦查询实例:
select*from project
where employee_num=
(select employee_num from employee where employee_name='amigo');
在很多情况下,我们可以将相关字查询转换为表连接,这样数据库引擎有可能更⽅便的得到更优的查询计划,从⽽使SQL语句的执⾏时间更少。例如可将上⾯的相关⼦查询实例转换为:
select customer.*FROM customer, vip
where customer.customer_num=vip.customer_num;
9、插⼊语句
我们可以使⽤insert语句往数据表中插⼊数据⾏。
如果各值按序赋给数据表中的所有数据列,则不需要指明数据列,例如往student表中插⼊数据,参考语句如下:
insert into student values('1000', 'amigo', 27, '19821121');
如果是将值赋给指定数据列,则需指定数据列,例如只插⼊student表中的前三个字段,若使⽤如下的语句:
insert into student values('1005', 'amigo', 27);
此时会报错提⽰值的个数不正确,错误提⽰如下所⽰:
236: Number of columns in INSERT does not match number of VALUES.
这时,需要指定数据列,参考语句如下:
insert into student (id, name, age) values('1005', 'amigo', 27);
可以在insert语句中嵌⼊select语句,从⽽将从⼀个或多个数据表查询来的数据插⼊到⽬标数据表。
例如将student_bak表中age⼤于25的数据插⼊到student表中,参考语句如下:
insert into student
select id, name, age, birthday
from student_bak where age>25;
10、更新语句
可以使⽤update语句为数据表更新数据⾏。
例如想将student中的id为1000的记录的name字段更新为amigo,age字段更新为28,语句参考如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论