Sql Server2012

目录

替换

创建数据库

创建表

修改表

删除表

对表进行crud操作

字符串函数

数学函数

日期函数

聚合函数

多表查询

变量

cast函数

视图

索引

存储过程

触发器

数据库用户


替换

replace(字符串,被替换的字符,替换的字符)

例如:

select replace(replace(replace('2012年5月18日','年','-'),'日',' '),'月','-');

创建数据库

create database question1
on primary
(
  name='question1_data',
  filename='C:\temp\question1_data.mdf',
  size=5MB,
  maxsize=10MB,
  filegrowth=10%
)
log on
(
   name='question1_log',
   filename='C:\temp\question1_log.ldf',
   size=5MB,
   maxsize=10MB,
   filegrowth=15%
)

创建表

use question1;
​
create table city(
CityCode Char(4) primary key,  //主键
CityName Varchar(80) not null  //非空
)
​
create table publishers(
PubCode Char(4) primary key,
PubName Char(5) not null,
Phone Char(15),
Address Varchar(100),
CityCode Char(4)
foreign key references city(CityCode)  //外键
)

修改表

use question1;
​
//添加列
alter table publishers 
add comment Varchar(100)
​
//修改列长度
alter table publishers 
alter column comment Varchar(120)
​
//删除列 comment
alter table publishers 
drop column  comment

删除表

//先删有外键的表
drop table publishers;
drop table city;

对表进行crud操作

use examdb;
​
//插入数据
insert into publishers(PubCode,PubName,Phone,Address,CityCode) values('ZLTC','蓝天出版社','020-83546627','越秀区果戈里大街12号','AGZ')
​
//更改数据
update  titles set Price=36 where TitleCode='T012'
​
//删除数据
delete publishers where PubCode='ZLTC'
​
//查询数据,排序 order by     asc:升序, desc:降序
select * from titles order by Price desc
​
//查询数据, 去除重复列 distinct
select distinct CityCode from publishers
​
//数据筛选,使用别名,按条件查询
select TitleName 名称,Author 作者,Price as 价格 from titles where CategoryID=1
​
//数据筛选,查询examDB数据库的titles表中出版日期在2009年至2010年的出版记录,并按出版日期升序排序。order by默认升序
select * from titles where year(PubDate)>=2009 and YEAR(PubDate)<=2010 order by PubDate
​
//模糊查询,查询examDB数据库的titles表中出版物名称包含“数据库”的出版记录
select * from titles where TitleName like '%数据库%'
​
//模糊查询,查询examDB数据库的titles表中出版社代码第二位是“X”的出版物名称、作者和出版社代码
select TitleName,Author,PubCode from titles where PubCode like '_X__'
​
//查询中使用算术运算符:查询examDB数据库中titles表的价格超过35的出版物名称、价格和85折后的价格
select TitleName 书名, Price 全价, Price*0.85 as '85折'   from titles where  price>35

字符串函数

print len('HI-你好!')--返回6
​
print datalength('123A你好!') --返回10
​
print datalength(N'123A你好!')--返回16 使用unicode数字和字母都占两个字节
​
3.upper()--小写转换大写
​
4.lower()--大写转换小写
​
5.ltrim() 去掉左端空格,rtrim()去掉右边空格
​
6.left('NIHAOYAP,2') 从左边截取2个字符
​
7.right('NIAH',2)从右边截取2个字符
​
8.substring('nihaooo',1,2)--从位置1截取两个字符,结果ni,
 下标是从1开始的。
  print substring('nihaooo',-1,3)--结果返回n ,下表-1,0是空值
​
//,查询examDB数据库中titles表的出版物名称长度大于7的TitleCode、TitleCode的后三位、后一位和出版物名称及名称、长度,并按长度降序排列 
//RTRIM() 去尾部空格,LTRIM 去头部空格
​
select TitleCode,right(RTRIM(TitleCode),3) Id1,right(RIRTM(TitleCode),1) Id2, TitleName,len(TitleName) from titles where len(TitleName)>7 order by len(TitleName) desc 
​
​

数学函数

--1、ABS(X)绝对值函数;
SELECT ABS(-2.0),ABS(2);

--2、PE()返回圆周率的函数;
SELECT PI();

--3、SQRT(X)平方根函数;
SELECT SQRT(9),SQRT(11);

--4、RAND()和RAND(X)函数:返回一个随机浮点值n(0<=n<=1.0);
SELECT RAND(),RAND(),RAND(); ----不带参数时生成的随机数不同;
SELECT RAND(5),RAND(5),RAND(3);--带相同的参数时生成相同的随机数;

--5、ROUND(X,Y)函数:四舍五入,返回最接近于参数X的值,其值保留到小数点后Y位,若Y为负数,则小数点左起Y位均为0;
SELECT ROUND(33333.333333,2),ROUND(33333.33333,-2),ROUND(33333,-2);

--6、SIGN(X)函数:返回参数的符号;
SELECT SIGN(3),SIGN(0),SIGN(-3),SIGN(3.33),SIGN(-33.33);

--7、CEILING(X)函数:返回不小于X的最小整数;
SELECT CEILING(33.333),CEILING(33.666),CEILING(-33.333),CEILING(-33.666);

--8、FLOOR(X)函数:返回比X小的最大整数;
SELECT FLOOR(33.333),FLOOR(-33.333);

--9、POWER(X,Y)函数:返回x的y次方;
SELECT POWER(2,3),POWER(3,0),POWER(5,-2),POWER(5.0,-2),POWER(5.000,-2); 

--10、SQUARE(X)函数:返回x的平方;
SELECT SQUARE(0),SQUARE(3),SQUARE(-3),SQUARE(3.3);

--11、EXP(X)函数:返回e的x乘方;
SELECT EXP(3),EXP(-3),EXP(0),EXP(3.3);

--12、LOG(X)函数:返回x的自然对数,x不能为0和负数;
SELECT LOG(3.3),LOG(3),LOG(4);

--13、LOG10(X)函数:返回x的基数为10的对数,如100的基数为10的对数是2;
SELECT LOG10(1000),LOG10(1),LOG10(5);

--14、RADIANS(X)函数:将参数x由角度转换为弧度;
SELECT RADIANS(45.0),RADIANS(45),RADIANS(-45.0);

--15、DEGREES(X):函数:将参数x由弧度转换为角度;
SELECT DEGREES(33),DEGREES(33.33333),DEGREES(-33.33333),DEGREES(PI());

--16、SIN(X)函数:返回x的正弦,x为弧度值;
SELECT SIN(30),SIN(-30),SIN(PI()),SIN(PI()/2),ROUND(SIN(PI()),0);

--17、ASIN(X)函数:返回x的反正弦,即返回正弦为x的值;
SELECT ASIN(1),ASIN(0),ASIN(-1);

--18、COS(X)函数:返回x的余弦,x为弧度值;
SELECT COS(30),COS(-30),COS(PI()),COS(1),COS(0);

--19、ACOS(X)函数:返回x的反余弦,即返回余弦为x的值;
SELECT ACOS(1),ACOS(0),ACOS(-1),ACOS(0.3434235),ROUND(ACOS(0.3434235),1);

--20、TAN(X)函数:返回x的正切,x为弧度值;
SELECT TAN(1),TAN(0),TAN(-1);

--21、ATAN(X)函数:返回x的反正切,即返回正切为x的值;
SELECT TAN(1),ATAN(1.5574077246549),ATAN(0); ------TAN和ATAN互为反函数;

--22、COT(X)函数:返回x的余切;
SELECT COT(3),1/TAN(3),COT(-3);--------------------COT和TAN互为倒数;
//返回小于或等于以下两个数的整数:4.5和-7.6;返回大于或等于8.1的整数;返回2的5次幂
select FLOOR(4.5),FLOOR(-7.6) ,CEILING(8.1),POWER(2,5);

日期函数

1.Current_Timestamp :返回当前系统时间

--无参数
--返回datetime类型
select Current_Timestamp as 当前系统时间 --2019-09-22 23:46:53.623


2.Dateadd():在日期中添加或减去指定的时间间隔

--语法:Dateadd(datepart,number,date)
--datepart:要将其与整数值相加的 date 的一部分
--number:时间间隔数,可以是正数也可以是负数
--date:日期
--返回datetime类型
select Dateadd(dd,3,Getdate()) --返回当前时间加三天
select Dateadd(mm,-3,Getdate())--返回当前时间减三个月


3.Datediff():返回时间差

--语法Datediff(datepart,startdate,enddate)
--datepart:用于报告 startdate 与 enddate 之间差异的单位
--startdate:开始日期
--enddate:结束日期
--返回int类型
select Datediff(dd,'2019-07-01','2019-07-25')--返回24
select Datediff(mm,'2019-11-01','2019-10-10')--返回-1


4.Datename():返回表示指定日期的指定日期部分的字符串

--语法:Datename(datepart,date)
--返回字符串类型
select Datename(dd,getdate())--获取当前日
select Datename(mm,getdate())--获取当前月份
select Datename(yy,getdate())--获取当前年份


5.Datepart():返回表示指定日期的指定日期部分的整数

--语法:Datepart(datepart,date)
--返回int类型
select Datepart(day,getdate())--获取当天
select Datepart(month,getdate())--获取当前月份
select Datepart(year,getdate())--获取当前年份


6.Day():返回表示指定日期的“日”日期部分的整数

--语法:Day(datetime)
--返回int类型
select Day(getdate())--返回当前日
select Day('2019-09-22')--返回22


7.Getdate():返回当前系统的日期和时间

--语法:Getdate()
--返回datetime类型
select Getdate()


8.Getutcdate():返回当前UTC(通用协调时,世界标准时间)时间

--语法:Getutcdate()
--返回datetime类型
select Getutcdate()--北京时间减八个小时


9.Isdate():确定输入表达式是否为有效的日期,返回1代表true,0代表false

--语法:Isdate(varchar)
--返回int类型
select Isdate('2019-20-01')--返回0
select Isdate('2019-01-01')--返回1


10.Month():返回指定日期的“月”部分的整数

--语法:Month(datetime)
--返回:int类型
select Month(getdate())--返回当前月份
select Month('2019-07-01')--返回7


11.Sysdatetime():返回当前系统时间的 datetime2(7) 值

--语法:Sysdatetime()
--返回datetime2(7)
select Sysdatetime()


12.Sysdatetimeoffset():返回当前系统时间的datetimeoffset(7)值,包含时区偏移量

--语法:Sysdatetimeoffset()
--返回datetimeoffset类型
select Sysdatetimeoffset()


13.Sysutcdatetime():返回当前UTC(世界标准时间)的datetime2(7)值

--语法:Sysutcdatetime()
--返回:datetime2(7)类型
select Sysutcdatetime()


14.Switchoffset():将datetimeoffset值从保留的时区偏移量改为新值

--语法:Switchoffset(datetimeoffset,时区)
--datetimeoffset:表达式式
--时区:varchar
--返回datetimeoffset
DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00') 
SELECT * FROM  table_name   
WHERE  dt2> @dt Option (Recompile) --重新编译、提高性能


15.Todatetimeoffset():返回从 datetime2 表达式转换的 datetimeoffset 值

--语法:Todatetimeoffset(expression,时区)
--返回datetimeoffset类型
DECLARE @todaysDateTime datetime2
SET @todaysDateTime = GETDATE()  
SELECT Todatetimeoffset (@todaysDateTime, '-07:00')


16.Year():返回指定日期的“年”部分的整数

--语法:Year(datetime)
--返回int类型
select Year(getdate())--当前年份


17.Datepart参数:

//返回当前系统日期,返回两个日期“2008-01-01”和“2009-01-01”之间的月份数 yy返回年数 mm返回月数,dd返回天数
select GETDATE(),DATEDIFF(mm,'2008-01-01','2009-01-01')

聚合函数

1、COUNT合计函数: 返回查询记录(行)数。

格式:

COUNT([ALL|DISTINCT] [表达式|*])

参数说明:

ALL:默认值,指对查询所有记录统计总数。

DISTINCT:指对查询记录去重非空记录的总数。

表达式:指除了text、image、ntext以外任何类型的表达式;

*:表示查询记录总的行数。

2、SUM 求和函数: 计算表中数值列的数据合计值。

格式:

SUM([ALL|DISTINCT] 表达式)

ALL:默认值,指对查询所有记录求和。

DISTINCT:指对查询记录去重后求和。

表达式:常量、数据列、函数与算术运算的任意组合。

用法:

SELECT SUM(score) FROM T_Score SELECT SUM(DISTINCT score) FROM T_Score SELECT SUM(1+99) 3、AVG 求平均值函数: 返回数据列表中的平均值,NULL被忽略。

格式:

AVG([ALL|DISTINCT] 列名(数值类型))

参数:ALL:表示所有不为NULL的列,DISTINCT去重的列。

用法:

SELECT AVG(Age) FROM T_User --求平均年龄 SELECT AVG(DISTINCT Age) FROM T_User -- 去重之后求平均年龄 4、MAX/MIN: 求出表中任意列中数据的最大/小值。

格式:

MAX/MIN(列名)

用法:

SELECT MAX(score) FROM T_Score SELECT MIN(score) FROM T_Score 5、COUNT_BIG 合计函数: 用法和COUNT类似,唯一的区别在于COUNT_BIG返回的值类型为bigint,COUNT返回的值类型为int。

6、GROUPING 函数 作用:新增一个附加列。如果grouping()函数返回1则指示聚合;返回0则指示不聚合。

用法:

SELECT GROUPING(name),name from T_User GROUP BY name

//查询examDB数据库的titles表中所有出版物的平均价格
select avg(Price) from titles;

//在SELECT语句中使用GROUP BY:新建查询窗口,输入查询语句,实现在examDB数据库publishers表中统计各城市的出版社数量
select count(*) as 出版社数量,citycode from publishers group by CityCode order by count(*)

//在SELECT语句中使用HAVING(与GROUP BY一起使用):新建查询窗口,输入查询语句,实现在examDB数据库publishers表中统计各城市出版社数量超过1的城市
select CityCode from publishers group by CityCode having count(*)>1

多表查询

--连接查询
--查询客户名称,采购数量,采购单价,商品名称
 
--方法一:内连接:inner join 语法:  select 列名1,列名2... from 表名1 inner join 表名2 on (外键表.外键=主键表.主键) 
--查询客户名称,采购数量,采购单价,商品名称
select clientName,productNumber,salePrice,productName from sales inner join product on(sales.productId=product.productId)
--查询客户名称,商品名称,商品报价
select clientName,productName,price from sales s inner join  product p on(s.productId=p.productId)
--方法二:通过等值连接实现内连接查询: select 列名1,列名2... from 表名1,表名2 where 外键表.外键=主键表.主键
select clientName,productName,price from sales s,product p where s.productId=p.productId
 
--查询单笔销售数量>20的商品名称,销售单价和销售数量
select productName,salePrice,productNumber from product inner join sales on(product.productId=sales.productId) where productNumber>20
select productName,salePrice,productNumber from product,sales where product.productId=sales.productId and productNumber>20
 
--empdb
use empdb
select * from dept
select * from emp
--查询员工姓名,性别,地址及部门名称和部门人数
select empName,empSex,empAddress,deptName,deptNum from emp inner join dept on(emp.deptId=dept.deptId)
--查询姓名中出现"凯歌"的员工姓名,性别,地址及部门名称和部门人数
select empName,empSex,empAddress,deptName,deptNum from emp inner join dept on(emp.deptId=dept.deptId) where empName like '%凯歌%'
select empName,empSex,empAddress,deptName,deptNum from emp,dept where emp.deptId=dept.deptId and empName like '%凯歌%'

//在一个SELECT语句中使用多个表(内联接):新建查询窗口,输入查询语句,查询examDB数据库中每个城市(city表中的CityName)的出版社名称(publishers表中)
select CityName,pubName from city inner join publishers on(city.CityCode=publishers.CityCode) 

//在SELECT语句中使用子查询:新建查询窗口,输入查询语句,查询examDB数据库的publishers表中价格最高的出版物名称、作者和出版日期
select TitleName,Author,PubDate from titles where Price=(select max(Price) from titles)

//使用UNION运算符的集合运算:新建查询窗口,输入查询语句,查询examDB数据库publishers表中CityCode为“AGZ”的出版社信息:包括PubCode、PubName、Phone、CityCode的记录集合,与CityCode为“HBJ”的出版社信息:包括PubCode、PubName、Phone、CityCode的记录集合,进行并集运算
select PubCode,PubName,Phone,CityCode from publishers where CityCode='AGZ' 
union 
select PubCode,PubName,Phone,CityCode from publishers where CityCode='HBJ' 

变量

局部变量

以“@”开头的标识符表示变量(局部变量),该变量必须先用DECLARE命令声明后才能使用:

DECLARE @js_age int;
DECLARE @name varchar(32), @address varchar(64);

使用DECLARE命令并创建局部变量后,初始值为NULL,可以使用SELECT或SET命令这只局部变量的值, 示例1:声明、赋值、输出:

DECLARE @js_age INT
SELECT @js_age = 28
SELECT @js_age AS 年龄
GO

示例2:通过查询语句给变量赋值:

DECLARE @js_rows INT
SET @js_rows  = (SELECT COUNT(*) FROM PERSON)
SELECT @js_rows as 行数
GO

示例3:使用由SET赋值的局部变量进行查询:

USE test
GO
DECLARE @js_address VARCHAR(64)
SET @js_address = 'AAAAA'
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, @js_address AS ADDRESS
FROM PERSON
GO

全局变量

在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值。全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数。

@@CONNECTIONS

返回 SQL Server 自上次启动以来尝试的连接数。

@@CPU_BUSY

返回 SQL Server 自上次启动后的工作时间。

@@CURSOR_ROWS

返回连接上打开的上一个游标中的当前限定行的数目,

确定当其被调用时检索了游标符合条件的行数。

@@DATEFIRST

针对会话返回 SET DATEFIRST 的当前值,SET DATEFIRST 表示指定的

每周的第一天。

@@DBTS

返回当前数据库的当前 timestamp 数据类型的值,

这一时间戳值在数据库中必须是唯一的。

@@ERROR

返回执行的上一个 Transact-SQL 语句的错误号,

如果前一个 Transact-SQL 语句执行没有错误,则返回 0。

@@FETCH_STATUS

返回针对连接当前打开的任何游标发出的上一条游标 FETCH

语句的状态。

@@IDENTITY

返回上次插入的标识值。

@@IDLE

返回 SQL Server 自上次启动后的空闲时间。结果以 CPU 时间

增量或“时钟周期”表示,并且是所有 CPU 的累积。

@@IO_BUSY

返回自从 SQL Server 最近一次启动以来,Microsoft SQL Server

已经用于执行输入和输出操作的时间。其结果是 CPU 时间增量

(时钟周期),并且是所有 CPU 的累积值

@@LANGID

返回当前使用的语言的本地语言标识符 (ID)。

@@LANGUAGE

返回当前所用语言的名称。

@@LOCK_TIMEOUT:

返回当前会话的当前锁定超时设置(毫秒)。

@@MAX_CONNECTIONS

返回 SQL Server 实例允许同时进行的最大用户连接数。

返回的数值不一定是当前配置的数值。

@@MAX_PRECISION

按照服务器中的当前设置,返回 decimal 和 numeric 数据类型

所用的精度级别。

@@NESTLEVEL

返回对本地服务器上执行的当前存储过程的嵌套级别(初始值为 0)。

@@OPTIONS

返回有关当前 SET 选项的信息。

@@PACK_RECEIVED

返回 SQL Server 自上次启动后从网络读取的输入数据包数。

@@PACK_SENT

返回 SQL Server 自上次启动后写入网络的输出数据包个数。

@@PACKET_ERRORS

返回自上次启动 SQL Server 后,在 SQL Server 连接上发生的网络

数据包错误数。

@@PROCID

返回 Transact-SQL 当前模块的对象标识符 (ID)。Transact-SQL

模块可以是存储过程、用户定义函数或触发器。

@@REMSERVER

返回远程 SQL Server 数据库服务器在登录记录中显示的名称。

@@ROWCOUNT

返回受上一语句影响的行数。

@@SERVERNAME

返回运行 SQL Server 的本地服务器的名称。

@@SERVICENAME

返回 SQL Server 正在其下运行的注册表项的名称。若当前实例为

默认实例,则 @@SERVICENAME 返回 MSSQLSERVER。

@@SPID

返回当前用户进程的会话 ID。

@@TEXTSIZE

返回 SET 语句中的 TEXTSIZE 选项的当前值。

@@TIMETICKS

返回每个时钟周期的微秒数。

@@TOTAL_ERRORS

返回 SQL Server 自上次启动之后所遇到的磁盘写入错误数。

@@TOTAL_READ

返回 SQL Server 自上次启动后读取磁盘(不是读取高速缓存)的次数。

@@TOTAL_WRITE

返回 SQL Server 自上次启动以来所执行的磁盘写入次数。

@@TRANCOUNT

返回当前连接的活动事务数。

@@VERSION

返回当前的 SQL Server 安装的版本、处理器体系结构、生成日期

和操作系统。

Print

使用print一起输出数值和字符串

要输出在同一行的话那肯定就要使得输出类型一致,也就是说输出的字符串和数值类型要一致,显然让数值转换成字符串是更简单的事情,因此我们可以用上print @p+convert(varchar,@q) 其中@p是字符串类型,@q是数值类型

DECLARE @vname Char(10);
DECLARE @vnum int;

set @vname = '张三';
set @vnum = 12;

print '局部变量:' + '@vname:'+@vname+'@vnum:'+convert(varchar,@vnum)

print '全局变量:' + '@@Language(当前所用语言的名称):'+ @@Language;

cast函数

内置函数

语法:
 
CAST (expression AS data_type)
 
参数说明:
 
expression:任何有效的SQServer表达式。
 
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
 
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
注意事项:
 
(1).CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。以下例子用于将文本字符串'12'转换为整型:
 
SELECT CAST('12' AS int)
 
(2).返回值是整型值12。如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢?
 
SELECT CAST('12.5' AS int)
 
(3).CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于12.5不能用int数据类型来表示,所以对这个函数调用将产生一个错误:
 
Server: Msg 245, Level 16, State 1, Line 1
 
Syntax error converting the varchar value
 
    '12.5' to a column of data type int.
 
(4).要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal值的精度与小数位数。在本例中,精度与小数位数分别为9 与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。
 
SELECT CAST('12.5' AS decimal(9,2))
 
decimal数据类型在结果网格中将显示有效小数位: 12.50
 
(5).精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server将截断数字的小数部分,而不会产生错误。
 
SELECT CAST('12.5' AS decimal)
 
    结果是一个整数值:12
使用select输出语句输出出版物代码的值和其对应的使用CAST函数转换后以字符形式输出的价格
select TitleCode,TitleName,Author,CateGoryID,PubCode,CAST(Price as varchar) 'Price',PubDate from titles;

视图

CREATE VIEW <视图名> [(<列名>[,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION]

//删除视图
drop view 视图名 


注意:

当我们SQL Server在创建视图时 ,会出现"create view 必须是批处理中仅有的语句"这个语法错误提示 ,实际上这本身没什么错! 因为create view 必须是批处理中的第一条语句。也就是说,你可能在这段代码之前还有其他的语句是同时处理的,为此,你可以在这段代码的前一行加上GO,在这段代码结束后一行加上GO就可以了。。或者你把这段代码单独执行就不会出错了。

--实现在examDB数据库中titles表上创建名为view1的视图,查询2010年后出版的出版物的TitleName、Author、Price和PubDate。
--创建成功后,保存视图并用SELECT语句查看视图所包含的列

use examDB;
go  
create view view1 
as 
select TitleName,Author,Price,PubDate from titles 
where year(PubDate)>2010
go
select * from view1;
创建复杂视图:新建查询窗口,输入Transact-SQL语句,实现在examDB数据库中创建名为view2的视图,视图实现按类别ID(Category表)和类别名称(Category表)分组统计各类出版物(TitleCode)的数量。

use examDB;
go
create view view2
as 
select category.CategoryID as '类别ID',category.CategoryName '类别名称',count(TitleCode) 数量 from category left outer join titles on category.CategoryID=titles.CategoryID group by category.CategoryID,category.CategoryName
go
select * from view2

注意:最后group by 分组CategoryID和CategoryName都需要,因为 ID和Name是一一对应的

索引

//创建索引
create index 索引名 on 表名(字段)

//删除索引
drop index 表名.索引
在表titles的pubdate字段上建立名为newidx的索引
create index newidx on titles(Pubdate)

存储过程

create proc 存储过程名 @输入参数 数据类型,@输出参数 数据类型 output
as
begin
	存储过程的主体
end;

//调用存储过程
EXEC <过程名> <入参值> [,<入参值>]...
//存储过程实现在city表中cityName为“北京”、在publishers表中查询该城市的pubName 和Address,即查询城市名是“北京”的出版社名称和出版社地址

create proc sproc1
as 
begin
  select pubName,Address from publishers inner join city  on city.CityCode=publishers.CityCode where city.CityName='北京'

end;

exec  sproc1;
//实现在examDB数据库中新建名为sproc2的存储过程。该存储过程包括一个输入参数,用来表示cityName。该存储过程实现在city表中给定不同的cityName,在publishers表查询该城市的pubName和Address。


use examDB;
go
create proc sproc2 @cname varchar(80)
as
begin
  select pubName,Address from publishers inner join city on publishers.CityCode =city.CityCode where city.CityName = @cname

end

exec sproc2 '北京'
实现在examDB数据库中新建名为sproc3的存储过程。该存储过程包括一个输入参数和一个输出参数:输入参数表示TitleCode,输出参数表示Price。该存储过程实现在titles表中根据不同的出版物代码,求出其对应的Price。

use examDB;
go

create proc sproc3 @tc char(6) , @p money output
as 
begin 
select @p=Price from titles where TitleCode=@tc
end
go
declare @p money
exec sproc3 'T002',@p output;
use examDB;
go

create proc sproc3 @tc char(6) , @p money output
as 
begin 
select @p=Price from titles where TitleCode=@tc
end
go
declare @p money
exec sproc3 'T002',@p output
print 'T002的价格是' + convert(varchar,@p);

注意:
exec sproc3 'T002',@p output
与
print 'T002的价格是' + convert(varchar,@p);
之间
不要加分号

触发器

create trigger 触发器名 on 表名 (after,before) (insert,delete,update)
as
begin
	if 条件:update(PubDate)
	begin
		内容
	end;
end;

//实现在examDB数据库中建立名为newtrigger的触发器。触发器规定当titles表的PubDate列的数据发生变化时,显示“出版日期已更改,触发器起到作用。”文本。修改titles表的PubDate列数据以触发该触发器

use examDB;
go
create trigger newtrigger on titles after update 
as
begin
  if update(PubDate)
  begin
      print '出版日期已修改,触发器起到作用'
  end
end;

update titles set PubDate= '2011-06-02' where TitleCode='T001'

数据库用户

创建数据库登录账户
exec sp_addLogin 账户名 账户密码

创建数据库用户
exec sp_grantDBaccess 登录账户 用户名
给数据库用户授权
grant (select,update,delete,…) on 表名 to 用户名

创建数据库登录帐户:新建查询窗口,输入Transact-SQL语句,使用系统存储过程sp_addLogin创建SQL Server身份的登录账户:登录名为Login1,密码为123456

exec sp_addLogin 'Login1','123456'
创建数据库用户:新建查询窗口,选择数据库examDB,输入Transact-SQL语句,使用系统存储过程sp_grantdDBaccess在该数据库中创建数据库用户dbUser1(默认登录名为Login1,也可以不同)

exec sp_grantdDBaccess 'Login1','dbUser1'
授予数据库用户dbUser1对publishers表具有select和update对象权限

grant select,update on publishers to dbUser1

猜你喜欢

转载自blog.csdn.net/weixin_53630942/article/details/125024242