数据库:
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;