一、建立數據庫
eg1. 建立不記錄日誌的庫testdb,參考語句以下:java
CREATE DATABASE testdb;數據庫
eg2. 建立帶緩衝式的記錄日誌的數據庫testdb(SQL語句不必定在事務之中,擁有者名字不被用於對象的解析),參考語句以下:session
CREATE DATABASE testdb WITH BUFFERED LOG;函數
eg3. 建立無緩衝式的記錄日誌的數據庫testdb(SQL語句不必定在事務之中,擁有者名字不被用於對象的解析),參考語句以下:spa
CREATE DATABASE testdb WITH LOG;.net
eg4. 建立ANSI的數據庫(記錄日誌時無緩衝,SQL總在事務之中,擁有者名字被用於對象的解析),參考語句以下:日誌
CREATE DATABASE testdb WITH LOG MODE ANSI;orm
二、建立普通數據表
普通數據表又被稱爲持久數據表,它在system catalog裏註冊。一個普通數據表可對多個session和connection。建立時能夠指定dbspace。
eg一、以下語句建立了一個集團信息表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
);blog
三、建立臨時數據表
臨時數據表不在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;
四、建立主鍵約束
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
);
五、建立引用約束
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與之相同的數據。
六、檢查約束
定義了檢查約束後,數據庫將數據賦給一個數據列以前將根據檢查約束檢查數據是否知足條件。
例如建立一個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.
七、建立視圖
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;
八、查詢語句
咱們使用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;
九、插入語句
咱們可使用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;
十、更新語句
可使用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';
十一、刪除語句
可使用delete語句從數據表中刪除數據行。
例如,刪除student表中的全部數據,參考語句以下:
delete from student;
例如,刪除student表中id爲1001的數據,參考語句以下:
delete from student where id='1001';
例如,刪除student表中以go結尾的記錄,參考語句以下:
delete from student where name matches '*go';