MSSQL网页编程之SQL语法年夜全
2008年1月16号MySQLAB被Sun公司收购。而2009年,SUN又被Oracle收购。就这样如同一个轮回,MySQL成为了Oracle公司的另一个数据库项目。sql语法SQL语法年夜全SQL语法年夜全
1.ASP与Access数据库毗连:
<%@language=VBscript%>
<%
dimconn,mdbfile
mdbfile=server.mappath("数据库称号.mdb")
setconn=server.createobject("adodb.connection")
conn.open"driver={microsoftaccessdriver(*.mdb)};uid=admin;pwd=数据库暗码;dbq="&mdbfile
%>
2.ASP与SQL数据库毗连:
<%@language=VBscript%>
<%
dimconn
setconn=server.createobject("ADODB.connection")
con.open"PROVIDER=SQLOLEDB;DATASOURCE=SQL服务器称号或IP地点;UID=sa;PWD=数据库暗码;DATABASE=数据库称号
%>
创建纪录集工具:
setrs=server.createobject("adodb.recordset")
rs.openSQL语句,conn,3,2
3.SQL经常使用命令利用办法:
(1)数据纪录选择:
sql="select*from数据表where字段名=字段值orderby字段名"
sql="select*from数据表where字段名like\%字段值%orderby字段名"
sql="selecttop10*from数据表where字段名orderby字段名"
sql="select*from数据表where字段名in(值1,值2,值3)"
sql="select*from数据表where字段名between值1and值2"
(2)更新数据纪录:
sql="update数据表set字段名=字段值where前提表达式"
sql="update数据表set字段1=值1,字段2=值2……字段n=值nwhere前提表达式"
(3)删除数据纪录:
sql="deletefrom数据表where前提表达式"
sql="deletefrom数据表"(将数据表一切纪录删除)
(4)增加数据纪录:
sql="insertinto数据表(字段1,字段2,字段3…)values(值1,值2,值3…)"
sql="insertinto方针数据表select*from源数据表"(把源数据表的纪录增加到方针数据表)
(5)数据纪录统计函数:
AVG(字段名)得出一个表格栏均匀值
COUNT(*|字段名)对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名)获得一个表格栏最年夜的值
MIN(字段名)获得一个表格栏最小的值
SUM(字段名)把数据栏的值相加
援用以上函数的办法:
sql="selectsum(字段名)as别号from数据表where前提表达式"
setrs=conn.excute(sql)
用rs("别号")猎取统的计值,别的函数使用同上。
(5)数据表的创建和删除:
CREATETABLE数据表称号(字段1范例1(长度),字段2范例2(长度)……)
例:CREATETABLEtab01(namevarchar(50),datetimedefaultnow())
DROPTABLE数据表称号(永世性删除一个数据表)
4.纪录集工具的办法:
rs.movenext将纪录指针从以后的地位向下移一行
rs.moveprevious将纪录指针从以后的地位向上移一行
rs.movefirst将纪录指针移到数据表第一行
rs.movelast将纪录指针移到数据表最初一行
rs.absoluteposition=N将纪录指针移到数据表第N行
rs.absolutepage=N将纪录指针移到第N页的第一行
rs.pagesize=N设置每页为N笔记录
rs.pagecount依据pagesize的设置前往总页数
rs.recordcount前往纪录总数
rs.bof前往纪录指针是不是超越数据表首端,true暗示是,false为否
rs.eof前往纪录指针是不是超越数据表末了,true暗示是,false为否
rs.delete删除以后纪录,但纪录指针不会向下挪动
rs.addnew增加纪录到数据表末了
rs.update更新数据表纪录
---------------------------------------
Recordset工具办法
Open办法
recordset.OpenSource,ActiveConnection,CursorType,LockType,Options
Source
Recordset工具能够经由过程Source属性来毗连Command工具。Source参数能够是一个Command工具称号、一段SQL命令、一个指定的数据表称号或是一个StoredProcedure。假设省略这个参数,体系则接纳Recordset工具的Source属性。
ActiveConnection
Recordset工具能够经由过程ActiveConnection属性来毗连Connection工具。这里的ActiveConnection能够是一个Connection工具或是一串包括数据库毗连信息(ConnectionString)的字符串参数。
CursorType
Recordset工具Open办法的CursorType参数暗示将以甚么样的游标范例启动数据,包含adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述以下:
--------------------------------------------------------------
常数常数值申明
-------------------------------------------------------------
adOpenForwardOnly0缺省值,启动一个只能向前挪动的游标(ForwardOnly)。
adOpenKeyset1启动一个Keyset范例的游标。
adOpenDynamic2启动一个Dynamic范例的游标。
adOpenStatic3启动一个Static范例的游标。
-------------------------------------------------------------
以上几个游标范例将间接影响到Recordset工具一切的属性和办法,以以下表申明他们之间的区分。
-------------------------------------------------------------
Recordset属性adOpenForwardOnlyadOpenKeysetadOpenDynamicadOpenStatic
-------------------------------------------------------------
AbsolutePage不撑持不撑持可读写可读写
AbsolutePosition不撑持不撑持可读写可读写
ActiveConnection可读写可读写可读写可读写
BOF只读只读只读只读
Bookmark不撑持不撑持可读写可读写
CacheSize可读写可读写可读写可读写
CursorLocation可读写可读写可读写可读写
CursorType可读写可读写可读写可读写
EditMode只读只读只读只读
EOF只读只读只读只读
Filter可读写可读写可读写可读写
LockType可读写可读写可读写可读写
MarshalOptions可读写可读写可读写可读写
MaxRecords可读写可读写可读写可读写
PageCount不撑持不撑持只读只读
PageSize可读写可读写可读写可读写
RecordCount不撑持不撑持只读只读
Source可读写可读写可读写可读写
State只读只读只读只读
Status只读只读只读只读
AddNew撑持撑持撑持撑持
CancelBatch撑持撑持撑持撑持
CancelUpdate撑持撑持撑持撑持
Clone不撑持不撑持
Close撑持撑持撑持撑持
Delete撑持撑持撑持撑持
GetRows撑持撑持撑持撑持
Move不撑持撑持撑持撑持
MoveFirst撑持撑持撑持撑持
MoveLast不撑持撑持撑持撑持
MoveNext撑持撑持撑持撑持
MovePrevious不撑持撑持撑持撑持
NextRecordset撑持撑持撑持撑持
Open撑持撑持撑持撑持
Requery撑持撑持撑持撑持
Resync不撑持不撑持撑持撑持
Supports撑持撑持撑持撑持
Update撑持撑持撑持撑持
UpdateBatch撑持撑持撑持撑持
--------------------------------------------------------------
个中NextRecordset办法其实不合用于MicrosoftAccess数据库。
LockType
Recordset工具Open办法的LockType参数暗示要接纳的Lock范例,假如疏忽这个参数,那末体系会以Recordset工具的LockType属性为预设值。LockType参数包括adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述以下:
-------------------------------------------------------------
常数常数值申明
--------------------------------------------------------------
adLockReadOnly1缺省值,Recordset工具以只读体例启动,没法运转AddNew、Update及Delete等办法
adLockPrssimistic2当数据源正在更新时,体系会临时锁住其他用户的举措,以坚持数据分歧性。
adLockOptimistic3当数据源正在更新时,体系其实不会锁住其他用户的举措,其他用户能够对数据举行增、删、改的操纵。
adLockBatchOptimistic4当数据源正在更新时,其他用户必需将CursorLocation属性改成adUdeClientBatch才干对数据举行增、
删、改的操纵。
DB2供应了干系式材料库的查询言语SQL(StructuredQueryLanguage),是一种十分白话化、既易学又易懂的语法。此一言语几近是每一个材料库体系都必需供应的,用以暗示干系式的操纵,包括了材料的界说(DDL)和材料的处置(DML)。SQL本来拼成SEQUEL,这言语的原型以“体系R“的名字在IBM圣荷西实行室完成,经由IBM外部及其他的很多利用性及效力测试,其了局相称使人中意,并决意在体系R的手艺基本开展出来IBM的产物。并且美国国度尺度学会(ANSI)及国际尺度化构造(ISO)在1987遵守一个几近是以IBMSQL为基本的尺度干系式材料言语界说。
1、材料界说DDL(DataDefinitionLanguage)
材料定言语是指对材料的格局和形状下界说的言语,他是每一个材料库要创建时分时起首要面临的,举凡材料分哪些表格干系、表格内的有什麽栏位主键、表格和表格之间相互参考的干系等等,都是在入手下手的时分所必需计划好的。
1、建表格:
CREATETABLEtable_name(
column1DATATYPE,
column2DATATYPE,
...)
申明:
DATATYPE--是材料的格局,详见表。
NUTNULL--可不成以同意材料有空的(还没有有材料填进)。
PRIMARYKEY--是本表的主键。
--------------------------------------------------------------------------------
--belin2000
--公布工夫:2004-6-822:08:51
--
2、变动表格
ALTERTABLEtable_name
ADDCOLUMNcolumn_nameDATATYPE
申明:增添一个栏位(没有删除某个栏位的语法。
ALTERTABLEtable_name
ADDPRIMARYKEY(column_name)
申明:变动表得的界说把某个栏位设为主键。
ALTERTABLEtable_name
DROPPRIMARYKEY(column_name)
申明:把主键的界说删除。
3、创建索引
CREATEINDEXindex_nameONtable_name(column_name)
申明:对某个表格的栏位创建索引以增添查询时的速率。
4、删除
DROPtable_name
DROPindex_name
2、的材料形状DATATYPEs
smallint
16位元的整数。
interger
32位元的整数。
decimal(p,s)
p准确值和s巨细的十进位整数,准确值p是指全体有几个数(digits)巨细值,s是指小数
点後有几位数。假如没有出格指定,则体系会设为p=5;s=0。
float
32位元的实数。
double
64位元的实数。
char(n)
n长度的字串,n不克不及凌驾254。
varchar(n)
长度不流动且其最年夜长度为n的字串,n不克不及凌驾4000。
graphic(n)
和char(n)一样,不外其单元是两个字元double-bytes,n不克不及凌驾127。这个形状是为
了增援两个字元长度的字体,比方中笔墨。
vargraphic(n)
可变长度且其最年夜长度为n的双字元字串,n不克不及凌驾2000。
date
包括了年份、月份、日期。
time
包括了小时、分钟、秒。
timestamp
包括了年、月、日、时、分、秒、千分之一秒。
3、材料操纵DML(DataManipulationLanguage)
材料界说好之後接上去的就是材料的操纵。材料的操纵不过乎增添材料(insert)、查询材料(query)、变动材料(update)、删除材料(delete)四种形式,以下分别先容他们的语法:
1、增添材料:
INSERTINTOtable_name(column1,column2,...)
valueS(value1,value2,...)
申明:
1.若没有指定column体系则会按表格内的栏位按次填进材料。
2.栏位的材料形状和所填进的材料必需符合。
3.table_name也能够是景不雅view_name。
INSERTINTOtable_name(column1,column2,...)
SELECTcolumnx,columny,...FROManother_table
申明:也能够经由一个子查询(subquery)把其余表格的材料填进。
2、查询材料:
基础查询
SELECTcolumn1,columns2,...
FROMtable_name
申明:把table_name的特定栏位材料全体列出来
SELECT*
FROMtable_name
WHEREcolumn1=xxx
申明:
1.*暗示全体的栏位都列出来。
2.WHERE之後是接前提式,把切合前提的材料列出来。
SELECTcolumn1,column2
FROMtable_name
ORDERBYcolumn2
申明:ORDERBY是指定以某个栏位做排序,是指从年夜到小分列,若没有指明,则是从小到年夜
分列
组合查询
组合查询是指所查询得材料来历其实不只要单一的表格,而是团结一个以上的
表格才干够失掉了局的。
SELECT*
FROMtable1,table2
WHEREtable1.colum1=table2.column1
申明:
1.查询两个表格中个中column1值不异的材料。
2.固然两个表格互相对照的栏位,其材料形状必需不异。
3.一个庞大的查询其动用到的表格大概会良多个。
整合性的查询:
SELECTCOUNT(*)
FROMtable_name
WHEREcolumn_name=xxx
申明:
查询切合前提的材料共有几笔。
SELECTSUM(column1)
FROMtable_name
申明:
1.盘算出总和,所选的栏位必需是可数的数字形状。
2.除此之外另有AVG()是盘算均匀、MAX()、MIN()盘算最年夜最小值的整合性查询。
SELECTcolumn1,AVG(column2)
FROMtable_name
GROUPBYcolumn1
HAVINGAVG(column2)>xxx
申明:
1.GROUPBY:以column1为一组盘算column2的均匀值必需和AVG、SUM等整合性查询的关头字
一同利用。
2.HAVING:必需和GROUPBY一同利用作为整合性的限定。
复合性的查询
SELECT*
FROMtable_name1
WHEREEXISTS(
SELECT*
FROMtable_name2
WHEREconditions)
申明:
1.WHERE的conditions能够是别的一个的query。
2.EXISTS在此是指存在与否。
SELECT*
FROMtable_name1
WHEREcolumn1IN(
SELECTcolumn1
FROMtable_name2
WHEREconditions)
申明:
1.IN後面接的是一个汇合,暗示column1存在汇合内里。
2.SELECT出来的材料形状必需切合column1。
其他查询
SELECT*
FROMtable_name1
WHEREcolumn1LIKEx%
申明:LIKE必需和後面的x%相照应暗示以x为开首的字串。
SELECT*
FROMtable_name1
WHEREcolumn1IN(xxx,yyy,..)
申明:IN後面接的是一个汇合,暗示column1存在汇合内里。
SELECT*
FROMtable_name1
WHEREcolumn1BETWEENxxANDyy
申明:BETWEEN暗示column1的值介於xx和yy之间。
3、变动材料:
UPDATEtable_name
SETcolumn1=xxx
WHEREconditoins
申明:
1.变动某个栏位设定其值为xxx。
2.conditions是所要切合的前提、若没有WHERE则全部table的谁人栏位城市全体被变动。
4、删除材料:
DELETEFROMtable_name
WHEREconditions
申明:删除切合前提的材料。
申明:关于WHERE前提前面假如包括有日期的对照,分歧数据库有分歧的表达式。详细以下:
(1)假如是ACCESS数据库,则为:WHEREmydate>#2000-01-01#
(2)假如是ORACLE数据库,则为:WHEREmydate>cast(2000-01-01asdate)
或:WHEREmydate>to_date(2000-01-01,yyyy-mm-dd)
在Delphi中写成:
thedate=2000-01-01;
query1.SQL.add(select*fromabcwheremydate>cast(+\+thedate+\+asdate));
假如对照日期工夫型,则为:
WHEREmydatetime>to_date(2000-01-0110:00:01,yyyy-mm-ddhh24:mi:ss)
练把握SQL是数据库用户的可贵财富。在本文中,我们将引诱你把握四条最基础的数据操纵语句-SQL的中心功效-来顺次先容对照操纵符、选择断言和三值逻辑。当你完成这些进修后,明显你已入手下手算是精晓SQL了。
在我们入手下手之前,先利用CREATETABLE语句来创立一个表(如所示)。DDL语句对数据库工具如表、列和视举行界说。它们其实不对表中的行举行处置,这是由于DDL语句其实不处置数据库中实践的数据。这些事情由另外一类SQL语句-数据操纵言语(DML)语句举行处置。
SQL中有四种基础的DML操纵:INSERT,SELECT,UPDATE和DELETE。因为这是年夜多半SQL用户常常用到的,我们有需要在此对它们举行逐一申明。在中我们给出了一个名为EMPLOYEES的表。个中的每行对应一个特定的雇员纪录。请熟习这张表,我们在前面的例子中将要用到它。
毗连查询
经由过程毗连运算符能够完成多个表查询。毗连是干系数据库模子的次要特性,也是它区分于别的范例数据库办理体系的一个标记。
在干系数据库办理体系中,表创建时各数据之间的干系不用断定,常把一个实体的一切信息寄存在
一个表中。当检索数据时,经由过程毗连操纵查询出寄存在多个表中的分歧实体的信息。毗连操纵给用户带
来很年夜的天真性,他们能够在任什么时候候增添新的数据范例。为分歧实体创立新的表,此后经由过程毗连举行查询。
毗连能够在SELECT语句的FROM子句或WHERE子句中创建,貌同实异在FROM子句中指出毗连时有助于
将毗连操纵与WHERE子句中的搜刮前提辨别开来。以是,在Transact-SQL中保举利用这类办法。
SQL-92尺度所界说的FROM子句的毗连语法格局为:
FROMjoin_tablejoin_typejoin_table
个中join_table指出介入毗连操纵的表名,毗连能够对统一个表操纵,也能够对多表操纵,对统一
个表操纵的毗连又称做自毗连。
join_type指出毗连范例,可分为三种:内毗连、外毗连和交织毗连。内毗连(INNERJOIN)利用比
较运算符举行表间某(些)列数据的对照操纵,并列出这些表中与毗连前提相婚配的数据行。依据所利用
的对照体例分歧,内毗连又分为等值毗连、天然毗连和不等毗连三种。
外毗连分为左外毗连(LEFTOUTERJOIN或LEFTJOIN)、右外毗连(RIGHTOUTERJOIN或RIGHTJOIN)
和全外毗连(FULLOUTERJOIN或FULLJOIN)三种。与内毗连分歧的是,外毗连不但列出与毗连前提相匹
配的行,而是列出左表(左外毗连时)、右表(右外毗连时)或两个表(全外毗连时)中一切切合搜刮前提的数据行。
交织毗连(CROSSJOIN)没有WHERE子句,它前往毗连表中一切数据行的笛卡尔积,其了局汇合中的
数据行数即是第一个表中切合查询前提的数据行数乘以第二个表中切合查询前提的数据行数。
毗连操纵中的ON(join_condition)子句指出毗连前提,它由被毗连表中的列和对照运算符、逻辑
运算符等组成。
不管哪一种毗连都不克不及对text、ntext和image数据范例列举行间接毗连,但能够对这三种列举行直接
毗连。比方:
SELECTp1.pub_id,p2.pub_id,p1.pr_info
FROMpub_infoASp1INNERJOINpub_infoASp2
ONDATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)内毗连
内毗连查询操纵列出与毗连前提婚配的数据行,它利用对照运算符对照被毗连列的列值。内毗连分三种:
1、等值毗连:在毗连前提中利用即是号(=)运算符对照被毗连列的列值,其查询了局中列出被毗连
表中的一切列,包含个中的反复列。
2、不等毗连:在毗连前提利用除即是运算符之外的别的对照运算符对照被毗连的列的列值。这些
运算符包含>、>=、<=、<、!>、!<和。
3、天然毗连:在毗连前提中利用即是(=)运算符对照被毗连列的列值,但它利用选择列表指出查询
了局汇合中所包含的列,并删除毗连表中的反复列。
例,上面利用等值毗连列出authors和publishers表中位于统一乡村的作者和出书社:
SELECT*
FROMauthorsASaINNERJOINpublishersASp
ONa.city=p.city
又如利用天然毗连,在选择列表中删除authors和publishers表中反复列(city和state):
SELECTa.*,p.pub_id,p.pub_name,p.country
FROMauthorsASaINNERJOINpublishersASp
ONa.city=p.city
(二)外毗连
内毗连时,前往查询了局汇合中的仅是切合查询前提(WHERE搜刮前提或HAVING前提)和毗连前提
的行。而接纳外毗连时,它前往到查询了局汇合中的不但包括切合毗连前提的行,并且还包含左表(左外
毗连时)、右表(右外毗连时)或两个边接表(全外毗连)中的一切数据行。
以下面利用左外毗连将论坛内容和作者信息毗连起来:
SELECTa.*,b.*FROMluntanLEFTJOINusertableasb
ONa.username=b.username
上面利用全外毗连将city表中的一切作者和user表中的一切作者,和他们地点的乡村:
SELECTa.*,b.*
FROMcityasaFULLOUTERJOINuserasb
ONa.username=b.username
--------------------------------------------------------------------------------
--belin2000
--公布工夫:2004-6-822:09:38
--
三)交织毗连
交织毗连不带WHERE子句,它前往被毗连的两个表一切数据行的笛卡尔积,前往到了局汇合中的数
据行数即是第一个表中切合查询前提的数据行数乘以第二个表中切合查询前提的数据行数。
例,titles表中有6类图书,而publishers表中有8家出书社,则以下交织毗连检索到的纪录数将等
于6*8=48行。
SELECTtype,pub_name
FROMtitlesCROSSJOINpublishers
ORDERBYtype
UNION运算符能够将两个或两个以上上SELECT语句的查询了局汇合兼并成一个了局汇合显现,即实行团结查询。UNION的语法格局为:
select_statement
UNIONselectstatement
selectstatement][…n]
个中selectstatement为待团结的SELECT查询语句。
ALL选项暗示将一切行兼并到了局汇合中。不指定该项时,被团结查询了局汇合中的反复即将只保存一
行。
团结查询时,查询了局的列题目为第一个查询语句的列题目。因而,要界说列题目必需在第一个查询语
句中界说。要春联合查询了局排序时,也必需利用第一查询语句中的列名、列题目大概列序号。
在利用UNION运算符时,应包管每一个团结查询语句的选择列表中有不异数目的表达式,而且每一个查询选
择表达式应具有不异的数据范例,或是能够主动将它们转换为不异的数据范例。在主动转换时,关于数值类
型,体系将低精度的数据范例转换为高精度的数据范例。
在包含多个查询的UNION语句中,其实行按次是自左至右,利用括号能够改动这一实行按次。比方:
查询1UNION(查询2UNION查询3)
INSERT语句
用户能够用INSERT语句将一行纪录拔出到指定的一个表中。比方,要将雇员JohnSmith的纪录拔出到本例的表中,可使用以下语句:
INSERTINTOEMPLOYEESvalueS
(Smith,John,1980-06-10,
LosAngles,16,45000);
经由过程如许的INSERT语句,体系将试着将这些值填进到响应的列中。这些列依照我们创立表时界说的按次分列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过体系会“试着”将值填进,除实行划定规矩以外它还要举行范例反省。假如范例不符(如将一个字符串填进到范例为数字的列中),体系将回绝这一次操纵并前往一个毛病信息。
假如SQL回绝了你所填进的一列值,语句中其他各列的值也不会填进。这是由于SQL供应对事件的撑持。一次事件将数据库从一种分歧性转移到另外一种分歧性。假如事件的某一部分失利,则全部事件城市失利,体系将会被恢复(或称之为回退)到此事件之前的形态。
回到本来的INSERT的例子,请注重一切的整形十进制数都不必要用单引号引发来,而字符串和日期范例的值都要用单引号来区分。为了增添可读性而在数字间拔出逗号将会引发毛病。记着,在SQL中逗号是元素的分开符。
一样要注重输出笔墨值时要利用单引号。双引号用来封装限界标识符。
关于日期范例,我们必需利用SQL尺度日期格局(yyyy-mm-dd),可是在体系中能够举行界说,以承受其他的格局。固然,2000年邻近,请你最好仍是利用四位来暗示年份。
既然你已了解了INSERT语句是如何事情的了,让我们转到EMPLOYEES表中的其他部分:
INSERTINTOEMPLOYEESvalueS
(Bunyan,Paul,1970-07-04,
Boston,12,70000);
INSERTINTOEMPLOYEESvalueS
(John,Adams,1992-01-21,
Boston,20,100000);
INSERTINTOEMPLOYEESvalueS
(Smith,Pocahontas,1976-04-06,
LosAngles,12,100000);
INSERTINTOEMPLOYEESvalueS
(Smith,Bessie,1940-05-02,
Boston,5,200000);
INSERTINTOEMPLOYEESvalueS
(Jones,Davy,1970-10-10,
Boston,8,45000);
INSERTINTOEMPLOYEESvalueS
(Jones,Indiana,1992-02-01,
Chicago,NULL,NULL);
在最初一项中,我们不晓得Jones师长教师的工薪级别和年薪,以是我们输出NULL(不要引号)。NULL是SQL中的一种特别情形,我们今后将举行具体的会商。如今我们只需以为NULL暗示一种未知的值。
偶然,像我们方才所会商的情形,我们大概但愿对某一些而不是全体的列举行赋值。除对要省略的列输出NULL外,还能够接纳别的一种INSERT语句,以下:
INSERTINTOEMPLOYEES(
FIRST_NAME,LAST_NAME,
HIRE_DATE,BRANCH_OFFICE)
value(
Indiana,Jones,
1992-02-01,Indianapolis);
如许,我们先在表名以后列出一系列列名。未列出的列中将主动填进缺省值,假如没有设置缺省值则填进NULL。请注重我们改动了列的按次,而值的按次要对应新的列的按次。假如该语句中省略了FIRST_NAME和LAST_NAME项(这两项划定不克不及为空),SQL操纵将失利。
让我们来看一看上述INSERT语句的语法图:
INSERTINTOtable
[(column{,column})]
valueS
(columnvalue[{,columnvalue}]);
和前一篇文章中一样,我们用方括号来暗示可选项,年夜括号暗示能够反复恣意次数的项(不克不及在实践的SQL语句中利用这些特别字符)。value子句和可选的列名列表中必需利用圆括号。
SELECT语句
SELECT语句能够从一个或多个表当选取特定的行和列。由于查询和检索数据是数据库办理中最主要的功效,以是SELECT语句在SQL中是事情量最年夜的部分。实践上,仅仅是会见数据库来剖析数据并天生报表的人能够对其他SQL语句一无所知。
SELECT语句的了局一般是天生别的一个表。在实行过程当中体系依据用户的尺度从数据库当选出婚配的行和列,并将了局放光临时的表中。在间接SQL(directSQL)中,它将了局显现在终真个显现屏上,大概将了局送到打印机或文件中。也能够分离其他SQL语句来将了局放到一个已出名称的表中。
SELECT语句功效壮大。固然外表上看来它只用来完本钱文第一部分中提到的干系代数运算“选择”(或称“限定”),但实践上它也能够完成其他两种干系运算-“投影”和“毗连”,SELECT语句还能够完成聚算计算并对数据举行排序。
SELECT语句最复杂的语法以下:
SELECTcolumnsFROMtables;
当我们以这类情势实行一条SELECT语句时,体系前往由所选择的列和用户选择的表中一切指定的行构成的一个了局表。这就是完成干系投影运算的一个情势。
让我们看一下利用中EMPLOYEES表的一些例子(这个表是我们今后一切SELECT语句实例都要利用的。而我们在和中给出了查询的实践了局。我们将在其他的例子中利用这些了局)。
假定你想检察雇员事情部门的列表。那上面就是你所必要编写的SQL查询:
SELECTBRANCH_OFFICEFROMEMPLOYEES;
以上SELECT语句的实行将发生如中表2所示的了局。
因为我们在SELECT语句中只指定了一个列,以是我们的了局表中也只要一个列。注重了局表中具有反复的行,这是由于有多个雇员在统一部门事情(记着SQL从所选的一切行中将值前往)。要打消了局中的反复行,只需在SELECT语句中加上DISTINCT子句:
SELECTDISTINCTBRANCH_OFFICE
FROMEMPLOYEES;
此次查询的了局如表3所示。
如今已打消了反复的行,但了局并非依照按次分列的。假如你但愿以字母表按次将了局列出又该怎样做呢?只需利用ORDERBY子句就能够依照升序或降序来分列了局:
SELECTDISTINCTBRANCH_OFFICE
FROMEMPLOYEES
ORDERBYBRANCH_OFFICEASC;
这一查询的了局如表4所示。请注重在ORDERBY以后是怎样安排列名BRANCH_OFFICE的,这就是我们想要对其举行排序的列。为何即便是了局表中只要一个列时我们也必需指出列名呢?这是由于我们还可以依照表中其他列举行排序,即便它们其实不显现出来。列名BRANCH_OFFICE以后的关头字ASC暗示依照升序分列。假如你但愿以降序分列,那末能够用关头字DESC。
一样我们应当指出ORDERBY子句只将一时表中的了局举行排序;其实不影响本来的表。
假定我们但愿失掉按部门排序并从人为最高的雇员到人为最低的雇员分列的列表。除人为括号中的内容,我们还但愿看到依照聘任工夫从比来聘任的雇员入手下手列出的列表。以下是你将要用到的语句:
SELECTBRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROMEMPLOYEES
ORDERBYSALARYDESC,
HIRE_DATEDESC;
这里我们举行了多列的选择和排序。排序的优先级由语句中的列名按次所决意。SQL将先对列出的第一个列举行排序。假如在第一个列中呈现了反复的行时,这些即将被依照第二列举行排序,假如在第二列中又呈现了反复的行时,这些行又将被依照第三列举行排序……云云类推。此次查询的了局如表5所示。
将一个很长的表中的一切列名写出来是一件相称贫苦的事,以是SQL同意在选择表中一切的列时利用*号:
SELECT*FROMEMPLOYEES;
此次查询前往全部EMPLOYEES表,如表1所示。
上面我们对入手下手时给出的SELECT语句的语法举行一下更新(竖直线暗示一个可选项,同意在个中选择一项。):
SELECT
(column[{,columns}])|*
FROMtable[{,table}]
|DESC
[{,column|DESC}]];
界说选择尺度
在我们今朝所先容的SELECT语句中,我们对了局表中的列作出了选择但前往的是表中一切的行。让我们看一下怎样对SELECT语句举行限定使得它只前往但愿失掉的行:
SELECTcolumnsFROMtables;
WHERE子句对前提举行了设置,只要满意前提的行才被包含到了局表中。这些前提由断言(predicate)举行指定(断言指出了关于某件事变的一种大概的现实)。假如该断言关于某个给定的行建立,该即将被包含到了局表中,不然该行被疏忽。在SQL语句中止言一般经由过程对照来暗示。比方,假设你必要查询一切姓为Jones的人员,则可使用以下SELECT语句:
SELECT*FROMEMPLOYEES
WHERELAST_NAME=Jones;
LAST_NAME=Jones部分就是断言。在实行该语句时,SQL将每行的LAST_NAME列与“Jones”举行对照。假如某一人员的姓为“Jones”,即断言建立,该人员的信息将被包含到了局表中(见表6)。
利用最多的六种对照
我们上例中的断言包含一种基于“等值”的对照(LAST_NAME=Jones),可是SQL断言还能够包括其他几品种型的对照。个中最经常使用的为:
即是=
不即是
小于<
年夜于>
小于或即是<=
年夜于或即是>=
上面给出了不是基于等值对照的一个例子:
SELECT*FROMEMPLOYEES
WHERESALARY>50000;
这一查询将前往年薪高于$50,000.00的人员(拜见表7)。
逻辑毗连符
偶然我们必要界说一条不止一种断言的SELECT语句。举例来讲,假如你仅仅想检察DavyJones的信息的话,表6中的了局将是不准确的。为了进一步界说一个WHERE子句,用户可使用逻辑毗连符AND,OR和NOT。为了只失掉人员DavyJones的纪录,用户能够输出以下语句:
SELECT*FROMEMPLOYEES
WHERELAST_NAME=JonesANDFIRST_NAME=Davy;
在本例中,我们经由过程逻辑毗连符AND将两个断言毗连起来。只要两个断言都满意时全部表达式才会满意。假如用户必要界说一个SELECT语句来使妥当个中任何一项建立就满意前提时,可使用OR毗连符:
SELECT*FROMEMPLOYEES
WHERELAST_NAME=JonesORLAST_NAME=Smith;
偶然界说一个断言的最好办法是经由过程相反的形貌来讲明。假如你想要检察除Boston做事处的人员之外的其他一切人员的信息时,你能够举行以下的查询:
SELECT*FROMEMPLOYEES
WHERENOT(BRANCH_OFFICE=Boston);
关头字NOT前面随着用圆括号括起来的对照表达式。其了局是对了局取否认。假如某一人员地点部门的做事处在Boston,括号内的表达式前往true,可是NOT操纵符将该值取反,以是该即将不被选中。
断言能够与其他的断言嵌套利用。为了包管它们以准确的按次举行求值,能够用括号将它们括起来:
SELECT*FROMEMPLOYEES
WHERE(LAST_NAME=Jones
ANDFIRST_NAME=Indiana)
OR(LAST_NAME=Smith
ANDFIRST_NAME=Bessie);
SQL相沿数学上尺度的表达式求值的商定-圆括号内的表达式将开始举行求值,其他表达式将从左到右举行求值。
你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁 还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。 记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。 也可谈一下你是怎么优化存储过程的? 无法深入到数据库系统层面去了解和探究 如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。 学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了! Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。 也可谈一下你是怎么优化存储过程的?
页:
[1]