用select @@identity得到上一次插入记录时自动产生的ID
IDENT_CURRENT('table_name') IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值
SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。
declare @t table(int int) --这里定义一个表 类型
INSERT dbo.Table (Name)
OUTPUT INSERTED.Id -这里使用output into 那个表,记住只能是表
VALUES ('MyName');
select * from @t
/**
delete tb where id=1
output deleted.id into @t -
where id=1 --把where语句放在下面
select * from @t
**/
encrypt
存储过程(sp_EncryptObject)加密的方法是在存储过程,函数,视图的“As”位置前加上“with encryption”;如果是触发器,就在“for”位置前加“with encryption”。
Top 表示只显示Select出来的头几个如Top 5 selecttop 20id,name,naddressFrompreson
Between
DISTINCT 在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
SELECT DISTINCT Company FROM Orders
AS
select preson.name AS 名字,preson_1.naddress AS 地址,count(*)From preson join preson_1 on preson.name=preson_1.Name where preson.name='BC'
JOIN 用于根据两个或多个表中的列之间的关系,从这些表中查询数据
select 【preson.name】,【preson_1.naddress】,count(*)From preson join preson_1onpreson.name=preson_1.Name where preson.name='BC'
引用两个表我们可以通过引用两个表的方式,从两个表中获取数据:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo FROM Persons,Orders WHERE Persons.Id_P =Orders.Id_P
UNION操作符
select name,naddress From preson orderby name (Group by *)
UNION ALL
select name,naddress From preson_1 orderby name (Group by *)
ALTER ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
如需在表中添加列,请使用下列语法:
ALTER TABLE table_name ADD column_name datatype
ALTER TABLE table_name DROPCOLUMN column_name
NULL
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL
ISNULL() ISNULL(UnitsOnOrder,0)
如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回0。
Over row_number()over(orderbyId)
select *from(select Id,Name,row_number()over(order by Id)As rownumber from Mypreson) t where t.rownumber>=10 and t.rownumber <= 20
CASE WHEN Then End
CASEWHEN sex=1THEN1 ELSENULL END
CASE WHEN T2.COMPARE_TYPE='A' AND THEN 1 ELSE NULL END
USE { database } 切换数据库用的。
HAVING count(*)Group by
SELECT Customer,SUM(OrderPrice) FROM Orders ROUP BYCustomer HAVING SUM(OrderPrice)<2000
GROUPBY
SELECT Name,SUM(ID)FROMpresonGROUPBYName
select ID,Name,NAddress,SUM(Id) From preson group By Id,Name,NAddress order by Name
ORDER BY ASC DESC
SELECT Company, OrderNumber FROM Orders ORDER BY Company
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
DELETE 语句用于删除表中的行。
DELETE FROM Person WHERE LastName = 'Wilson'
DELETE FROM table_name 删除所有行
Update
Update Person Set Name=’Name’ WHERE LastName = 'Wilson'
INSERT INTO
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson','Champs-Elysees')
output inserted
insert into preson([User],Pwd) output inserted.Id values('name',N'pwd ')
insert into person output inserted.name values('dsfsf','lskdjflsdk')
WHERE IN操作符
in('BC','ZC')在二者之间 LIKE['BC','ZC'] 当然Link只匹配单一字符
select top 20 id,name,naddress From preson where name in('BC','ZC')order by name in(Ting[])可以是子查询返回的组
select top 20 id,name,naddress From preson where id>=0and name in('BC','ZC')order by name
LIKE 通配符匹配 NotLink'N%'
% 替代一个或多个字符 _ 仅替代一个字符
[charlist] 字符列中的任何单一字符 [1-9][1,2,3,4]
[^charlist]或者[!charlist] 不在字符列中的任何单一字符
Id为N开头 select top 20 id,name,naddress FROM preson WHERE Id LIKE 'N%'
SELECT * FROM Persons WHERE City LIKE 'N%'
select top 20 id,name,naddress From preson where id>=0 and name like 'B%' order by name
BETWEEN 在某个范围内
LIKE 搜索某种模式
AND 和 OR 运算符 NOT
SELECT
select top 20 name AS 名字,naddress AS 地址 From preson where id>=0 and name between 'BC' and 'ZC' order by name
CREATE DATABASE NAME ON PRIMARY(NAME=,FILENAME='*.mdf',SIZE,MAXSIZE,FILEGROWTH=1024KB,10MB,%10)
LOG ON(NAME=,FILENAME='*.mdf',SIZE,MAXSIZE,FILEGROWTH=1024KB,10MB,%10)
CREATE TABLE Persons (Id_P int NOT NULL,LastName varchar(255) NOTNULL,PRIMARY KEY (Id_P))
CREATE TABLE Persons (Id_P int NOT NULL PRIMARY KEY,LastNamevarchar(255) NOT NULL)
快照
CREATE DATABASE Damo_snapshot ON(NAME=Damo,FILENAME='d:\snapshot\demo.mdf)AS SANPSHOT OF demo; //快照
SQL CHECK 约束
Name like ('[0-9][0-9]') Name in ('a','8') Name >0 and Name <9
Date 函数
select CONVERT(VARCHAR(10),GETDATE(),110) /select DATEPART(yyyy,GETDATE())
下面的表格列出了 SQL Server 中最重要的内建日期函数:
函数 描述
GETDATE() 返回当前日期和时间
DATEPART() 返回日期/时间的单独部分
DATEPART(yyyy,OrderDate)
DATEADD() 在日期中添加或减去指定的时间间隔
DATEADD(day,2,OrderDate)
DATEDIFF() 返回两个日期之间的时间
DATEDIFF(datepart,startdate,enddate)
CONVERT() 用不同的格式显示日期/时间
select CONVERT(VARCHAR(19),GETDATE())
select CONVERT(VARCHAR(10),GETDATE(),110)
select CONVERT(VARCHAR(11),GETDATE(),106)
select CONVERT(VARCHAR(24),GETDATE(),113)
abs(1.2)=1
ceiling(1.3)=2 (1.5)=2
floor(1.3)=1 (1.6)=1
round(3.14156,2)=3.14 (3.15156,1)=3.2
AVG(column) 返回某列的平均值
COUNT(column) 返回某列的行数(不包括NULL值)
COUNT(*) 回被选行数
MAX(column) 返回某列的最高值
MIN(column) 回某列的最低值
SUM(column) 返回某列的总和
LEN()
lower() upper()
rtrim() ltrim()
substring('JJGGGGOO',2,3)='JGG'
CONVERT(varchar(10),SaleTime)/cast(SaleTime as varchar(10))
视图 View相当于Temp生成的表
CREATEVIEW [Current Product List] AS Select * From...
DROPVIEW [Current Product List]
触发器
createtrigger mytrigger on AddTable for update AS ....
altertrigger mytrigger on AddTable for update AS ....
execsp_helptext mytrigger 查看某一个触发器的内容
select* from sysobjects where xtype='TR' 如果我想查询当前数据库中有多少触发器
disabletrigger [触发器名] on database --禁用触发器
enabletrigger [触发器名] on database --开启触发器
那触发器的功能虽大,但是一旦触发,恢复起来就比较麻烦了,那我们就需要对数据进行保护,这里就需要用到rollback数据回滚~
过程
PROCEDURE==proc
createproc [Name] {,OUT,OUTPUT} AS .....
create proc MyProcess @Id INT,@Namenvarchar(50) AS.....Go
exec MyProcess 80,@Name OutPut
drop proc MyProcess
游标
declare mycursor cursor SCROLL for select O_ID,A_Salary from AddSalary
open mycursor
fetchnext from mycursor into @O_ID,@A_Salary while(@@fetch_status= 0)
NEXT | PRIOR | FIRST | LAST |
ABSOLUTE { n | @nvar } |
如果 n 或 @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果n 或 @nvar 为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新当前行。如果n 或 @nvar 为 0,则不返回行。
RELATIVE { n | @nvar }
如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果n 或 @nvar 为 0,则返回当前行。在对游标进行第一次提取时为-1,设置为负数或 0 的情况下指定FETCH RELATIVE,则不返回行。
原因:DECLARE 指定标CURSOR FOR 解决:DECLARE 指定标CURSOR SCROLLFOR
declare Mycursor cursor scroll for select*from persons
open Mycursor
while @@FETCH_STATUS=0
fetch next from Mycursor into @Id,@Name,@pwd
close Mycursor
deallocate Mycursor
判断
if exists(select * From persons where Name is NULL)
print 'true'
Go
GO代表一个批处理的结束你可以把每个GO之间的语句当成是一句SQL GO不是标准的语法,只是查询分析器为了区分多个批处理而设的分隔符而已