SQL基础知识大全.docx
《SQL基础知识大全.docx》由会员分享,可在线阅读,更多相关《SQL基础知识大全.docx(34页珍藏版)》请在冰豆网上搜索。
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<条件表达式>...]
[GROUPBY列名[HAVING<条件表达式>>
[ORDERBY列名[ASC|DESC>
解释:
[ALL|DISTINCT] ALL:
全部;DISTINCT:
不包括重复行
<目标列表达式>对字段可使用AVG、COUNT、SUM、MIN、MAX、运算符等
<条件表达式>
查询条件谓词
比较=、>,<,>=,<=,!
=,<>,
确定范围BETWEENAND、NOTBETWEENAND
确定集合IN、NOTIN
字符匹配LIKE(“%”匹配任何长度,“_”匹配一个字符)、NOTLIKE
空值ISNULL、ISNOTNULL
子查询ANY、ALL、EXISTS
集合查询UNION(并)、INTERSECT(交)、MINUS(差)
多重条件AND、OR、NOT
对查询结果分组
[HAVING<条件表达式>]分组筛选条件
[ORDERBY列名[ASC|DESC>对查询结果排序;ASC:
升序DESC:
降序
例1:
selectstudent.snoas学号,student.nameas姓名,courseas课程名,scoreas成绩fromscore,studentwherestudent.sid=score.sidandscore.sid=:
sid
例2:
selectstudent.snoas学号,student.nameas姓名,AVG(score)as平均分fromscore,studentwherestudent.sid=score.sidandstudent.class=:
classand(term=5orterm=6)groupbystudent.sno,student.namehavingcount(*)>0orderby平均分DESC
例3:
select*fromscorewheresidlike'9634'
例4:
select*fromstudentwhereclassin(selectclassfromstudentwherename='陈小小')
(2)INSERT插入语句
语法:
INSERTINTO<表名>[(<字段名1>[,<字段名2>,...])]VALUES(<常量1>[,<常量2>,...])
语法:
INSERTINTO<表名>[(<字段名1>[,<字段名2>,...])]子查询
例子:
INSERTINTO借书表(rid,bookidx,bdate)VALUES(edit1.text,edit2.text,date)
例子:
INSERTINTOscore1(sno,name)SELECTsno,nameFROMstudentWHEREclass=’9634’
(3)UPDATE-SQL
语法:
UPDATE〈表名〉
SET列名1=常量表达式1[,列名2=常量表达式2...]
WHERE<条件表达式>[AND|OR<条件表达式>...]
例子:
updatescoresetcredithour=4wherecourse='数据库'
(4)DELETE-SQL
语法:
DELETEFROM〈表名〉[WHERE<条件表达式>[AND|OR<条件表达式>...>
例子:
Deletefromstudentwheresid='003101'
(5)CREATETABLE
CREATETABLE|DBFTableName1[NAMELongTableName][FREE]
(FieldName1FieldType[(nFieldWidth[,nPrecision])]
[NULL|NOTNULL]
[CHECKlExpression1[ERRORcMessageText1>
[DEFAULTeExpression1]
[PRIMARYKEY|UNIQUE]
[REFERENCESTableName2[TAGTagName1>
[NOCPTRANS]
[,FieldName2...]
[,PRIMARYKEYeExpression2TAGTagName2
|,UNIQUEeExpression3TAGTagName3]
[,FOREIGNKEYeExpression4TAGTagName4[NODUP]
REFERENCESTableName3[TAGTagName5>
[,CHECKlExpression2[ERRORcMessageText2>)
|FROMARRAYArrayName
(6)ALTERTABLE
ALTERTABLETableName1
ADD|ALTER[COLUMN]FieldName1
FieldType[(nFieldWidth[,nPrecision])]
[NULL|NOTNULL]
[CHECKlExpression1[ERRORcMessageText1>
[DEFAULTeExpression1]
[PRIMARYKEY|UNIQUE]
[REFERENCESTableName2[TAGTagName1>
[NOCPTRANS]
(7)DROPTABLE
DROPTABLE[路径名.]表名
(8)CREATEINDEX
CREATEINDEXindex-nameONtable-name(column[,column…])
例:
CREATEINDEXuspaON口令表(user,password)
(9)DROPINDEX
DROPINDEXtable-name.index-name|PRIMARY
例:
DROPINDEX口令表.uspa
二、在程序中使用静态SQL语句
在程序设计阶段,将SQL命令文本作为TQuery组件的SQL属性值设置。
三、在程序中使用动态SQL语句
动态SQL语句是指在SQL语句中包含有参数变量的SQL语句(如:
select*fromstudentwhereclass=:
class),在程序中可以为参数赋值。
给参数赋值的方法有:
1、利用参数编辑器为参数赋值
选中TQuery组件,在对象监视器OI中点取Params项,在弹出的参数编辑窗口中设置参数的值。
例:
SELECTbookidxAS书号,藏书表.booknameAS书名,bdateAS借书日期FROM借书表,藏书表where借书表.bookidx=藏书表.bookidxandrid=:
rid
2、在程序运行中通过程序为参数赋值
(1)根据参数在SQL语句中出现的顺序,使用TQuery的Params属性为参数赋值;
例:
在借书表中插入一条记录
withQuery1do
begin
SQL.clear;
SQL.add('InsertInto借书表(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属性设置为另一个数据源(TDataSource名字),Delphi会把未赋值的参数与指定的数据源中的各字段相比较,并将匹配的字段的值赋给未赋值的参数,可实现主表—明细表应用。
四、对TQuery返回的数据集进行修改
一般情况下,TQuery返回的数据集是只读的,不能修改;
对不包含集操作(如:
SUM、COUNT)的单表SELECT查询,设置TQuery的RequsetLive属性为True,则可修改TQuery返回的数据集。
var
I:
Integer;
ListItem:
string;
begin
forI:
=0toQuery1.ParamCount-1do
begin
ListItem:
=ListBox1.Items[I];
caseQuery1.Params[I].DataTypeof
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
ifListItem='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;
2003-11-259:
59:
00
查看评语?
?
?
2003-11-2510:
06:
20 运行期间对数据库表的
一、数据集表的打开与关闭
打开:
设置数据集组件的Active属性为True或调用数据集组件的Open方法
关闭:
设置数据集组件的Active属性为False或调用数据集组件的Close方法
二、创建数据库应用程序
?
利用向导创建:
使用Database菜单/FormWizard选项;
?
创建主从表:
设置从表的MasterSource、MasterField属性;
?
创建查询表:
使用TQuery组件;
三、数据库表记录的定位
?
使用TDBNavigator组件;
?
调用数据集组件的First、Next、Prior、Last方法;
?
数据集组件的EOF属性(或BOF属性)用来判断记录指针是否指向第一条记录(或最后一条记录);
?
使用数据集的书签BookMark(GetBookMark:
获得当前记录的BookMark记号;GotoBookMark:
从当前记录直接转到指定BookMark的那条记录;FreeBookMark:
释放某个BookMark)
?
使用GotoKey、FindKey方法查找记录进行定位;
四、数据库表字段对象的使用
(1)创建永久的字段对象
双击或单击再右击TTable(TQuery)对象打开字段编辑器,使用其弹出菜单增加字段对象、删除字段对象、定义新的字段对象(字段编辑器的弹出菜单的NewFields选项,可创建计算字段);
(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设置表的ValidityCheck、TableLookup、ReferentialIntegrity等属性);
?
在字段编辑表FieldsEditor(双击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([StartValues],[EndValue])、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方法(表的末尾插入);
2003-11-2510:
11:
12 动态的添加PARADOX表的方法【王寒松】下面给出的函数AddMasterPassword完成添加PARADOX表主口令的工作
AddMasterPassword(Table1,'MyNewPassword')
procedureAddMasterPassword(Table:
TTable;pswd:
string);
const
RESTRUCTURE_TRUE=WordBool
(1);
var
TblDesc:
CRTblDesc;
hDb:
hDBIDb;
begin
{表打开?
表是独占吗?
}
if(Table.Active=False)or(Table.Exclusive=False)then
raiseEDatabaseError.Create('数据表必须在独占方式才可以添加口令');
{初始化表描述区}
FillChar(TblDesc,SizeOf(CRTblDesc),0);
withTblDescdo
begin
{把表名放到描述区}
StrPCopy(szTblName,Table.TableName);
{把表类型放到描述区}
StrCopy(szTblType,szPARADOX);
StrPCopy(szPassword,pswd);
{设置BPROTECTED为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);
{重新打开表}
Table.Open;
end;
添加副口令的办法与此类似
2003-11-2511:
21:
29 如何选择一个好的数据库【三大数据库比较】
【开放性】
SQLServer
只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。
Windows9X系列产品是偏重于桌面应用,NTserver只适合中小型企业。
而且windows平台的可靠性,安全性和伸缩性是非常有限的。
它不象unix那样久经考验,尤其是在处理大数据量的关键业务时.
Oracle
能在所有主流平台上运行(包括windows)。
完全支持所有的工业标准。
采用完全开放策略。
可以使客户选择最适合的解决方案。
对开发商全力支持。
DB2