zoukankan      html  css  js  c++  java
  • 【数据库】数据库基础

    【数据库】数据库基础

    一、SQL语句

    (1)Select 查询语句

             语法:SELECT [ALL|DISTINCT] <目标列表达式> [AS 列名]
                         [,<目标列表达式> [AS 列名] ...] FROM <表名> [,<表名>…]
                         [WHERE <条件表达式> [AND|OR <条件表达式>...]
                         [GROUP BY 列名 [HAVING <条件表达式>]]
                         [ORDER BY 列名 [ASC | DESC]] 
              解释:[ALL|DISTINCT]        ALL:全部

                                                             DISTINCT:不包括重复行
                          <目标列表达式> 对字段可使用AVG、COUNT、SUM、MIN、MAX、运算符等
                          <条件表达式> 
                                                 查询条件 谓词
                                                 比较 =、>,<,>=,<=,!=,<>,
                                                 确定范围 BETWEEN AND、NOT BETWEEN AND
                                                 确定集合 IN、NOT IN
                                                 字符匹配 LIKE(“%”匹配任何长度,“_”匹配一个字符)、NOT LIKE
                                                 空值          IS NULL、IS NOT NULL
                                                 子查询      ANY、ALL、EXISTS
                                                 集合查询 UNION(并)、INTERSECT(交)、MINUS(差)
                                                 多重条件 AND、OR、NOT
                          <GROUP BY 列名> 对查询结果分组
                           [HAVING <条件表达式>] 分组筛选条件
                           [ORDER BY 列名 [ASC | DESC]] 对查询结果排序;ASC:升序 DESC:降序

             例子:


              例1:从表score 、student中查询学生的 学号、姓名、课程名、成绩 

                       select student.sno as 学号, student.name as 姓名, course as 课程名, score as 成绩 from score,student where student.sid=score.sid andscore.sid=:sid
              例2:

                      select   student.sno as 学号student.name as 姓名, AVG(score) as 平均分 from score,student where student.sid=score.sid and student.class=:class and (term=5 or term=6) group by student.sno, student.name having count(*)>0 order by 平均分 DESC


              例3:模糊查询

                      select * from score where sid like '9634'   

           
              例4:集合查询

                      select * from student where class in (select class from student where name='陈小小')

    (2)INSERT插入语句
              语法:INSERT INTO <表名> [(<字段名1> [,<字段名2>, ...])] VALUES (<常量1> [,<常量2>, ...])

              例1:INSERT INTO 借书表(rid,bookidx,bdate)VALUES (edit1.text,edit2.text,date)

              语法:INSERT INTO <表名> [(<字段名1> [,<字段名2>, ...])]  子查询 
              例2:INSERT INTO score1(sno,name) SELECT sno,name FROM student WHERE class=’9634’

    (3)UPDATE-SQL
              语法:UPDATE 〈表名〉

                           SET           列名1 = 常量表达式1[,列名2 = 常量表达式2 ...]
                           WHERE   <条件表达式> [AND|OR <条件表达式>...]

     
              例子:update score set credithour=4   where course='数据库'

    (4)DELETE-SQL  (删除记录)
              语法:DELETE FROM〈表名〉[WHERE <条件表达式> [AND|OR <条件表达式>...]]
             例子:Delete from student where sid='003101'

    (5)CREATE TABLE
              CREATE TABLE | DBF TableName1 [NAME LongTableName] [FREE]
              (FieldName1 FieldType [(nFieldWidth [, nPrecision])]
               [NULL | NOT NULL] 
              [CHECK lExpression1 [ERROR cMessageText1]]
              [DEFAULT eExpression1]
              [PRIMARY KEY | UNIQUE]
              [REFERENCES TableName2 [TAG TagName1]]
              [NOCPTRANS]
              [, FieldName2 ...]
              [, PRIMARY KEY eExpression2 TAG TagName2
                          |, UNIQUE eExpression3 TAG TagName3]
             [, FOREIGN KEY eExpression4 TAG TagName4 [NODUP]
                REFERENCES TableName3 [TAG TagName5]]
            [, CHECK lExpression2 [ERROR cMessageText2]])
                          | FROM ARRAY ArrayName

    (6)ALTER TABLE
              ALTER TABLE TableName1
              ADD | ALTER [COLUMN] FieldName1
              FieldType [(nFieldWidth [, nPrecision])]
              [NULL | NOT NULL]
              [CHECK lExpression1 [ERROR cMessageText1]]
              [DEFAULT eExpression1]
              [PRIMARY KEY | UNIQUE]
              [REFERENCES TableName2 [TAG TagName1]]
              [NOCPTRANS]

    (7)DROP TABLE
               DROP TABLE [路径名.]表名

    (8)CREATE INDEX
              CREATE INDEX index-name ON table-name(column[,column…])
              例:CREATE INDEX uspa ON 口令表(user,password)

    (9)DROP INDEX
             DROP INDEX table-name.index-name|PRIMARY
             例:DROP INDEX 口令表.uspa

    二、在程序中使用静态SQL语句
           在程序设计阶段,将SQL命令文本作为TQuery组件的SQL属性值设置。

    三、在程序中使用动态SQL语句
            动态SQL语句是指在SQL语句中包含有参数变量的SQL语句(如:select * from student where class=:class),在程序中可以为参数赋值。给参数赋值的方法有:

            1、利用参数编辑器为参数赋值
                  选中TQuery组件,在对象监视器OI中点取Params项,在弹出的参数编辑窗口中设置参数的值。
                  例:SELECT bookidx AS 书号,藏书表.bookname AS 书名, bdate AS 借书日期 FROM 借书表,藏书表 where 借书表.bookidx=藏书表.bookidx and rid=:rid

            2、在程序运行中通过程序为参数赋值
                (1)根据参数在SQL语句中出现的顺序,使用TQuery的Params属性为参数赋值;

                  例:在借书表中插入一条记录
                           with Query1 do
                           begin
                           SQL.clear;
                           SQL.add('Insert Into 借书表(bookidx,rid,rdate)');
                           SQl.add('Values(:bookidx,:rid,:rdate)');
                           Params[0].AsString := bookidxEdit.Text;
                           Params[1].AsString := ridEdit.Text;
                           Params[2] .AsDate:=date;
                           ExecSQL;
                           End;

              (2)根据SQL语句中的参数名字,调用ParamByName方法为参数赋值;
                         ParamByName('bookidx').AsString := bookidxEdit.Text;
                         ParamByName('rid').AsString := ridEdit.Text;
                         ParamByName('rdate') .AsDate:=date;
                         ExecSQL;
                         有:AsString 、AsSmallInt 、AsInteger 、AsWord 、AsBoolean 、AsFloat 、AsCurrency 、AsBCD 、AsDate 、AsTime 、AsDateTime转换函数

               3、使用数据源为参数赋值
                     把TQuery的DataSource属性设置为另一个数据源(T DataSource名字),Delphi会把未赋值的参数与指定的数据源中的各字段相比较,并将匹配的字段的值赋给未赋值的参数,可实现主表—明细表应用。

    四、对TQuery返回的数据集进行修改
            一般情况下,TQuery返回的数据集是只读的,不能修改;
            对不包含集操作(如:SUM、COUNT)的单表SELECT查询,设置TQuery的RequsetLive属性为True,则可修改TQuery返回的数据集。

    var
    I: Integer;
    ListItem: string;
    begin
    for I := 0 to Query1.ParamCount - 1 do
    begin
    ListItem := ListBox1.Items[I];
    case Query1.Params[I].DataType of
    ftString:
    Query1.Params[I].AsString := ListItem;
    ftSmallInt:
    Query1.Params[I].AsSmallInt := StrToIntDef(ListItem, 0);
    ftInteger:
    Query1.Params[I].AsInteger := StrToIntDef(ListItem, 0);
    ftWord:
    Query1.Params[I].AsWord := StrToIntDef(ListItem, 0);
    ftBoolean:
    begin
    if ListItem = 'True' then
    Query1.Params[I].AsBoolean := True
    else
    Query1.Params[I].AsBoolean := False;
    end;
    ftFloat:
    Query1.Params[I].AsFloat := StrToFloat(ListItem);
    ftCurrency:
    Query1.Params[I].AsCurrency := StrToFloat(ListItem);
    ftBCD:
    Query1.Params[I].AsBCD := StrToCurr(ListItem);
    ftDate:
    Query1.Params[I].AsDate := StrToDate(ListItem);
    ftTime:
    Query1.Params[I].AsTime := StrToTime(ListItem);
    ftDateTime:
    Query1.Params[I].AsDateTime := StrToDateTime(ListItem);
    end;
    end;
    end; 

    一、数据集表的打开与关闭
           打开:设置数据集组件的Active属性为True或调用数据集组件的Open方法
            关闭:设置数据集组件的Active属性为False或调用数据集组件的Close方法

    二、创建数据库应用程序
            利用向导创建:使用Database菜单/Form Wizard选项;
            创建主从表:设置从表的MasterSource、MasterField属性;
            创建查询表:使用TQuery组件;

    三、数据库表记录的定位
            使用TDBNavigator组件;
             调用数据集组件的First、Next、Prior、Last方法;
              数据集组件的EOF属性(或BOF属性)用来判断记录指针是否指向第一条记录(或最后一条记录);
             使用数据集的书签BookMark(GetBookMark:获得当前记录的BookMark记号;GotoBookMark:从当前记录直接转到指定BookMark的那条记录;FreeBookMark:释放某个BookMark)
              使用GotoKey、FindKey方法查找记录进行定位;

    四、数据库表字段对象的使用

    (1)创建永久的字段对象
               双击或单击再右击TTable(TQuery)对象打开字段编辑器,使用其弹出菜单增加字段对象、删除字段对象、定义新的字段对象(字段编辑器的弹出菜单的New Fields选项,可创建计算字段);

    (2)字段对象的属性、方法、事件
              字段对象名:如Table1Name、Query1Sid
              属性:Alignment(对齐方式)、Calculated(是否是从其它字段值计算得到)、DisplayLabel(显示的标题)、DisplayWidth(显示的宽度)、DisplayFormat(显示的格式)、EditMask(输入的限制)、FieldName(字段名)、ReadOnly(是否只读)、Visible(是否显示)
              事件:OnChange(字段值发生变化时触发)、OnGetText(当字段对象获得字段值时触发)、OnSetText(当字段对象被设置字段值时触发)、OnValiData(当修改、插入、进行有效性检验时触发)

    (3)字段对象的类型转换
              有:AsString 、AsSmallInt 、AsInteger 、AsWord 、AsBoolean 、AsFloat 、AsCurrency 、AsBCD 、AsDate 、AsTime 、AsDateTime转换函数
             如:Edit1.Text:=Table1Name.Value ;
             Table1Bdate.AsString:=DateToStr(DATE) ;

    (4)对字段对象的访问
              动态字段对象的访问:Table1.Fields[0]. DisplayLabel:= '学生编号'
              Table1.FieldByName('Sid'). DisplayLabel:= '学生编号' Table1.Fields[0].Assignment:=taCenter
               Edit1.Text:= Table1.FieldByName('Sid').AsString
                永久字段对象的访问:Query1Sid.DisplayLabel:= '学生编号' 
                Query1Sid.DisplayWidth:= 12

    五、对数据库表数据的操作方法

    (1)访问表中某一字段的数据的方法:
    Table1.FieldByName('bookidx').AsString
    Table1.Field[0].AsInteger
    Table1.Fieldvalues['bookidx']

    (2)数据库表的一些属性:
    当前记录号:Table1.Recno
    记录总数:Table1.RecordCount
    得到表的字段名:Table1.GetFieldNames(ListBox1。Items)

    (3)数据维护的方法:
    Edit方法:把数据集设置为编辑状态;
    Append方法:把数据集设置为插入状态(最后);
    Insert方法:把数据集设置为插入状态(当前记录后);
    Post方法:把修改的记录写回数据集;
    Cancel方法:取消当前的操作;
    Delete方法:删除表中当前记录;
    AppendRecord方法:
    InsertRecord方法:table1.InsertRecord(['963409', NIL, NIL,'考试']);
    SetRecords方法:
    Abort方法:取消各种方法的调用;

    (4)输入数据的合法性验证
    对数据库表建立合法性验证机制(如在DBD设置表的Validity Check、Table Lookup、Referential Integrity等属性);
     在字段编辑表Fields Editor(双击Ttable对象),选择字段,编写其OnValidate事件,要求非空可设置其Required属性为True;
     在程序中防止不合法输入(如:使用TDBcombobox对象,TDBlookupcombobox对象);

    六、数据检索
    (1)利用索引排序
    如:TABLE1.IndexName:='uspa' 或TABLE1.IndexFieldNames:='user_id'
    (2)使用GotoKey方法查找数据库中的记录
     要求查找字段建立了索引,非主索引要设置Ttable对象的IndexName属性。
     调用SetKey方法,把要查找的Ttable对象置成查找模块;
     把查找值送进被查找的Field的查找缓冲区;
    调用Ttable对象的GotoKey方法,测试该方法的返回值判断查找是否成功;
    (3)使用FindKey方法查找数据库中的记录
    把查找值作为参数传递给FindKey函数,允许有多个查找值,要求把要查找的多个字段的索引名赋给Ttable对象的IndexName属性;
    (4)不精确查找
    GotoNearest方法
    FindNearest方法
    (5)使用Locate方法查找数据库中的记录(不用建索引)
    table1.locate(‘字段名1;字段名2’,VarArroyof([‘值1’,‘值2’]),[LoCaseInsensitive,LoPartialKey])
    LoCaseInsensitive:忽略大小写;IoPartialKey:不精确查找
    (6)设定查找范围的方法
    SetRangeStart、SetRangeEnd、EditRangeStart、EditRangeEnd、SetRange([Start Values],[End Value])、ApplyRange、CancelRange
    (7)用TQuery组件的动态SQL语句进行查找

    七、修改数据库中的记录
    在程序中对数据库记录进行操作可按下列的步骤进行:
    (1)移动数据指针到要修改的记录;
    (2)调用Edit方法将Ttable组件设置成编辑状态;
    (3)修改字段值;(Table1.Fieldvalues['字段名']:=值、Table1.Field[0].AsString:=值)
    (4)可用Nil对字段赋空值;
    (5)调用Post方法将修改后的记录写入数据库;

    八、插入和删除记录
    删除:移动指针到相应记录处,调用Delete方法;
    插入:调用Insert、InsertRecord方法(当前记录处插入)或Append、InsertRecord方法(表的末尾插入); 


    如何选择一个好的数据库(三大数据库比较)
    【开放性】

    SQL Server:只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时.

    Oracle:能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。

    DB2:能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%.


    【可伸缩性,并行性】

    SQL server:并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。

    Oracle:平行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。

    DB2 :DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境.数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点或数据库节点


    【安全性】

    SQL server:没有获得任何安全证书。

    Oracle Server:获得最高认证级别的ISO标准认证。

    DB2:获得最高认证级别的ISO标准认证。


    【性能】

    SQL Server:多用户时性能不佳

    Oracle:性能最高, 保持windowsNT下的TPC-D和TPC-C的世界记录。

    DB2:适用于数据仓库和在线事物处理,性能较高。


    【客户端支持及应用模式】

    SQL Server:C/S结构,只支持windows客户,可以用ADO,DAO,OLEDB,ODBC连接.

    Oracle:多层次网络计算,支持多种工业标准,可以用ODBC,JDBC,OCI等网络客户连接

    DB2:跨平台,多层结构,支持ODBC,JDBC等客户


    【操作简便】

    SQL Server:操作简单,但只有图形界面.

    Oracle:较复杂, 同时提供GUI和命令行,在windowsNT和unix下操作相同

    DB2: 操作简单,同时提供GUI和命令行,在windowsNT和unix下操作相同


    【使用风险】

    SQL server:完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。

    Oracle:长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。

    DB2:在巨型企业得到广泛的应用,向下兼容性好。风险小。

  • 相关阅读:
    【Problem】前端项目运行:Module build failed:Error Node Sass does not yet support my current environmen
    element ui源码解析 -- Pagination篇( 副:列表页进入详情页再返回后,如何保持当前页码正确 )
    vue mixins是什么及应用
    bootstrap fileinput实现限制图片上传数量及如何控制分批多次上传
    fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考
    provide inject应用及和props对比
    element ui源码解析 -- input篇
    vue指令应用--实现输入框常见过滤功能
    vue项目实现导出数据到excel
    组件绑定v-model,实现最大化复用
  • 原文地址:https://www.cnblogs.com/karkash/p/3073945.html
Copyright © 2011-2022 走看看