天堂2私服SQL数据库和表的操作
立表
createtable订单明细(订单明细IDcounter,订单IDinteger
default1,商品IDintegerdefault1,单价moneydefault1,
数量integerdefault1,商品编码stringdefault1,售价
moneydefault1,订购日期date,公司stringdefault1,
分店stringdefault1)
注意:自增字端用counter类型
删除表
droptable订单明细
数据转移
insertinto商品临时(商品ID,商品名称,单位,商品条码,
供货商ID)select商品ID,商品名称,单位,商品条码,供货
商IDfrom商品
增加字段
altertable订单明细add备注stringdefault1
删除字段
altertable订单明细drop备注
修改字段
altertable订单明细modify备注新备注string(100)...
在Tab1的Date列上建立可重复索引
CreateIndexiDateONTab1([Date])
在Tab1的Name列上建立不可重复索引
CreateUniqueIndexiNameONTab1(Name)
删除索引
DropIndexiDateONTab1
访问多个不同的ACCESS数据库-在SQL中使用In子句
Selecta.*,b.*FromTab1a,Tab2bIndb2.mdb
Wherea.ID=b.ID;
上面的SQL语句查询出当前数据库中Tab1和db2.mdb
(当前文件夹中)中Tab2以ID为关联的所有记录.
缺点-外部数据库不能带密码.
ACCESS中的日期查询
注意:ACCESS中的日期时间分隔符是#而不是引号
Select*FromTab1Where[Date]>#2002-1-1#
ACCESS中的字符串可以用双引号分隔,但SQLSERVER
不认,所以为了迁移方便和兼容,
建议用单引号作为字符串分隔符.
=======================================================
选择不重复的数据用DIST
SELECTDISTINCTPRICEFROMTABLE
对字段进行计算后形成新字段
SELECTPRICE,(PRICE+15)NEWPRICEFROMTABLE
或
SELECTPRICE,PRICE+15NEWPRICEFROMTABLE
也可以对其中两个字段进行计算形成新了段
LIKE的格式有
表示含:SELECTnameFROMusersWHEREnameLIKE%yang%
表示不含:SELECTnameFROMusersWHEREnameNOTLIKE%yang%
表示以yang开头:SELECTnameFROMusersWHEREnameLIKEyang%
表示匹配其它字符:SELECTnameFROMusersWHEREnameLIKEya_
组合:SELECTnameFROMusersWHEREnameLIKE_ya%
把两个字符串类型的字段合在一起(同CONCAT)
SELECTfname||lnamenameFROMusers
中间也可以插入符号:SELECTfname||,||lnamenameFROMusers
UNION(联合)
SELECT*FROMuser1UNIONSELECT*FROMuser2
//合并两个选择结果,去重复部分
SELECT*FROMuser1UNIONALLSELECT*FROMuser2
//合并两个选择结果,不去重复部分
INTERSECT(相交)
SELECT*FROMuser1INTERSECTSELECT*FROMuser2
//得到两种选择结果共同的部分
MINUS(相减)
SELECT*FROMuser1MINUSSELECT*FROMuser2
IN
SELECT*FROMuserWHEREusernameIN(yang,lin,chen)
//得到用户名中含有yang或lin或chen的用户
BETWEEN
SELECT*FROMPRICETABLEWHEREpriceBETWEEN10AND30
//得到价格在10和30之间的产品
===============================================
COUNT()得到记录个数
SUM()汇总数
AVG()平均数
MAX()最大数
MIN()最小数
ADD_MONTHS()增加一个月例:SELECT*FROMdate
WHEREADD_MONTHS(bdate)<ldate
LAST_DAY()返回月份的最后一天SELECTLAST_DAY(ndate)FROMuser
MONTHS_BETWEEN(udate,ndate)返回两个月之间有多少个月
NEXT_DAY()返回指定日期所在星期星期几的日期
SYSDATE()返回系统日期和时间
ABS()绝对值
MOD(A,B)余数
CHR()返回字符如:CHR(27)
CONCAT()连接两个字符串字段
LTRIM()
RTRIM()
REPLACE()
LPAD()
RPAD()
LOWER()
UPPER()
SUBSRT()
TRANSLATE()
INSTR()
LENGTH()
TO_CHAT()
TO_NUMBER()
GREATEST()
LEAST()
USER()
===============================================
对一个表中某个字段为数字需要在另一个表中得到具体内容
的操作,以下例子是涉及到四个表的操作方法。
SELECT*
FROM(((MemberINNERJOINMemberSortONMember.MemberSort=MemberSort.MemberSort)
INNERJOINMemberLevelONMember.MemberLevel=MemberLevel.MemberLevel)
INNERJOINMemberIdentityONMember.MemberIdentity=MemberIdentity.MemberIdentity)
INNERJOINWedlockONMember.Wedlock=Wedlock.Wedlock
ORDERBYMemberDateDESC
===============================================
===============================================
===============================================
===============================================
===============================================
===============================================
蛙蛙推荐:整理了一些SQL数据库技巧,贴一下
一.怎样删除一个表中某个字段重复的列呀,举个例子
表[table1]
idname
1aa
2bb
3cc
1aa
2bb
3cc
我想最后的表是这样的
idname
1aa
2bb
3cc
回答:
将记录存到临时表#t中,重复的记录只存一条,然后将临时表#t
中的记录再存回原表中,注意“selectdistinctid,class,name”
要包含你需要的所有字段,否则有些字段就被删掉了。
在查询管理器里执行下面代码:
-----------------------------
SELECTDISTINCTid,,name
INTO#t
FROMtable1DELETEtable1
INSERT
INTOtable1
SELECT*
FROM#t
------------------------------
二.找出既会VB又会PHP的人
表是这样的:
ID员工技能
11VB
21PHP
31ASP
42PHP
53ASP
64VB
74ASP
要从这张表中找出既会VB又会PHP的人,SQL该怎么写啊?
回答:
--------------------------------------------------------
-------------------------------------
SELECT员工FROM[Table]WHERE员工IN(SELECT员工FROM
[Table]WHERE技能=VB)AND技能=PHP
-------------------------------------------------------
---------------------------------------
三.数据库合并问题
access里的两个表,想让两个表的内容合并
表[a]结构如下:
[id]编号自动编号
[name]名称文本
[price]价格数字
[guige]规格文本
[changjia]生产厂家文本
[baozhuang]包装文本
[danwei]单位文本
共有900条记录,除了id和name字段,其他均可以为空
表[b]结构如下:
[id]编号自动编号
[name]名称文本
[price]价格数字
[changjia]生产厂家文本
[danwei]单位文本
[xingzhi]性质文本
共有800条记录,除了id和name字段,比表[a]少几个字段,但还多
一个[xingzhi]的字符安其它均可以为空
现在想生成一个新表[c],结构如下,而且内容是两个表的内容之和,
[id]编号自动编号
[name]名称文本
[price]价格数字
[guige]规格文本
[changjia]生产厂家文本
[baozhuang]包装文本
[danwei]单位文本
[xingzhi]性质文本
用sql语句也可以,手工操作也好,xml也好,别管怎么着吧,怎么
实现呀,哥们要郁闷坏了,真要让我们再输入800条记录,我就挂了,
回答:
1.这样
-----------------------------
insertintoc(id,name,.....)
selectid,name,.....
froma
insertintoc(id,name,.....)
selectmax(id)+1,name,.....
fromb
------------------------------
2.更正:
如果直接在查询分析器里执行:
-------------------------------
insertintoc(name,.....)
selectname,.....
froma
insertintoc(name,.....)
selectname,.....
fromb
--------------------------------
3.用union方法
---------------------------------
insertinto[c]([id],编号,自动编号)
select[id],编号,自动编号from[a]
union
select[id],编号,自动编号from[b]
-----------------------------------
4.asp的解决办法
------------------------------------------------------------
<%循环检测a表
Setrs=Server.CreateObect("ADODB.RECORDSET")
rs.open"select*fromaorderbyid",conn,1,1
Dowhilenotrs.eof
CallactAdd(rs("name"))调用像b表添加内容的函数!
rs.MoveNext
Loop
rs.Close
Setrs=Nothing
SubactAdd(txt)
Dimts,sql
sql="insertintob(name)values("&txt&")"
Setts=Conn.Execute(sql)
ts.Close
Setts=Nothing
endSub
%>
----------------------------------------------------
5.asp的解决办法----
<%
dimarr_temp1,arr_temp2,arr_data
setrs=conn.execute("selectid,name,price,guige,
changjia,baozhuang,danweifroma")
arr_temp1=rs.getrows
rs.close
setrs=nothing
setrs=conn.execute("selectid,name,price,guige,
changjia,danwei,xingzhifromb")
arr_temp2=rs.getrows
rs.close
setrs=nothing
rem开始处理
redimarr_data(ubound(arr_temp1,2)+ubound(arr_temp2,2),7)
rem把两个数组的内容复制进来
这一部分自己写了做两个循环
然后再存进数据库
%>
--------------------------------------------------
最后转一些经典的SQL语句:
1.蛙蛙推荐:一些精妙的SQL语句
---------------------------------------------------
说明:复制表(只复制结构,源表名:a新表名:b)
SQL:select*intobfromawhere1<>1
说明:拷贝表(拷贝数据,源表名:a目标表名:b)
SQL:insertintob(a,b,c)selectd,e,ffromb;
说明:显示文章、提交人和最后回复时间
SQL:selecta.title,a.username,b.adddatefromtable
a,(selectmax(adddate)adddatefromtablewhere
table.title=a.title)b
说明:外连接查询(表名1:a表名2:b)
SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffroma
LEFTOUTJOINbONa.a=b.c
说明:日程安排提前五分钟提醒
SQL:select*from日程安排wheredatediff(minute,
f开始时间,getdate())>5
说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
deletefrominfowherenotexists(select*from
infobzwhereinfo.infid=infobz.infid)
说明:--
SQL:
SELECTA.NUM,A.NAME,B.UPD_DATE,B.PREV_UPD_DATE
FROMTABLE1,
(SELECTX.NUM,X.UPD_DATE,Y.UPD_DATEPREV_UPD_DATE
FROM(SELECTNUM,UPD_DATE,INBOUND_QTY,STOCK_ONHAND
FROMTABLE2
WHERETO_CHAR(UPD_DATE,YYYY/MM)=TO_CHAR(SYSDATE,
YYYY/MM))X,
(SELECTNUM,UPD_DATE,STOCK_ONHAND
FROMTABLE2
WHERETO_CHAR(UPD_DATE,YYYY/MM)=
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,YYYY/MM)|
|/01,YYYY/MM/DD)-1,YYYY/MM))Y,
WHEREX.NUM=Y.NUM(+)
ANDX.INBOUND_QTY+NVL(Y.STOCK_ONHAND,0)<>X.STOCK_ONHAND)B
WHEREA.NUM=B.NUM
说明:--
SQL:
select*fromstudentinfowherenotexists(select*from
studentwherestudentinfo.id=student.id)and系名
称="&strdepartmentname&"and专业名称="&strprofessionname&"order
by性别,生源地,高考总成绩
说明:
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
SQL:
SELECTa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,yyyy)AStelyear,
SUM(decode(TO_CHAR(a.telfeedate,mm),01,a.factration))ASJAN,
SUM(decode(TO_CHAR(a.telfeedate,mm),02,a.factration))ASFRI,
SUM(decode(TO_CHAR(a.telfeedate,mm),03,a.factration))ASMAR,
SUM(decode(TO_CHAR(a.telfeedate,mm),04,a.factration))ASAPR,
SUM(decode(TO_CHAR(a.telfeedate,mm),05,a.factration))ASMAY,
SUM(decode(TO_CHAR(a.telfeedate,mm),06,a.factration))ASJUE,
SUM(decode(TO_CHAR(a.telfeedate,mm),07,a.factration))ASJUL,
SUM(decode(TO_CHAR(a.telfeedate,mm),08,a.factration))ASAGU,
SUM(decode(TO_CHAR(a.telfeedate,mm),09,a.factration))ASSEP,
SUM(decode(TO_CHAR(a.telfeedate,mm),10,a.factration))ASOCT,
SUM(decode(TO_CHAR(a.telfeedate,mm),11,a.factration))ASNOV,
SUM(decode(TO_CHAR(a.telfeedate,mm),12,a.factration))ASDEC
FROM(SELECTa.userper,a.tel,a.standfee,b.telfeedate,b.factration
FROMTELFEESTANDa,TELFEEb
WHEREa.tel=b.telfax)a
GROUPBYa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,yyyy)
说明:四表联查问题:
SQL:select*fromaleftinnerjoinbona.a=b.brightinnerjoin
cona.a=c.cinnerjoindona.a=d.dwhere.....
说明:得到表中最小的未使用的ID号
SQL:
SELECT(CASEWHENEXISTS(SELECT*FROMHandlebWHEREb.HandleID=1)
THENMIN(HandleID)+1ELSE1END)asHandleID
FROMHandle
WHERENOTHandleIDIN(SELECTa.HandleID-1FROMHandlea)
-------------------------------------------------------------
2.删除重复数据----------------
一、具有主键的情况
a.具有唯一性的字段id(为唯一主键)
deletetable
whereidnotin
(
selectmax(id)fromtablegroupbycol1,col2,col3...
)
groupby子句后跟的字段就是你用来判断重复的条件,如只有col1,
那么只要col1字段内容相同即表示记录相同。
b.具有联合主键
假设col1+,+col2+,...col5为联合主键
select*fromtablewherecol1+,+col2+,...col5in(
selectmax(col1+,+col2+,...col5)fromtable
wherehavingcount(*)>1
groupbycol1,col2,col3,col4
)
groupby子句后跟的字段就是你用来判断重复的条件,
如只有col1,那么只要col1字段内容相同即表示记录相同。
c:判断所有的字段
select*into#aafromtablegroupbyid1,id2,....
deletetable
insertintotable
select*from#aa
二、没有主键的情况
a:用临时表实现
selectidentity(int,1,1)asid,*into#tempfromta
delete#temp
whereidnotin
(
selectmax(id)from#groupbycol1,col2,col3...
)
deletetableta
insetintota(...)
select.....from#temp
b:用改变表结构(加一个唯一字段)来实现
altertable表addnewfieldintidentity(1,1)
delete表
wherenewfieldnotin
(
selectmin(newfield)from表groupby除newfield外的所有字段
)
altertable表dropcolumnnewfield~
|
|
|