【网学网提醒】:网学会员鉴于大家对十分关注,论文会员在此为大家搜集整理了“SQL语法语句汇总大全”一文,供大家参考学习
在这一页中,我列出所有常用的SQL指令的语法
目的是提供一个简洁的SQL语法做为读者参考之用(之后有详尽剖析实例)
Select
SELECT"栏位"FROM"表格名"
Distinct
SELECTDISTINCT"栏位"FROM"表格名"
Where
SELECT"栏位"FROM"表格名"WHERE"condition"
And/Or
SELECT"栏位"FROM"表格名"WHERE"简单条件"{[AND|OR]"简单条件"}+
In
SELECT"栏位"FROM"表格名"WHERE"栏位"IN('值1','值2',...)
Between
SELECT"栏位"FROM"表格名"WHERE"栏位"BETWEEN'值1'AND'值2'
Like
SELECT"栏位"FROM"表格名"WHERE"栏位"LIKE{模式}
OrderBy
SELECT"栏位"FROM"表格名"[WHERE"条件"]ORDERBY"栏位"[ASC,DESC]
Count
SELECTCOUNT("栏位")FROM"表格名"
GroupBy
SELECT"栏位1",SUM("栏位2")FROM"表格名"GROUPBY"栏位1"
Having
SELECT"栏位1",SUM("栏位2")FROM"表格名"GROUPBY"栏位1"HAVING(栏位)
CreateTable
CREATETABLE"表格名"("栏位1""栏位1资料种类","栏位2""栏位2资料种类",...)
DropTable
DROPTABLE"表格名"
TruncateTable
TRUNCATETABLE"表格名"
InsertInto
INSERTINTO"表格名"("栏位1","栏位2",...)VALUES("值1","值2",...)
Update
UPDATE"表格名"SET"栏位1"=[新值]WHERE{条件}
DeleteFrom
DELETEFROM"表格名"WHERE{条件}
比较常用的SQL语句语法(Oracle)
一.数据控制语句(DML)部分
【1.】INSERT(往数据表里插入记录的语句)
INSERTINTO表名(字段名1,字段名2,……)VALUES(值1,值2,……);
INSERTINTO表名(字段名1,字段名2,……)SELECT字段名1,字段名2,……FROM另外的表名;
字符串类型的字段值必须用单引号括起来,例如:’GOODDAY’
如果字段值里包含单引号’需要进行字符串转换,我们把它替换成两个单引号’’.
字符串类型的字段值超过定义的长度会出错,最好在插入前进行长度校验.
日期字段的字段值可以用当前数据库的系统时间SYSDATE,精确到秒
或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
TO_DATE()还有很多种日期格式,可以参看ORACLEDOC.
年-月-日小时:分钟:秒的格式YYYY-MM-DDHH24:MI:SS
INSERT时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,
方法借用ORACLE里自带的DBMS_LOB程序包.
INSERT时如果要用到从1开始自动增长的序列号,应该先建立一个序列号
CREATESEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENTBY1STARTWITH1
MAXVALUE99999CYCLENOCACHE;
其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999
INSERT语句插入这个字段值为:序列号的名称.NEXTVAL
【2.】DELETE(删除数
据表里记录的语句)
DELETEFROM表名WHERE条件;
注意:删除记录并不能释放ORACLE里被占用的数据块表空间.它只把那些被删除的数据块标成unused.
如果确实要删除一个大表里的全部记录,可以用TRUNCATE命令,它可以释放占用的数据块表空间
TRUNCATETABLE表名;
此操作不可回退.
【3.】UPDATE(修改数据表里记录的语句)
UPDATE表名SET字段名1=值1,字段名2=值2,……WHERE条件;
如果修改的值N没有赋值或定义时,将把原来的记录内容清为NULL,最好在修改前进行非空校验;
值N超过定义的长度会出错,最好在插入前进行长度校验..
注意事项:
A.以上SQL语句对表都加上了行级锁,
确认完成后,必须加上事物处理结束的命令COMMIT才能正式生效,
否则改变不一定写入数据库里.
如果想撤回这些操作,可以用命令ROLLBACK复原.
B.在运行INSERT,DELETE和UPDATE语句前最好估算一下可能操作的记录范围,
应该把它限定在较小(一万条记录)范围内,.否则ORACLE处理这个事物用到很大的回退段.
程序响应慢甚至失去响应.如果记录数上十万以上这些操作,可以把这些SQL语句分段分次完成,
其间加上COMMIT确认事物处理.
二.数据定义(DDL)部分
【1.】CREATE(创建表,索引,视图,同义词,过程,函数,数据库链接等)
ORACLE常用的字段类型有
CHAR固定长度的字符串
VARCHAR2可变长度的字符串
NUMBER(M,N)数字型M是位数总长度,N是小数的长度
DATE日期类型
创建表时要把较小的不为空的字段放在前面,可能为空的字段放在后面
创建表时可以用中文的字段名,但最好还是用英文的字段名
创建表时可以给字段加上默认值,例如DEFAULTSYSDATE
这样每次插入和修改时,不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如不允许重复UNIQUE,关键字PRIMARYKEY
【2.】ALTER(改变表,索引,视图等)
改变表的名称
ALTERTABLE表名1TO表名2;
在表的后面增加一个字段
ALTERTABLE表名ADD字段名字段名描述;
修改表里字段的定义描述
ALTERTABLE表名MODIFY字段名字段名描述;
给表里的字段加上约束条件
ALTERTABLE表名ADDCONSTRAINT约束名PRIMARYKEY(字段名);
ALTERTABLE表名ADDCONSTRAINT约束名UNIQUE(字段名);
把表放在或取出数据库的内存区
ALTERTABLE表名CACHE;
ALTERTABLE表名NOCACHE;
【3.】DROP(删除表,索引,视图,同义词,过程,函数,数据库链接等)
删除表和它所有的约束条件
DROPTABLE表名CASCADEC
ONSTRAINTS;
【4.】TRUNCATE(清空表里的所有记录,保留表的结构)
TRUNCATE表名;
三.查询语句(SELECT)部分
SELECT字段名1,字段名2,……FROM表名1,[表名2,……]WHERE条件;
字段名可以带入函数
例如:COUNT(*),MIN(字段名),MAX(字段名),AVG(字段名),DISTINCT(字段名),
TO_CHAR(DATE字段名,’YYYY-MM-DDHH24:MI:SS’)
NVL(EXPR1,EXPR2)函数
解释:
IFEXPR1=NULL
RETURNEXPR2
ELSE
RETURNEXPR1
DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数
解释:
IFAA=V1THENRETURNR1
IFAA=V2THENRETURNR2
..…
ELSE
RET
URNNULL
LPAD(char1,n,char2)函数
解释:
字符char1按制定的位数n显示,不足的位数用char2字符串替换左边的空位
字段名之间可以进行算术运算
例如:(字段名1*字段名1)/3
查询语句可以嵌套
例如:SELECT……FROM
(SELECT……FROM表名1,[表名2,……]WHERE条件)WHERE条件2;
两个查询语句的结果可以做集合操作
例如:并集UNION(去掉重复记录),并集UNIONALL(不去掉重复记录),差集MINUS,交集INTERSECT
分组查询
SELECT字段名1,字段名2,……FROM表名1,[表名2,……]GROUPBY字段名1
[HAVING条件];
两个以上表之间的连接查询
SELECT字段名1,字段名2,……FROM表名1,[表名2,……]WHERE
表名1.字段名=表名2.字段名[AND……];
SELECT字段名1,字段名2,……FROM表名1,[表名2,……]WHERE
表名1.字段名=表名2.字段名(+)[AND……];
有(+)号的字段位置自动补空值
查询结果集的排序操作,默认的排序是升序ASC,降序是DESC
SELECT字段名1,字段名2,……FROM表名1,[表名2,……]
ORDERBY字段名1,字段名2DESC;
字符串模糊比较的方法
INSTR(字段名,‘字符串’)>0
字段名LIKE‘字符串%’[‘%字符串%’]
每个表都有一个隐含的字段ROWID,它标记着记录的唯一性.
四.ORACLE里常用的数据对象(SCHEMA)
【1.】索引(INDEX)
CREATEINDEX索引名ON表名(字段1,[字段2,……]);
ALTERINDEX索引名REBUILD;
一个表的索引最好不要超过三个(特殊的大表除外),最好用单字段索引,结合SQL语句的分析执行情况,
也可以建立多字段的组合索引和基于函数的索引
ORACLE8.1.7字符串可以索引的最大长度为1578单字节
ORACLE8.0.6字符串可以索引的最大长度为758单字节
ORACLEDOC上说字符串最大可以建索引的长度约是:数据块的大小(db_block_size)*40%
【2.】视图(VIEW)
CREATEVIEW视图名ASSELECT….FROM…..;
ALTERVIEW视图名COMPILE;
视图仅是一个SQL查询语句,它可以把表之间复杂的关系简洁化.
【3.】同义词(SYNONMY)
CREATESYNONYM同义词名FOR表
名;
CREATESYNONYM同义词名FOR表名@数据库链接名;
【4.】数据库链接(DATABASELINK)
CREATEDATABASELINK数据库链接名CONNECTTO用户名IDENTIFIEDBY密码USING‘数据库连接字符串’;
数据库连接字符串可以用NET8EASYCONFIG或者直接修改TNSNAMES.ORA里定义.
数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT*FROMGLOBAL_NAME;
查询远端数据库里的表
SELECT……FROM表名@数据库链接名;
五.权限管理(DCL)语句
【1.】GRANT赋于权限
常用的系统权限集合有以下三个:
CONNECT(基本的连接),RESOURCE(程序开发),DBA(数据库管理)
常用的数据对象权限有以下五个:
ALLON数据对象名,SELECTON数据对象名,UPDATEON数据对象名,
DELETEON数据对象名,INSERTON数据对象名,ALTERON数据对象名
GRANTCONNECT,RESOURCETO用户名;
GRANTSELECTON表名TO用户名;
GRANTSELECT,INSERT,DELETEON表名TO用户名1,用户名2;
【2.】REVOKE回收权限
REVOKECONNECT,RESOURCEFROM用户名;
REVOKESELECTON表名FROM用户名;
REVOKESELECT,INSERT,DELETEON表名FROM用户名1,用户名2;
以下是MSSQL
SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,简要介绍基础语句:
1、说明:创建数据库
CREATEDATABASEdatabase-name
2、说明:删除数据库
dropdatabasedbname
3、说明:备份sqlserver
---创建备份数据的device
USEmaster
EXECsp_addumpdevice’disk’,’testBack’,
’c:\mssql7backup\MyNwind_1.dat’
---开始备份
BACKUPDATABASEpubsTOtestBack
4、说明:创建新表
createtabletabname(col1type1[notnull][primarykey],col2
type2[notnull],..)
根据已有的表创建新表:
A:createtabletab_newliketab_old(使用旧表创建新表)
B:createtabletab_newasselectcol1,col2…fromtab_old
definitiononly
5、说明:删除新表droptabletabname
6、说明:增加一个列
Altertabletabnameaddcolumncoltype
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改
变的是增加varchar类型的长度。
7、说明:添加主键:Altertabletabnameaddprimarykey(col)
说明:删除主键:Altertabletabnamedropprimarykey(col)
8、说明:创建索引:create[unique]indexidxnameontabname(col
….)
删除索引:dropindexidxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:createviewviewnameasselectstatement
删除视图:dropviewviewname
10、说明:几个简单的
基本的sql语句
选择:select*fromtable1where范围
插入:insertintotable1(field1,field2)values(value1,value2)
删除:deletefromtable1where范围
更新:updatetable1setfield1=value1where范围
查找:select*fromtable1wherefield1like’%value1%’--
-like的语法很精妙,查资料!
排序:select*fromtable1orderbyfield1,field2[desc]
总数:selectcount*astotalcountfromtable1
求和:selectsum(field1)assumvaluefromtable1
平均:selectavg(field1)asavgvaluefromtable1
最大:selectmax(field1)asmaxvaluefromta
ble1
最小:selectmin(field1)asminvaluefromtable1
11、说明:几个高级查询运算词
A:UNION运算符
UNION运算符通过组合其他两个结果表(例如TABLE1和TABLE2)并消去
表中任何重复行而派生出一个结果表。当ALL随UNION一起使用时(即
UNIONALL),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE1就是来自TABLE2。
B:EXCEPT运算符
EXCEPT运算符通过包括所有在TABLE1中但不在TABLE2中的行并消除所
有重复行而派生出一个结果表。当ALL随EXCEPT一起使用时(EXCEPT
ALL),不消除重复行。
C:INTERSECT运算符
INTERSECT运算符通过只包括TABLE1和TABLE2中都有的行并消除所有
重复行而派生出一个结果表。当ALL随INTERSECT一起使用时
(INTERSECTALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、leftouterjoin:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所
有行。
SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOIN
bONa.a=b.c
B:rightouterjoin:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的
所有行。
C:fullouterjoin:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录
。
其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a新表名:b)(Access可用)
法一:select*intobfromawhere1<>1
法二:selecttop0*intobfroma
2、说明:拷贝表(拷贝数据,源表名:a目标表名:b)(Access可用)
insertintob(a,b,c)selectd,e,ffromb;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)
insertintob(a,b,c)selectd,e,ffrombin‘具体数据库’
where条件
例子:..frombin’"&;Server.MapPath(".")&;"\data.mdb"&;"’
where..
4、说明:子查询(表名1:a表名2:b)
selecta,b,cfromawhereaIN(selectdfromb)或者:
selecta,b,cfromawhereaIN(1,2,3)
5、说明:显示文章、提交人和最后回复时间
selecta.title,a.username,b.adddatefromtablea,(select
max(adddate)adddatefromtablewheretable.title=a.title)b
6、说明:外连接查询(表名1:a表名2:b)
selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbON
a.a=b.c
7、说明:在线视图查询(表名1:a)
select*from(SELECTa,b,cFROMa)Twheret.a>1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not
between不包括
select*fromtable1wheretimebetweentime1andtime2
selecta,b,c,fromtable1whereanotbetween数值1and数值2
9、说明:in的使用方法
select*fromtable1wherea[not]in(‘值1’,’值2’,’值4’,
’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
deletefromtable1wherenotexists(select*fromtable2
wheretable1.field1=table2.field1)
11、说明:四表联查问题:
select*fromaleftinnerjoinbona.a=b.brightinnerjoin
cona.a=c.cinnerjoindona.a=d.dwhere.....
12、说明:日程安排提前五分钟提醒
SQL:select*from日程安排wheredatediff(’minute’,f开始时
间,getdate())>5
13、说明:一条sql语句搞定数据库分页
selecttop10b.*from(selecttop20主键字段,排序字段from表
名orderby排序字段desc)a,表名bwhereb.主键字段=a.主键字
段orderbya.排序字段
14、说明:前10条记录
selecttop10*formtable1where范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(
类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排
名,等等.)
selecta,b,cfromtablenametawherea=(selectmax(a)from
tablenametbwheretb.b=ta.b)
16、说明:包括所有在TableA中但不在TableB和TableC中的行并消除
所有重复行而派生出一个结果表
(selectafromtableA)except(selectafromtableB)except
(selectafromtableC)
17、说明:随机取出10条数据
selecttop10*fromtablenameorderbynewid()
18、说明:随机选择记录
selectnewid()
19、说明:删除重复记录
Deletefromtablenamewhereidnotin(selectmax(id)from
tablenamegroupbycol1,col2,...)
20、说明:列出数据库里所有的表名
selectnamefromsysobjectswheretype=’U’
21、说明:列出表里的所有的
selectnamefromsyscolumnswhereid=object_id(’TableName’)
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便
地实现多重选择,类似select中的case。
selecttype,sum(casevenderwhen’A’thenpcselse0
end),sum(casevenderwhen’C’thenpcselse0end),sum(case
venderwhen’B’thenpcselse0end)FROMtablenamegroupby
type
显示结果:
typevenderpcs
电脑A1
电脑A1
光盘B2
光盘A2
手机B3
手机C3
23、说明:初始化表table1
TRUNCATETA
BLEtable1
24、说明:选择从10到15的记录
selecttop5*from(selecttop15*fromtableorderbyid
asc)table_别名orderbyiddesc
随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们
可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见
的解决方案是建立如下所示的循环:
Randomize
RNumber=Int(Rnd*499)+1
WhileNotobjRec.EOF
IfobjRec("ID")=RNumberTHEN
...这里是执行脚本...
endif
objRec.MoveNext
Wend
这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500
就是数据库内记录的总数)。然后,你遍历每一记录来测试ID的值、检查
其是否匹配RNumber。满足条件的话就执行由THEN关键字开始的那一块代码
。假如你的RNumber等于495,那么要循环一遍数据库花的时间可就长了。
虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个
小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候
不就死
定了?
采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录
的recordset,如下所示:
Randomize
RNumber=Int(Rnd*499)+1
SQL="SELECT*FROMCustomersWHEREID="&;RNumber
setobjRec=ObjConn.Execute(SQL)
Response.WriteRNumber&;"="&;objRec("ID")&;""&;
objRec("c_email")
不必写出RNumber和ID,你只需要检查匹配情况即可。只要你对以上代
码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内
容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干Random函数的最后一滴油,那么你可能会一次
取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random
示例扩展一下就可以用SQL应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一recordset内,你可以存储
三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL="SELECT*FROMCustomersWHEREID="&;RNumber&;"OR
ID="&;RNumber2&;"ORID="&;RNumber3
假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),
你可以用BETWEEN或者数学等式选出第一条记录和适当数量的递增记录。这
一操作可以通过好几种方式来完成,但是SELECT语句只显示一种可能(这
里的ID是自动生成的号码):
SQL="SELECT*FROMCustomersWHEREIDBETWEEN"&;RNumber&;
"AND"&;RNumber&;"+9"
注意:以上代码的执行目的不是检查数
据库内是否有9条并发记录。
随机读取若干条记录,测试过
Access语法:SELECTtop10*From表名ORDERBYRnd(id)
Sqlserver:selecttopn*from表名orderbynewid()
mysqlelect*From表名OrderByrand()Limitn
Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有
Access的SQL说明,只有自己测试,现在记下以备后查)
语法electtable1.fd1,table1,fd2,table2.fd2Fromtable1left
jointable2ontable1.fd1,table2.fd1where...
使用SQL语句用...代替过长的字符串显示
语法:
SQL数据库:selectcasewhenlen(field)>10thenleft(field,10)
+’...’elsefieldendasnews_name,news_idfromtablename
Access数据库:SELECTiif(len(field)>2,left(field,2)
+’...’,field)FROMtablename;
Conn.Execute说明
Execute方法
该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法
的使用格式分为以下两种:
1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
Set对象变量名=连接对象.Execute("SQL查询语言")
Execute方法调用后,会自动创建记录集对象,并将查询结果存储在
该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变
量就代表了该记录集对象。
2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
连接对象.Execute"SQL操作性语句"[,RecordAffected][,
Option]
·RecordAffected为可选项,此出可放置一个变量,SQL语
句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可
知道SQL语句队多少条记录进行了操作。
·Option可选项,该参数的取值通常为adCMDText,它用于
告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定
该参数,可使执行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开
始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的
事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,
事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并
恢复到处里前的状态。
BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间
的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对
象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生
,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
以下是MSSQL
SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,简要介绍基础语句:
1、说明:创建数据库
CREATEDATABASEdatabase-name
2、说明:删除数据库
dropdatabasedbname
3、说明:备份sqlserver
---创建备份数据的device
USEmaster
EXECsp_addumpdevice’disk’,’testBack’,
’c:\mssql7backup\MyNwind_1.dat’
---开始备份
BACKUPDATABASEpubsTOtestBack
4、说明:创建新表
createtabletabname(col1type1[notnull][primarykey],col2
type2[notnull],..)
根据已有的表创建新表:
A:createtabletab_newliketab_old(使用旧表创建新表)
B:createtabletab_newasselectcol1,col2…fromtab_old
definitiononly
5、说明:删除新表droptabletabname
6、说明:增加一个列
Altertabletabnameaddcolumncoltype
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改
变的是增加varchar类型的长度。
7、说明:添加主键:Altertabletabnameaddprimarykey(col)
说明:删除主键:Altertabletabnamedropprimarykey(col)
8、说明:创建索引:create[unique]indexidxnameontabname(col
….)
删除索引:dropindexidxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:createviewviewnameasselectstatement
删除视图:dropviewviewname
10、说明:几个简单的基本的sql语句
选择:select*fromtable1where范围
插入:insertintotable1(field1,field2)values(value1,value2)
删除:deletefromtable1where范围
更新:updatetable1setfield1=value1where范围
查找:select*fromtable1wherefield1like’%value1%’--
-like的语法很精妙,查资料!
排序:select*fromtable1orderbyfield1,field2[desc]
总数:selectcount*astotalcountfromta
ble1
求和:selectsum(field1)assumvaluefromtable1
平均:selectavg(field1)asavgvaluefromtable1
最大:selectmax(field1)asmaxvaluefromtable1
最小:selectmin(field1)asminvaluefromtable1
11、说明:几个高级查询运算词
A:UNION运算符
UNION运算符通过组合其他两个结果表(例如TABLE1和TABLE2)并消去
表中任何重复行而派生出一个结果表。当ALL随UNION一起使用时(即
UNIONALL),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE1就是来自TABLE2。
B:EXCEPT运算符
EXCEPT运算符通过包括所有在TABLE1中但不在TABLE2中的行并消除所
有重复行而派生出一个结果表。当ALL随EXCEPT一起使用时(EXCEPT
ALL),不消除重复行。
C:INTERSECT运算符
INTERSECT运算符通过只包括TABLE1和TABLE2中都有的行并消除所有
重复行而
派生出一个结果表。当ALL随INTERSECT一起使用时
(INTERSECTALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、leftouterjoin:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所
有行。
SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOIN
bONa.a=b.c
B:rightouterjoin:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的
所有行。
C:fullouterjoin:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录
。
其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a新表名:b)(Access可用)
法一:select*intobfromawhere1<>1
法二:selecttop0*intobfroma
2、说明:拷贝表(拷贝数据,源表名:a目标表名:b)(Access可用)
insertintob(a,b,c)selectd,e,ffromb;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)
insertintob(a,b,c)selectd,e,ffrombin‘具体数据库’
where条件
例子:..frombin’"&;Server.MapPath(".")&;"\data.mdb"&;"’
where..
4、说明:子查询(表名1:a表名2:b)
selecta,b,cfromawhereaIN(selectdfromb)或者:
selecta,b,cfromawhereaIN(1,2,3)
5、说明:显示文章、提交人和最后回复时间
selecta.title,a.username,b.adddatefromtablea,(select
max(adddate)adddatefromtablewheretable.title=a.title)b
6、说明:外连接查询(表名1:a表名2:b)
selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbON
a.a=b.c
7、说明:在线视图查询(表名1:a)
select*from(SELECTa,b,cFROMa)Twheret.a>1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not
between不包括
select*fromtable1wheretimebetweentime1andtime2
selecta,b,c,fromtable1whereanotbetween数值1and数值2
9、说明:in的使用方法
select*fromtable1wherea[not]in(‘值1’,’值2’,’值4’,
’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
deletefromtable1wherenotexists(select*fromtable2
wheretable1.field1=table2.field1)
11、说明:四表联查问题:
select*fromaleftinnerjoinbona.a=b.brightinnerjoin
cona.a=c.cinnerjoindona.a=d.dwhere.....
12、说明:日程安排提前五分钟提醒
SQL:select*from日程安排wheredatediff(’minute’,f开始时
间,getdate())>5
13、说明:一条sql语句搞定数据库分页
selecttop10b.*from(selecttop20主键字段,排序字段from表
名orderby排序字段desc)a,表名bwhereb.主键字段=a.主键字
段orderbya.排序字段
14、说明:前10条记录
selecttop10
*formtable1where范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(
类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排
名,等等.)
selecta,b,cfromtablenametawherea=(selectmax(a)from
tablenametbwheretb.b=ta.b)
16、说明:包括所有在TableA中但不在TableB和TableC中的行并消除
所有重复行而派生出一个结果表
(selectafromtableA)except(selectafromtableB)except
(selectafromtableC)
17、说明:随机取出10条数据
selecttop10*fromtablenameorderbynewid()
18、说明:随机选择记录
selectnewid()
19、说明:删除重复记录
Deletefromtablenamewhereidnotin(selectmax(id)from
tablenamegroupbycol1,col2,...)
20、说明:列出数据库里所有的表名
selectnamefromsysobjectswheretype=’U’
21、说明:列出表里的所有的
selectnamefromsyscolumnswhereid=object_id(’TableName’)
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便
地实现多重选择,类似select中的case。
selecttype,sum(casevenderwhen’A’thenpcselse0
end),sum(casevenderwhen’C’thenpcselse0end),sum(case
venderwhen’B’thenpcselse0end)FROMtablenamegroupby
type
显示结果:
typevenderpcs
电脑A1
电脑A1
光盘B2
光盘A2
手机B3
手机C3
23、说明:初始化表table1
TRUNCATETABLEtable1
24、说明:选择从10到15的记录
selecttop5*from(selecttop15*fromtableorderbyid
asc)table_别名orderbyiddesc
随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们
可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见
的解决方案是建立如下所示的循环:
Randomize
RNumber=Int(Rnd*499)+1
WhileNotobjRec.EOF
IfobjRec("ID")=RNumberTHEN
...这里是执行脚本...
endif
objRec.MoveNext
Wend
这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500
就是数据库内记录的总数)。然后,你遍历每一记录来测试ID的值、检查
其是否匹配RNumber。满足条件的话就执行由THEN关键字开始的那一块代码
。假如你的RNumber等于495,那么要循环一遍数据库花的时间可
就长了。
虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个
小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候
不就死定了?
采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录
的recordset,如下所示:
Randomize
RNumber=Int(Rnd*4
99)+1
SQL="SELECT*FROMCustomersWHEREID="&;RNumber
setobjRec=ObjConn.Execute(SQL)
Response.WriteRNumber&;"="&;objRec("ID")&;""&;
objRec("c_email")
不必写出RNumber和ID,你只需要检查匹配情况即可。只要你对以上代
码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内
容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干Random函数的最后一滴油,那么你可能会一次
取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random
示例扩展一下就可以用SQL应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一recordset内,你可以存储
三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL="SELECT*FROMCustomersWHEREID="&;RNumber&;"OR
ID="&;RNumber2&;"ORID="&;RNumber3
假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),
你可以用BETWEEN或者数学等式选出第一条记录和适当数量的递增记录。这
一操作可以通过好几种方式来完成,但是SELECT语句只显示一种可能(这
里的ID是自动生成的号码):
SQL="SELECT*FROMCustomersWHEREIDBETWEEN"&;RNumber&;
"AND"&;RNumber&;"+9"
注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
随机读取若干条记录,测试过
Access语法:SELECTtop10*From表名ORDERBYRnd(id)
Sqlserver:selecttopn*from表名orderbynewid()
mysqlelect*From表名OrderByrand()Limitn
Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有
Access的SQL说明,只有自己测试,现在记下以备后查)
语法electtable1.fd1,table1,fd2,table2.fd2Fromtable1left
jointable2ontable1.fd1,table2.fd1where...
使用SQL语句用...代替过长的字符串显示
语法:
SQL数据库:selectcasewhenlen(field)>10thenleft(field,10)
+’...’elsefieldendasnews_name,news_idfromtablename
Access数据库:SELECTiif(len(field)>2,left(field,2)
+’...’,field)FROMtablename;
Conn.Execute说明
Execute方法
该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法
的使用格式分为以下两种:
1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
Set对象变量名=连接对象.Execute("SQL查询语言")
Execute方法调用后,会自动创建记录集对象,并将查询结果存储在
该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变
量就代表了该记录集对象。
2.执行SQL的操作性语言时,
没有记录集的返回。此时用法为:
连接对象.Execute"SQL操作性语句"[,RecordAffected][,
Option]
·RecordAffected为可选项,此出可放置一个变量,SQL语
句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可
知道SQL语句队多少条记录进行了操作。
·Option可选项,该参数的取值通常为adCMDText,它用于
告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定
该参数,可使执行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开
始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的
事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,
事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并
恢复到处里前的状态。
BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间
的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对
象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生
,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
Access基本操作
Access基本操作
一、数据库的基本概念和设计方法
所谓数据库实际上是关于某一特定主题或目标的信息集合。它把大量数据按一定的结构进行存储,集中管理和统一使用这些数据,实现数据共享。在Access中,数据库不仅包含用于存放加工过的信息的表,还包含以表中所存放的信息为操作对象的查询、窗体、报表、页等数据库对象。
一般地,数据库的设计应遵循以下几个步骤:
1、确定创建数据库所要完成的目的。
2、确定创建数据库中所需要的表。
3、确定表中所需要的字段。
4、明确有唯一值的主关键字段。
5、确定表之间的关系。
6、优化设计。
7、输入数据并创建其他数据库对象。
二、创建数据库
在Access中既可以使用人工的方法按照自己的要求来建立数据库,也可以使用软件为用户提供的各种数据库向导,前者更为自由而后者则显然要方便一些。
A、自行创建数据库
使用人工的方法按照自己的要求来建立数据库,首先应创建一个空数据库,然后再将对象加入到数据库中。创建空数据库的步骤为:
1、在启动Access后的MicrosoftAccess对话框中选择“空Access数据库”选项。
2、在弹出的“文件新建数据库”对话框中选择数据库存放的位置、输入数据库的名称并单击“创建”
按钮,进入Access数据库窗口,即完成了空数据库的创建。
B、使用数据库向导创建数据库
Access为用户提供了多种数据库向导,使用数据库向导可以方便地完成数据库的创建工作。具体步骤如下:
1、在启动Access后的MicrosoftAccess对话框中选择“Access数据库向导、数据页和项目”选项。
2、在弹出“新建”对话框后单击“数据库”选项卡,选择一种数据库。
3、在弹出的“文件新建数据库”对话框中,选择数据库存放的位置,输入数据库的名称并单击“创建”按钮。
4、依次在数据库向导窗口中为数据库中的各个表选择字段、选择显示样式、确定打印报表所用的样式、
输入所建数据库的标题、确定是否在所有报表上加一幅图片,最后启动该数据库,至此就完成了使用向导创建数据库的工作。
三、表的基本概念
表是数据库中存储数据的最基本的对象,常称为“基础表”,是构成数据库的一个重要组成部分。表由若干记录组成,每一行称为一个记录,对应着一个真实的对象;每一列称为一个字段,对应着对象的一个属性信息。每个表的关键字(关键字可以为一个字段或多个字段)使表中的记录唯一。在表内还可以定义索引,当表内存放大量数据时可以加速数据的查找。
Access中的所有数据都存放在数据表中。表是一个数据库系统的基础,只有建立表后,才可以建立查询、窗体和报表等其他项目,逐步完善数据库。
四、创建表
Access提供了三种创建新表的方法:
1、使用数据库向导,在一个操作中创建整个数据库所需的全部表、窗体及报表。
2、使用表向导来选择表的字段,这些字段可以从其他已定义好的表中选择。
3、使用设计视图创建表。
不管使用哪一种方法来创建表,随时都可以使用表设计试图来进一步自定义表。由于第一种方法已包含在使用数据库向导创建数据库的内容之中,这里着重说明后两种方法的实现。
A、利用表向导创建表
利用表向导创建新表,一般情况下能满足数据库开发者的要求,至于多余的字段可以用其他的方法将其删除。利用表向导创建表的步骤如下:
1、在数据库窗口中,单击“对象”列表中的“表”,双击“使用向导创建表”。
2、在弹出的“表向导”对话框中单击“表向导”并单击“确定”按钮。
3、在弹出的对话框中选择要使用的表并添加所需要的字段(可以重命名)后单击“下一步”按钮。
4、为表指定名称并确认主键,单击“下一步”按钮。
5、选择创建完表后的动作,然后单击“完成”按钮。
B、利用设计视图创建表
使用设计器建立表的方法有两种:一种方法是直
接使用设计器来创建新表,另一种方法是使用表向导来构造一个结构相近的表,然后在设计器中打开修改。下面介绍使用设计器来创建新表的步骤:
1、在数据库窗口中,单击对象列表中的“表”,双击“使用设计器创建表”的按钮,进入“新建表”对话框。
2、在各栏中输入字段名称、选择数据类型,然后设置字段属性。
3、接着选中要设置为关键字的字段,单击“编辑”菜单中“主键”命令,设置“主关键字”,此时在所选字段左边行选定器上出现钥匙标记。
4、保存所设计的表。
五、关于主关键字与建立表间关系
A、设置主关键字
为了提高Access在查询、窗体和报表操作中的快速查找能力和组合保存在各个不同表中信息的性能,必须为建立的表指定一个主关键字。主关键字可以包含一个或多个字段,以保证每条记录都有唯一的值。设定主关键字的目的就在于保证表中的所有记录都能够被唯一识别。如果表中没有可以用作唯一识别表中记录的字段,则可以使用多个字段来组合成主关键字。其设置步骤如下:
1、在表设计器中,单击字段名称左边的字段选择按钮,选择要作为主关键字的字段。单击字段选择按钮的同时按住Ctrl键可以同时选择多个字段。
2、单击“编辑”菜单中的“主键”命令,则在该字段的左边显示钥匙标记。
B、建立表间关系
在表中定义主关键字除了可以保证每条记录可以被唯一识别外,更重要的作用在于多个表间的连接。当数据库中包含多个表时,需要通过主关键字的连接来建立表间的关系,使各表协同工作。
要在两个表间建立关系,必须在这两个表中拥有相同数据类型的字段。其设置步骤如下:
1、打开表所在的数据库窗口。
2、单击“工具”菜单中的“关系”命令,弹出“显示表”对话框。
3、选择要建立关系的表,然后单击“添加”按钮,依次添加完所需要的表后,单击“关闭”按钮。
4、在关系对话框中选择其中一表中的主关键字,拖曳到另一表中相同的主关键字,释放鼠表键后,弹出“编辑关系”对话框。
5、若在“编辑关系”对话框中选中“实施参照完整性”和“级联更新相关字段”复选框,则使在更新主表中记录的同时更新关系表中的相关记录。
6、若在“编辑关系”对话框中选中“实施参照完整性”和“级联删除相关字段”复选框,则使在删除主表中记录的同时删除关系表中的相关记录。
7、接着单击“联接类型”按钮,弹出“联接属性”对话框,在此选择联接的方式。
8、在“编辑关系”对话框中单击“创建”按钮,即在创建关系的表之间有一条线将其连接起来,表
示已创建好表之间的关系。
9、关闭关系对话框,按需要选择是否保存关系的设定。
编辑或修改关联性的操作是直接用鼠标在这一条线上双击,然后在弹出的“编辑关系”对话框中进行修改。删除关联性的操作是先用鼠标在这一条线上单击,然后再按Delete键删除。
六、记录的基本操作
Access只允许每次操作一个记录,正在操作的记录在行选定器上显示一个“三角图标”用于标记当前记录。当改变当前记录的数据但又没有保存时,行选定器上显示一个“笔型图标”。
记录的基本操作包括添加记录、修改记录和删除记录。
A、添加记录
打开表的数据视图画面时,表的最末端有一条空白的记录,在记录的行选定器上显示一个星花图标,标示可以从这里开始增加新的记录。单击“插入”菜单中的“新记录”或直接选定该行即可添加记录。输入完数据后,移到另一个记录时会自动保存该记录。
B、修改记录
可用Tab键或直接用鼠标移到要修改的字段进行修改。
C、删除记录
选择一条或多条记录后按Delete键删除所有选中的记录。