Heim >Datenbank >MySQL-Tutorial >【数据库】数据库基础

【数据库】数据库基础

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 15:12:141146Durchsuche

一、SQL语句 (1)Select 查询语句 语法:SELECT [ALL|DISTINCT] 目标列表达式 [AS 列名] [,目标列表达式 [AS 列名] ...] FROM 表名 [,表名…] [WHERE 条件表达式 [AND|OR 条件表达式...] [GROUP BY 列名 [HAVING 条件表达式]] [ORDER BY 列名 [ASC | DESC]

一、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
                      对查询结果分组
                       [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 and score.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 [( [,, ...])] VALUES ( [,, ...])

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

          语法:INSERT INTO [( [,, ...])]  子查询 
          例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:在巨型企业得到广泛的应用,向下兼容性好。风险小。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn