美文网首页
01_sqlserver脚本模板

01_sqlserver脚本模板

作者: 渣渣戴 | 来源:发表于2021-03-17 01:44 被阅读0次

    我们工作上会使用到有了这个模版可以让工作更加便捷

    --1.查询 SELECT

    --查询所有

    SELECT * FROM dbo.TSalary

    --指定字段查询

    SELECT EmployeeID,CurrentYear,CurrentMonth FROM dbo.TSalary

    --指定字段放在前面,查询所有

    SELECT EmployeeID,CurrentYear,CurrentMonth, * FROM dbo.TSalary

    --条件查询 =

    SELECT * FROM dbo.TSalary WHERE CurrentYear = '2014'

    --条件查询 in

    SELECT * FROM dbo.TSalary WHERE CurrentYear IN( '2014','2013')

    --模糊查询 like

    SELECT * FROM dbo.TSalary WHERE EmployeeSalary LIKE '6%'

    --合并查询 union-去重,2个表的字段必须一致

    SELECT * FROM dbo.TSalary WHERE EmployeeSalary LIKE '%2%'

    UNION

    SELECT * FROM dbo.TSalary WHERE EmployeeSalary LIKE '6%'

    ORDER BY EmployeeSalary

    --合并查询 union all-不去重,2个表的字段必须一致

    SELECT * FROM dbo.TSalary WHERE EmployeeSalary LIKE '%2%'

    UNION ALL

    SELECT * FROM dbo.TSalary WHERE EmployeeSalary LIKE '6%'

    ORDER BY EmployeeSalary

    --字段指定别名

    SELECT EmployeeID AS ID,CurrentYear AS 年,CurrentMonth 月, * FROM dbo.TSalary

    --查询排序(默认ASC,升序)

    SELECT * FROM dbo.TSalary ORDER BY EmployeeID

    SELECT * FROM dbo.TSalary ORDER BY EmployeeID DESC

    --2.更新 UPDATE

    UPDATE TABLE SET 新值 WHERE 条件

    --3.删除 DELETE

    DELETE FROM 表  WHERE 条件

    --4.top关键字

    SELECT TOP 2  * FROM dbo.TSalary

    --5.Group by和Having

    -- 先查看每个员工的工资-分组列一定要在显示列中体现

    SELECT EmployeeID, SUM(EmployeeSalary) FROM dbo.TSalary GROUP BY EmployeeID

    -- 按员工汇总工资,即返回每人的工资总和

    -- SUM()是求和函数,将该字段的值求和并返回结果

    SELECT CurrentMonth, SUM(EmployeeSalary) FROM dbo.TSalary GROUP BY CurrentMonth

    -- 同样想知道每个月一共为员工发了多少工资

    SELECT CurrentYear,CurrentMonth, SUM(EmployeeSalary) 月度工资总额 FROM dbo.TSalary GROUP BY CurrentYear,CurrentMonth

    -- 查询每个员工的平均工资

    -- AVG()是求均值函数,将该字段的值返回平均值

    SELECT EmployeeID, AVG(EmployeeSalary) 平均工资 FROM dbo.TSalary GROUP BY EmployeeID

    -- 查询每个员工的工资总和并且只显示那些工资总和大于20000的记录

    -- 分组条件用 Having 子句,类似与非分组情况下的where

    SELECT EmployeeID, SUM(EmployeeSalary) 平均工资 FROM dbo.TSalary GROUP BY EmployeeID HAVING SUM(EmployeeSalary)>20000

    --6.Distinct关键字去重

    SELECT  DISTINCT CurrentYear,CurrentMonth FROM dbo.TSalary ORDER BY CurrentYear,CurrentMonth

    --等价于

    SELECT  CurrentYear,CurrentMonth FROM dbo.TSalary GROUP BY CurrentYear,CurrentMonth

    --7.范围查询between...and...

    SELECT  * FROM dbo.TSalary  WHERE EmployeeSalary BETWEEN 7000 AND 10000

    --8.日期查询

    --返回当前系统日期和时间。

    SELECT GETDATE()

    --返回两个指定日期间的时间间隔数目。(例如天数)

    SELECT DATEDIFF(month,'2017-01-01',GETDATE())

    --向指定日期加上一段时间,返回新的datetime值。

    SELECT DATEADD(MONTH,3,GETDATE())

    --返回年  月  日

    SELECT YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE())

    --9.随机数以及四舍五入

    --返回一个0-1的随机数,且进行四舍五入保留2位小数

    SELECT ROUND(RAND(),2)

    --10.类型转换

    SELECT CONVERT(VARCHAR(100),GETDATE(),110)

    SELECT CAST(GETDATE() AS VARCHAR(100))

    SELECT EmployeeName+'【'+CAST(EmployeeID AS VARCHAR(100))+'】' AS '姓名+学号' FROM dbo.TEmployee

    --11.case when语句

    SELECT  EmployeeID ,

            CurrentYear ,

            CurrentMonth ,

            EmployeeSalary ,

            ProvideTime ,

            CASE WHEN ProvideTime < '2012-12-01' THEN '老员工'

        WHEN ProvideTime > '2014-01-01' THEN '新员工'

                ELSE '普通员工'

            END AS 员工类型

    FROM    dbo.TSalary

    --12.将查询结果保存到一张新表 SELECT * into 新表 FROM  表

    SELECT  EmployeeID ,

            CurrentYear ,

            CurrentMonth ,

            EmployeeSalary ,

            ProvideTime ,

            CASE WHEN ProvideTime < '2012-12-01' THEN '老员工'

        WHEN ProvideTime > '2014-01-01' THEN '新员工'

                ELSE '普通员工'

            END AS 员工类型

    INTO TSalary_bak

    FROM    dbo.TSalary

    SELECT *FROM  TSalary_bak

    --13.多表连接查询

    --1301.内连接(where x=y  与表 A inner join 表B on A.X=B.X  效果一样 )

    SELECT *FROM  TSalary

    SELECT *FROM  TEmployee

    SELECT * FROM  TSalary ts ,TEmployee te WHERE ts.EmployeeID=te.EmployeeID

    SELECT * FROM  TSalary ts ,TEmployee te WHERE te.EmployeeID=ts.EmployeeID

    --等同于下面

    SELECT * FROM  TSalary ts INNER JOIN TEmployee te  ON ts.EmployeeID=te.EmployeeID

    --1302.左连接(左边数据全部显示,右侧没有与左侧匹配的则全部显示null)

    SELECT * FROM  TSalary ts LEFT JOIN TEmployee te  ON ts.EmployeeID=te.EmployeeID

    --1303.右连接(右边数据全部显示,左侧没有与左侧匹配的则全部显示null)

    SELECT * FROM  TSalary ts RIGHT JOIN TEmployee te  ON ts.EmployeeID=te.EmployeeID

    --1304.全连接(返回左右2侧全部数据,左侧有右侧没的右侧显示null,右侧有左侧没有的左侧显示null),ISNULL判断为空,CAST类型转换

    SELECT  * FROM TSalary ts FULL OUTER JOIN TEmployee te ON ts.EmployeeID = te.EmployeeID

    SELECT  ISNULL(CAST(ts.EmployeeID AS VARCHAR(100)), '不存在') 工号 ,

            ISNULL(ts.EmployeeSalary, 0) 薪水 ,

            ISNULL(te.EmployeeName, '不存在') 员工

    FROM    TSalary ts

            FULL OUTER JOIN TEmployee te ON ts.EmployeeID = te.EmployeeID

    SELECT  * FROM TSalary ts FULL OUTER JOIN TEmployee te ON ts.EmployeeID = te.EmployeeID WHERE ts.EmployeeID IS NULL

    SELECT  * FROM TSalary ts FULL OUTER JOIN TEmployee te ON ts.EmployeeID = te.EmployeeID WHERE ts.EmployeeID IS NOT NULL

    --*1305.自连接(组织架构表-自己连接自己)

    SELECT ta.StruName,tb.StruName FROM  TCorpStructure ta INNER JOIN dbo.TCorpStructure tb ON ta.StruID=tb.ParentStruID WHERE ta.StruID='TotalCompany'

    --14.子查询

    ---查询员工的id、工资和姓名

    SELECT  EmployeeID,EmployeeSalary,ISNULL((SELECT EmployeeName FROM TEmployee te WHERE te.EmployeeID=ts.EmployeeID),'空') AS 员工姓名 FROM TSalary ts

    ---查询工资最高的员工姓名

    ----标量子查询(=):此项用等于只能在子查询有一个返回结果

    SELECT *FROM dbo.TEmployee WHERE EmployeeID=(SELECT TOP 1 EmployeeID FROM TSalary ORDER BY  EmployeeSalary DESC)

    ----多值子查询(IN),独立子查询:可以单独执行此项,用IN可用在在子查询有N个返回结果

    SELECT *FROM dbo.TEmployee WHERE EmployeeID IN (SELECT TOP 1 EmployeeID FROM TSalary ORDER BY  EmployeeSalary DESC)

    ---查询存在工资的员工

    ----*EXISTS相关子查询,依赖外部查询,不能单独查询

    SELECT * FROM dbo.TEmployee WHERE EXISTS(SELECT * FROM dbo.TSalary WHERE dbo.TEmployee.EmployeeID=dbo.TSalary.EmployeeID)

    SELECT * FROM dbo.TEmployee WHERE NOT EXISTS(SELECT * FROM dbo.TSalary WHERE dbo.TEmployee.EmployeeID=dbo.TSalary.EmployeeID)

    --14.流程控制语句

    ---while(begin end  语句块)

    DECLARE @i INT

    SET @i=1

    WHILE @i<10

    BEGIN

    PRINT @i

    SET @i=@i+1

    END

    ---while(计算偶数的和)

    DECLARE @i INT,@sum INT

    SET @i=1

    SET @sum=0

    WHILE @i<=10

    BEGIN

    -----输出1-10的数

    BEGIN

    PRINT @i

    SET @i=@i+1

    END

    -----计算1-10的偶数和

    BEGIN

    IF @i%2=0

    SET @sum=@sum+@i

    END

    END

    PRINT @sum

    ---Case when then

    DECLARE @x INT

    SET @x=22

    DECLARE @s VARCHAR(1000)

    SET @s=

    CASE @x

    WHEN 1 THEN 'NO.01'

    WHEN 2 THEN 'NO.02'

    WHEN 3 THEN 'NO.03'

    ELSE 'NO.0X'

    END

    SELECT @s

    --15.视图

    ---优点:限定查询,用户不同只能看到部分数据;容易维护;

    ---缺点:大型表、复杂关系表查询慢;视图中不要嵌套视图、函数

    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id=OBJECT_ID('VEmployeeStyle'))

    DROP VIEW VEmployeeStyle

    GO

    CREATE VIEW VEmployeeStyle

    AS

    SELECT  EmployeeID ,

            CurrentYear ,

            CurrentMonth ,

            EmployeeSalary ,

            ProvideTime ,

            CASE WHEN ProvideTime < '2012-12-01' THEN '老员工'

        WHEN ProvideTime > '2014-01-01' THEN '新员工'

                ELSE '普通员工'

            END AS 员工类型

    FROM    dbo.TSalary

    GO

    SELECT *FROM VEmployeeStyle

    --16.函数

    ---表值函数:返回TABLE数据类型

    --对于表值函数:

    --1.所有的传入参数前都必须加@

    --2.create后的返回,关键字是returns,而不是return。

    --3.returns后面的跟的不是变量,而是返回表table。

    --4.as后面直接用return 返回结果表。

    IF EXISTS(select * from dbo.sysobjects where id = object_id('F3_GetSalary'))

    DROP FUNCTION F3_GetSalary

    GO

    CREATE FUNCTION F3_GetSalary(@EmployeeID INT )

    RETURNS TABLE

    AS

    RETURN

        ( SELECT    *

          FROM      TSalary

          WHERE    EmployeeID = @EmployeeID

        )

    GO

    SELECT *FROM F3_GetSalary(2)  --返回的表需要使用select * from 函数

    GO

    ---*标量函数:使用RETURN语句返回单个数据值

    --对于标量函数:

    --1.所有的传入参数前都必须加@

    --2.create后的返回,关键字是returns,而不是return。

    --3.returns后面的跟的不是变量,而是返回值的类型,如:int,char等。

    --4.在begin/end语句块中,是return。

    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id=OBJECT_ID('F3_GetMax'))

    DROP FUNCTION F3_GetMax

    GO

    CREATE FUNCTION F3_GetMax(@a INT,@b INT)

    RETURNS INT

    AS

    BEGIN

    DECLARE @max INT;

    IF @a>@b

    BEGIN

      SET @max=@a;

    END

    ELSE

    BEGIN

      SET @max=@b;

    END

    RETURN @max

    END

    GO

    DECLARE @m INT

    SET @m = EmployeeDB.dbo.F3_GetMax(1,2) --返回的值需要使用select 函数

    SELECT @m

    --或者

    SELECT EmployeeDB.dbo.F3_GetMax(1,2) --返回的值需要使用select 函数

    --17.存储过程

    --存储过程和用户自定义函数的区别如下:

    --1.存储过程支持输出参数,向调用者返回值。用户定义函数只能通过返回值返回数据。

    --2.存储过程可以作为一个独立的主体被执行,而用户定义函数可以出现在SELECT语句中。

    --3.存储过程功能比较复杂,而用户定义函数通常都具有比较明确的、有针对性的功能。

    -- 显示有关数据库对象相关性的信息

    EXEC sp_depends  'dbo.TEmployee'

    -- 显示帮助

    EXEC sp_help 'dbo.F3_GetMax'

    -- 显示帮助

    EXEC sp_helpdb 'dbo.EmployeeDB'

    -- 显示具体脚本

    EXEC sp_helptext 'dbo.F3_GetMax'

    -- 显示表使用空间

    EXEC sp_spaceused 'dbo.TEmployee'

    --创建不带参数的存储过程

    IF OBJECT_ID('SP3_getGetEmployees') IS NOT NULL

        DROP PROCEDURE SP3_getGetEmployees;

    GO

    CREATE PROCEDURE SP3_getGetEmployees

    AS

    BEGIN

      SELECT  EmployeeID ,

            CurrentYear ,

            CurrentMonth ,

            EmployeeSalary ,

            ProvideTime ,

            CASE WHEN ProvideTime < '2012-12-01' THEN '老员工'

        WHEN ProvideTime > '2014-01-01' THEN '新员工'

                ELSE '普通员工'

            END AS 员工类型

      FROM    dbo.TSalary

    END

    EXEC dbo.SP3_getGetEmployees

    --创建带参数的存储过程

    IF OBJECT_ID('SP3_getGetEmployeesId') IS NOT NULL

    DROP PROCEDURE SP3_getGetEmployeesid

    GO

    CREATE PROCEDURE SP3_getGetEmployeesid

    (

    @EmployeeID INT

    )

    AS

    BEGIN

    -- 不向客户端发送消息,禁用它们能够减少网络流量。

      SET NOCOUNT ON

      SELECT  EmployeeID ,

            CurrentYear ,

            CurrentMonth ,

            EmployeeSalary ,

            ProvideTime ,

            CASE WHEN ProvideTime < '2012-12-01' THEN '老员工'

        WHEN ProvideTime > '2014-01-01' THEN '新员工'

                ELSE '普通员工'

            END AS 员工类型

      FROM    dbo.TSalary WHERE EmployeeID=@EmployeeID

    END

    EXEC SP3_getGetEmployeesId @EmployeeID=1

    EXEC SP3_getGetEmployeesId 1

    相关文章

      网友评论

          本文标题:01_sqlserver脚本模板

          本文链接:https://www.haomeiwen.com/subject/etfscltx.html