常用的T-SQL语句


经过一天的奋斗,终于总结出这些常用的T-SQL语句。

--创建数据库
CREATE DATABASE SQLTest
ON 
(NAME=SQLTest_date,
 FILENAME='E:\数据库\SQLTest.mdf',
 SIZE=3,FILEGROWTH=1
)
LOG ON 
(NAME=SQLTest_log,
 FILENAME='E:\数据库\SQLTest.ldf',
 SIZE=1,FILEGROWTH=1
)
GO

--删除数据库
DROP DATABASE SQLTest

--修改数据库(重命名)
ALTER DATABASE SQLTest
MODIFY name=Test

--备份数据库
BACKUP DATABASE SQLTest TO DISK ='E:\数据库\SQLTest.bak'

--还原数据库
RESTORE DATABASE SQLTest FROM DISK='E:\数据库\SQLTest.bak'
 

--创建数据库中的表
USE SQLTest
CREATE TABLE Teacher
(
Id INT IDENTITY(1,1) NOT NULL, 
Name VARCHAR(20) NOT NULL,
Sex CHAR(2) NULL,
Phone VARCHAR(20) NOT NULL,
Address VARCHAR(100) NULL, 
Email VARCHAR(30) NULL
)

--删除数据库中的表
DROP TABLE Teacher

--更新数据库中的表
--添加字段
ALTER TABLE Teacher
ADD Sallary smallmoney null

--删除字段
ALTER TABLE Teacher
DROP COLUMN Sallary

--修改字段
ALTER TABLE Teacher 
ALTER COLUMN Phone VARCHAR(12) NULL
 



--数据安全性
--创建规则
CREATE RULE SEX_RULE AS @Sex IN('男','女')
GO

--使用规则
EXECUTE sp_bindrule 'SEX_RULE','Teacher.Sex'

--解除规则
EXECUTE sp_unbindrule 'Teacher.Sex'

--删除规则
DROP RULE SEX_RULE
 



 
--数据添加
INSERT INTO Teacher VALUES('Tom','男','145656789','sdkjagfi','jkgsdhlfuihl',2000)
INSERT INTO Teacher (Name,Sex) VALUES('Juery','男')
 
 
--数据删除(无条件会删除所有元组)
DELETE FROM Teacher WHERE Id='02'
 

--数据更新(无条件会更新所有元组)
UPDATE Teacher SET Sex='女' WHERE Name='Jack'
 
 
--数据查询
--查询所有列
SELECT * FROM Teacher

--查询指定列
SELECT Name,Sex FROM Teacher

--在查询指定列中使用表达式
SELECT Name,Sex,Sallary*1.2 AS Sallary FROM Teacher

--重新命名结果列名
SELECT Name AS 姓名 FROM Teacher
SELECT 姓名=Name FROM Teacher

--将查询的表生成一个新表
SELECT Name,Sex INTO NEWTeacher FROM Teacher

--取出查询结果的部分内容
SELECT TOP 10 * FROM Teacher

--使用逻辑表达式进行查询
SELECT * FROM Teacher WHERE Sallary<=1000 OR Sallary>=3000
SELECT * FROM Teacher WHERE Sallary>1000 AND Sallary<3000
SELECT * FROM Teacher WHERE NOT(Sallary>3000)

--使用通配符进行模糊查询
SELECT * FROM Teacher WHERE Name LIKE '_ac%'
SELECT * FROM Teacher WHERE Name LIKE '[J,T]%'

--使用BETWEEN...AND关键字进行查询
SELECT * FROM Teacher WHERE PostDate BETWEEN '2012-12-01' AND DATEADD (DAY ,3, '2012-12-01')

--使用IN关键字进行查询
SELECT * FROM Teacher WHERE Sex IN ('男','女')
SELECT * FROM Teacher WHERE Sex IN (SELECT Sex FROM Teacher GROUP BY Sex)

--使用NULL关键字进行查询
SELECT * FROM Teacher WHERE Name IS NOT NULL

--排序查询
SELECT * FROM Teacher ORDER BY Sallary ASC
SELECT * FROM Teacher ORDER BY Sallary DESC

--分组查询
SELECT Email FROM Teacher GROUP BY Email
SELECT Sex, COUNT(Name) AS Count FROM Teacher GROUP BY Sex HAVING Sex='男'

--使用聚集函数查询
SELECT COUNT(*) AS 总个数 FROM Teacher --"*"包括空值行
SELECT SUM(Sallary) AS 总和 FROM Teacher
SELECT AVG(Sallary) AS 平均数 FROM Teacher
SELECT MAX(Sallary) AS 最大值 FROM Teacher
SELECT MIN(Sallary) AS 最小值 FROM Teacher

--多表连接查询
--内连接
SELECT Teacher.Name,Course.Name FROM Teacher,Course WHERE Teacher.Id=Course.TeacherId
SELECT Teacher.Name,Course.Name FROM Teacher INNER JOIN Course ON Teacher.Id=Course.TeacherId

--外连接
SELECT Teacher.Name,Course.Name FROM Teacher FULL OUTER JOIN Course ON Teacher.Id=Course.TeacherId
SELECT Teacher.Name,Course.Name FROM Teacher LEFT OUTER JOIN Course ON Teacher.Id=Course.TeacherId
SELECT Teacher.Name,Course.Name FROM Teacher RIGHT OUTER JOIN Course ON Teacher.Id=Course.TeacherId
 


 
--循环控制语句
--WHILE语句
DECLARE @num int
SELECT @num=0
WHILE @num<10
BEGIN 
SELECT @num=@num+1
SELECT @num
END

--GOTO语句
BEGIN 
SELECT Name FROM Teacher
GOTO SKIP
SELECT * FROM Teacher
SKIP:
PRINT 'SELECT * FROM Teacher did not get excuted'
END

--IF...ELSE语句
DECLARE @X INT, @Y INT,@Z INT
SELECT @X=2,@Y=5,@Z=4
IF @X>@Y
PRINT 'X>Y'
ELSE IF @Y>@Z
PRINT 'Y>Z'
ELSE 
PRINT 'Z>Y'

--CASE语句
SELECT Sallary,
CASE
WHEN Sallary>=3000 THEN 'VERYGOOD'
WHEN Sallary>=2000 THEN 'GOOD'
ELSE 'BAD'
END
FROM Teacher

--WHILE语句
DECLARE @I INT 
SET @I=5
WHILE @I>-1
BEGIN
PRINT @I
SET @I=@I-1
IF @I=1
BREAK
END

--WAITFOR语句
SELECT * FROM Teacher WAITFOR DELAY '00:00:10'--10秒后执行
SELECT * FROM Teacher WAITFOR TIME '00:00:10'--直到00:00:10才执行
 


 
--常用函数
--CHARINDEX函数
SELECT CHARINDEX ('a','I have many friends')
SELECT CHARINDEX('a','I hava many friends',5)

--LEFT函数
SELECT LEFT('I hava many friends',10)

--RIGHT函数
SELECT RIGHT('I have many friends',10)

--LEN函数
SELECT LEN('I have many friends')

--LTRIM函数
SELECT LTRIM('  I have many friends')

--RTRIM函数
SELECT RTRIM('I have many friends   ')

--LOWER函数
SELECT LOWER('I Have Many Friends')

--UPPER函数
SELECT UPPER('I have many friends')

--PATINDEX函数(字符串中的第一个a)
SELECT PATINDEX('%a%','I have many friends')

--REPALCE函数(替换)
SELECT REPLACE ('He is a student','student','teacher')

--REVERSE函数(反转)
SELECT REVERSE('ABCDEFG')

--STR函数
SELECT STR(123.45)
SELECT STR(123.45,6,2)

--SUBSTRING函数
SELECT SUBSTRING('I have many friends',1,LEN('I have many friends')/2)

--DATEADD函数
SELECT DATEADD(DAY,2,'2012-12-05')

--DATENAME函数
SELECT DATENAME(WEEKDAY,'2012-12-05') AS 星期几

--DATEPART函数
SELECT DATEPART(WEEKDAY,'2012-12-05') AS 星期的第几天

--DAY函数
SELECT DAY('2012-12-05') AS 天

--MONTH函数
SELECT MONTH('2012-12-05') AS 月

--YEAR函数
SELECT YEAR('2012-12-05') AS 年

--GETDATE函数
SELECT GETDATE() AS 目前时间
SELECT YEAR (GETDATE())

--CAST函数(数据类型转换)
SELECT CAST('010101' AS DATETIME) AS 日期年月日
SELECT CAST('010101' AS FLOAT) AS '0不见了'

--CONVERT函数(数据格式转换)
SELECT CONVERT(VARCHAR(8),GETDATE(),1) AS 日期
SELECT CONVERT(VARCHAR(8),GETDATE(),8) AS 时间
 



--事务
--显示事务
USE SQLTest
BEGIN TRANSACTION TA
INSERT INTO Teacher (Name,Sex) VALUES ('LILEI','男')
INSERT INTO Teacher (Sex) VALUES('女')
ROLLBACK TRANSACTION
SELECT * FROM Teacher

--隐式事务
SET IMPLICIT_TRANSACTIONS ON --隐式事务不需要BEGIN TRANSACTION
INSERT INTO Teacher (Name,Sex) VALUES ('LILEI','男')
COMMIT TRANSACTION
INSERT INTO Teacher (Name,Sex) VALUES ('LILI','女')
ROLLBACK TRANSACTION
SELECT * FROM Teacher
SET IMPLICIT_TRANSACTIONS OFF --自动处理事务
INSERT INTO Teacher (Name,Sex) VALUES ('LILEI','男')
COMMIT TRANSACTION
BEGIN TRANSACTION --不再是隐式事务
INSERT INTO Teacher (Name,Sex) VALUES ('LILI','女')
ROLLBACK TRANSACTION
SELECT * FROM Teacher

--事务案例
BEGIN TRANSACTION
INSERT INTO Teacher (Name,Sex) VALUES ('LILI','女')
INSERT INTO Teacher (Name,Sex) VALUES ('LILI','女')
INSERT INTO Teacher (Name,Sex) VALUES ('LILI','女')
INSERT INTO Teacher (Name,Sex) VALUES ('LILI','女')
DECLARE @COUNT INT
SET @COUNT=(SELECT COUNT(Name) FROM Teacher WHERE Name='LILI')
IF @COUNT>4
BEGIN
ROLLBACK TRANSACTION
PRINT '数据过多,失败!'
SELECT * FROM Teacher
END
ELSE
BEGIN
COMMIT TRANSACTION
PRINT '数据添加成功!'
SELECT * FROM Teacher
END



--锁
--查看系统锁
EXECUTE sp_lock

--锁定表的某一行
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM Teacher ROWLOCK WHERE Id=5

--锁定整个表
SELECT * FROM Teacher TABLOCK WHERE 1=1

--排它锁
BEGIN TRANSACTION TRAN1
UPDATE Teacher SET Phone='5842156624' WHERE Name='LILI'
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
BEGIN TRANSACTION TRAN2
SELECT * FROM Teacher WHERE Name='LILI'
COMMIT

--共享锁
BEGIN TRANSACTION TRAN1
SELECT * FROM Teacher WITH(HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
BEGIN TRANSACTION TRAN2
SELECT Name,Sex FROM Teacher 
UPDATE Teacher SET Phone='111111111' WHERE Name='LILI'
COMMIT TRANSACTION

--死锁
BEGIN TRANSACTION TRAN1
UPDATE Teacher SET Phone='33333333' WHERE Name='LILEI'
WAITFOR DELAY '00:00:10'
UPDATE Teacher SET Phone='44444444' WHERE Name='LILI'
COMMIT TRAN
BEGIN TRAN TRAN2
UPDATE Teacher SET Phone='44444444' WHERE Name='LILI'
WAITFOR DELAY '00:00:10'
UPDATE Teacher SET Phone='33333333' WHERE Name='LILEI'
COMMIT TRANSACTION




--存储过程
--创建存储过程
CREATE PROCEDURE SELECTBYSEX
@COUNTS INT OUTPUT 
AS
BEGIN 
SET NOCOUNT ON
SET @COUNTS=(SELECT COUNT(*) FROM Teacher WHERE Sex='女')
END
GO

--执行存储过程
DECLARE @COUNTS INT
EXECUTE SELECTBYSEX @COUNTS OUTPUT
PRINT @COUNTS
GO

--查看存储过程
EXECUTE sp_help SELECTBYSEX
GO

--删除存储过程
DROP PROCEDURE SELECTBYSEX
GO


你可能感兴趣的:(SQL,SQLServer,T-SQL)