SQL SEVER 笔记誊录

数据库:

sqlcmd -S .\sqlespress //链接免费的数据库实例
sqlcmd -S YKTHHAP1RIWNZ4L\SQLHJS//链接到本地的数据库实例(机器名\实例名)
1>//登录成功!
net start mssql$sqlexpress启动服务

quit/exit退出数据库的链接

char(10):ASIIC码10个字节:一个汉字占2个字节,只能放5个汉字,可以放是10个英文、数字
固定长度,没有的补空格
nchar(10):Unicode码,10个字符:10个汉字
存多少占多少

创建数据库

CREATE DATABASE TestData
GO

 
创建表

CREATE TABLE dbo.Products
   (ProductID int PRIMARY KEY NOT NULL,
    ProductName varchar(25) NOT NULL,
    Price money NULL,
    ProductDescription text NULL)
GO

您可以使用 sqlcmd 运行 Transact-SQL 脚本文件。Transact-SQL 脚本文件是一个文本文件,它可以包含 Transact-SQL 语句、sqlcmd 命令以及脚本变量的组合。

若要使用记事本创建一个简单的 Transact-SQL 脚本文件,请执行下列操作:

单击“开始”,依次指向“所有程序”、“附件”,再单击“记事本”。

复制以下 Transact-SQL 代码并将其粘贴到记事本:

复制代码 

USE AdventureWorks;
GO
SELECT c.FirstName + ‘ ‘ + c.LastName AS ‘Employee Name‘,
a.AddressLine1, a.AddressLine2 , a.City, a.PostalCode
FROM Person.Contact AS c
   INNER JOIN HumanResources.Employee AS e
        ON c.ContactID = e.ContactID
    INNER JOIN HumanResources.EmployeeAddress ea
        ON ea.EmployeeID = e.EmployeeID
    INNER JOIN Person.Address AS a
        ON a.AddressID = ea.AddressID;
GO

 

在 C 驱动器中将文件保存为 myScript.sql。

运行脚本文件

打开命令提示符窗口。

在命令提示符窗口中,键入 sqlcmd -S myServer\instanceName -i C:\myScript.sql

按 Enter 键。

Adventure Works 员工的姓名和地址列表便会输出到命令提示符窗口。

将此输出保存到文本文件中

打开命令提示符窗口。

在命令提示符窗口中,键入 sqlcmd -S myServer\instanceName -i C:\myScript.sql -o C:\EmpAdds.txt

按 Enter 键。

命令提示符窗口中不会返回任何输出,而是将输出发送到 EmpAdds.txt 文件。您可以打开 EmpAdds.txt 文件来查看此输出操作。

Sqlserver中创建登录名

单击“开始”,单击“运行”,在“打开”框中,键入 %SystemRoot%\system32\compmgmt.msc /s,再单击“确定”打开“计算机管理”程序。

在“系统工具”下,展开“本地用户和组”,右键单击“用户”,再单击“新建用户”。

在“用户名”框中,键入 Mary。

在“密码”和“确认密码”框中,键入强密码,再单击“创建”创建新的本地 Windows 用户。

在 SQL Server Management Studio 的查询编辑器窗口中,键入并执行以下代码

CREATE LOGIN [YKTHHAP1RIWNZ4L\hjs]
    FROM WINDOWS
    WITH DEFAULT_DATABASE = [hjs];
GO

在数据库中创建用户

再使用 CREATE USER 语句将她的登录名映射到名为 hjs 的用户。

CREATE USER [hjs] FOR LOGIN [YKTHHAP1RIWNZ4L\hjs];
GO

将 pr_Names 存储过程的 EXECUTE 权限授予 Mary。

复制代码

GRANT EXECUTE ON pr_Names TO Mary;
GO

希望 Mary 能够对视图执行 SELECT 语句,则您还必须执行 GRANT SELECT ON vw_Names TO Mary

对象的访问权限,请使用 REVOKE 语句

删除权限和对象

在删除对象之前,请确保使用正确的数据库:

复制代码 

USE TestData;
GO

 

使用 REVOKE 语句删除 Mary 对存储过程的执行权限:

复制代码

REVOKE EXECUTE ON pr_Names FROM Mary;
GO

使用 DROP 语句删除 Mary 对 TestData 数据库的访问权限:

复制代码

DROP USER Mary;
GO

使用 DROP 语句删除 Mary 对此 SQL Server 2005 实例的访问权限。

复制代码

DROP LOGIN [<computer_name>\Mary];
GO

使用 DROP 语句删除存储过程 pr_Names:

复制代码

DROP PROC pr_Names;
GO

使用 DROP 语句删除视图 vw_Names:

复制代码

DROP View vw_Names;
GO

使用 DELETE 语句删除 Products 表中的所有行:

复制代码

DELETE FROM Products;
GO

使用 DROP 语句删除 Products 表:

复制代码

DROP Table Products;
GO

正使用 TestData 数据库时,无法删除该数据库;因此,请首先将上下文切换到其他数据库,再使用 DROP 语句删除 TestData 数据库:

复制代码

USE MASTER;
GO
DROP DATABASE TestData;
GO

 
select *,2 as bird,‘nn‘ as birdman from Student --凭空加一列

--将常量数据拼接成表

select ‘ddd‘ as 他们的,‘dd‘ as 你们的

union  all

select ‘ddd‘ as 他们的,‘dd‘ 你们的

union all

select ‘ddd‘ as 他们的,‘dd‘ 你们的

select newid() --返回Guid:Golable 也是UUID

insert into Test (id,name) values(NEWID(),‘huangjiansheng‘)//此时的ID不能加唯一约束等条件,要不然会报错

dataset.Tables[0].Rows[0][0]:第一章表的第一行第一列的值

string[] rows = File.ReadAllLines("name1.txt");

            for (int i = 0; i < rows.Length; i++)
            {
                string[] temp = rows[i].Split(new char[] { ‘\t‘ }, StringSplitOptions.RemoveEmptyEntries);
                // 0  姓名
                // 1  性别
                // 2  年龄
                DataRow row = dt.NewRow();
                row["Name"] = temp[0];
                row["Age"] = Convert.ToInt32(temp[2]);
                row["Gender"] = temp[1];

                dt.Rows.Add(row);
            }

            // 遍历
            //foreach (DataRow r in dataSet.Tables["我的第一张表"].Rows)
            //{
            //    // r中又有汗多列
            //    // Console.WriteLine("{0}\t\t{1}\t\t{2}\t\t{3}", r["Id"], r["Name"], r["Age"], r["Gender"]);
            //    foreach (DataColumn col in dataSet.Tables["我的第一张表"].Columns)
            //    {
            //        Console.Write(r[col]);
            //    }
            //    Console.WriteLine();
            //}

            dataSet.Tables[0].WriteXml("Person.xml");

Files myFile = new WORDFile(); myFile.Open(); 针对上述示例,具体的调用过程,可以小结为: 编译器首先检查myFile的声明类型为Files,然后查看myFile调用方法是否被实现为虚方法。如果不是虚方法,则直接执行即可;如果是虚方法,则会检查实现类型WORDFile是否重写该方法Open,如果重写则调用WORDFile类中覆写的方法,例如本例中就将执行WORDFile类中覆写过的方法;如果没有重写,则向上递归遍历其父类,查找是否覆写该方法,直到找到第一个覆写方法调用才结束。

接口:

同样的方法对不同的对象表现为不同的行为,同一操作作用于不同的对象,产生不同的执行结果。

case 函数的用法:

select sName,
 case
      when sAge <18 then ‘未成年人‘--在用字段做表达式判断的时候用这样模式
      when sAge >=18 then ‘成年人‘
      else ‘未知‘
 end as 年龄,
 sId,
 case sGender
     when 1 then ‘男‘--用字段的特定值做判断的时候用这种模式
     when 0 then ‘女‘
     else ‘未知‘
 end as性别
 from Student

数据库的三范式:

1、每一列的原子性,列的唯一,不能有重复的列

主键唯一,每行记录必须唯一

不可在分

 
2、数据单一,每行记录必须唯一

 
3、表中的列必须直接依赖主键

  不相关的列应该放在其他的表中

内连接:把左右表完全匹配的数据查询出来

right:以右表为准,把左表没有匹配的数据也查询出来(以NULL代替),

右表的数据必须全部有,左表没有(以NULL代替)

left:以左表为准,把右表没有匹配的数据也查询出来(以NULL代替)

左表的数据必须全部,右表没有(以NULL代替)

主外键

当外键表还存在对主键表主键的引用时,是不允许删除主键表中的该条记录,必须得在外键表删除与其相关的记录,才能在主键表中的该条记录。

如果要在主外键同时删除相关的记录则使用变量参数

给变量赋值

ADO.NET的组成:

数据集/.netframework数据提供程序

dataset/datatable/datarow     connection/dataAdapter/dataReader/commmand

dataReader:只进只读,一行一行读取数据(不能返回)

数据库的三范式:

1、每一列的原子性,列的唯一,不能有重复的列

主键唯一,每行记录必须唯一

不可在分

 
2、数据单一,每行记录必须唯一

 
3、表中的列必须直接依赖主键

  不相关的列应该放在其他的表中

传智博客面试宝典上的:

1、字段不能有冗余的信息,所有的字段都是必不可少的(比如一张表中有出生日期,年龄就可以不要)

2、满足第一范式的表并且表必须有主键

3、满足第二范式并且表引用其他表必须通过主键引用

内连接:把左右表完全匹配的数据查询出来

right:以右表为准,把左表没有匹配的数据也查询出来(以NULL代替),

右表的数据必须全部有,左表没有(以NULL代替)

left:以左表为准,把右表没有匹配的数据也查询出来(以NULL代替)

左表的数据必须全部,右表没有(以NULL代替)

主外键表的关系:

当外健表没有设置级联删除时,删除主键表的记录,必须先删除外键表的相关记录

当外键表设置成级联删除时,删除主键表的记录,外键表中的相关记录也被删除

当外键表还存在对主键表主键的引用时,是不能删除主键表中的该条记录,必须得在外键表中删除与其相关的记录,才能在主键表中的该条记录。

因为当你在主键表中删除该记录时,外键表还存在对该主键表的引用,使用删除时包约束错误

如果要在主外键同时删除相关的记录则使用变量参数

给变量赋值

--同时删除2条记录

declare @id int        --变量声明

select @id = scoreId from TStudent where sName=‘安半青‘ and studentId=2        --变量赋值

delete from TStudent where [email protected]

delete from TScore where  [email protected]

truncate table dbo.Teacher//清空数据库中的数据并使自动增长值恢复到1

ceiling():进一位取整(天花板函数只要是3.1就取4),还有个FLOOR()地板函数,3.9取就3

--求刚刚插入数据的id号

insert into TStudent (sName,sAge,sGender) output inserted.studentId values (‘huang‘,20,‘男‘)--第一中方法,然后用execultSclare()去执行,

可以返回首行首列的值,然后赋值给一个变量,然后根据这个变量去查询刚才插入的记录

select @@IDENTITY--查看当前的自动增长号,第二中方法(数据量多同时插入的时候会出现问题,保险的时候再查询一遍)

select @@error--查询前一次的错误消息

存储过程优点:

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。

主要优点有如下三点:

(1)通过本地存储、代码预编译和缓存技术,提高数据操作的性能。

(2)增加了可维护性。

(3)增强了安全性,防止sql注入

(4)减少网络流通量

存储过程的缺点:

1、把所有的压力给数据库--解决:数据库集群

2、可移值性差--所有一般是用sql

创建数据库和表:

use master
go

if db_id(‘itcast20120602‘) is null
create database itcast20120602
on
(
    name=‘itcast20120602‘,
    filename=‘G:\db\itcast20120602.mdf‘
)
log on
(
    name=‘itcast20120602_log‘,
    filename=‘G:\db\itcast20120602_log.ldf‘
)
go

use itcast20120602
go

if object_id(‘Score‘,‘U‘) is not null
    drop table Score
create table Score
(
    scoreId int,
    studentId int,
    english int,
    math int
)

if object_id(‘Teacher‘,‘U‘) is not null
    drop table Teacher
create table Teacher
(
    tId int,
    tName nvarchar(10),
    tSex bit,
    tAge int,
    tSalary money,    -- 工资
    tBirthday datetime
);

if object_id(‘Student‘,‘U‘) is not null
    drop table Student
create table Student
(
    studentId int,
    name nvarchar(10),
    age int
)

插入数据:

insert into Test values(‘张三‘,19,‘true‘);//注意是单引号//不给出列名时,值必须一一对应
insert into Student(studentId, name, age) values(1,‘张三‘,19);

一次插入多条数据

insert into bank select * from deleted

快速复制数据并插入本表

insert into customer(cusName,Delflag) select cusname,delfalg from customer

创建一个表备份数据

select * into customerbak from customer//如果customerbak表存在报错,不存在则创建,再把customer表中数据插入到customerbak里面

当外健表没有设置级联删除时,删除主键表的记录,必须先删除外键表的相关记录

当外键表设置成级联删除时,删除主键表的记录,外键表中的相关记录也被删除

更新语句:

update Score set english=english+10 where studentId = 1

使用代码添加约束:

--主键约束
alter table Teacher add constraint PK_Teacher_tId primary key(tid)
--唯一约束
alter table Teacher add constraint UNQ_Teacher_tName unique(tName);
--检查约束
alter table Teacher add constraint CK_Teacher_tAge check(tAge>=0 and tAge<=120);
--默认约束
alter table Teacher add constraint DF_Teacher_tSalary default(1000) for tSalary;
--添加外键
alter table WaiTable add constraint FK_WaiTable_MainTable_Fid
FOREIGN KEY(id) REFERENCES MainTable(Fid)

--删除约束
alter table Teacher drop constraint UNQ_Teacher_tName;

ALTER TABLE [dbo].[LoginTable] ADD  DEFAULT (getdate()) FOR [loginTime]
ALTER TABLE [dbo].[Person] ADD  DEFAULT ((0)) FOR [PGender]
ALTER TABLE [dbo].[Classes] ADD  DEFAULT (‘nojpg.jpg‘) FOR [CImg]

--创建表的同时就添加约束

use itcast20120602
go
create table MyTable
(
    id int identity(1,1) primary key,
    [uni que] int unique,
    name nvarchar(10) not null,
    Gender nvarchar(1) check(Gender=‘男‘ or Gender=‘女‘),
    Gender bit default(0)//数据库中存0/1
    UserAge int check(UserAge<(100) AND UserAge>(0)),
    isDel bit default(0),//也可以DEFAULT (‘false‘),
    CurrentAddTime datetime DEFAULT (getdate()),
    UserId int foreign key references Users(Id)//同时添加外键
)

create table mytable
(
  id int identity(1,1) primary key not null,
  username nvarchar(20) not null,
  pwd varchar(20) not null,
  gender bit default(0),
  addtime datetime default(getdate()),
  age int check(age>0 and age<100),
  userid int foreign key references users(ID)
)

CREATE TABLE [dbo].[Person](
    [PID] [int] IDENTITY(1,1) NOT NULL,
    [PCID] [int] NOT NULL,
    [PType] [int] NOT NULL,
    [PLoginName] [varchar](50) NOT NULL,
    [PCName] [varchar](50) NOT NULL,
    [PPYName] [varchar](50) NULL,
    [PPwd] [varchar](50) NOT NULL,
    [PGender] [bit] NOT NULL,
    [PEmail] [varchar](100) NULL,
    [PAreas] [varchar](50) NULL,
    [PIsDel] [bit] NOT NULL,
    [PAddTime] [datetime] NOT NULL,
)

ALTER TABLE [dbo].[Person] ADD  DEFAULT ((1)) FOR [PType]
GO

ALTER TABLE [dbo].[Person] ADD  DEFAULT ((0)) FOR [PGender]
GO

ALTER TABLE [dbo].[Person] ADD  DEFAULT ((0)) FOR [PIsDel]
GO

ALTER TABLE [dbo].[Person] ADD  DEFAULT (getdate()) FOR [PAddTime]
GO

--修改表结构

use itcast20120602;
go

--增加字段

alter table Student add gender bit;
go

alter table Student add note nvarchar(max)

--修改字段

alter table Student alter column gender nvarchar(1);
go

--删除字段

alter table Student drop column note

--外键的写法与命名规范

alter table 外键表 add constraint 外键名 foreign key(外键) references 主键表(主键)

命名规范:FK_外键表_主键表_主键

alter table WaiTable add constraint FK_WaiTable_MainTable_Fid
FOREIGN KEY(id) REFERENCES MainTable(Fid)

create table MED_TABLE_COLS_MEANINGS
(
  TABLE_NAME        NVARCHAR(100) not null,
  COLUMN_NAME       NVARCHAR(100) not null,
  HOSPITAL_NAME     NVARCHAR(100) not null,
  COLUMN_MEANINGS   NVARCHAR(100) not null,
  COL_VALUES        NVARCHAR(100),
  constraint PK_APGAR_RESULT
      primary key (TABLE_NAME, COLUMN_NAME, HOSPITAL_NAME)//同时创建三个主键
  );

-分页的问题Top

--row_number

--查询40到50条的记录

select top 10* from TStudent where studentId not in
(select top 30 studentId from TStudent)

select * from
(select ROW_NUMBER() over (order by studentId)as num,* from TStudent) as t
where t.num between 40 and 50

--内连接

--select t1.studentId, sName, sAge, sGender, insertTime, isDel, scoreId, classId,scoreId, chinese, english, math
select t1.studentId,sName,sAge,t2.chinese,t2.math,t2.english
from TStudent t1
inner join TScore t2
on
t1.scoreId=t2.scoreId
where t1.scoreId=8

--左连接

select t1.studentId,t1.sName,t1.sAge,t2.chinese,t2.math
from TStudent t1
left join TScore t2
on t1.scoreId=t2.scoreId

--右连接

select t1.studentId,t1.sName,t1.sAge,t2.chinese,t2.math
from TStudent t1
right join TScore t2
on t1.scoreId=t2.scoreId

create view view_student--创建视图
as
    select t1.sName, t1.sAge, t2.cName, t3.english, t3.math, t3.chinese
    from
        TStudent as t1
        inner join
        TClass as t2
        on t1.classId = t2.classId
        inner join
        TScore as t3
        on t1.scoreId = t3.scoreId

        
select * from view_JoinStudent--执行视图

--视图不具备存储数据的能力

--将视图看做一个SQL语句的集合

--使用的时候,会执行其中的sql语句,得到一个结果集

--视图上一张虚拟的表,只列出用户干兴趣的数据

--一般不能对视图进行修改等操作

--保护的数据的安全性

--提高的查询的速度与性能

--同时删除2条记录

declare @id int        --变量声明
select @id = scoreId from TStudent where sName=‘安半青‘ and studentId=2        --变量赋值
delete from TStudent where scoreId=@id
delete from TScore where  [email protected]

--求刚刚插入数据的id号

insert into TStudent (sName,sAge,sGender) output inserted.studentId values (‘huang‘,20,‘男‘)--第一中方法
select @@IDENTITY--查看当前的自动增长号,第二中方法

case 字段

     when 值 then,

     when 值 then,

     ..............

     else 替换值

end AS 字段

--需要在哪儿控制显示,就在谁的前面加case

--有2个版本

--1、等价于switch-case结构

--case 字段

--    when 值 then 替换值,

--    when 值 then 替换值,

--    ...

--    else 替换值

--end

select

    id,

    name,

    age,

    case gender

        when 1 then ‘男‘

        when 0 then ‘女‘

        else ‘未知‘

    end as 性别

from dbo.Table0608

--2、等价于if-else if结构

if()

{}

else if()

{}

else

{}

case

    when 表达式 then 值

    when 表达式 then 值

    else 值

end

select

   
    name,

    case

        when age is null then ‘未知‘

        when age<=18 then ‘未成年人‘

        else ‘成年人‘

    end

    ,id,

    case gender

        when 1 then ‘男‘

        when 0 then ‘女‘

        else ‘未知‘

    end as 性别

from dbo.Table0608

select sName,

case

      when sAge <18 then ‘未成年人‘--在用字段做表达式判断的时候用这样模式

      when sAge >=18 then ‘成年人‘

      else ‘未知‘

end as 年龄,

sId,

case sGender

     when 1 then ‘男‘--用字段的特定值做判断的时候用这种模式

     when 0 then ‘女‘

     else ‘未知‘

end as性别

from Student

  select

    sName,

    case

        when sAge is null then ‘未知‘

        when sAge<=18 then ‘未成年人‘

        else ‘成年人‘

    end

    ,sId,

    case sGender

        when 1 then ‘男‘

        when 0 then ‘女‘

        else ‘未知‘

    end as 性别

from Student

--%表示任意个字符

--_表示一个字符

--找出姓张的,名字只有两个字的同学

--‘张_‘

--找出姓张的

--‘张%‘

select  * from student where sName like ‘张_‘ //匹配张开头,后面跟一个字符的
select  * from student where sName like ‘张%‘ //匹配张开头,后面不限
select * from Student where sName like ‘[_]%‘//要匹配一个_.则必须用[]款住

-> 通配符 %多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符

-> 通配符_ 单字符匹配,它匹配单个出现的字符

-> [] 只匹配一个字符  并且这个字符必须是[]范围内的,或[_]

-> not与like一起使用:not like ….

--此时的不完全匹配不能使用等号(=),需要使用like

select * from Student where sName like ‘[_]%‘

--对于null,查询出来不好看,因此可以使用isnull函数来修改查询出来的结果

select sName, isnull(sAge, -1), sGender from Student

--将某字段相同数据聚合到一起

--如果使用分组,在select中只能使用分组的字段和聚合函数

select sClass, count(*) from Student group by sClass

--分组语法为group by

--是将字段集合到一起,但是使用分组后,select中只能有分组的字段或聚合函数

--筛选班级人数大于260的

--筛选有两种,一个是查询前筛选,用where

--另一个是查询后,用having

select

    sClass, count(*)

from Student

group by

    sClass

having count(*) > 260

-- 联合结果集

select ‘学习C++的人数有:‘, count(*) from Student where sClass=‘C++‘

union

select ‘学习Java的人数有:‘,count(*) from Student where sClass=‘java‘;

--不要和连接混淆

--联合是将结果集合并

select 123,123

union--union all//效率较高,把重复的值都查出来,union:重复的值不显示

select 1234,213

--日期函数

-- 获得当前日期

select getdate()
select year(getdate()) as 年, month(getdate()) as 月, day(getdate()) as 日

--银行的自动还款

--在当前时间上向后加20天

select getdate() as 当前时间, dateadd(day, 30, getdate()) as 应还款时间

  
--存款

select getdate() as 当前时间, dateadd(month,18,getdate()) as 结算时间

--时间差

create table timetable
(
    startTime datetime default(getdate()),
    endTime datetime default(dateadd(minute, 1, getdate()))
)
insert into timetable values(getdate(), dateadd(millisecond, 31234, getdate()));

--获得打电话的毫秒数

select datediff(millisecond, startTime, endTime) from timeTable

--获得时间的任何一个部分

select datepart(Weekday, getdate())

-- 关于转换函数

select 1 + cast(‘1‘ as int)
select 1 + 1
select ‘1‘ + 1
select ascii(0)
select ‘1‘ + ‘1‘
select ‘您的编号为‘ + cast(1 as nvarchar(10))
--convert(类型, 数值)
select ‘您的编号为‘ + convert(nvarchar(10), 1)
select ‘今天的日期是‘ + cast(getdate() as nvarchar(50))
select ‘今天的日期是‘ + convert(nvarchar(50), getdate() ,11)

if_else 语句

if

  begin

 
  end

else

begin

 
end

--查询是否存在这个人

declare @id int;

set @id = 4;

declare @exist int;

select @exist = count(*) from TStudent where studentId = @id

if @exist = 0

begin

    select ‘查无此人‘

end

else

begin

    select * from TStudent where studentId = @id

end

----打印出1加到100的结果

declare @i int

declare @sum int

set @i=1

set @sum=0

while @i<=100

begin

   set @[email protected][email protected]

   set @[email protected]+1

   if @i=50--等于50的时候跳出循环

   begin

      break

   end

end

select @sum, @i--查询总和和当前的i值

--求若不及格的人数大于一半,则给每个同学家加2分,直到及格人数大于一半

declare @total int

declare @curr int

select @total = count(*) from TScore where chinese is not null

select @curr = count(*)  from TScore where chinese < 90

while @curr>@total/2

begin

   update TScore set  chinese = chinese+2

   select @curr=COUNT(*) from TScore where chinese<90

end

--事务

create table bank

(

    cId char(4) primary key,

    balance money,            --余额

)

alter table bank

add constraint CH_balance check(balance >=10)

go

--delete from bank

insert into bank values(‘0001‘,1000)

insert into bank values(‘0002‘,10)

go

update bank set balance=balance+100 where cId=‘0001‘

update bank set balance=balance-100 where cId=‘0002‘

--回滚

--SQL语句

--判断 没错

    --提交

--有错

    --回滚

   
begin transaction

    --SQL语句

    --利用一个变量进行记录

if-- 变量没有问题

    commit transaction

else

    rollback transaction

update bank set balance=balance+100 where cId=‘0001‘

update bank set balance=balance-100 where cId=‘0002‘

begin transaction

declare @iserror int

set @iserror=0

update bank set balance=balance-10 where cId=‘0002‘;

set @[email protected][email protected]@ERROR

update bank set balance=balance+10 where cId=‘0001‘;

set @[email protected][email protected]@ERROR

if @iserror=0

  begin

    commit-- transaction

  end

else

  begin

    rollback --transaction

  end

--try_catch模式

begin transaction

begin try

    update bank set balance = balance - 10 where cid = ‘0002‘;

    update bank set balance = balance + 10 where cid = ‘0001‘;

    commit

end try

begin catch

    rollback

end catch

--定义存储过程

--定义一个简单的存储过程(演示)

create proc usp_money

as

begin transaction

begin try

    update bank set balance = balance - 10 where cid = ‘0002‘;

    update bank set balance = balance + 10 where cid = ‘0001‘;

    commit

end try

begin catch

    rollback

end catch

exec usp_money--执行存储过程

create proc usp_sum

as

declare @i int

declare @sum int

set @i=1

set @sum=0

while @i<=100

begin

   set @[email protected][email protected]

   set @[email protected]+1

end

select @sum

exec usp_sum

create proc usp_ReturnSum

    @min int,

    @max int,

    @sum int output

as

    declare @i int

    declare @ss int

    set @i = @min

    set @ss = 0

    while @i <= @max

    begin

        set @ss = @ss + @i

        set @i = @i + 1

    end

    set @sum = @ss

   
--使用这个存储过程

--使用这个存储过程

declare @sum int

exec usp_ReturnSum 1, 1000, @sum output

--触发器

create trigger tr1 on bank
for delete
as
begin
  insert into bank select * from deleted--把删除的数据有重新加进去
end

create trigger tr2 on bank
instead of update
as
begin
  declare @money int
  declare @old int
  select @money=balance from inserted
  select @old=balanec from deleted
  set @[email protected]@old
  update bank set [email protected] where cid=‘0002‘

end

--面试题

create table Score

(

    学号 nvarchar(10),

    课程 nvarchar(10),

    成绩 int

)

insert into Score values(‘0001‘,‘语文‘,87);

insert into Score values(‘0001‘,‘数学‘,79);

insert into Score values(‘0001‘,‘英语‘,95);

insert into Score values(‘0002‘,‘语文‘,69);

insert into Score values(‘0002‘,‘数学‘,84);

转化为:

学号  语文 数学 英语

0001  87    79   95

0002  69    84   null

select 学号,

    sum(case 课程 when ‘数学‘ then 成绩 end) as 数学,

    sum(case 课程 when ‘英语‘ then 成绩 end) as 英语,

    sum(case 课程 when ‘语文‘ then 成绩 end) as 语文

from dbo.Score20120611

group by 学号

分析:

//首先根据学号进行分组,select 学号,group by 学号

//因为分组。所以查询的结果只能包含学号字段和聚合函数 select 学号,sum(),因为每个学生的每个课程只有一个值,使用使用sum时,不会对原值输出不会产生影响

//使用case来控制课程的显示方法,用成绩列中的值来替换课程列中的具体课程 ,结果使用as课程名 作为新的列名

select 学号,

    min(case when 课程 = ‘数学‘ then 成绩 end) 数学,

    avg(case when 课程 = ‘英语‘ then 成绩 end) 英语,

    avg(case when 课程 = ‘语文‘ then 成绩 end) 语文

from dbo.Score20120611

group by 学号

CowNewSQL支持的函数:

函数名(别名)   说明例子

ABS 绝对值ABS(-1)

ACOS 反余弦ACOS(1)

ADD_DAYS

ADDDAYS

将日期增加指定个天数ADDDAYS

(now(),3)

ADD_HOURS

ADDHOURS

将日期增加指定个小时数ADDHOURS

(now(),3)

ADD_MINUTES

ADDMINUTES

将日期增加指定个分钟数ADDMINUTES

(now(),3)

ADD_MONTHS 将日期增加指定个月数ADD_MONTHS(no

w(),3)

ADD_SECONDS

ADDSECONDS

将日期增加指定个秒数ADDSECONDS

(now(),3)

ADD_YEARS

ADDYEARS

将日期增加指定个年数ADDYEARS(now()

,3)

ASCII 取得字符的ASCII值。ASCII(‘a’)

ASIN 反正弦ASIN(1)

ATAN 反正切ATAN(1)

ATN2/ATAN2 反正切ATAN2(1,2)

AVG 聚合函数,返回表达式的平均值。AVG(FCount)

CEILING/CEIL 返回大于或等于所给数字表达式的最小整数。CEIL(2.3)

CHARINDEX 返回字符串中指定表达式的起始位置。CHARINDEX

( expression1 , expression2)。expression1一个表达式,其中

包含要寻找的字符的次序。expression2 一个表达式,通常

是一个用于搜索指定序列的列。

CHARINDEX(‘very

cd’,’w’)

CHR 取得数字对应的字符(ASCII的反函数) CHR(80)

CONCAT 连接两个字符串。CONCAT(‘hi’,’worl

d’)

CONVERT 进行数值类型转换。格式CONVERT(类型,值),“类型”可

取值为:CHAR、VARCHAR、NCHAR、NVARCHAR、

DATETIME、DATE、INT、DECIMAL。

CONVERT

(‘INT’,’3’)、

CONVERT

(‘DATE’,’2008-

08-08’)、CONVERT

(‘VARCHAR’,3)

COS 余弦COS(1)

COT 余切COT(1)

COUNT 聚合函数,返回组中项目的数量。COUNT(*)

CURDATE 取当前日期CURDATE()

CURTIME 去当前时间CURTIME()

DATEADD 、

DATE_ADD

在向指定日期加上一段时间的基础上,返回新的datetime

值。DATEADD ( datepart , number, date )。datepart是规定应

向日期的哪一部分返回新值的参数,有如下取值“Year(缩

写yy, yyyy)”、“quarter(缩写qq, q)” 、“Month(缩写mm,

m)” 、“dayofyear(缩写dy, y)” 、“Day(缩写dd, d)” 、

“Week(缩写wk, ww)” 、“Hour(缩写hh)” 、“minute

(缩写mi, n)” 、“second(缩写ss, s)” 、“millisecond(缩

写ms)”。number 是用来增加datepart 的值。date 是返回

datetime 或smalldatetime 值或日期格式字符串的表达式。

DateADD(month,3,

Now())

DATEDIFF 、

DATE_DIFF

返回跨两个指定日期的日期和时间边界数。DATEADD 。

datepart 是规定了应在日期的哪一部分计算差额的参数,取

值同“DATEADD”。startdate是计算的开始日期。enddat是

计算的终止日期。

DATEDIFF(day,

pubdate, getdate())

DATENAME 返回代表指定日期的指定日期部分的字符串。DATENAME

( datepart , date )。datepart是指定应返回的日期部分的参数,

取值同“DATEADD”。

DATENAME

(q,now())

DAYNAME 返回指定日期是星期几。DAYNAME(bdate)

DAYOFMONTH 返回代表指定日期的在一个月中的天数。DAYOFMONTH(no

w())

DAYOFWEEK 返回代表指定日期的在一周中的天数。DAYOFWEEK

(now())

DAYOFYEAR 返回代表指定日期的在一年中的天数。DAYOFYEAR

(now())

DAYS_BETWEEN

DAYSBETWEEN

返回两个日期之间的天数间隔DAYSBETWEEN(d

2,d2)

DEGREE

DEGREES

弧度转角度DEGREE(2)

EXP 自然指数EXP(2)

FLOOR 返回小于或等于所给数字表达式的最大整数。FLOOR(-2.4)

HOUR 返回指定日期的小时部分HOUR(now())

ISNULL

NVL

使用指定的替换值替换NULL 。ISNULL

( check_expression , replacement_value ) :check_expression

将被检查是否为NULL 的表达式;replacement_value 在

check_expression 为NULL 时将返回的表达式。如果

check_expression 不为NULL,那么返回该表达式的值;否

则返回replacement_value。

ISNULL(f1,f2) 、

NVL (f1,f2)

LCASE

LOWER

返回指定字符串的小写形式。LCASE(‘aBcD’) 、

LOWER(‘1AAcB’)

LEFTSTR 返回从字符串左边开始指定个数的字符。LEFT

( character_expression , integer_expression ) 。

LEFTSTR(‘abcd’,2)

LENGTH

LEN

返回给定字符串表达式的字符(而不是字节)个数。LENGTH(‘123’) 、

LEN(‘012’)

LOG 求自然对数LOG(3)

LOG10 求以10 为低的对数LOG10(4)

LTRIM 删除起始空格后返回字符表达式。LTRIM(‘ aa f ’)

MAX 聚合函数,返回表达式的最大值。MAX(price)

MIN 聚合函数,返回表达式的最小值。MIN (price)

MINUTE 返回指定日期的分钟部分MINUTE (now())

MOD 整除3 MOD 4

MONTH 返回指定日期的月份部分MONTH (now())

MONTHNAME 返回指定日期的月份的名称MONTHNAME

(now())

MONTHS_BETWEE

N

MONTHSBETWEE

N

返回两个日期之间的月份间隔MONTHS_BETWE

EN(d1,d2)

取得当前时间:

NOW

GETDATE

TODAY

取得当前时间NOW()

NULLIF 如果两个指定的表达式相等,则返回空值。NULLIF

( expression , expression ):如果两个表达式不相等,NULLIF

返回第一个expression 的值。如果相等,NULLIF 返回第

一个expression 类型的空值。

NULLIF(f1、f2)

PI 取圆周率PI()

POWER

POW

求a 的b次方POWER(3,5)

QUARTER 返回指定日期的季度部分QUARTER(now())

RADIANS 角度转弧度RADIANS(3)

RAND 取得随机数。如果没有参数,则返回0..1 之间的一个随机数,

如果有参数则返回大于0、小于指定参数的一个随机数。

RAND() 、

RAND(108)

REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第

二个给定字符串表达式。REPLACE ( ‘string_expression1‘ ,

‘string_expression2‘ , ‘string_expression3‘ )

REPLACE(‘abc%12

3%www’,’%’,’@’)

RIGHTSTR 返回字符串中从右边开始指定个数的integer_expression

字符。RIGHT ( character_expression , integer_expression )。

RIGHTSTR(‘aaaa’,

2)

ROUND 四舍五入,第一个参数表示要进行四舍五入的值,第二个表

示要取的精度

ROUND(3.38332,3)

RTRIM 截断所有尾随空格后返回一个字符串。RTRIM (‘ aa f ’)

SECOND 返回指定日期的秒部分SECOND (now())

SIGN 取一个数的符号,如果此数为正数则返回1,为负数则返回

-1,为0则返回0.

SIGN(-8)

SIN 正弦SIN(3)

SOUNDEX 返回由四个字符组成的代码(SOUNDEX) 以评估两个字符

串的相似性。SOUNDEX ( character_expression )

SOUNDEX(‘cowne

w’)

SQRT 开方SQRT(3)

SUBSTRING

SUBSTR

返回字符串表达式的一部分。SUBSTRING ( expression ,

start , length ):expression是字符串表达式;start 是一个整

数,指定子串的开始位置;length是一个整数,指定子串的

长度(要返回的字符数或字节数)。

SUBSTRING(‘ok

aha’,1,3)

SUM 聚合函数,返回表达式中所有值的和。SUM(amount)

TAN 正切TAN(1)

TO_DATE

TODATE

将指定的数值转换为日期类型TODATE(‘2008-08-

08’)

TO_INT

TOINT

将指定的值转换为整数类型。TOINT(3.14) 、

TO_INT(‘3.65’)

TO_NUMBER

TONUMBER

将指定的值转换为数值类型。TO_NUMBER(‘3.1

4’)

TOCHAR

TO_CHAR

将指定的值转换为字符串类型。TOCHAR(33) 、

TO_CHAR (33)

TRIM 截断开头和结尾的空格后返回一个字符串。TRIM (‘ aa f ’)

UCASE

UPPER

返回指定字符串的大写形式。UCASE (‘aBcD’)、

UPPER (‘1AAcB’)

WEEK 返回指定日期的在一年中的第几周WEEK (now())

YEAR 返回指定日期的年部分,4 位数YEAR (now())

case 函数的用法:

select sName,

case

      when sAge <18 then ‘未成年人‘--在用字段做表达式判断的时候用这样模式

      when sAge >=18 then ‘成年人‘

      else ‘未知‘

end as 年龄,

sId,

case sGender

     when 1 then ‘男‘--用字段的特定值做判断的时候用这种模式

     when 0 then ‘女‘

     else ‘未知‘

end as性别

from Student

IF()函数:

使用CASE函数可以实现非常复杂的逻辑判断,可是若只是实现“如果符合条件则返回

A,否则返回B”这样简单的判断逻辑的话,使用CASE函数就过于繁琐,如下:

CASE

WHEN condition THENA

ELSE B

END

MYSQL提供了IF()函数用于简化这种逻辑判断,其语法格式如下:

IF(expr1,expr2,expr3)

如果expr1 为真(expr1 <> 0 以及expr1 <> NULL),那么IF() 返回expr2,否则返回

expr3。IF()返回一个数字或字符串,这取决于它被使用的语境。

这里使用IF()函数来判断一个人的体重是否太胖,而如果体重大于50则认为太胖,否则

认为正常:

SELECT

FName,

FWeight,

IF(FWeight>50,‘太胖‘,‘正常‘) AS ISTooFat

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FName FWeight ISTooFat

Tom 56.67 太胖

Jim 36.17 正常

MYSQL中计算年龄:

select 学号,姓名,(year(getdate())-year(出生日期))AS年龄 from 学生表

select datediff(year,brith,getdate()) as年龄

程序员的SQL金典 第120页

日期时间函数:

在 Oracle 中以字符串表示的数据是不能自动转换为日期时间类型的,必须使用

TO_DATE()函数来手动将字符串转换为日期时间类型的,比如TO_DATE(‘2008-08-08‘,

‘YYYY-MM-DD HH24:MI:SS‘)

取得当前日期时间:

MYSQL:

MYSQL中提供了NOW()函数用于取得当前的日期时间,NOW()函数还有SYSDATE()、

CURRENT_TIMESTAMP等别名。如下:

SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP

执行完毕我们就能在输出结果中看到下面的执行结果:

NOW() SYSDATE() CURRENT_TIMESTAMP

2008-01-12 01:13:19 2008-01-12 01:13:19 2008-01-12 01:13:19

如果想得到不包括时间部分的当前日期,则可以使用CURDATE()函数,CURDATE()

函数还有CURRENT_DATE等别名。如下:

SELECT CURDATE(),CURRENT_DATE

执行完毕我们就能在输出结果中看到下面的执行结果:

CURDATE() CURRENT_DATE

2008-01-12 2008-01-12

如果想得到不包括日期部分的当前时间,则可以使用CURTIME()函数,CURTIME ()

函数还有CURRENT_TIME等别名。如下:

SELECT CURTIME(),CURRENT_TIME

执行完毕我们就能在输出结果中看到下面的执行结果:

CURTIME() CURRENT_TIME

01:17:09 01:17:09

MSQLServer:

MSSQLServer 中用于取得当前日期时间的函数为GETDATE()

SELECT GETDATE() as 当前日期时间

执行完毕我们就能在输出结果中看到下面的执行结果:

当前日期时间

2008-01-12 01:02:04.78

Convert()函数:MSSQLServer 没有专门提供取得当前日期、取得当前时间的函数,不过我们可以将

GETDATE()的返回值进行处理,这里需要借助于Convert()函数

CONVERT(VARCHAR(50) ,日期时间值, 101)可以得到日期时间值的日期部分

SELECT CONVERT(VARCHAR(50) ,GETDATE( ), 101) as 当前日期

执行完毕我们就能在输出结果中看到下面的执行结果:

当前日期

01/14/2008

SELECT CONVERT(VARCHAR(50) ,GETDATE(), 108) as 当前时间

执行完毕我们就能在输出结果中看到下面的执行结果:

当前时间

21:37:19

Oracle:

Oracle 中没有提供取得当前日期时间的函数,不过我们可以到系统表DUAL 中查询

SYSTIMESTAMP的值来得到当前的时间戳。如下:

SELECT SYSTIMESTAMP

FROM DUAL

执行完毕我们就能在输出结果中看到下面的执行结果:

SYSTIMESTAMP

2008-1-14 21.46.42.78000000 8:0

我们可以到系统表DUAL中查询SYSDATE 的值来得到当前日期时间

SELECT SYSDATE

FROM DUAL

执行完毕我们就能在输出结果中看到下面的执行结果:

SYSDATE

2008-01-14 21:47:16.0

Oracle中也没有专门提供取得当前日期、取得当前时间的函数,不过我们可以将

SYSDATE 的值进行处理,这里需要借助于TO_CHAR()函数

TO_CHAR(时间日期值, ‘YYYY-MM-DD‘) 可以得到日期时间值的日期部分,因此下

面的SQL语句可以得到当前的日期值:

SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD‘)

FROM DUAL

执行完毕我们就能在输出结果中看到下面的执行结果:

TO_CHAR(SYSDATE,YYYY-MM-DD)

2008-01-14

使用TO_CHAR(时间日期值, ‘HH24:MI:SS‘) 可以得到日期时间值的时间部分,因此下

面的SQL语句可以得到当前的日期值:

SELECT TO_CHAR(SYSDATE, ‘HH24:MI:SS‘)

FROM DUAL

执行完毕我们就能在输出结果中看到下面的执行结果:

TO_CHAR(SYSDATE,HH24:MI:SS)

21:56:13

其他的相关日期函数:

DATENAME(datepart,date):

SELECT

FBirthDay,

DATENAME(year,FBirthDay) AS y,

DATENAME(dayofyear,FBirthDay) AS d,

DATENAME(week,FBirthDay) AS u

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FBirthDay y d u

1981-03-22 00:00:00.0 1981 81 13

1987-01-18 00:00:00.0 1987 18 4

DATEPART (datepart,date):

SELECT FBirthDay, DATEPART(Dayofyear,FBirthDay),

FRegDay, DATEPART(Year, FRegDay)

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FBirthDay FRegDay

1981-03-22 00:00:00.0 81 1998-05-01 00:00:00.0 1998

1987-01-18 00:00:00.0 18 1999-08-21 00:00:00.0 1999

日期增减:

DATEADD (datepart , number, date ):

DATEADD(DAY, 3,date) 为计算日期date 的3 天后的日期, 而

DATEADD(MONTH ,-8,date)为计算日期date的8 个月之前的日期。

DATE_FORMAT(date,format):

SELECT

FBirthDay,

DATE_FORMAT(FBirthDay,‘%y-%M %D %W‘) AS bd,

FRegDay,

DATE_FORMAT(FRegDay,‘%Y年%m月%e日‘) AS rd

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FBirthDay bd FRegDay rd

1981-03-22 00:00:00 81-March 22nd

Sunday

1998-05-01 00:00:00 1998 年05月1 日

1987-01-18 00:00:00 87-January 18th

Sunday

1999-08-21 00:00:00 1999 年08月21 日

oracle:TO_CHAR()

SELECT FBirthDay,

TO_CHAR(FBirthDay, ‘YYYY-MM-DD‘) as yyymmdd,

FRegDay,

TO_CHAR(FRegDay, ‘DD-YYYY-MM‘) as ddyyyymm

FROM T_Person

SELECT FBirthDay,

TO_CHAR(FBirthDay, ‘YYYY‘) as yyyy,

TO_CHAR(FBirthDay, ‘MM‘) as mm,

TO_CHAR(FBirthDay, ‘MON‘) as mon,

TO_CHAR(FBirthDay, ‘WW‘) as ww

FROM T_Person

FBIRTHDAY YYYMMDD FREGDAY DDYYYYMM

1981-03-22

00:00:00.0

1981-03-22 1998-05-01

00:00:00.0

01-1998-05

1987-01-18

00:00:00.0

1987-01-18 1999-08-21

00:00:00.0

21-1999-08

执行完毕我们就能在输出结果中看到下面的执行结果:

FBIRTHDAY YYYY MM MON WW

1981-03-22

00:00:00.0

1981 03 3月12

1987-01-18

00:00:00.0

1987 01 1月03

计算日期差额:

MYSQL中使用DATEDIFF()函数用于计算两个日期之间的差额,其参数调用格式如下:

DATEDIFF(date1,date2)

函数将返回date1与date2之间的天数差额,如果date2在date1之后返回正值,否则返回负

值。

比如下面的SQL语句用于计算注册日期和出生日期之间的天数差额:

SELECT FRegDay,FBirthDay, DATEDIFF(FRegDay, FBirthDay) ,

DATEDIFF(FBirthDay ,FRegDay)

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FRegDay FBirthDay DATEDIFF(FRegDay,

FBirthDay)

DATEDIFF(FBirthDay ,FRegDay)

1998-05-01

00:00:00

1981-03-22

00:00:00

6249 -6249

1999-08-21

00:00:00

1987-01-18

00:00:00

4598 -4598

MSSQLServer中同样提供了DATEDIFF()函数用于计算两个日期之间的差额,与MYSQL

中的DATEDIFF()函数不同,它提供了一个额外的参数用于指定计算差额时使用的单位,其

参数调用格式如下:

DATEDIFF ( datepart , startdate , enddate )

其中参数datepart为计算差额时使用的单位,可选值如下:

单位别名 说明

year yy, yyyy 年

quarter qq, q 季度

month mm, m 月

dayofyear dy, y 工作日

day dd, d 天数

week wk, ww 周

Hour hh 小时

minute mi, n 分钟

second ss, s 秒

millisecond ms 毫秒

参数startdate为起始日期;参数enddate为结束日期。

select 学号,姓名,(year(getdate())-year(出生日期))AS年龄 from 学生表

select datediff(year,brith,getdate()) as年龄

在Oracle中,可以在两个日期类型的数据之间使用减号运算符“-”,其计算结果为两个

日期之间的天数差,比如执行下面的SQL语句用于计算注册日期FRegDay和出生日期

FBirthDay之间的时间间隔:

SELECT FRegDay,FBirthDay,FRegDay-FBirthDay

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FREGDAY FBIRTHDAY FREGDAY-FBIRTHDAY

1998-05-01 00:00:00.0 1981-03-22 00:00:00.0 6249

1999-08-21 00:00:00.0 1987-01-18 00:00:00.0 4598

2001-09-

Oracle中可以直接使用加号“+”来进行日期的加法运算,其计算单位为“天”,比如date+3

就表示在日期date的基础上增加三天;同理使用减号“-”则可以用来计算日期前的特定时间

段的时间,比如date+3就表示在日期date的三天前的日期。比如下面的SQL语句用于计算每

个人出生日期3天后以及10天前的日期:

SELECT FBirthDay,

FBirthDay+3,

FBirthDay-10

FROM T_Person

DB2中提供了DAYS()函数,这个函数接受一个时间日期类型的参数,返回结果为从0001

年1月1日到此日期的天数

借助于DAYS()函数我们可以轻松计算两个日期之间的天数间隔,很显然

DAYS(date1)-DAYS(date2)的计算结果就是日期date1和日期date2之间的天数间隔,比如下面

的SQL语句用于计算出生日期FBirthDay与注册日期FRegDay之间的天数间隔:

SELECT FBirthDay,FRegDay,

DAYS(FRegDay)-DAYS(FBirthDay)

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FBIRTHDAY FREGDAY 3

1981-03-22 1998-05-01 6249

1987-01-18 1999-08-21 4598

REPLICATE ()函数:

REPLICATE ()函数用来得到一个子字符串重复了若干次所组成的字符串,它和MYSQL

中的REPEAT()函数是一样的,其参数格式如下:

REPLICATE (str,count)

参数str为子字符串,而count为重复次数。

下面的SQL语句用于将每个人的姓名重复n次,n等于体重与20的整除结果:

SELECT FName,FWeight,

CAST(FWeight/20 AS INT),

REPLICATE(FName, CAST(FWeight/20 AS INT))

FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:

FName FWeight

Tom 56.67 2 TomTom

Jim 36.17 1 Jim

Lily 40.33 2 LilyLily

和MYSQL一样,MYSQL中同样提供了一个简化REPLICATE ()调用的函数SPACE(N),

它用来得到一个有N 空格字符组成的字符串,可以看做是REPLICATE (‘ ‘,N)的等价形式。

字符串颠倒:

REVERSE()函数用来将一个字符串的顺序颠倒,下面的SQL语句将所有人员的姓名进行

了颠倒:

SELECT FName, REVERSE(FName)

FROM T_Person

ISDATE()函数:

ISDATE()函数用来确定输入表达式是否为有效日期。如果输入表达式是有效日期,那

么ISDATE 返回 1;否则,返回 0。其参数格式如下:

ISDATE ( expression )

expression参数为要验证其是否为日期的表达式。expression可以是text、ntext 表达式

和image 表达式以外的任意表达式,可以隐式转换为nvarchar。

下面的SQL语句演示了这个函数的使用:

SELECT

ISDATE(NULL) as d1,

ISDATE(‘13/43/3425‘) as d2,

ISDATE(‘1995-10-1a‘) as d3,

ISDATE(19920808) as d4,

ISDATE(‘1/23/95‘) as d5,

ISDATE(‘1995-10-1‘) as d6,

ISDATE(‘19920808‘) as d7,

ISDATE(‘ Abc‘) as d8

执行完毕我们就能在输出结果中看到下面的执行结果:

d1 d2 d3 d4 d5 d6 d7 d8

0 0 0 1 0 1 1 0

ISNUMERIC ()函数:

用来确定表达式是否为有效的数值类型。如果输入表达式的计算值

为有效的整数、浮点数、money 或decimal 类型时,ISNUMERIC 返回 1;否则返回 0。

其参数格式如下:

ISNUMERIC ( expression )

expression参数为要计算的表达式。下面的SQL语句演示了这个函数的使用:

SELECT

ISNUMERIC(NULL) as d1,

ISNUMERIC(‘13/43/3425‘) as d2,

ISNUMERIC(‘30a.8‘) as d3,

ISNUMERIC(19920808) as d4,

ISNUMERIC(‘1/23/95‘) as d5,

ISNUMERIC(‘3E-3‘) as d6,

ISNUMERIC(‘19920808‘) as d7,

ISNUMERIC(‘-30.3‘) as d8

执行完毕我们就能在输出结果中看到下面的执行结果:

d1 d2 d3 d4 d5 d6 d7 d8

0 0 0 1 0 1 1 1

索引:

索引用来提高数据的检索速度,而约束则用来保证数据的完整性。

索引是针对字段的,因此创建索引索引的时候需要指定要在那个字段上创建索引,还可

以为多个字段创建一个索引,这样还可以指定索引相关的字段列表。创建索引的SQL 语句

是CREATE INDEX,其语法如下:

CREATE INDEX 索引名ON 表名(字段1, 字段2,……字段n)

其中【索引名】为被创建的索引的名称,这个名称必须是唯一的;【表名】为要创建索

引的表;【字段1, 字段2,……字段n】为组成这个索引的字段列表,允许一到多个。

下面的SQL语句在T_Person表的FName字段上创建索引,索引名为idx_person_name:

CREATE INDEX idx_person_name ON T_Person(FName)

下面的SQL 语句在T_Person 表的FName 和FAge 字段上创建索引,索引名为

idx_person_nameage:

CREATE INDEX idx_person_nameage ON T_Person(FName,FAge)

索引创建后是可以被删除的,删除索引使用的语句为DROP INDEX。不同的数据库系

统的DROP INDEX 语法是不同的,下面分别介绍:

MYSQL中的DROP INDEX 语法如下:

DROP INDEX 索引名ON 表名

比如下面的SQL语句用来删除刚才我们创建了两个索引:

DROP INDEX idx_person_name ON T_Person;

DROP INDEX idx_person_nameage ON T_Person;

MSSQLServer 中的DROP INDEX 语法如下:

DROP INDEX 表名.索引名

比如下面的SQL语句用来删除刚才我们创建了两个索引:

DROP INDEX T_Person.idx_person_name;

DROP INDEX T_Person.idx_person_nameage;

Oracle和DB2中的DROP INDEX 语句不要求指定表名,只要指定索引名即可,语法如

下:

DROP INDEX 索引名

比如下面的SQL语句用来删除刚才我们创建了两个索引:

DROP INDEX idx_person_name;

DROP INDEX idx_person_nameage;

 

时间: 2024-10-10 05:58:50

SQL SEVER 笔记誊录的相关文章

ASP.NET笔记誊录

元数据:代码中二进制级别达到重用,包括IL代码,类的属性,字段方法,程序集,资源等各种数据 VS中的的代码智能提示就是反射元数据来获取的,是这个.net中代码中灵魂 sqlconnection连接池(list集合,放在内存中):保存内连接对象 内连接对象跟连接字符串相关,当sqlconnection conn=new sqlconnection(strConn1) 就会创建一个内连接对象,此时会根据对象的连接的字符串去sqlconnection连接池中查看是否有该对象,如果有则取出来用.没有则创

ASP.NET MVC笔记誊录

非托管代码:像由c++写的程序直接把二进制代码交给操作系统的内核来处理,叫做非托管代码 托管代码:运行在CLR下面的代码叫托管代码,由CLR来对代码进行异常等处理,编译成平台代码 匿名函数: public delegate int AddDel(int a,int b); 简单委托: AddDel delDemo=new AddDel(AddInt) public int AddInt(int a,int b) { return a+b; } 泛型委托,一般用于约束返回值和传入的参数 publi

C#笔记誊录

1.继承 面向对象的三大特征: 封装性 继承性  多态性 一.继承:类与类的关系 为什么会用继承:减少代码重复 优化 空间内存 实现多态  class 基类 { //基类成员 } class 子类:基类 { //子类成员 } 判断继承关系 用进行进行判断-->子类对象 is 父类成员 例如 诺基亚手机  诺基亚280  诺基亚板砖007 继承特征 :1.单根性  一个只能继承自一个类 不可能继承俩个类                  2.传递性   爷爷 父亲 孙子              

JavaScript Dom 笔记誊录

DOM:文档对象模型 Dhtml:javascript+css+html(dom) 为什么要使用Dom: 1.HTML页面动态化 2.提升用户交互型 2. 1.document.getEelmentById 可以通过对象的id属性来获取该元素对象 2.document.getElementsByTagName 可以通过元素的标签名得到一组元素对象的数组 3.document.getElementsByName 根据元素的name属性来获得该一组对象的数组,一般节点都具有name属性 docume

JQuer笔记誊录

jQuery=$ 2者相等 $是顶级的对象,就像dom中的window jQuery中最常用的对象即$对象,要想使用jQuery的方法必须通过$对象.只有将普通的Dom对象封装成jQuery对象,然后才能调用jQuery中的各种方法. $是jQuery简写,在代码中可以使用jQuery代替$,但一般为了方便大家都直接使用$. 通过js实现的页面加载完毕的执行代码的方式与JQuery的区别: 需求:页面加载完毕后弹出"加载完毕!". 通过window.onload实现. 通过jQuery

JavaScript笔记誊录

js:一种脚本语言.客户端语言 1.代码都写在<script></script>标签中 2.外部引用<script type="text/javascript" src=""></script> 变量命名规则 -> 严格区分大小写 ->与C#类似,多一个,可以使用$开头 大小写敏感,弱类型var -> 注释    // 与 /**/    (<!--  -->) -> 需要写JS,代

HTML笔记誊录

www.w3school.com.cn网站 ctrl+k+d 页面源码对齐 注释不允许嵌套 <!--你好--> <!--你还 nihao nihao nihao --> <!--你还 nihao nihao <!-- nihao --> nihao --> //注释不允许嵌套 /* 注释的内容 */ 字体分为逻辑字体和物理字体 推荐使用逻辑字体(效率较高) <(<) >(>)  (空格) <font size="7&q

C#笔记誊录&lt;二&gt;

c#编译器把源码编译成IL(中间)代码,再由CLR通过即时编译器把IL代码编译成本机机器语言(平台语言) www.webkaka.com//测试服务器的网速 ctrl+k+d 代码对其 CTRL+K+S #REGION代码折叠 ctrl+r+e 连敲2个回车:封装字段 shift+alt+f10:实现接口 XML序列化:把对象写到XML文档中 标识某个对象的某个字段不能被序列化,只要把[XmlIgnoreAttribute]放在某个字段前面 二进制流序列化:把对象序列化成二进制流进行网络传输 标

三层架构笔记誊录

html:提供内容 css:提供美化.样式 js:提供控制.效果 饭馆: 服务员.厨师.采购员 菜 三层: 表示层(ui):和用户交互 业务逻辑层(bll):提供具体的业务逻辑,隔离UI和DAL(做一些判断,把UI中输入的数据和DAL层返回的数据做处理) 数据访问层(dal):操作数据库 实体(model):在三层中传递数据 为什么要用三层: 创建三层: 1.创建一个空的解决方案 2.创建三个类库项目(model:ItcastSIMModel.dal:ItcastSIMDAL.bll:Itcas