您的位置:首页 > 数据库

firebird常用sql语句

2017-10-09 11:29 337 查看
转自:http://www.du52.com/text.php?id=182
Firebird常用SQL

一、分页写法小例:

1
select
first
10
templateid,code,
name
from
template
;
2
select
first
10
skip10templateid,code,
name
from
template
;
3
select
*
from
shop
rows
1
to
10;
--firebird2.0支持这种写法
二、show

 

1
show
tables;
2
show
table
tablename;
三、

D:\firebird2\bin>isql-usysdba-pmasterkey

connect"E:\company\xmwsoft\newxmwsoft\c2\db\cts2.fdb";

四、--更新字段注释

1
update
RDB$RELATION_FIELDS
2
set
RDB$DESCRIPTION
=
'描述信息'
3
where
(RDB$RELATION_NAME
=
'SHOP'
)
and
4
(RDB$FIELD_NAME
=
'CREDIT_BUY'
)
五、--显示字段注释

1
select
RDB$FIELD_NAME,RDB$DESCRIPTION
from
RDB$RELATION_FIELDS
2
where
(RDB$RELATION_NAME
=
'SHOP'
)
3
and
4
(RDB$FIELD_NAME
=
'CREDIT_BUY'
)
六、--更新表注释

1
update
RDB$RELATIONS
set
RDB$DESCRIPTION
=
'描述信息'
where
RDB$RELATION_NAME=
'TABLE_NAME'
七、--查询所有的表和视图(包括系统表和系统视图)

1
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS;
八、--查询所有的用户表和用户视图

1
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS
WHERE
RDB$SYSTEM_FLAG
=0;
九、--查询所有的用户表

1
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS
WHERE
RDB$SYSTEM_FLAG
=0
AND
RDB$VIEW_BLR
IS
NULL
十、查所有用户表、用户视图所有字段及相关定义

01
SELECT
a.RDB$RELATION_NAME,
b.RDB$FIELD_NAME,b.RDB$FIELD_ID,d.RDB$TYPE_NAME,
02
c.RDB$FIELD_LENGTH,
c.RDB$FIELD_SCALE
03
FROM
RDB$RELATIONS
a
04
INNER
JOIN
RDB$RELATION_FIELDS
b
05
ON
a.RDB$RELATION_NAME
=b.RDB$RELATION_NAME
06
INNER
JOIN
RDB$FIELDS
c
07
ON
b.RDB$FIELD_SOURCE
=c.RDB$FIELD_NAME
08
INNER
JOIN
RDB$TYPES
d
09
ON
c.RDB$FIELD_TYPE
=d.RDB$TYPE
10
WHERE
a.RDB$SYSTEM_FLAG
=0
11
AND
d.RDB$FIELD_NAME
=
'RDB$FIELD_TYPE'
12
ORDER
BY
a.RDB$RELATION_NAME,
b.RDB$FIELD_ID
十一、查找某表的所有字段及相关定义

1
SELECT
A.RDB$FIELD_NAME,
B.RDB$FIELD_TYPE,B.RDB$FIELD_LENGTH,B.RDB$FIELD_PRECISION,B.RDB$FIELD_SCALE
2
FROM
RDB$RELATION_FIELDS
A,RDB$FIELDSB
3
WHERE
A.RDB$RELATION_NAME
=
'tablename'
4
AND
A.RDB$FIELD_SOURCE
=B.RDB$FIELD_NAME
5
ORDER
BY
A.RDB$FIELD_POSITION
十二、查找某表的主键定义字段

1
select
A.RDB$FIELD_NAME
FROM
RDB$INDEX_SEGMENTS
A,RDB$RELATION_CONSTRAINTSB
2
WHERE
B.RDB$CONSTRAINT_TYPE
=
'PRIMARY
KEY'
3
AND
B.RDB$RELATION_NAME
=
'tablename'
4
AND
A.RDB$INDEX_NAME
=B.RDB$INDEX_NAME
5
ORDER
BY
A.RDB$FIELD_POSITION
十三、查找某表的外键定义

1
select
r1.RDB$CONSTRAINT_NAME,
rind.RDB$FIELD_NAME,r2.RDB$RELATION_NAME
2
FROM
RDB$RELATION_CONSTRAINTS
r1,RDB$RELATION_CONSTRAINTSr2,RDB$REF_CONSTRAINTSref,RDB$INDEX_SEGMENTSrind
3
where
r1.RDB$RELATION_NAME
=
'tablename'
4
and
r1.RDB$CONSTRAINT_TYPE
=
'FOREIGN
KEY'
5
and
r1.RDB$CONSTRAINT_NAME
=ref.RDB$CONSTRAINT_NAME
6
and
ref.RDB$CONST_NAME_UQ
=r2.RDB$CONSTRAINT_NAME
7
and
r1.RDB$INDEX_NAME
=rind.RDB$INDEX_NAME
firebird默认的用户名:SYSDBA密码:masterkey

开源的Firebird的可视化管理工具Marathon

flameRobin也量个开源的可视化管理工具

1、创建表

01
CREATE
TABLE
table_name
02
(
03
column_name
{<datatype>|COMPUTED
BY
(<
expr>)|domain}
04
[
DEFAULT
{
literal|
NULL
|
USER
}]
[
NOT
NULL
]
05
...
06
CONSTRAINT
constraint_name
07
PRIMARY
KEY
(column_list),
08
UNIQUE
(column_list),
09
FOREIGN
KEY
(column_list)
REFERENCES
other_table
(column_list),
10
CHECK
(condition),
11
...
12
);
如:createtablet1

(

sno1char(9)primarykey,

sno2char(9)referencesstudent(sno)

)

2、修改表

(1)增加字段

altertabletable_nameaddfieldnamedatetype[notnull,primarykey]

如:altertablestudentaddsexchar(2)notnull

primarykey

default'm'

CHECK(sex1='f'orsex1='m')

ALTERTABLESTUDENT

ADDAGEINTEGER[1:100]

DEFAULT56

CHECK(agebetween20and35)

ALTERTABLESTUDENT

ADDAGEINTEGER[1:100]

DEFAULT56

CHECK(age>=20andage<=35)

(2)删除字段

altertabletable_namedropfieldname

ALTERTABLESTUDENTDROPAA

(3)增加主键

altertableSCORE

addconstraintPK_SCORE_1

primarykey(ID,CORUSENAME)

////////////////////////////////////////////////////////////////////////////

查询:

SELECT[TRANSACTIONtransaction]

[DISTINCT|ALL]

{*|<val>[,<val>…]}

[INTO:var[,:var…]]

FROM<tableref>[,<tableref>…]

[WHERE<search_condition>]

[GROUPBYcol[COLLATEcollation][,col[COLLATEcollation]…]

[HAVING<search_condition>]

[UNION<select_expr>[ALL]]

[PLAN<plan_expr>]

[ORDERBY<order_list>]

[FORUPDATE[OFcol[,col…]]];

在表上增加外键

altertableSTUDENT

addconstraintFK_STUDENT_1

foreignkey(ID)

referencesSCORE(ID)

///////////////////////////////////////////////////////////////////////

创建域:

CREATEDOMAINdomain[AS]<datatype>

[DEFAULT{literal|NULL|USER}]

[NOTNULL][CHECK(<dom_search_condition>)]

[COLLATEcollation];

如:

(1)createdomainMyScoreasSMALLINT

default0

check(valuebetween0and100)

(2)CREATEDOMAINDEPTNOASCHAR(3)

CHECK((VALUE='000')OR

(VALUE>'0'ANDVALUE<='999')

OR(VALUEISNULL))

修改域:

ALTERDOMAINname{

SETDEFAULT{literal|NULL|USER}

|DROPDEFAULT

|ADD[CONSTRAINT]CHECK(<dom_search_condition>)

|DROPCONSTRAINT|new_col_name

|TYPEdatatype};

如:

(1)alterDOMAINDAGETYPEINTEGER

(2)alterDOMAINDAGETYPEINTEGER

setDEFAULT40

addconstraintCHECK(valuebetween10and90)

(3)alterDOMAINDAGETYPEINTEGER

dropCONSTRAINT

(4)CREATEDOMAINprodtype

ASVARCHAR(12)

DEFAULT'software'NOTNULL

CHECK(VALUEIN('software','hardware','other','N/A'));

问题:不知道{USER}是什么意思,怎么用?

连接到数据:

CONNECT'filespec'[USER'username'][PASSWORD'password']

[CACHEint][ROLE'rolename']

如:

connectg:\firebird\test.fdbuser'sysdba'password'masterkey';//一定要加上‘;’以表示sql语句结束。

创建索引:

CREATE[UNIQUE][ASC[ENDING]|DESC[ENDING]]INDEXindex

ONtable(col[,col…]);

创建视图:

CREATEVIEWname[(view_col[,view_col…])]

AS<select>[WITHCHECKOPTION];

创建存储过程

CREATEPROCEDUREname

[(param<datatype>[,param<datatype>…])]

[RETURNS<datatype>[,param<datatype>…])]

AS<procedure_body>[terminator]

//////////////////////////////////////////////

<procedure_body>=

[<variable_declaration_list>]

<block>

////////////////////////////////////////////////

<variable_declaration_list>=

DECLAREVARIABLEvar<datatype>;

[DECLAREVARIABLEvar<datatype>;…]

///////////////////////////////////

<block>=

BEGIN

<compound_statement>

[<compound_statement>…]

END

查询select:

SELECT[TRANSACTIONtransaction]

[DISTINCT|ALL]

{*|<val>[,<val>…]}

[INTO:var[,:var…]]

FROM<tableref>[,<tableref>…]

[WHERE<search_condition>]

[GROUPBYcol[COLLATEcollation][,col[COLLATEcollation]…]

[HAVING<search_condition>]

[UNION<select_expr>[ALL]]

[PLAN<plan_expr>]

[ORDERBY<order_list>]

[FORUPDATE[OFcol[,col…]]];

注意:plan和for的用法。

查询数据的前10行:

selectFIRST10skip2*fromEMPLOYEE

查询数据的前10行,用关键字first:

CAST(<value>|NULLASdatatype)

FromdatatypeTodatatype

NUMERIC->CHARACTER,DATE

CHARACTER->NUMERIC,DATE

DATE->CHARACTER,NUMERIC

连接字符串:||

如:selectid,name||'ddd'

fromSTUDENT

////////////////////////////////////////////////////////////////////

注意:在InterBase存储过程和触发器语言代码中,除了上面提到的复合语句Begin、End之外,所有的语句必须以分号结束,这一点必须明确。

单独的sql语句后也不用加分号结束。

//////////////////////////////////////////

单行选择语句Select…Into:将选择的结果存储到Into之后的变量中,into子句必须放在整个选择语句的末尾。例如:SelectCount(*)fromEmployeeInto:varcount;

////////////////////////////////////////////////////////////////////

多行选择语句FORselect_statementDOcompound_statement:

对select_statement返回的每一条记录重复执行compounde_statement语句,实际是一个循环结构。其中:select_statement是必须带有into子句的选择语句,而且into子句必须放在选择语句的末尾,而且后面不能跟分号。使用该语句可以返回多个数据行。语法结构是:Forselect_statement
DoCompound_statement

/////////////////////////////////////////////////////////

IF(condition)THENcompound_statement[ELSEcompound_statement]:

/////////////////////////////////////////////////////////////

SUSPEND:暂时终止即挂起存储过程的执行,并将参数返回给客户端。这是存储过程专用的语句。

//////////////////////////////////////////////////////////////////

WHILEconditionDOcompound_statement:当condition条件为真时,重复执行compounde_statement语句,直到condition条件为假时退出。

///////////////////////////////////////////////////////////////////////

WHEN{error[,error…]|ANY}DOcompound_statement:

错误处理语句。当指定的错误之一出现时,执行compound_statement语句。如果使用了WHEN,那么必须将其放在整个存储过程或触发器的最后一个语句。error可以是异常、SQLCODE错误码、GDSCODE代码。ANY表示处理任何错误。

///////////////////////////////////////////////////

注意:在存储过程中,除了CreateProcedure,As,Begin…End语句之外,任何其他语句末尾都要添加分号结束。因此,如果你使用isql创建存储过程,你必须另外定义其它的符号来代表创建存储过程的结束,通常使用setterm语句完成。比如,在创建存储过程之前,使用setterm!!;把!!作为分号来表示存储过程创建的结束,在创建存储过程的语句之后,再用set
term;!!恢复分号的作用。如:

SetTerm##;CreateProcedureAdd_Emp_Proj(Emp_NoSmallint,Proj_IdChar(5))AsBegin

Begin

InsertIntoEmployee_Project(Emp_No,Proj_Id)Values(:Emp_No,:Proj_Id);

WhenSqlcode-530DoExceptionUnknown_Emp_Id;

EndReturn;

End##

SetTerm;##

特别注意:不论是输入参数、输出参数还是局部变量,如果在SQL语句中使用,前面必须加上冒号。如果不和SQL语句一起使用,则不要加冒号。

//////////////////////////////////

在存储过程中不要使用标准的select语句返回多行数据,而是要使用FOR…SELECT…INTO循环和SUSPEND语句通过输出参数来完成。

///////////////////////

删除存储过程

要删除一个存储过程,可以使用DropProcedure语句。不过你要注意如下的一些限制:

·不能删除一个被其它存储过程、触发器、视图引用的存储过程,必须先将这种引用关系解除,然后才能删除存储过程。

·不能删除一个递归或者与其它存储过程形成循环依赖关系的存储过程,必须先解除这种递归或者循环依赖关系才能删除存储过程。

·如果存储过程正被活动事务使用,则必须等事务结束后才能删除。

·只有超级用户和存储过程的创建者才能删除存储过程。

//////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: