SQL 语句分类
DDL — 数据定义语句 (CREATE,ALTER,DROP,DECLARE)
DML — 数据操纵语句 (SELECT,DELETE,UPDATE,INSERT)
DCL — 数据控制语句 (GRANT,REVOKE,COMMIT,ROLLBACK)
DDL 基础语句
说明:创建数据库
-
CREATE DATABASE database
-
name
说明:删除数据库
-
drop database dbname
说明:收缩数据库
-
USE
数据库名称
-
DUMP TRANSACTION
数据库名称
WITH NO_LOG
-
DBCC SHRINKFILE
(
2
,
truncateonly
)
说明:备份sql server
-
--创建备份数据的
device
-
USE master
-
EXEC sp_addumpdevice
'disk'
,
'testBack'
,
'c:\mssql7backup\MyNwind_1.dat'
-
--开始备份
-
BACKUP DATABASE pubs TO testBack
说明:SQL还原数据库后孤立用户问题处理
-
--列出当前数据库的孤立用户
-
exec
sp_change_users_login
'REPORT'
-
--自动将用户名所对应的同名登录添加到
syslogins
中
-
exec
sp_change_users_login
'AUTO_FIX'
,
'用户名'
,
NULL
,
'密码'
-
--将用户名映射为指定的登录名
-
exec
sp_change_users_login
'UPDATE_ONE'
,
'用户名'
,
'登录名'
说明:查看SQL服务器名称
sp_helpserver
或
SELECT @@SERVERNAME
和以下结果做比较
select serverproperty('servername')
不一致则要重命名,并以下面的结果为新的命名。
说明:当更改计算机名以后,需要为SQL服务器重命名
-
--
SQL SERVER
2005
-
sp_dropserver
<
old_name\instancename
>
-
GO
-
sp_addserver
<
new_name\instancename
>,
local
-
GO
-
-
--
SQL SERVER
2000
-
use
master
-
go
-
sp_configure
'allow up'
,
1
-
RECONFIGURE WITH OVERRIDE
-
GO
-
update sysservers
set
srvname
=
'ERP'
where
srvid
=
0
-
update sysservers
set
datasource
=
'192.168.2.15'
where
srvid
=
1
-
GO
-
sp_configure
'allow up'
,
0
-
RECONFIGURE WITH OVERRIDE
-
GO
说明:建立链接服务器(这样可以建立带大小写的名称,且按名称引用比按IP地址好)
-
exec
sp_addlinkedserver
@server
=
N
'链接服务器名'
,
@srvproduct
=
N
'MSSQL2005'
,
@provider
=
N
'SQLNCLI'
,
@datasrc
=
N
'IP地址'
-
GO
-
exec
sp_addlinkedsrvlogin
@rmtsrvname
=
N
'链接服务器名'
,
@useself
=
'false'
,
@locallogin
=
NULL
,
@rmtuser
=
'帐户'
,
@rmtpassword
=
'密码'
-
GO
说明:重新生成系统数据库(更改服务器排序规则)
http://msdn.microsoft.com/zh-cn/library/dd207003%28v=sql.105%29.aspx
【SQL SERVER 2008 R2】
首先把安全性改为Windows身份验证模式,停止服务,然后进入安装程序目录执行
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=Administrator /SQLCOLLATION=Chinese_PRC_CI_AS
说明:创建新表
-
create table tabname
(
col1 type1
[
not
null
]
[
primary key
],
col2 type2
[
not
null
],..)
说明:根据已有的表创建新表
方法一:
-
create table tab_new like tab_old
方法二:
-
create table tab_new
as
select
col1
,
col2
…
from
tab_old definition only
方法三(Access 可用):
-
select
*
into
tab_new
from
tab_old
where
1
<>
1
方法四(Access 可用):
-
select
top
0
*
into
tab_new
from
tab_old
说明:删除新表
-
drop table tabname
说明:增加一个列
-
Alter
table
[
TABLE NAME
]
add
[
COLUMN NAME
]
type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
说明:创建主键/删除主键
-
--创建主键
-
Alter
table
[
TABLE NAME
]
add primary key
([
COLUMN NAME
])
-
--删除主键
-
declare
@conName
nvarchar
(
128
)
--定义约束名称变量
-
declare
@tabName
nvarchar
(
128
)
--定义操作表名称变量
-
set
@tabName
=
[
TABLE NAME
]
--设置操作表名称
-
SELECT
@conName
=
NAME FROM sys
.
sysobjects WHERE xtype
=
'PK'
and
left
(
name
,
4
+
len
(
@tabName
))=
'PK__'
+
@tabName
-
EXEC
(
'Alter table '
+
@tabName
+
' DROP CONSTRAINT '
+
@conName
)
说明:创建索引/删除索引
-
--创建索引
-
create
[
unique
]
index idxname on tabname
(
col
….)
-
--删除索引
-
drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
说明:创建视图/删除视图
-
--创建视图
-
create view viewname
as
select
statement
-
--删除视图
-
drop view viewname
说明:列出数据库里所有的用户表名
-
select
name
from
sysobjects
where
type
=
'U'
说明:列出表里的所有的字段名
-
select
name
from
syscolumns
where
id
=
object_id
(
'TableName'
)
说明:列出一个数据库内所有表的行数
-
SELECT
表名=
a
.
name
,记录数=
b
.
rows
-
FROM
数据库名.
dbo
.
sysobjects a
,
数据库名.
dbo
.
sysindexes b
-
WHERE a
.
name
=
b
.
name
and
a
.
type
=
'U'
-
ORDER BY
记录数
DESC
说明:列出数据库里所有的触发器(SQL2005)
-
select
B
.
name
as
parent_name
,*
from
sysobjects A
,
sysobjects B
-
where
B
.
id
=
A
.
parent_obj AND A
.
xtype
=
'TR'
DML 基础语句
说明:几个简单的基本的sql语句
选择:
select * from table1 where 范围
插入:
insert into table1(field1,field2) values(value1,value2)
删除:
delete from table1 where 范围
更新:
update table1 set field1=value1 where 范围
查找:
select * from table1 where field1 like '%value1%'
–like的语法很精妙,查资料!
排序:
select * from table1 order by field1,field2 [desc]
总数:
select count * as totalcount from table1
求和:
select sum(field1) as sumvalue from table1
平均:
select avg(field1) as avgvalue from table1
最大:
select max(field1) as maxvalue from table1
最小:
select min(field1) as minvalue from table1
说明:几个高级查询运算词
UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
说明:使用外连接
-
--
SQL
Server
-
select
t1
.
a
,
t1
.
b
,
t1
.
c
,
t2
.
c
,
t2
.
d
,
t2
.
f
from
t1 LEFT
/
RIGHT
/
FULL OUTER JOIN t2 ON t1
.
a
=
t2
.
c
-
--
Access
左连接
-
select
t1
.
fd1
,
t1
,
fd2
,
t2
.
fd2
From
t1 left join t2 on t1
.
fd1
,
t2
.
fd1
where
...
LEFT OUTER JOIN
左外连接(左连接):结果集包括a表的所有行,也包括b表的匹配行内容。
RIGHT OUTER JOIN
右外连接(右连接):结果集包括b表的所有行,也包括a表的匹配行内容。
FULL OUTER JOIN
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
SQL 进阶应用
说明:查询ID列中缺少的不连续的最小值和最大值
-
select
max
(
t1
.
id
)-
1
最小值,
min
(
t2
.
id
)+
1
最大值
-
from
表名
as
t1
-
full join
表名
as
t2 on t1
.
id
=(
t2
.
id
+
1
)
-
where
t1
.
id
is
null
or
t2
.
id
is
null
说明:从1开始重设标志列值,清除由于删除操作造成的中间隔断。
注:如果该标志列为主键,需先删除主键
-
--先删除标志列
-
alter table
[
TABLE NAME
]
drop column
[
COLUMN NAME
]
-
--再创建标志列
-
alter table
[
TABLE NAME
]
add
[
COLUMN NAME
]
numeric
(
18
,
0
)
not
null
identity
(
1
,
1
)
说明:拷贝表 (Access可用)
-
insert
into
b
(
a
,
b
,
c
)
select
d
,
e
,
f
from
b
说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access专用)
-
insert
into
b
(
a
,
b
,
c
)
select
d
,
e
,
f
from
b
in
‘具体数据库’
where
条件
例子:
... from b in '"&Server.MapPath(".")&"\data.mdb" &"' where ...
说明:IN 集合的用法
-
--子查询
-
select
a
,
b
,
c
from
t1
where
a
[
not
]
IN
(
select
d
from
t2
)
-
--常量集合
-
select
a
,
b
,
c
from
t1
where
a
[
not
]
IN
(
1
,
2
,
3
)
说明:前10条记录
-
select
top
10
*
form table1
where
条件
说明:显示文章、提交人和最后回复时间
-
select
a
.
title
,
a
.
username
,
b
.
adddate
from
table a
,(
select
max
(
adddate
)
adddate
from
table
where
table
.
title
=
a
.
title
)
b
说明:在线视图查询
-
select
*
from
(
SELECT a
,
b
,
c FROM table
)
T
where
T
.
a
>
1
;
说明:between的用法
-
--
between
限制查询数据范围时包括了边界值
-
select
*
from
table1
where
time between time1
and
time2
-
--
not
between
不包括
-
select
a
,
b
,
c
,
from
table1
where
a
not
between
数值
1
and
数值
2
说明:随机产生全局唯一识别符
-
select
newid
()
说明:随机取出10条数据
-
--
SQL
Server
-
select
top
10
*
from
tablename order
by
newid
()
-
--
Mysql
-
select
*
From
表名
Order
By
rand
()
Limit
10
-
--
Acess
-
SELECT top
10
*
From
表名
ORDER BY
Rnd
(
id
)
说明:日程安排提前五分钟提醒
-
select
*
from
日程安排
where
datediff
(
'minute'
,
f
开始时间,
getdate
())>
5
说明:一条 sql 语句搞定数据库分页
-
select
top
10
b
.*
from
(
select
top
20
主键字段,排序字段
from
表名
order
by
排序字段
desc
)
a
,表名
b
where
b
.主键字段
=
a
.主键字段
order
by
a
.排序字段
说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
-
select
a
,
b
,
c
from
tablename ta
where
a
=(
select
max
(
a
)
from
tablename tb
where
tb
.
b
=
ta
.
b
)
说明:两张关联表,从主表中删除已经在副表中没有的信息
-
delete
from
table1
where
not
exists
(
select
*
from
table2
where
table1
.
field1
=
table2
.
field1
)
说明:包括所有在 TableA 中但不在 TableB 和 TableC 中的行并消除所有重复行而派生出一个结果表
-
(
select
a
from
tableA
)
except
(
select
a
from
tableB
)
except
(
select
a
from
tableC
)
说明:删除重复记录
-
Delete
from
tablename
where
id
not
in
(
select
max
(
id
)
from
tablename
group
by
col1
,
col2
,...)
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
-
select
type
,
sum
(
case
vender
when
'A'
then
pcs
else
0
end
)
A
,
sum
(
case
vender
when
'B'
then
pcs
else
0
end
)
B
,
sum
(
case
vender
when
'C'
then
pcs
else
0
end
)
C FROM
数据表
group
by
type
数据表:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
显示结果:
type A B C
电脑 2 0 0
光盘 2 2 0
手机 0 3 3
说明:初始化表
-
TRUNCATE TABLE table1
说明:选择从10到15的记录
-
select
top
5
*
from
(
select
top
15
*
from
table order
by
id asc
)
table_
别名
order
by
id desc
说明:用…代替过长的字符串显示(IF 的用法)
语法:
-
--
SQL
Server
-
select
case
when
len
(
field
)>
10
then
left
(
field
,
10
)+
'...'
else
field
end
as
news_name
,
news_id
from
tablename
-
--
Access
-
SELECT iif
(
len
(
field
)>
2
,
left
(
field
,
2
)+
'...'
,
field
)
FROM tablename
;
说明:一句话替换数据库中某字段中的特定字符
-
UPDATE
<table_name>
SET
<field_name>
=
replace
(<
field_name
>,
'from_str'
,
'to_str'
)
WHERE
<条件>
说明:从表2中更新数据到表1
-
UPDATE
<table_name1>
SET
<field_name1>
=
a
.<
field_name1
>,
<field_name2>
=
a
.<
field_name2
>
-
from
(
SELECT
<field_name1>
,
<field_name2>
FROM
<table_name2>
WHERE
<搜索条件>)
as
a
-
where
<条件>
说明:游标的用法
-
DECLARE
@id
INT
-
DECLARE
@Name
VARCHAR
(
30
)
-
DECLARE cur CURSOR
-
FOR
-
SELECT ID
,
Name
FROM dbo
.
tUser
-
OPEN cur
-
FETCH NEXT FROM cur INTO
@id
,
@Name
-
WHILE
(@
@FETCH_STATUS
=
0
)
-
BEGIN
-
--插入循环体内处理语句
-
-
FETCH NEXT FROM cur INTO
@id
,
@Name
-
END
-
CLOSE cur
-
DEALLOCATE cur
-
GO
说明:BeginTrans、RollbackTrans、CommitTrans 事务处理
这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
说明:查看事务日志
-
--方法一
-
select
*
From
::
fn_dblog
(
default
,
default
)
-
--方法二
-
DBCC LOG
(
'DatabaseName'
,
2
)
说明:降低事务隔离等级,用于降低进程死锁(“事务与另一个进程已被死锁在 lock,communication buffer 资源上”)
-
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
说明:查看SQL Server内存使用情况
-
DBCC MEMORYSTATUS
说明:利用SQL Server操作DBF数据库(需要sa权限)
语法:
-
--删除数据
-
DELETE FROM openrowset
(
'MICROSOFT.JET.OLEDB.4.0'
,
'dBase 5.0;DATABASE=c:\ '
,
'select * from [erp.DBF]'
)
-
-
--插入数据
-
INSERT INTO openrowset
(
'MICROSOFT.JET.OLEDB.4.0'
,
'dBase 5.0;DATABASE=c:\ '
,
'select * from [erp.DBF]'
)
select
MB001 AS erpph
,
MB002 AS erppm
,
MB003 AS erpgg
from
INVMB
-
-
--将本地
DBF
导入到
SQL
Server
-
SELECT
*
into
dst IN
[
ODBC
]
-
[
ODBC
;
Driver
=
SQL
Server
;
UID
=
sa
;
PWD
=;
Server
=
127.0
.
0.1
;
DataBase
=
Demo
;]
from
src
-
-
--将
SQL
Server
上的表导出到本地
DBF
(自动在本地创建
dst
.
dbf
)
-
SELECT
*
into
dst FROM src IN
[
ODBC
]
-
[
ODBC
;
Driver
=
SQL
Server
;
UID
=
sa
;
PWD
=;
Server
=
127.0
.
0.1
;
DataBase
=
Demo
;]
说明:数据库连接字符串,用于ADO编程
SQL Server:
"Provider=sqloledb;server=服务器地址;Uid=用户名;Pwd=密码;Database=数据库名"
Oracle:
"Provider=MSDAORA.1;Data Source=数据源;User ID=用户名;Password=密码;Persist Security Info=True"
DBF:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\;Password='';Extended Properties=dbase 5.0;Persist Security Info=True"
//假设 sample.DBF 文件在 C:\下,sample.dbf 可以看做是一个Table 。
说明:二维表生成动态列(SQL2005)
http://www.cnblogs.com/ajunsoft/archive/2009/03/30/1425238.html
-
declare
@sql
varchar
(
8000
)
-
--根据
@sql
构造的字符串集合来替换【问题类别】这个列,生成动态列,用
count
(
ID
)填充列值。
-
select
@sql
=
ISNULL
(
@sql
+
'],['
,
''
)+问题类别
from
#ywmx group by 问题类别
-
exec
(
'select * from (select ID,问题类别,部门 from #ywmx)a pivot (count(ID) for 问题类别 in (['
+
@sql
+
']))b'
)
说明:多行合并为一行
http://www.cnblogs.com/codeyu/archive/2010/05/25/1743474.html
-
SELECT TOP
10
UserID
+
'|'
+
RTRIM
(
Name
)+
';'
FROM dbo
.
tUser FOR XML PATH
(
''
)
结果:admin|管理员;10053|程萍;08002|熊芳;09006|李红燕;10001|齐慧宇;10003|刘波;10004|何莉;10005|何昌林;10007|付小春;10008|刘莉;
说明:字符串超过 8000 的处理办法
-
CREATE TABLE dbo
.#
TMP
-
(
-
ID
int
NOT NULL
,
-
长文本
ntext
--定义文本类型字段存放超长字符串
-
);
-
GO
-
--定义多个字符串变量,再拼接
-
DECLARE
@str
VARCHAR
(
8000
)
-
DECLARE
@str1
VARCHAR
(
8000
)
-
INSERT
#TMP VALUES(1, @str + @str1)
说明:随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd
499) +1
While Not objRec.EOF
If objRec(“ID”) = RNumber THEN
… 这里是执行脚本 …
end if
objRec.MoveNext
Wend
这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
Randomize
RNumber = Int(Rnd
499) + 1
SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & ” = ” & objRec(“ID”) & ” ” & objRec(“c_email”)
不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber & ” OR ID = ” & RNumber2 & ” OR ID = ” & RNumber3
假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
SQL = “SELECT * FROM Customers WHERE ID BETWEEN ” & RNumber & ” AND ” & RNumber & “+ 9”
注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
说明: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方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
转载于:https://www.cnblogs.com/cancelpj/p/5192221.html