-
用Transact-SQL创建数据库
-
查看数据库的存储路径
sp_helpdb
命令查看所有数据库信息删除数据库
右键删除
或使用命令
DROP DATABASE database_name
-
视图、索引、存储过程、触发器概述
数据类型
- real是实数
- varchar(n) 中的n是存储字符最大长度
-
自定义数据类型
-
使用资源管理器修改表结构
若无法保存修改
使用SQL命令修改表结构
-- 新增字段
ALTER TABLE authors
ADD auth_note VARCHAR(100) NULL
-- 修改字段
ALTER TABLE authors
ALTER COLUMN auth_phone VARCHAR(15)
GO
-- 删除字段
ALTER TABLE authors
DROP COLUMN auth_phone
-
标识符
select @@VERSION AS 'SQL Server版本', @@SERVERNAME AS '服务器名称'
- 局部变量
-- 声明局部变量
DECLARE @Name varchar(30), @Phone varchar(20), @Address char(2);
-- 用select赋值
DECLARE @MyCount INT
SELECT @MyCount = 10
SELECT @MyCount
GO
-- 用set赋值
DECLARE @rows int
SET @rows = (SELECT count(*) from member)
SELECT @rows
GO
select 与set的区别:
select可以一次给多个变量赋值,set一次只能给一个
set赋值的是多个值的子查询会出错,select会选择最后一个赋值
-
GO命令:表示批处理的结束
批处理若出错,则不会执行
USE test -- 指明要操作的数据库
GO
-- 一个批处理结束
select * from ...
update ...
...
GO
-- 第二个批处理结束
依次类推
- PRINT输出用户自定义信息以及变量的字符串值
DECLARE @name VARCHAR(10) = '小明' -- 这里DECLARE直接赋值
DECLARE @age INT = 21
PRINT '姓名 年龄'
PRINT @name + ' ' + CONVERT(VARCHAR(20), @age)
-- 若直接PRINT @age会报错,必须是字符串
- 流程控制语句
14.1 BEGIN...END
用在while循环和IF...ELSE判断内,以包含多条语句
14.2 IF...ELSE
DECLARE @age int
SELECT @age = 10
IF @age < 30
BEGIN
PRINT 'HELLO'
PRINT 'This is a young man!'
END
ELSE
PRINT 'This is an old man!'
14.3 CASE 的两种用法
USE test_db
SELECT s_id, s_name,
-- 用法一
CASE s_name
WHEN '马华' THEN '班长'
WHEN '张三' THEN '学习委员'
WHEN '李四' THEN '体育委员'
ELSE '无'
END
AS '职位'
FROM stu_info
SELECT s_id, s_name, s_score,
-- 用法二
CASE
WHEN s_score > 90 THEN '优秀'
WHEN s_score > 80 THEN '良好'
WHEN s_score > 70 THEN '一般'
WHEN s_score > 60 THEN '及格'
ELSE '不及格'
END
AS '评价'
FROM stu_info
14.4 WHILE循环,注意CONTINUE和BREAK
DECLARE @num INT;
SELECT @num = 10;
WHILE @num > -1
BEGIN
IF @num > 5
BEGIN
PRINT '@num 等于' + CONVERT(VARCHAR(4), @num) + '大于5循环继续执行';
SELECT @num = @num - 1;
CONTINUE; -- 结束本次循环,进入下一次循环
END
ELSE
BEGIN
PRINT '@num 等于' + CONVERT(VARCHAR(4), @num);
BREAK; -- 跳出整个循环
END
END
PRINT '循环终止之后@num等于' + CONVERT(VARCHAR(4), @num);
14.5 GOTO
USE test_db;
BEGIN
SELECT s_name FROM stu_info;
GOTO jump --跳转到jump标签
SELECT s_score FROM stu_info;
jump: --jump标签
PRINT '第二条SELECT语句没有执行';
END
14.6 WAITFOR延迟
DECLARE @name VARCHAR(50);
SET @name = 'admin';
BEGIN
WAITFOR DELAY '00:00:10'; -- 延迟10秒,标准格式
PRINT @name;
END;
14.7 RETURN 查询过程无条件退出
RETURN 0; -- 0表示成功,1表示失败
- CAST(x AS TYPE)和CONVERT(TYPE, x)数据类型转换
SELECT CAST('121231' AS DATE), CAST(100 AS CHAR(3)), CONVERT(TIME, '2012-05-01 12:11:10');
- 存储过程
存储过程是可重复调用的批处理,系统存储过程在master数据库中,用户可以自定义存储过程
USE mytest;
GO
CREATE PROCEDURE SelProc -- 创建查询member表的存储过程
AS
SELECT * FROM member;
GO
-- 调用存储过程
USE mytest;
GO
EXEC SelProc;
-- 创建带参数的存储过程
USE test;
GO
CREATE PROCEDURE QueryById @sID INT
AS
SELECT * FROM fruits WHERE s_id = @sID;
GO
-- 用两种方式调用带参数存储过程
USE test;
GO
EXECUTE QueryById 101;
EXECUTE QueryById @sID=101; -- 多参数情况下好用
-- 创建带默认参数的存储过程
USE test;
GO
CREATE PROCEDURE QueryById @sID INT = 101
AS
SELECT * FROM fruits WHERE s_id = @sID;
GO
-- 创建带输出变量的存储过程
USE test;
GO
CREATE PROCEDURE QueryById3
@sID INT = 101,
@fruitscount INT OUTPUT -- 输出变量
AS
SELECT @fruitscount=COUNT(fruits.s_id) FROM fruits WHERE s_id=@sID;
GO
-- 调用带输出参数的存储过程
USE test;
GO
DECLARE @fruitscount INT;
DECLARE @sID INT = 101;
EXEC QueryById3 @sID, @fruitscount OUTPUT
SELECT '该供应商一共提供了' + LTRIM(STR(@fruitscount)) + '种水果'
GO
用资源管理器可以执行、修改、删除存储过程
- 函数
-- 标值函数,最后返回一个学生姓名
CREATE FUNCTION GetStuNameById(@stuid INT)
RETURN VARCHAR(30)
AS
BEGIN
DECLARE @stuName CHAR(30)
SELECT @stuName=(SELECT s_name FROM stu_info WHERE s_id = @stuid)
RETURN @stuName
END
-- 表值函数,返回的是一张表
CREATE FUNCTION getStuRecordBySex(@stuSex CHAR(2))
RETURNS TABLE
AS
RETURN
(
SELECT s_id, s_name, s_sex, (s_score-10) AS newScore
FROM stu_info
WHERE s_sex = @stuSex
)
-- 调用表值函数
SELECT * FROM getStuRecordbySex('男');
- 删除存储过程和函数
DROP PROCEDURE pName;
DROP FUNCTION fName;