数据库语法总结
------------------------------------------------- 创建的数据库 ---------------------------------------
------- 设置当前数据库为 master ,以便访问 sysdatabases 表
USE master
------ 批处理( SQLServer 规定:如果是建库 , 建表,存储过程和视图等必须在语句末尾添加批处理标志 ”GO” )
GO
----- 判断是否存在要创建的数据库
IF EXISTS ( SELECT * FROM sysdatabases WHERE name =' 数据库名 ' )
------ 存在则删除(再创建)
drop database 数据库名
------- 创建数据库
CREATE DATABASE 数据库名
ON [PRIMARY]
(
数据文件参数 [ , …n] [ 文件组参数 ]
)
[LOG ON]
(
日志文件参数 [ , …n]
)
文件参数 包括: NAME=' stuDB_data ', ------ 数据文件的逻辑名
FILENAME='D:/project/stuDB_data.mdf', ----- 数据文件的物理名
SIZE=5mb, ------ 数据文件初始大小
MAXSIZE=100mb, ------ 数据文件增长的最大值
FILEGROWTH=15% ------ 数据文件的增长率
--------------------------------------------------- 创建的表 -----------------------------------------------
------- 设置当前数据库为创建的数据库,以便访问 sysobjects 表
USE 创建的数据库名
------ 批处理
GO
----- 判断是否存在要创建的表
IF EXISTS ( SELECT * FROM sysobjects WHERE name =' 表名 ' )
------ 存在则删除(再创建)
drop table 表名
---------- 创建一个数据表
CREATE TABLE 表名
(
列名 1 类型 1 identity (1,1) 约束 , ---- 设置为标识列
列名 2 类型 2 约束 ,
列名 n 类型 n 约束
)
------- 创建表时直接创建各种约束
CREATE TABLE 表名
(
列名 1 类型 1 primary key( 列名 1, 列名 2, ……列名 n),--- 主键约束
列名 2 类型 2 unique,--- 唯一约束
列名 3 类型 3 identity( 初始值 , 增量 ),--- 标识列约束
列名 4 类型 4 default 默认值 [ 注意 : 字符和日期要用单引号 ]--- 默认值约束
列名 5 类型 5 check( 列名及常量及运算符组成的表达式 )--- 检查约束
…………………
列名 n 类型 n,foreign key( 列名 1, 列名 2, ……列名 n) references 主键所在表名 ( 列名 a1, 列名 a2, ……列名 n)
)
----------------------------------------- 删除数据库 -----------------------------------------
drop database 数据库名 1 ,数据库名 2 ,……数据库 n
----------------------------------------- 删除数据表 -----------------------------------------
drop table 表名 1, 表名 2, ……表名 n
---------------------------------- 维护数据表的结构 ---------------------------------------
------- 修改列
alter table 表名 alter column 列名 新类型 ( 长度 )
------- 添加列
alter table 表名 add 列名 类型 ( 长度 )
------- 删除列
alter table 表名 drop column 列名
------- 添加主键约束
alter table 表名 add constraint 主键约束名 primary key ( 列名 1, 列名 2, ……列名 n)
------- 删除主键约束
alter table 表名 drop constraint 主键约束名
------- 添加唯一约束
alter table 表名 add constraint 唯一约束名 unique ( 列名 )
------- 删除唯一约束
alter table 表名 drop constraint 唯一约束名
------- 添加默认约束
alter table 表名 add constraint 默认约束名 default 默认值 for 列名
------- 删除默认约束
alter table 表名 drop constraint 默认约束名
------- 添加检查约束
alter table 表名 add constraint 检查约束名 check ( 列名及常量及运算符组成的表达式 )
------- 删除检查约束
alter table 表名 drop constraint 检查约束名
------- 添加外键约束
alter table 表名 add constraint 外键约束名 foreign key ( 列名 1, 列名 2, ……列名 n) references
主键所在的表名 ( 列名 A1, 列名 A2, ……列名 An)
------- 删除外键约束
alter table 表名 drop constraint 外键约束名
--------------------------------------- 维护表的数据 -------------------------------------
------------------------------ 插入数据 -----------------------------
----------------- 插入单行数据 ----------------
-------- 整行插入(表名后未跟列名要将所有的列值全部列出)
insert [into] 表名 values( 列值 1, 列值 2, ……列值 n)
-------- 插入某几列(不能为空无默认值非表识列的列必须全部列出)
Insert [into] 表名 ( 列名 1, 列名 2, ……列名 n) values (列值 1, 列值 2, ……列值 n )
------------------ 插入多行数据 -----------------+
---------- 直接插入多行
Insert into 表名 ( 列名 1, 列名 2, ……列名 n)
Select 列值 1, 列值 2, ……列值 n union
Select 列值 1, 列值 2, ……列值 n union
……
---------- 新表已存在
insert [into] 表名 1( 列名 1, 列名 2, ……列名 n) select ( 列名 a1, 列名 a2, ……列名 an) from 源表名
---------- 建表和插入数据一起完成
Select 列名 1, 列名 2, ……列名 n into 表名 from 源表名
----------SELECT INTO 插入多行数据的同时插入新的标识
Select 列名 1, 列名 2, ……列名 n, Identity ( 数据类型 , 标识种子 , 标识增长量 ) as 列名 into 新表 from 原始表
-------------------------------- 查询数据 ----------------------------
------- 显示所有记录的所有列
select * from 表名
------- 显示所有记录的某些列
select 列名 1, 列名 2, ……列名 n from 表名
-------- 显示满足条件的所有记录的所有列
select * from 表名 where 条件表达式
-------- 显示满足条件的所有记录的某些列
select 列名 1, 列名 2, ……列名 n from 表名 where 条件表达式
---------------- 内联接查询 ---------------
-------- 内联接的等值联接
select 别名 1. 列名 1, ……别名 1. 列名 n, 别名 2. 列名 1, ……别名 2. 列名 n from 表名 1 as 别名 1 inner join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
-------- 内联接的不等值联接
select 别名 1. 列名 1, ……别名 1. 列名 n, 别名 2. 列名 1, ……别名 2. 列名 n from 表名 1 as 别名 1 inner join 表名 2 as 别名 2 on 别名 1. 列名 > 别名 2. 列名 where 条件表达式
--------------- 外联接查询 ---------------
-------- 外联接的左外联接
select 别名 1. 列名 1, ……别名 1. 列名 n, 别名 2. 列名 1, ……别名 2. 列名 n from 表名 1 as 别名 1 left outer join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
-------- 外联接的右外联接
select 别名 1. 列名 1, ……别名 1. 列名 n, 别名 2. 列名 1, ……别名 2. 列名 n from 表名 1 as 别名 1 right outer join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
-------- 外联接的完全外联接
select 别名 1. 列名 1, ……别名 1. 列名 n, 别名 2. 列名 1, ……别名 2. 列名 n from 表名 1 as 别名 1 full outer join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
-------- 按某列排序 [ ASC 为升序, DESC 为降序。对于联接查询的排序只需将上述语法后加上 order by 子句即可 ]
select 列名 1, 列名 2, ……列名 n from 表名 where 条件表达式 order by 列名
------- 使用特殊符号显示满足条件的所有记录的某些列
select 列名 1+' 符号常量 '+ 列名 2+' 符号常量 '+ ……列名 n from 表名 where 条件表达式
------- 使用 as 子句显示满足条件的所有记录的某些列
select 列名 1 as 新列名 1, 列名 2 as 新列名 2, ……列名 n as 新列名 n from 表名 where 条件表达式
------- 使用 Identity 从一个旧表创建一个新表 , 且只有一个标识列
select identity ( 类型 , 初值 , 增量 ) as 新列名 into 新创建的表名 from 已有的表名
------- 使用 identity 从一个旧表创建一个新表 , 且只有一个标识列 [ 当新表中只有一个标识列时可不用 as]
select identity ( 类型 , 初值 , 增量 ) as 新列名 into 新创建的表名 from 已有的表名
------- 使用 identity 从一个旧表创建一个新表 , 且只有一个标识列
select 新列名 = identity ( 类型 , 初值 , 增量 ) into 新创建的表名 from 已有的表名
------- 使用 identity 从一个旧表创建一个新表 , 且有一个标识列和其它列 [ 当新表中有很多列时必用 as]
select identity( 类型 , 初值 , 增量 ) as 新列名 1, 旧表的列名 1 as 新表的列名 2, …… 旧表的列名 n as 新表的列名 n into 新创建的表名 from 已有的表名
-------- 显示前 n 行记录
select top n * from 表名 where 条件表达式
------ 显示前 n% 行记录
select top n percent * from 表名 where 条件表达式
------- 使用聚合函数分组查询 [ 注意 sum 和 avg 只用于数字型的列, count 用于数字型和字符型的列, max 和 min 用于数字、字符和日期型的列, sum 、 avg 和 count 支持 distinct]
select 列名 1, 列名 2, ……列名 n from 表名 group by 列名 1, 列名 2, ……列名 n
select 列名 , 聚合函数 [sum( 列名 ) 或 avg( 列名 ) 或 count( 列名 ) 或 max( 列名 ) 或 min( 列名 )] from 表名 group by 列名
------- 使用 having 子句查询 [ 注意 where 、 group 和 having 的顺序不能颠倒 ]
select 列名 1, 列名 2, ……列名 n from 表名 group by 列名 1, 列名 2, ……列名 n having 条件表达式
-------- 使用通配符进行模糊查询
select * from 表名 where 通配符条件表达式
--- 列名 like '_A%'
--- 列名 not like '_A%'
--- 列名 in ( 值 1 ,值 2 ,……值 n)
--- 列名 not in ( 值 1 ,值 2 ,……值 n)
--- 列名 between 值 1 and 值 2
--- 列名 not between 值 1 and 值 2
--- 列名 is null
--- 列名 is not null
----------------------------- 更新数据 ----------------------------
-------- 更新满足条件的记录的某些列值
update 表名 set 列名 1= 值 1, 列名 2= 值 2, ……列名 n= 值 n where 条件表达式
------- 内联接的等值联接更新
update 表名 set 列名 1= 值 1, 列名 2= 值 2, ……列名 n= 值 n from 表名 1 as 别名 1 inner join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
-------- 内联接的不等值联接更新
update 表名 set 列名 1= 值 1, 列名 2= 值 2, ……列名 n= 值 n from 表名 1 as 别名 1 inner join 表名 2 as 别名 2 on 别名 1. 列名 > 别名 2. 列名 where 条件表达式
-------- 外联接的左外联接更新
update 表名 set 列名 1= 值 1, 列名 2= 值 2, ……列名 n= 值 n from 表名 1 as 别名 1 left outer join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
------- 外联接的右外联接更新
update 表名 set 列名 1= 值 1, 列名 2= 值 2, ……列名 n= 值 n from 表名 1 as 别名 1 right outer join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
-------- 外联接的完全外联接更新
update 表名 set 列名 1= 值 1, 列名 2= 值 2, ……列名 n= 值 n from 表名 1 as 别名 1 full outer join 表名 2 as 别名 2 on 别名 1. 列名 = 别名 2. 列名 where 条件表达式
------------------------------ 删除数据 -----------------------------
------- 删除满足条件的记录
delete from 表名 where 条件表达式
----- 删除所有的记录 , 只保留表的结构 .
truncate table 表名
---------------------------------------------- 添加 SQL 登录帐户 ------------------------------------------
------------------ 添加登录帐户 -----------------
------- - 添加 Windows 登录帐户
EXEC sp_grantlogin ‘ jbtraining/S26301 ‘
-------- 添加 SQL 登录帐户 [ 帐户: zhangsan 密码: 1234]
EXEC sp_addlogin 'zhangsan', '1234'
----------------- 添加数据库用户 ------------------
-------- 在 master 数据库中添加两个用户
USE master
GO
EXEC sp_grantdbaccess 'jbtraining/S26301', 'S26301DBUser'
EXEC sp_grantdbaccess 'zhangsan', 'zhangsanDBUser'
----------------- 分配对表的权限 ----------------
-------- 为 S26301DBUser 分配建表的权限
GRANT create table TO S26301DBUser
-------- 为 zhangsanDBUser 分配对表 stuInfo 的 select, insert, update 权限
GRANT select, insert, update ON stuInfo TO zhangsanDBUser
-------------------------------------------- 数据库中的变量 -----------------------------------------------
------------------------------------ 局部变量 -------------------------------------
----------- 局部变量的声明(局部变量必须以标记 @ 作为前缀 ,如 @age )
DECLARE @ 变量名 数据类型
----------- 局部变量的赋值(局部变量的使用必须先声明,再赋值 )
SET @ 变量名 = 值 或 SELECT @ 变量名 = 值
---------------------------------- 全局变量 -----------------------------------------
----------- 全局变量的使用(全局变量不需定义,由系统维护;且不能赋值,只能读取它的值,以 @@ 作前缀)
变量 |
含义 |
@@ERROR |
最后一个 T-SQL 错误的错误号 |
@@ IDENTITY |
最后一次插入的标识值 |
@@LANGUAGE |
当前使用的语言的名称 |
@@MAX_CONNECTIONS |
可以创建的同时连接的最大数目 |
@@ROWCOUNT |
受上一个 SQL 语句影响的行数 |
@@SERVERNAME |
本地服务器的名称 |
@@TRANSCOUNT |
当前连接打开的事务数 |
@@VERSION |
SQL Server 的版本信息 |
---------------------------------------------------- 逻辑控制语句 --------------------------------------------------
--------- SQL 中的 IF-ELSE 语句 ( ELSE 是可选部分,如果有多条语句,才需要 BEGIN-END 语句块 )
IF (条件)
BEGIN
语句 1
语句 2
……
END
ELSE
BEGIN
语句 1 ;
语句 2 ;
……
END
---------- SQL 中的 WHILE 循环语句( BREAK 表示退出循环,如果有多条语句,才需要 BEGIN-END 语句块 )
WHILE (条件)
BEGIN
语句 1
语句 2
……
BREAK
END
----------SQL 中的 CASE - END 多分支语句
CASE
WHEN 条件 1 THEN 结果 1
WHEN 条件 2 THEN 结果 2
……
ELSE 其他结果
END
---------------------------------------------------- 创建事务 --------------------------------------------------------
开始事务: BEGIN TRANSACTION
提交事务: COMMIT TRANSACTION
回滚(撤销)事务: ROLLBACK TRANSACTION
-------- 示例说明创建事务
BEGIN TRANSACTION
DECLARE @errorSum INT ------ 定义变量,用于累计事务执行过程中的错误
SET @errorSum=0 ------- 初始化为 0 ,即无错误
UPDATE bank SET currentMoney=currentMoney-1000 ------ 转账:张三的账户少 1000 元,李四的账户多 1000 元
WHERE customerName=' 张三 '
SET @errorSum=@errorSum+@@error
UPDATE bank SET currentMoney=currentMoney+1000
WHERE customerName=' 李四 '
SET @errorSum=@errorSum+@@error ------ 累计是否有错误
IF @errorSum<>0 ------ 如果有错误
BEGIN
print ' 交易失败,回滚事务 '
ROLLBACK TRANSACTION
END
ELSE
BEGIN
print ' 交易成功,提交事务,写入硬盘,永久的保存 '
COMMIT TRANSACTION
END
GO
----------------------------------------------------- 创建索引 -------------------------------------------------------
-------- 判断要创建的索引是否存在
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes WHERE name = ' 索引名(如: IX_writtenExam ) ')
DROP INDEX 表名 . 索引名
------- - 创建索引
CREATE [UNIQUE (唯一索引) ] [CLUSTERED||NONCLUSTERED (聚集索引或非聚集索引) ]
INDEX 索引名
ON 表名 ( 列名 )
WITH FILLFACTOR =x ( x 填充因子(系数) : 指定一个 0 ~ 100 之间的值,表示索引页填充的百分比)
------- 指定按索引查询
SELECT * FROM 表名 with ( INDEX = 索引名( IX_writtenExam ) )
WHERE 列名( writtenExam ) BETWEEN 60 AND 90
----------------------------------------------------- 创建视图 ------------------------------------------------------
-------- 判断要创建的视图是否存在
IF EXISTS (SELECT * FROM sysobjects WHERE name = ' 视图名(如: view_stuInfo_stuMarks ) ')
DROP VIEW 视图名
GO
-------- 创建视图
CREATE VIEW 视图名
AS
查询语句(如: SELECT 姓名 =stuName, 学号 =stuInfo.stuNo,
笔试成绩 =writtenExam, 机试成绩 =labExam,
平均分 =(writtenExam+labExam)/2
FROM stuInfo LEFT JOIN stuMarks
ON stuInfo.stuNo=stuMarks.stuNo )
GO
--------- 查询试图
SELECT * FROM 视图名
--------------------------------------------------------- 系统存储过程 ----------------------------------------------------
--------- 常用的系统存储过程
系统存储过程 |
说明 |
sp_databases |
列出服务器上的所有数据库。 |
sp_helpdb |
报告有关指定数据库或所有数据库的信息 |
sp_renamedb |
更改数据库的名称 |
sp_tables |
返回当前环境下可查询的对象的列表 |
sp_columns |
回某个表列的信息 |
sp_help |
查看某个表的所有信息 |
sp_helpconstraint |
查看某个表的约束 |
sp_helpindex |
查看某个表的索引 |
sp_stored_procedures |
列出当前环境中的所有存储过程。 |
sp_password |
添加或修改登录帐户的密码。 |
sp_helptext |
显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。 |
---------- 常用的扩展存储过程 : xp_cmdshell
1, 可以执行 DOS 命令下的一些的操作
2, 以文本行方式返回任何输出
xp_cmdshell 调用语法:
EXEC xp_cmdshell DOS 命令 [NO_OUTPUT]
例如 :EXEC xp_cmdshell 'mkdir d:/bank', NO_OUTPUT ( 在 d 盘创建了一个名为 bank 的文件夹 )
---------- 创建存储过程
CREATE PROC[EDURE] 存储过程名
@ 参数 1 数据类型 = 默认值 OUTPUT,
…… ,
@ 参数 n 数据类型 = 默认值 OUTPUT
AS
SQL 语句
GO
----------- 处理存储过程中的错误
RAISERROR (msg_id | msg_str , severity state WITH option[,...n]])
注意 : msg_id( 在 sysmessages 系统表中指定用户定义错误信息 )
msg_str( 用户定义的特定信息,最长 255 个字符 )
severity( 定义严重性级别。用户可使用的级别为 0–18 级 )
state( 表示错误的状态, 1 至 127 之间的值 )
option( 指示是否将错误记录到服务器错误日志中
---------- 调用存储过程
EXEC[UTE] 过程名 [ 参数 ]
---------------------------------------------------SQL Server 中的函数 ---------------------------------------------------
----------- 字符串函数
函数名 |
描述 |
举例 |
CHARINDEX
|
用来寻找一个指定的字符串在另一个字符串中的起始位置
|
SELECT CHARINDEX('ACCP','My Accp Course',1 ) 返回: 4 |
LEN
|
返回传递给它的字符串长度
|
SELECT LEN('SQL Server 课程 ') 返回: 12 |
LOWER
|
把传递给它的字符串转换为小写
|
SELECT LOWER('SQL Server 课程 ') 返回: sql server 课程 |
UPPER
|
把传递给它的字符串转换为大写
|
SELECT UPPER ('sql server 课程 ') 返回: SQL SERVER 课程 |
LTRIM
|
清除字符左边的空格
|
SELECT LTRIM (' 周智宇 ') 返回:周智宇 (后面的空格保留) |
RTRIM
|
清除字符右边的空格
|
SELECT RTRIM (' 周智宇 ') 返回: 周智宇(前面的空格保留) |
RIGHT
|
从字符串右边返回指定数目的字符 ( 最后几个字符 ) |
SELECT RIGHT(' 买卖提 . 吐尔松 ',3) 返回:吐尔松 |
REPLACE
|
替换一个字符串中的字符
|
SELECT REPLACE(' 莫乐可切 . 杨可 ',' 可 ',' 兰 ') 返回:莫乐兰切 . 杨兰 |
STUFF
|
在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符串 ( 填充 ) |
SELECT STUFF('ABCDEFG', 2, 3, ' 我的音乐我的世界 ') 返回: A 我的音乐我的世界 EFG |
---------- 日期函数
函数名 |
描述 |
举例 |
GETDATE |
取得当前的系统日期 |
SELECT GETDATE() 返回:今天的日期 |
DATEADD |
将指定的数值添加到指定的日期部分后的日期 |
SELECT DATEADD(mm,4, ’ 01/01/99 ’ ) 返回:以当前的日期格式返回 05/01/99 |
DATEDIFF |
两个日期之间的指定日期部分的区别 |
SELECT DATEDIFF(mm,’01/01/99’,’05/01/99’) 返回: 4 |
DATENAME |
日期中指定日期部分的字符串形式 |
SELECT DATENAME(dw, ’ 01/01/2000 ’ ) 返回: Saturday |
DATEPART |
日期中指定日期部分的整数形式 |
SELECT DATEPART(day, ’ 01/15/2000 ’ ) 返回: 15 |
------------ 数学函数
函数名 |
描述 |
举例 |
ABS |
取数值表达式的绝对值 |
SELECT ABS(-43) 返回: 43 |
CEILING |
返回大于或等于所给数字表达式的最小整数 |
SELECT CEILING(43.5) 返回: 44 |
FLOOR |
取小于或等于指定表达式的最大整数 |
SELECT FLOOR(43.5) 返回: 43 |
POWER |
取数值表达式的幂值 |
SELECT POWER(5,2) 返回: 25 |
ROUND |
将数值表达式四舍五入为指定精度 |
SELECT ROUND(43.543,1) 返回: 43.5 |
Sign |
对于正数返回 +1 ,对于负数返回 -1 ,对于 0 则返回 0 |
SELECT SIGN(-43) 返回: -1 |
Sqrt |
取浮点表达式的平方根 |
SELECT SQRT(9) 返回: 3 |
----------- 系统函数
函数名 |
描述 |
举例 |
CONVERT |
用来转变数据类型 |
SELECT CONVERT (VARCHAR (5) , 12345) 返回 :字符串 12345 |
CURRENT_USER |
返回当前用户的名字 |
SELECT CURRENT_USER 返回 : 你登录的用户名 |
DATALENGTH |
返回用于指定表达式的字节数 |
SELECT DATALENGTH (' 中国 A 盟 ') 返回: 7 |
HOST_NAME |
返回当前用户所登录的计算机名字 |
SELECT HOST_NAME() 返回:你所登录的计算机的名字 |
SYSTEM_USER |
返回当前所登录的用户名称 |
SELECT SYSTEM_USER 返回:你当前所登录的用户名 |
USER_NAME |
从给定的用户 I D 返回用户名 |
SELECT USER_NAME(1) 返回:从任意数据库中返回 “dbo” |