在SQL Server中之SQL

发布时间:2018-11-15  栏目:SQL  评论:0 Comments

USE [TestDB]
GO
/****** 对象:  Table [dbo].[Person]    脚本日期: 11/23/2008 13:37:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
    [PersonId] [nchar](18) NOT NULL,
    [PersonName] [nchar](20) NOT NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [PersonId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

1.列别名
  除了支持oracle的列表名语法形式外,还支持将列别名置于列名之前,并附加等号:

默认情况下要实行一个工作中出现错误,则独自回滚错误操作语句(就是说这句不执行了,算不达回滚),错误处前要以后的对操作语句还是会于交付。如:

select emp_name=ename,salary=sal from emp;
Use TestDB

Begin TransAction
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('3','Name3')
Commit TransAction
/*
    Select 一下 有'1','Name1'和'3','Name3',
    说明只有第二句的错误被取消了
*/

2.字符串条件
  SQL
Server除了支持like关键字、“%”及“_”作为连接配符以及以escape关键字指定转义字符进行模糊匹配查询,还支持正则表达式中的方括号之所以法,以相当指定范围外还是方括号所指定集合中之随机单个字符。
  SQL
Server支持的方括号用法有两栽形式,[]与[^],前者用于包含某些字符,后者用于不带有某些字符,举例如下。

普回滚的法1:打开 XACT_ABORT

  • [amd]:表示包含a、m、d三独字符中之即兴一个
  • [^amd]:表示不带有a、m、d三只字符中之妄动一个
  • [b-f]:表示英文字母表中b到f之中的任意一个
  • [0-9]:表示0到9即10只数字中之随意一个
      如查询dept表的dname列中的第一及第二许符为数字,第三只字符为题写英文字母的记录,可以下如下语句:
Use TestDB
SET XACT_ABORT ON -- 打开
Begin TransAction
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('3','Name3')
Commit TransAction
/*
    当 SET XACT_ABORT 为 ON 时,
    如果执行 Transact-SQL 语句产生运行时错误,
    则整个事务将终止并回滚。 
    默认情况下它是OFF状态。
*/

方方面面回滚方法2:使用Try…Catch

select * from dept where dname like '[0-9][0-9][a-z]%';
Use TestDB
Begin Try
    Begin TransAction
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
        Insert Into Person(PersonId,PersonName)
                    Values('3','Name3')
    Commit TransAction
End Try
Begin Catch
    Rollback TransAction
End Catch
/*
    使用TryCatch来捕获异常。
    如果 TRY 块内生成的错误导致当前事务的状态失效,
    则将该事务归类为不可提交的事务。
    如果通常在 TRY 块外中止事务的错误在 TRY 内发生时,
    就会导致事务进入不可提交状态。
    不可提交的事务只能执行读操作或 ROLLBACK TRANSACTION。
    该事务不能执行任何可能生成写操作或 COMMIT TRANSACTION 的 Transact-SQL 语句。
    如果事务被分类为不可提交的事务,则 XACT_STATE 函数会返回值 -1。
*/

3.多表连接
  对于自然连接,Oracle支持natural join以及using关键字的用法,而SQL
Server不支持。
  以from子句被使用子查询时,Oracle使用还是无使用表别名都是足以的。若用表别名,则无可知附带as关键字。如下面子查询:

全回滚方法3:自定义错误变量

#未使用别名
select ename from (select * from emp where deptno=20);
#使用别名
select ename from (select * from emp where deptno=20) e;
Use TestDB
Declare @tranError int -- 定义变量
Set @tranError=0
    Begin TransAction
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
            Set @tranError = @tranError + @@Error
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
            Set @tranError = @tranError + @@Error
        Insert Into Person(PersonId,PersonName)
                    Values('3','Name3')
            Set @tranError = @tranError + @@Error
    If @tranError = 0
        Commit TransAction
    Else
        Rollback TransAction
/*
    自定义一个变量来判断最后是否发生过错误。
*/

而是SQL Server要编写得动表别名,且附带或非顺手as都支持:

最后要留心的是:如果一个事情写了 Begin TransAction 而没写 Commit TransAction 或 Rollback TransAction 则相关操作的数据(也许是说明,也许是排,这自己还从未测试。。。)会叫钉住。。。而于锁住的解决办法就是独立实施一下Commit TransAction 或 Rollback TransAction

select ename from (select * from emp where deptno=20) e;
select ename from (select * from emp where deptno=20) as e;

4.查询排序后的面前n行或第n行记录

SQL Server中落实取出表中的前面n行,可以采用简单种植方法:

  • top n
  • row_number()

SQL
Server不支持Oracle中的rownum关键字,而row_number()函数的用法及Oracle相同。
  相对于Oracle的落实方式,使用top n的用法,在SQL
Server中得很易地贯彻取出表中前n行的目的。如查询emp表中之sal值最高的前头3长达记下:

select top 3 ename,sal from emp order by sal desc;

只要如查询排序后的第n航记录,可以由前n行结果除去前n-1实施结果,如要查询emp表中sql值排名第三底笔录:

select a.ename,a.sal from
(select top 3 ename,sal from emp order by sal desc) as a
except
select a.ename,a.sal from
(select top 2 ename,sal from emp order by sal desc) as a;

而SQL不支持以下做法:

select top 3 ename,sal from emp order by sal desc
except
select top 2 ename,sal from emp order by sal desc;

5.集合运算
  对与聚集的差运算,Oracle使用minus运算符,而SQL
Server使用except运算符。

6.null值在排序(order by)中之处理
  以SQL Server的查询中,如果order
by附加了asc选项,即升序排序,则null值排在其他非空值之前;如果order
by子句附加了desc,则null值排在其余非空值之后,也得以看以SQL
Server中,null值最小,这和Oracle的处理方式正好相反。

7.null处理函数
  对应于Oracle的nvl()函数,SQL
Server提供的null处理函数为isnull(),其所以法与Oracle的nvl()相同。

select ename,sal+isnull(comm,0) from emp;

8.修改表结构

①改数据列
  Oracle和SQL Server分别下modify与alter
column关键字修改列的数据类型,两者的语法为:

  • Oracle:alter table table_name modify column_name datatype
  • SQL Server:alter table table_name alter column_name datatype

②改列名
  Oracle以alter table附加rename column子句来改列名:

alter table tablename rename column old_column_name to new_column_name;

留下评论

网站地图xml地图