• 【收藏】Firebird知识


    本代码在:WinXp Pack 3 + Delphi2009 updata1 火鸟Firebird2.5.0.23247下测试通过。
    使用了Data Access面板的组件用SQL进行操作
    作者:LAH [懒妹]
    QQ:112412387

    火鸟Firebird数据库的中文参考资料

    ■firebird标准连接串 
    Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey;DbName=C:document. and SettingsAdministrator桌面datademo.fdb;
    default character set gbk; 使用中文时在创建数据库语句中就应该加这句,并且连接文本中也要用这句。

    .NET - Firebird .Net Data Provider 连接串 
    User=SYSDBA;Password=masterkey;Database=SampleDatabase.fdb;DataSource=localhost;Port=3050;Dialect=3; Charset=NONE;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;



    ■Firebird除了可见的表外,还隐藏了系统表具体可用(注意以下语句中的""中的文本区分大小写)

    查询所有的表和视图(包括系统表和系统视图)
    SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;

    这样我们就能看到rdb$开头的系统表,如约束信息表:
    rdb$relation_constraints 及与其相关的 RDB$CHECK_CONSTRAINTS RDB$INDEX_SEGMENTS

    一、分页写法小例:
    select first 10 templateid,code,name from template ;
    select first 10 skip 10 templateid,code,name from template ;
    select * from shop rows 1 to 10; --firebird2.0支持这种写法

    二、show
    show tables;
    show table tablename;
    三、
    D:firebird2in>isql -u sysdba -p masterkey
    connect "E:companyxmwsoft ewxmwsoftc2dbcts2.fdb";
    四、--更新字段注释
    update RDB$RELATION_FIELDS
    set RDB$DESCRIPTION = "描述信息"
    where (RDB$RELATION_NAME = "SHOP") and
    (RDB$FIELD_NAME = "CREDIT_BUY")

    五、--显示字段注释
    select RDB$FIELD_NAME,RDB$DESCRIPTION from RDB$RELATION_FIELDS
    where (RDB$RELATION_NAME = "SHOP")
    and
    (RDB$FIELD_NAME = "CREDIT_BUY")

    六、--更新表注释
    update RDB$RELATIONS set RDB$DESCRIPTION = "描述信息" where RDB$RELATION_NAME="TABLE_NAME"



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

    九、--查询所有的用户表
    SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL

    十、查所有用户表、用户视图所有字段及相关定义
    SELECT a.RDB$RELATION_NAME, b.RDB$FIELD_NAME, b.RDB$FIELD_ID, d.RDB$TYPE_NAME,
    c.RDB$FIELD_LENGTH, c.RDB$FIELD_SCALE
    FROM RDB$RELATIONS a
    INNER JOIN RDB$RELATION_FIELDS b
    ON a.RDB$RELATION_NAME = b.RDB$RELATION_NAME
    INNER JOIN RDB$FIELDS c
    ON b.RDB$FIELD_SOURCE = c.RDB$FIELD_NAME
    INNER JOIN RDB$TYPES d
    ON c.RDB$FIELD_TYPE = d.RDB$TYPE
    WHERE a.RDB$SYSTEM_FLAG = 0
    AND d.RDB$FIELD_NAME = "RDB$FIELD_TYPE"
    ORDER BY a.RDB$RELATION_NAME, b.RDB$FIELD_ID
    十一、查找某表的所有字段及相关定义
    SELECT A.RDB$FIELD_NAME, B.RDB$FIELD_TYPE, B.RDB$FIELD_LENGTH, B.RDB$FIELD_PRECISION, B.RDB$FIELD_SCALE
    FROM RDB$RELATION_FIELDS A, RDB$FIELDS B
    WHERE A.RDB$RELATION_NAME = "tablename"
    AND A.RDB$FIELD_SOURCE = B.RDB$FIELD_NAME
    ORDER BY A.RDB$FIELD_POSITION
    十二、查找某表的主键定义字段
    select A.RDB$FIELD_NAME FROM RDB$INDEX_SEGMENTS A, RDB$RELATION_CONSTRAINTS B
    WHERE B.RDB$CONSTRAINT_TYPE = "PRIMARY KEY"
    AND B.RDB$RELATION_NAME = "tablename"
    AND A.RDB$INDEX_NAME = B.RDB$INDEX_NAME
    ORDER BY A.RDB$FIELD_POSITION

    十三、查找某表的外键定义
    select r1.RDB$CONSTRAINT_NAME, rind.RDB$FIELD_NAME, r2.RDB$RELATION_NAME
    FROM RDB$RELATION_CONSTRAINTS r1, RDB$RELATION_CONSTRAINTS r2, RDB$REF_CONSTRAINTS ref, RDB$INDEX_SEGMENTS rind
    where r1.RDB$RELATION_NAME = "tablename"
    and r1.RDB$CONSTRAINT_TYPE = "FOREIGN KEY"
    and r1.RDB$CONSTRAINT_NAME = ref.RDB$CONSTRAINT_NAME
    and ref.RDB$CONST_NAME_UQ = r2.RDB$CONSTRAINT_NAME
    and r1.RDB$INDEX_NAME = rind.RDB$INDEX_NAME

    十四、添加主键等约束
    alter table tablename add constraint PK_tablename primary key(FIELDname)
    alter table tablename add constraint uq_FIELD unique(FIELDname) 或 alter table tablename add unique(FIELDname)
    添加NOT NULL约束比较特殊
    update RDB$RELATION_FIELDS set RDB$NULL_FLAG = 1 where (RDB$FIELD_NAME = 'FIELDNAME') and (RDB$RELATION_NAME = 'TN')
    insert into RDB$RELATION_constraints values('NN_FIELD','NOT NULL','WFW','NO','NO','')
    insert into RDB$CHECK_constraints values('NN_FIELD','FIELD')

    十五、删除主键等约束
    先查这个表的主键名
    select RDB$CONSTRAINT_NAME from RDB$RELATION_CONSTRAINTS where RDB$CONSTRAINT_TYPE='PRIMARY KEY' and RDB$RELATION_NAME='tablename'
    然后
    alter table tablename drop constraint 主键名 (主键名一般在隐藏的系统表中,每个约束一个名。)

    十六、创建数据库
    Create Database 'D:Mydb.fdb' user 'sysdba' password 'masterkey' [default character set gbk]

    十七、查指定字段Not Null约束
    SELECT a.rdb$trigger_name,b.rdb$constraint_name,b.rdb$constraint_type FROM RDB$CHECK_CONSTRAINTS a, rdb$relation_constraints b where a.rdb$constraint_name=b.rdb$constraint_name and b.rdb$constraint_type='NOT NULL' and b.RDB$RELATION_NAME='表名' and a.rdb$trigger_name='字段名'

    十八、查指定表所有unique约束 和 主键约束
    SELECT a.RDB$FIELD_NAME,b.rdb$constraint_name,b.rdb$constraint_type FROM RDB$INDEX_SEGMENTS a, rdb$relation_constraints b where a.RDB$INDEX_NAME=b.RDB$INDEX_NAME and b.RDB$RELATION_NAME='tablename'

    十九、修改字段类型
    ALTER TABLE TABLENAME ALTER FIELDNAME TYPE FLOAT

    二十、改字段名
    alter table TABLENAME alter oldFIELDname to newFIELDname


    ■Firebird的基本数据类型

    由于排版关系,取幂将用[],比如10[5],表示10的5次方。

    INTEGER:长整型,取值范围:-2147483648至2147483647

    FLOAT:单精度浮点型,取值范围:1.175*10[-38]至3.402*10[38]

    DOUBLE PRECISION:双精度浮点型,取值范围:2.225*10[-308]至1.797*10[308]

    DECIMAL:小数型,可指定有效位数最大为18位或小数点后18位。比如DECIMAL(5,2),就是指有5位数字,不含小数点,形如123.45

    NUMERIC:小数型,与DECIMAL类似,稍后讲它们的区别。

    注意,当数据含小数部分时,请尽量用DECIMAL,因为浮点型有精度问题,除非数值特别大,才用浮点型!

    DECIMAL与NUMERIC的区别:
    比如,DECIMAL(5,2)与NUMERIC(5,2)所分别定义的字段,DECIMAL(5,2)指的是至少有5位数字,还可以更多!而NUMERIC(5,2)指的是,就是5位,不多也不少。


    SMALLINT:短整型,取值范围:-32768至32767,数值确定比较小时,可以使用,可以节省磁盘空间与提升效率

    CHAR:字符型,最多32767个字符,注意,使用CHAR类型,即使字符数没有达到指定字段的宽度,也会用空字符补满!取值时,请注意用TRIM()等函数去掉多余空字符。除非确定每条记录的字符数不变,否则请用VARCHAR类型。

    VARCHAR:可变长度字符型,最多32767个字符,存储时,会根据内容长度自动改变存储位数,不会产生多余空字符。当字符数超过32767时,请用BLOB型。

    TIME:时间型,取值范围:00:00至23:59.9999

    TIMESTAMP:日期时间型,取值范围:公元100年1月1日至公元32768年2月29日,同时包含日期与时间信息。

    DATE:日期型,取值范围:公元100年1月1日至公元32768年2月29日。,注意,建库时需选择DIALECT 3级别才支持DATE型,否则就是TIMESTAMP型。

    BLOB:大二进制型,可支持Text(文本)、Binary Data(二进制型,比如图片,声音等)等子类型。取值范围:64KB以内。

    BOOLEAN:逻辑型,Firebird 2.0引入的新类型。取值范围:TRUE(值)或FALSE(假)。使用BOOLEAN而不用SMALLINT的理由是可以用更少的位数来存储,而且与SQL标准兼容,但是,数据将与1.5版本不兼容。



    ■1. COUNT, AVG, MAX, MIN, SUM
    说明:通用统计函数,不详细介绍了

    2. EXTRACT(timestamp_part FROM value)
    说明:EXTRACT(YEAR/MONTHE/DAY/WEEKDAY FROM 字段名)
    从日期型字段中分离出年,月,日及一个星期的第几天

    3. CAST(value AS datatype)
    说明:转换数据类型

    4. LOWER() *
    说明:返回小写值

    5. UPPER()
    说明:返回大写值

    6. TRIM() *
    说明:去除字符串两边的空格

    7. SUBSTRING(string FROM pos FOR length)
    说明:取字符串子串,注意,第一个字符的位置是1

    8. BIT_LENGTH *
    说明:返回字符串位(bit)数

    9. CHAR_LENGTH/CHARACTER_LENGTH *
    说明:返回字符串字符数

    10. OCTET_LENGTH *
    说明:返回字符串字节数

    11. CASE
    说明:通过执行外来的一组条件取得相应的返回值
    举例
    i) 简单
    SELECT o.ID, o.Description,
    CASE o.Status
    WHEN 1 THEN "confirmed"
    WHEN 2 THEN "in production"
    WHEN 3 THEN "ready"
    WHEN 4 THEN "shipped"
    ELSE "unknown status """ || o.Status || """"
    END
    FROM Orders o;
    ii) 表达式
    SELECT o.ID, o.Description,
    CASE
    WHEN (o.Status IS NULL) THEN "new"
    WHEN (o.Status = 1) THEN "confirmed"
    WHEN (o.Status = 3) THEN "in production"
    WHEN (o.Status = 4) THEN "ready"
    WHEN (o.Status = 5) THEN "shipped"
    ELSE "unknown status """ || o.Status || """"
    END
    FROM Orders o;

    12. IIF (<search_condition>, <value1>, <value2>)
    说明:表达式为真,返回value1否则返回value2
    等价于以下语句:
    CASE
    WHEN <search_condition> THEN <value1>
    ELSE <value2>
    END

    13. NULLIF(V1,V2)
    说明:如果V1=V2,返回NULL,否则返回V1
    等价于以下语句:
    CASE WHEN V1 = V2 THEN NULL ELSE V1 END
    举例
    UPDATE PRODUCTS
    SET STOCK = NULLIF(STOCK,0)

    14. COALESCE(V1, V2, …, Vn)
    说明:如果V1为Null,返回V2,否则返回V1,
    如果 n >= 3, 等于如下case语句:
    CASE
    WHEN V1 IS NOT NULL THEN V1
    ELSE COALESCE (V2,...,Vn)
    END

    举例
    SELECT
    PROJ_NAME AS Projectname,
    COALESCE(e.FULL_NAME,"[< not assigned >]") AS Employeename
    FROM
    PROJECT p
    LEFT JOIN EMPLOYEE e
    ON (e.EMP_NO = p.TEAM_LEADER);

    SELECT
    COALESCE(Phone,MobilePhone,"Unknown") AS "Phonenumber"
    FROM Relations;




    ■ 某表tbl,
    字段A,varchar
    字段B,date
    字段C,numeric

    如有一下数据:
    A,B,C
    0001,2008-3-1,7
    0001,2008-3-2,14
    0002,2008-3-1,32
    0002,2008-3-3,56

    0001和0002的最新日期是不一致的。

    我现在可以查出0001和0002的最新日期的数据,
    select * from tbl a
    where B=(select max(B) from tbl B where a.A=b.A)

    得到
    0001,2008-3-2,14
    0002,2008-3-3,56

    问题是如何查出次新日期的数据,得到
    0001,2008-3-1,7
    0002,2008-3-1,32

    channon:自己解决了
    select * from tbl a
    where B=(select max(B) from tbl b where a.A=b.A
    and B<(select max(B) from tbl c where c.A=b.A))

  • 相关阅读:
    Yii -format 数据格式化类的用法
    Yii CModel中rules验证规则(需要验证,有些有错误)
    yii rules 转自 安全者 » Yii rules常用规则 ,适用Yii2
    yii2 restfulapi moudules 模块下的接口
    SL410K 在Ubuntu禁用触摸板
    AngularJs遇到的小坑与技巧
    google chrome 32 升级变更找回user agent(google chrome lose user agent)
    感慨一下发展快速的前端开发
    Sublime key bindings使用
    ubuntu 12.04 搭建nginx + php + mysql +phpmyadmin
  • 原文地址:https://www.cnblogs.com/81/p/3512836.html
Copyright © 2020-2023  润新知