SQL教程简明教程
bear10214
|
1#
bear10214 发表于 2006-07-24 21:24
SQL教程简明教程
SQL教程简明教程
SQL语言由命令、子句、运算和集合函数等构成。在SQL中,数据定义语言DDL(用来建立及定义数据表、字段以及索引等数据库结构)包含的命令有create、drop、alter;数据操纵语言DML(用来提供数据的查询、排序以及筛选数据等功能)包含的命令有select、insert、update、delete。 一、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: 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 <表名> [(<字段名1> [,<字段名2>, ...])] VALUES (<常量1> [,<常量2>, ...]) 语法:insert INTO <表名> [(<字段名1> [,<字段名2>, ...])] 子查询 例子:insert INTO 借书表(rid,bookidx,bdate)VALUES (edit1.text,edit2.text,date) 例子: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方法(表的末尾插入); |