zoukankan      html  css  js  c++  java
  • 【收藏】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))

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 矩阵加法
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 乘法表
    监管只是压倒网盘业务的一根稻草,但不是主要原因(答案只有一个:成本!)
  • 原文地址:https://www.cnblogs.com/81/p/3512836.html
Copyright © 2011-2022 走看看