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 default 0 not null,
agentmax INTEGER default 0 not null,
ivrmax INTEGER default 0 not 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中的数据通过select......into temp语句将数据导入到临时表中,如下实例创建了一个正式的表customer,并插入了三条数据,接着通过select....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:00');
最后,通过select......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 default 0 not 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 default 0 not null check (age between 5 and 35),
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>=20 and age<=25
若要查询视图中的数据,例如得到student_age视图中的数据,可通过select语句进行查询,参考如下:
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 between 24 and 30;
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='000001200002111864' 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
when 1 then 'too little'
when 100 then '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;
外连接
例如,有两个表,员工表和项目表,员工可以负责项目,项目也可以有负责人(员工)。
若想知道:那个员工负责哪个项目,哪些员工不负责项目,可以使用左外连接,参考语句如下:
select e.employee_num, employee_name, project_num, project_name
from employee e LEFT OUTER JOIN project p ON e.employee_num=p.employee_num
若想知道:哪个员工负责哪个项目,哪些项目没有人负责,可以使用右外连接,参考语句如下:
select e.employee_num, employee_name, project_num, project_name
from employee e RIGHT OUTER JOIN project p ON e.employee_num=p.employee_num
若想知道:哪个员工负责哪个项目,哪些员工不负责项目,哪些项目没有人负责,可以使用全连接,参考语句如下:
select e.employee_num, employee_name, project_num, project_name
from employee e FULL OUTER JOIN project p ON e.employee_num=p.employee_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,语句参考如下:
update student set name='amigoxie', age=28 where id='1000';
使用如下的写法也是等效的:
update student set (name, age)=('amigoxie', 28) where id='1000';
11、删除语句
可以使用delete语句从数据表中删除数据行。
例如,删除student表中的所有数据,参考语句如下:
delete from student;
例如,删除student表中id为1001的数据,参考语句如下:
delete from student where id='1001';
例如,删除student表中以go结尾的记录,参考语句如下:
delete from student where name matches '*go';
posted on 2010-11-05 16:41
阿蜜果 阅读(15710)
评论(1) 编辑 收藏 所属分类:
database