1、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|D
2、ISTINCT 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 | D
3、ESC 对查询结果排序;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=:
4、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 ( , .) 语法:INSERT INTO ( , .) 子查询 例子:
5、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
6、AND|OR .例子:Delete from student where sid=003101(5)CREATE TABLECREATE 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 NOCP
7、TRANS, 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 TABLEALTER TABLE TableName1ADD | ALTER COLUMN FieldN
8、ame1 FieldType (nFieldWidth , nPrecision) NULL | NOT NULL CHECK lExpression1 ERROR cMessageText1 DEFAULT eExpression1 PRIMARY KEY | UNIQUE REFERENCES TableName2 TAG TagName1 NOCPTRANS(7)DROP TABLEDROP TABLE 路径名.表名(8)CREATE INDEXCREATE INDEX index-name ON table-name(column,column)例:CREATE INDEX uspa
9、ON 口令表(user,password)(9)DROP INDEXDROP 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中点取Par
10、ams项,在弹出的参数编辑窗口中设置参数的值。例:SELECT bookidx AS 书号,藏书表.bookname AS 书名, bdate AS 借书日期 FROM 借书表,藏书表 where 借书表.bookidx=藏书表.bookidx and rid=:rid 2、在程序运行中通过程序为参数赋值(1)根据参数在SQL语句中出现的顺序,使用TQuery的Params属性为参数赋值;例:在借书表中插入一条记录with Query1 dobegin SQL.clear; SQL.add(Insert Into 借书表(bookidx,rid,rdate)); SQl.add(Values(
11、:bookidx,:rid,:rdate); Params0.AsString := bookidxEdit.Text; Params1.AsString := ridEdit.Text; Params2 .AsDate:=date; ExecSQL;End;(2)根据SQL语句中的参数名字,调用ParamByName方法为参数赋值;ParamByName(bookidx).AsString := bookidxEdit.Text;ParamByName(rid).AsString := ridEdit.Text;ParamByName(rdate) .AsDate:=date;ExecSQL
12、;有:AsString 、AsSmallInt 、AsInteger 、AsWord 、AsBoolean 、AsFloat 、AsCurrency 、AsBCD 、AsDate 、AsTime 、AsDateTime转换函数3、使用数据源为参数赋值 把TQuery的DataSource属性设置为另一个数据源(T DataSource名字),Delphi会把未赋值的参数与指定的数据源中的各字段相比较,并将匹配的字段的值赋给未赋值的参数,可实现主表明细表应用。四、对TQuery返回的数据集进行修改 一般情况下,TQuery返回的数据集是只读的,不能修改; 对不包含集操作(如:SUM、COUNT)
13、的单表SELECT查询,设置TQuery的RequsetLive属性为True,则可修改TQuery返回的数据集。varI: Integer;ListItem: string;beginfor I := 0 to Query1.ParamCount - 1 dobegin ListItem := ListBox1.ItemsI; case Query1.ParamsI.DataType of ftString: Query1.ParamsI.AsString := ListItem; ftSmallInt: Query1.ParamsI.AsSmallInt := StrToIntDef(Li
14、stItem, 0); ftInteger: Query1.ParamsI.AsInteger := StrToIntDef(ListItem, 0); ftWord: Query1.ParamsI.AsWord := StrToIntDef(ListItem, 0); ftBoolean: begin if ListItem = True then Query1.ParamsI.AsBoolean := True else Query1.ParamsI.AsBoolean := False; end; ftFloat: Query1.ParamsI.AsFloat := StrToFloat
15、(ListItem); ftCurrency: Query1.ParamsI.AsCurrency := StrToFloat(ListItem); ftBCD: Query1.ParamsI.AsBCD := StrToCurr(ListItem); ftDate: Query1.ParamsI.AsDate := StrToDate(ListItem); ftTime: Query1.ParamsI.AsTime := StrToTime(ListItem); ftDateTime: Query1.ParamsI.AsDateTime := StrToDateTime(ListItem);
16、 end;end;end; 2003-11-25 9:59:00 查看评语? 2003-11-25 10:06:20 运行期间对数据库表的一、数据集表的打开与关闭打开:设置数据集组件的Active属性为True或调用数据集组件的Open方法关闭:设置数据集组件的Active属性为False或调用数据集组件的Close方法二、创建数据库应用程序?利用向导创建:使用Database菜单/Form Wizard选项;?创建主从表:设置从表的MasterSource、MasterField属性;?创建查询表:使用TQuery组件;三、数据库表记录的定位?使用TDBNavigator组件;?调用数据集组
17、件的First、Next、Prior、Last方法;?数据集组件的EOF属性(或BOF属性)用来判断记录指针是否指向第一条记录(或最后一条记录);?使用数据集的书签BookMark(GetBookMark:获得当前记录的BookMark记号;GotoBookMark:从当前记录直接转到指定BookMark的那条记录;FreeBookMark:释放某个BookMark)?使用GotoKey、FindKey方法查找记录进行定位;四、数据库表字段对象的使用(1)创建永久的字段对象 双击或单击再右击TTable(TQuery)对象打开字段编辑器,使用其弹出菜单增加字段对象、删除字段对象、定义新的字段对
18、象(字段编辑器的弹出菜单的New Fields选项,可创建计算字段);(2)字段对象的属性、方法、事件 字段对象名:如Table1Name、Query1Sid 属性:Alignment(对齐方式)、Calculated(是否是从其它字段值计算得到)、DisplayLabel(显示的标题)、DisplayWidth(显示的宽度)、DisplayFormat(显示的格式)、EditMask(输入的限制)、FieldName(字段名)、ReadOnly(是否只读)、Visible(是否显示) 事件:OnChange(字段值发生变化时触发)、OnGetText(当字段对象获得字段值时触发)、OnSet
19、Text(当字段对象被设置字段值时触发)、OnValiData(当修改、插入、进行有效性检验时触发)(3)字段对象的类型转换 有:AsString 、AsSmallInt 、AsInteger 、AsWord 、AsBoolean 、AsFloat 、AsCurrency 、AsBCD 、AsDate 、AsTime 、AsDateTime转换函数如:Edit1.Text:=Table1Name.Value ;Table1Bdate.AsString:=DateToStr(DATE) ;(4)对字段对象的访问 动态字段对象的访问:Table1.Fields0. DisplayLabel:= 学
20、生编号Table1.FieldByName(Sid). DisplayLabel:= 学生编号 Table1.Fields0.Assignment:=taCenterEdit1.Text:= Table1.FieldByName(Sid).AsString 永久字段对象的访问:Query1Sid.DisplayLabel:= 学生编号 Query1Sid.DisplayWidth:= 12五、对数据库表数据的操作方法(1)访问表中某一字段的数据的方法:?Table1.FieldByName(bookidx).AsString?Table1.Field0.AsInteger?Table1.Fie
21、ldvaluesbookidx(2)数据库表的一些属性:?当前记录号:Table1.Recno?记录总数:Table1.RecordCount?得到表的字段名:Table1.GetFieldNames(ListBox1。Items)(3)数据维护的方法:?Edit方法:把数据集设置为编辑状态;?Append方法:把数据集设置为插入状态(最后);?Insert方法:把数据集设置为插入状态(当前记录后);?Post方法:把修改的记录写回数据集;?Cancel方法:取消当前的操作;?Delete方法:删除表中当前记录;?AppendRecord方法:?InsertRecord方法:table1.In
22、sertRecord(963409, NIL, NIL,考试);?SetRecords方法:?Abort方法:取消各种方法的调用;(4)输入数据的合法性验证 对数据库表建立合法性验证机制(如在DBD设置表的Validity Check、Table Lookup、Referential Integrity等属性);? 在字段编辑表Fields Editor(双击Ttable对象),选择字段,编写其OnValidate事件,要求非空可设置其Required属性为True;? 在程序中防止不合法输入(如:使用TDBcombobox对象,TDBlookupcombobox对象);六、数据检索(1)利用
23、索引排序 如:TABLE1.IndexName:=uspa 或TABLE1.IndexFieldNames:=user_id(2)使用GotoKey方法查找数据库中的记录? 要求查找字段建立了索引,非主索引要设置Ttable对象的IndexName属性。? 调用SetKey方法,把要查找的Ttable对象置成查找模块;? 把查找值送进被查找的Field的查找缓冲区;? 调用Ttable对象的GotoKey方法,测试该方法的返回值判断查找是否成功;(3)使用FindKey方法查找数据库中的记录 把查找值作为参数传递给FindKey函数,允许有多个查找值,要求把要查找的多个字段的索引名赋给Ttab
24、le对象的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)、A
25、pplyRange、CancelRange(7)用TQuery组件的动态SQL语句进行查找七、修改数据库中的记录 在程序中对数据库记录进行操作可按下列的步骤进行:(1)移动数据指针到要修改的记录;(2)调用Edit方法将Ttable组件设置成编辑状态;(3)修改字段值;(Table1.Fieldvalues字段名:=值、Table1.Field0.AsString:=值)(4)可用Nil对字段赋空值;(5)调用Post方法将修改后的记录写入数据库;八、插入和删除记录 删除:移动指针到相应记录处,调用Delete方法; 插入:调用Insert、InsertRecord方法(当前记录处插入)或Ap
26、pend、InsertRecord方法(表的末尾插入); 2003-11-25 10:11:12 动态的添加PARADOX表的方法【王寒松】下面给出的函数 AddMasterPassword 完成添加PARADOX表主口令的工作AddMasterPassword(Table1, MyNewPassword) procedure AddMasterPassword(Table: TTable; pswd: string);const RESTRUCTURE_TRUE = WordBool(1);var TblDesc: CRTblDesc; hDb: hDBIDb;begin 表打开?表是独占吗
27、? if (Table.Active = False) or (Table.Exclusive = False) then raise EDatabaseError.Create(数据表必须在独占方式才可以添加口令); 初始化表描述区 FillChar(TblDesc, SizeOf(CRTblDesc), 0); with TblDesc do begin 把表名放到描述区 StrPCopy(szTblName, Table.TableName); 把表类型放到描述区 StrCopy(szTblType, szPARADOX); StrPCopy(szPassword, pswd); 设置B
28、PROTECTED为TRUE bProtected := RESTRUCTURE_TRUE; end; 从当前的HANDLE里得到DATABASE的HANDLE Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb); 关闭表 Table.Close; 添加主口令到PARADOX表里 Check(DbiDoRestructure(hDb, 1, TblDesc, nil, nil, nil, FALSE); 添加一个新口令到SESSION Session.AddPassword(pswd); 重新打开表 T
29、able.Open;end;添加副口令的办法与此类似 2003-11-25 11:21:29 如何选择一个好的数据库【三大数据库比较】 【开放性】SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时.Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。DB2