SQL语句实战大全

--SQL SERVER--- 面试前复习总结

SELECT * FROM T_Person
-----新增数据-------

----第一种写法--指定列-----
insert into T_Person (FName,FAge,FRemark) values ('邵石泉',18,'建设工程师')

insert into T_Person(FName,FAge,FRemark)values('李小龙',27,'武术家')

insert into T_Person(FName,FAge,FRemark)values('刘德华',27,'哥手')

insert into T_Person(FName,FAge,FRemark)values('成龙',27,'功夫巨星')

 

----第二种写法--不指定列----

insert into T_Person values('邵世铨',26,'软件工程师')

 

--总结:个人 认为使用第一种写法,结构清晰能清楚的知道对应的值对应的是那个字段--

---非空的值不允许插入空值
--如:

insert into T_Person values('李霞',19)

 


--会报这样的错误:
--消息 213,级别 16,状态 1,第 1 行
--列名或所提供值的数目与表定义不匹配。

select * from T_DEBT
------主键---------
insert into T_DEBT (FNumber,FAmount,FPerson)values(1,'10000','邵世铨')
---主键具有唯一性-----当主键重复时候不能插入-----
insert into T_DEBT(FNumber,FAmount,FPerson)values(1,'2000000','刘德华')
---这样就可以插入了插入不同的主键就可以插入了--
insert into T_DEBT(FNumber,FAmount,FPerson)values(2,'3000000','李小龙')
---可以看到数据已经被正确的插入到了数据库中了(是不是?)

 

------修改数据-----
--语法:

--修改单个列
update T_Person set FRemark='无业游民'
--修改多个列,列与列之间用逗号隔开---
update T_Person set FRemark='有职业的',FAge=18

----修改指定的数据---加上where 条件----
--如:只修改“邵世铨”的
Update T_Person set FAge=26,FRemark='软件架构师'where FName='邵世铨'

Update T_Person set FRemark='看名字猜职业'where FAge=18

---where 中的或者

Update T_Person set FRemark='高级软件工程师' where FName='邵世铨'or FName='刘德华'

 


---删除SQL语句----

delete from T_Person

delete from T_Person

---带where 条件的语句
delete from T_Person where FAge=18

 

----删除表

Drop Table T_DEBT

Drop Table T_Person

 

---何为UnIon

--数据库知识的重点知识----是数据的检索(搜索)----

--新增加一个表

Create Table T_Emplpyee (FNamber varchar(20),FName varchar(20),FAge int,Fsalary Decimal(10,2),Primary key(FNamber))

select * from T_Emplpyee

 

--新增数据

insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('1','邵世铨',25,8500)
insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('2','刘德华',55,800500)
insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('3','周星驰',53,9000500)
insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('4','周润发',62,9008500)
insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('5','张学友',48,1000500)
insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('6','王一胖',25,2500)
insert into T_Emplpyee(FNamber,FName,FAge,Fsalary)values('7','李小八',19,1500)

 

--*表示所有的列

select *from T_Emplpyee
-----定义别名---as
select FNamber as 编号 ,FName as 姓名,FAge as 年龄,Fsalary as 工资 from T_Emplpyee
------也可以不加as----
select FNamber ID,FName Name,FAge 年龄,Fsalary 工资 from T_Emplpyee
----查询工资少于5000的人员
select * from T_Emplpyee where Fsalary<5000

 

----------------------------------------------------------SQL语句中的函数-------------------------------------------------------

---查询年龄最大的人
select Max(FAge) from T_Emplpyee

---查询年龄最小的值
select Min(FAge)from T_Emplpyee

---所有人工资的平均值
select AVG(Fsalary) from T_Emplpyee

---查询工资的总和
select SUM(Fsalary) from T_Emplpyee

----查询年龄小于25中 工资最高的人
select Max(Fsalary)from T_Emplpyee where FAge<25

---Count(*)与Count(FNamber)是否是等价的?
---先插入一条有区别的数据
insert into T_Emplpyee(FNamber,FName,Fsalary)values('8',22,800)

select Count(*) as 总条数,COUNT(FNamber) as 总ID,Count(FAge) as 有姓名的 from T_Emplpyee

 

---排序
--------------------------------------单列排序--------------------------------

--按年龄对数据进行排序
--年龄从小到大排序
select * from T_Emplpyee Order by FAge asc
--年龄从大到小排序
select * from T_Emplpyee Order by FAge Desc
----Order by 的默认排序方式是升序,默认情况可以不写asc
select * from T_Emplpyee Order by FAge
--asc:表升序
--Desc:降序

 

--------------------------------------多列排序--------------------------------
--比如按年龄从大到小排序的,然后年龄相同的按工资大小排序,可以多列,列与列之间用,号隔开(相同会首先安装FAge进行排序,发现遇到相同的无法判断哪个拍在前面就会安装第二个条件进行排序)

select * from T_Emplpyee Order by FAge desc,Fsalary desc

---Order By排序与Where一起使用(注意点Order By一定要放在Where后面,不然会报语法错误)
---错误的写法
select * from T_Emplpyee Order By FAge asc where FAge>19
---正确的写法
select * from T_Emplpyee where FAge>19 Order By FAge

 

--------------------------------------------------------
--高级数据过滤

--01:通配符过滤 like 关键字(通配符过滤功能强大,缺点:使用通配符过滤的时候会对数据库中的表进全表扫描,所以会导致速度比较慢,所以不要过分进行通配符过滤,能用其他方式实现的情况下尽量不要使用通配符过滤)
---单字符匹配
select * from T_Emplpyee where FType like '_eery'

select * from T_Emplpyee where FType like '_x_'
---多字符匹配
--匹配 FType中z开头长度任意的值
select * from T_Emplpyee where FType like 'z%'

select * from T_Emplpyee where FName like '周%'
--匹配FTtype中 含有x字母的值
select * from T_Emplpyee where FType like '%x%'

select * from T_Emplpyee where FName like '%周%'

----单字符通配符,多字符通配符组合使用()
select * from T_Emplpyee where FName like '%星_'

--集合匹配
--匹配 FType中首字母为b或者z的数据'[bz]%'
select * from T_Emplpyee where FType like '[bz]%'
--通过"^”来对于集合取反(匹配FType中开头第一个字母不是b,或者z)的
select * from T_Emplpyee where FType like '[^bz]%'

-----空值检测 (需要用is NULL来检测)
select * from T_Emplpyee
--例:如果检测姓名是空的数据
--错误的写法
select * from T_Emplpyee where FName=NULL
--正确的写法(检测姓名为空的所有数据)
select * from T_Emplpyee where FName is NULL
--检测使有的数据中TName中不为空的值
select * from T_Emplpyee where FName is not null
--is NULL 和 is Not NULL可以与其他的语句一起使用
--例:查找所有的用户中姓名不为空并且工资小于500的
select * from T_Emplpyee where FName is not Null and Fsalary<5000

 

----反意符运算

--!= 不等于,!< 不小于 !>不大于
--例:查询出年龄等于25,并且工资大于8000的数据
select * from T_Emplpyee where FAge!=25 and Fsalary>8000
-- 例:查询出年龄不大于60,并且工资大于5000的数据
select * from T_Emplpyee where FAge!>60 and Fsalary>5000
--例如:查询年龄不小于20的,工资不小于3000的
select * from T_Emplpyee where FAge!<20 and Fsalary !<3000

---否定语句上都有同意运算符 --不等于:大于或者小于,!>:不大于:小于等于,!< 不小于就是大于等于
--例:查询出年龄!等于25,并且工资不大于8000的数据
select * from T_Emplpyee where FAge<>25 and Fsalary<=8000
--例:查询出年龄不大于60,并且工资大于5000的数据
select * from T_Emplpyee where FAge<=60 and Fsalary>5000
--例如:查询年龄不小于20的,工资不小于3000的
select * from T_Emplpyee where FAge>=20 and Fsalary>=3000
--还可以用Not来取反
--例如:查询年龄不小于20的,工资不小于3000的
select * from T_Emplpyee where Not (FAge<20) and Not (Fsalary<3000)

--总结:推荐使用 Not表示非。使用!(只能在MsSqlserver,DB2数据库上运行),使用同意运算符容易因为认为的原因导致Bug。

 

--多值检测(OR)

--笨的方法:
select * from T_Emplpyee where FAge=25 or FAge=53 or FAge=62

--聪明的方法(使用方法:用in(值1,值2,值3........)
select * from T_Emplpyee where FAge in (25,53,62)

select * from T_Emplpyee where FAge>=50 and FAge <=80

-----范围内的值的检测----(BetweeN and :Between 左范围值 and 右范围值:数据库对于BetWeen and进行了优化,对于范围查询时会比其他的范围查询方式性能更好,所以范围查询时应该有些使用BetWeen,
--注意点:Between and 在检测的时候包括了范围边界值:也就是闭区间,如果要使用开区间,或者半开区间就要使用其他方法啦)
--语法:
--例:检测年龄在20到60之间的用户
select * from T_Emplpyee where FAge Between 20 and 60
--多个范围的查询--
select * from T_Emplpyee where (FAge Between 20 and 50) and (Fsalary Between 300 and 9000)

---低效的Where 1=1(因为使用1=1会进行全扫描,导致查询数据变慢:优化方法:参考书籍58页代码)

--数据的分组(Group by:进行分组)
--单列
select FAge from T_Emplpyee Group by FAge
--注意点:Group by 必须放到(where 后面)
select Fsalary from T_Emplpyee where FAge>30 Group by Fsalary
--错误的写法
select FAge from T_Emplpyee Group by FAge where Fsalary>3000

--多列分组
select FAge,Fsalary from T_Emplpyee Group by FAge,Fsalary 
----利用分组来统计每个年龄段有多少人
select FAge,count(*) AS 数量 from T_Emplpyee Group by FAge
--统计每个公司的年龄段人数
select FsubCompany,FAge,count(*) as 公司人员年龄段分布 from T_Emplpyee Group by FsubCompany,FAge
--多次分组
select FsubCompany,FAge,COUNT(*)as 公司员工年龄 from T_Emplpyee Group by FsubCompany,FAge Order by FsubCompany

--SUM,AVG,MIN,MAX
--统计公司工资总和
select FsubCompany,SUM(Fsalary) as 工资总和 from T_Emplpyee Group by FsubCompany

--统计公司总部门的评价工资
select FDepartment,SUM(Fsalary) as 部门工资 from T_Emplpyee Group by FDepartment
--统计部门中年龄最大值和最小值
select FDepartment as 职业,MIN(FAge)as 年龄最小的,MAX(FAge)as 年龄最大的 from T_Emplpyee Group by FDepartment

---Having语句----Having语句不能再Where中使-----
--错误的写法
select FAge,count(*) as 年龄 from T_Emplpyee Group by FAge where count(*)>1
--正确的写法
select FAge,COUNT(*) as 年龄 from T_Emplpyee Group by FAge Having Count(*)>1
--Having也可以像Where一样使用复杂的过滤条件
--例:找出功能年龄个数=1个和3个的
select FAge ,Count(*) as 年龄 from T_Emplpyee Group by FAge Having COUNT(*)=1 or COUNT(*)=3
--也可以使用IN操作符来实现
select FAge,COUNT(*) as 年龄 from T_Emplpyee Group by FAge Having Count(*) in (1,3)

---总结 Having 语句 与Where 的相同点与不同定,相同点Where 和Having 使用的语法基本上一模一样,不同点 where 必须在 Group by 的前面,而且Having必须在 Group by 的后面。
--注意点:Having语句不能包含未分组的列名
--比如:错误的写法
select FAge,COUNT(*) as 年龄 from T_Emplpyee Group by FAge Having FName is Not Null
----需要用Where来代替 Having语句
select FAge,COUNT(*)as 年龄 from T_Emplpyee where FName is not Null Group by FAge

 

---------------------限制结果集行数---------------------------------------------

--返回从第二行开始排序的数据
select TOP 5 * from T_Emplpyee Order by Fsalary Desc

----这里需要扩充知识点
----回从65页看起------

----数据库分页--------实现数据库分页的核心技术就是:“限制结果集行数”(会了,跳过)

----联合结果集 :有时我们需要将两个完全不相关的两个表显示在一个结果中,这时候就需要用到联合结果集 Union :(原则是:1每个结果集必须要要相同的列数,2每个结果集的列必须内容相容)
--语法:select 列名 from 表名称01 Union select 列名 from 表名称02
--Union合并了两个查询结果集,其中完全重复的数据行被合并为一条数据
---如果要返回结果集中的所有数据行不管他是否重复,需要在Union后面加上all
--语法:select 列名 from 表名称01 Union all Select 列名 from 表名称02

 

----Union常用情况---如查询最大年龄和最小年龄

select '最大年龄',Max(FAge) from T_Emplpyee
Union
select '最小年龄',MIN(FAge) from T_Emplpyee

--程序所有人员工的工资并且在最后的一行中将工资全部加起来
select FNamber,Fsalary from T_Emplpyee Union Select '工资合计',Sum(Fsalary) From T_Emplpyee

--要求打印出5以内的自然数的平方
select 1 as 自然数,1*1 as 平方
Union
select 2,2*3
Union
select 3,3*3
Union
select 4,4*4
Union
select 5,5*5
Union
select 6,6*6

 

---数据库中的函数

--1:数学函数,2字符串函数,3日期函数,4其他函数
--SQL中的函数的功能包括字符串大小写的转换,求一个数的对数,计算两个日期之间的天数间阁等,数量的掌握这些函数将能帮助我们更快的完成业务功能。
--首先需要创建一个表然后进行数据库中函数的练习
--01:创建表的SQL:
Create Table T_Person(FIdNumber Varchar(20),FName varchar(20),FBirthDay DateTime,FRegDay DaTeTime ,FWeight Decimal(10,2))
--02:插入初始数据
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789120','李嘉诚','1929-03-12','1998-05-01',56.67);

insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789111','李小龙','1960-04-13','1978-01-19',68.89);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789122','成龙','1929-03-12','1998-05-01',33.47);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789133','卖价','1929-03-12','1998-05-01',44.67);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789144','许冠杰','1959-03-12','2008-05-01',66.77);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789155','许冠文','1969-03-12','2003-05-01',78.17);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789166','许冠英','1979-03-12','1995-05-01',89.27);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789177','钱小豪','1969-03-12','1996-05-01',66.37);
insert into T_Person(FIdNumber,FName,FBirthDay,FRegDay,FWeight)values('123456789188','钱嘉乐','1979-03-12','1997-05-01',53.47);

select * from T_Person

---01:数学函数
--a:求绝对值函数:"ABS()"函数用来返回一个数的绝对值,该函数接受一个参数,这个参数为求绝对值的参数,例:SQL语句如下:
select FWeight-50,ABS(FWeight-50),ABS(-5.38) from T_Person

--b:求指数:"Power()"函数用来计算指数函数,该函数接收两个参数,第一个为待求幂的表达式,第二个参数为幂。例:SQL语句如下:
select FWeight,POWER(FWeight,-0.5),POWER(FWeight,2),POWER(FWeight,3),POWER(FWeight,4) from T_Person

--c求平方根
--SQRT()函数是用来计算平方根的函数,该函数接受一个参数,这个参数为待计算平方根的表达式。例:SQL语句如下:
select FWeight,SQRT(FWeight)as 平方根 from T_Person

---生成随机数
select RAND();
--带参数
select RAND(56);
---去掉小数点后面的数,并且向大的数舍入
select * from T_Emplpyee

select FName,CEILING(Fsalary),Fsalary from T_Emplpyee


---舍入到最小整数FLOOR()函数
select FName,Fsalary,FLOOR(Fsalary) from T_Emplpyee

---四舍五入函数ROUND()函数:不像RAND()函数那样总是像最大的数舍入,也不像FLOOR()函数一样总是像小数字舍入,ROUND英文意思半径的意思
----ROUND可以带两个参数,ROUND(M,D)M为带四舍五入的数,D为精度。当D为0的时候就,则不保留小数位进行四舍五入,其中D也可以为负数,这时表示在整数部位进行四舍五入。

select * from T_Person

select FName,ROUND(FWeight,1)as 单个参数,ROUND(FWeight*-1,0)as 两个参数,ROUND(FWeight,-1) from T_Person

select ROUND(FWeight) from T_Person

---求正弦值 函数:SIN()可以带一个参数,这个参数为待计算正弦的表达式。
select FName,FWeight,SIN(FWeight)as 求正弦值 from T_Person

---求余弦值 COS()可以带一个参数,这个参数为待计算余弦值的表达式。
select FName,FWeight,COS(FWeight)as余弦值 from T_Person

--- 求反正弦值 ASIN()它接受一个参数,这个参数为待计算 反正弦值的表达式
Select FName,FWeight,ASIN(1/FWeight)as 反正弦值 from T_Person

---求反余弦值 函数ACOS(),它接收一个参数,这个参数为待计算反余弦值
Select FName,FWeight,ACOS(1/FWeight)as 反余弦值 from T_Person

----求正切值 函数TAN(),接一个参数,这个参数为待计算正切值的表达式
Select FName,FWeight,TAN(FWeight) from T_Person

----求反正切值 函数ATAN(),接收一个参数,这个参数为待计算正切值的表达式
Select FName,FWeight,ATAN(FWeight) from T_Person

----求两个个变量的反正切值 ATAN2 函数( 在 MYSQLServer 中这个函数名称为 ATN2)用来计算 2 个变量的反正切, 其使用格式为:ATAN2(X,Y),函数返回 2 个变量 X 和 Y 的反正切。它类似于计算 Y/X 的 反正切,除了两个参数的符号被用来决定结果的象限
SELECT FName,FWeight, ATN2(FWeight,2) FROM T_Person

--- 求余切 用来计算一个数值的反正切值的函数为 COT(),它接受一个参数,这个参数为待计算余 切值的表达式。
SELECT FName,FWeight, COT(FWeight) FROM T_Person

 

----求圆周率π值

----圆周率π值是一个恒定值,所以在使用它的时候可以使用 3.1415926……来引用它,不 过手工输入π值非常容易出错,在 MYSQL 和 MSSQLServer 中提供了 PI()函数用来取得圆 周率π值,这个函数不需要使用参数,在 Oracle 和 DB2 中不支持 PI()函数,不过根据-1 的 反余弦值等于π值的这一特性,我们可以用 ACOS(-1)来变通实现。 
SELECT FName,FWeight,FWeight * acos(-1) FROM T_Person

 

--- 弧度制转换为角度制

---用来将一个数值从弧度制转换为角度制的函数为 DEGREES (),它接受一个参数,这个 参数为待转换的表达式。在 Oracle 和 DB2 中不支持这个函数,不过根据: 角度制=弧度制*180/π 这一个特性,可以用变通方式来实现。 
SELECT FName,FWeight, DEGREES(FWeight) FROM T_Person

 

----角度制转换为弧度制 用来将一个数值从角度制转换为弧度制的函数为 RADIANS (),它接受一个参数,这个 参数为待转换的表达式。在 Oracle 和 DB2 中不支持这个函数,不过根据: 弧度制=角度制*π/180 这一个特性,可以用变通方式来实现。 执行下面的 

SQL 语句: 
SELECT FName,FWeight, RADIANS(FWeight) FROM T_Person

 

-----求符号 SIGN()函数用来返回一个数值的符号,如果数值大于 0 则返回 1,如果数值等于 0 则返 回 0,如果数值小于 0 则返回-1。该函数接受一个参数,这个参数为待求绝对值的表达式。 执行下面的 SQL 语句:

SELECT FName,FWeight-48.68,SIGN(FWeight-48.68) FROM T_Person

 

---- 求符号
--SIGN()函数用来返回一个数值的符号,如果数值大于 0 则返回 1,如果数值等于 0 则返 回 0,如果数值小于 0 则返回-1。该函数接受一个参数,这个参数为待求绝对值的表达式。 执行下面的 SQL 语句:

SELECT FName,FWeight-48.68,SIGN(FWeight-48.68) FROM T_Person

 

----求整除余数
--MOD()函数用来计算两个数整除后的余数。该函数接受两个参数,第一个参数为除数, 而第二个参数则是被除数。在 MYSQL 和 Oracle 中提供了对 MOD()函数的直接支持;在
--MSSQLServer 中不支持 MOD(),不过 MSSQLServer 中直接提供了操作符“%”用来计算两 个数的整除余数;DB2 中不支持求整除余数操作。 执行下面的 SQL 语句:

SELECT FName,FWeight,FWeight % 5 FROM T_Person

 

----求自然对数
--LOG ()函数用来计算一个数的自然对数值。该函数接受一个参数,此 参 数为 待 计算自然 对数的表达式,在 Oracle 中这个函数的名称为 LN()。 执行下面的 SQL 语句:

SELECT FName,FWeight, LOG(FWeight) FROM T_Person

 

----求以 10 为底的对数
-----LOG10()函数用来计算一个数的以 10 为底的对数值。该函数接受一个参数,此参数为 待计算对数的表达式,在 Oracle 中不支持这个函数,不过 Oracle 中有一个可以计算任意数 为底的对数的函数 LOG(m,n),它用来计算以 m为底 n 的对数,我们将 m设为常量 10 就可 以了。

SELECT FName,FWeight, LOG10(FWeight) FROM T_Person

 

---求幂
--POWER(X,Y)函数用来计算 X 的 Y 次幂。 执行下面的 SQL 语句:

SELECT FName,FWeight, POWER(1.18,FWeight) FROM T_Person

 

-------------字符串函数

----计算字符串长度
-- LENGTH()函数用来计算一个字符串的长度。该函数接受一个参数,此参数为待计算的 字符串表达式,在 MYSQLServer 中这个函数名称为 LEN()。 执行下面的 SQL 语句:

SELECT FName, LEN(FName) FROM T_Person 

 


---字符串转换为小写
--LOWER()函数用来将一个字符串转换为小写。该函数接受一个参数,此参数为待转换 的字符串表达式,在 DB2 中这个函数名称为 LCASE()。 执行下面的 SQL 语句: MYSQL,MSSQLServer,Oracle:

SELECT FName, LOWER(FName) FROM T_Person 

 


--字符串转换为大写
--与 LOWER()函数正好相反,UPPER ()函数用来将一个字符串转换为大写。该函数接受
--一个参数,此参数为待转换的字符串表达式,在 DB2 中这个函数名称为 UCASE ()。 执行下面的 SQL 语句: MYSQL,MSSQLServer,Oracle:

SELECT FName, UPPER(FName) FROM T_Person

 

--截去字符串左侧空格
--LTRIM()函数用来将一个字符串左侧的空格去掉。该函数接受一个参数,此参数为待处 理的字符串表达式。 执行下面的 SQL 语句:

SELECT FName,LTRIM(FName),LTRIM(' abc ') FROM T_Person

 

---截去字符串右侧空格
---RTRIM ()函数用来将一个字符串左侧的空格去掉。该函数接受一个参数,此参数为待处 理的字符串表达式。

SELECT FName,RTRIM(FName),RTRIM(' abc ') FROM T_Person

 

---截去字符串两侧的空格
---TRIM ()函数用来将一个字符串两侧的空格去掉。该函数接受一个参数,此参数为待处 理的字符串表达式。此函数只在 MYSQL 和 Oracle 中提供支持,不过在 MSSQLServer 和 DB2 中可以使用 LTRIM ()函数和 RTRIM ()函数复合来进行变通实现,也就是用 LTRIM(RTRIM(string))来模拟实现 TRIM (string)。 执行下面的 SQL 语句:

SELECT FName,TRIM(FName),TRIM(' abc ') FROM T_Person 
SELECT FName,LTRIM(RTRIM(FName)),LTRIM(RTRIM(' abc ')) FROM T_Person 

 


--- 取子字符串
--字符串是由多个字符组成的串,比如“HelloWorld”在内存是如下存储的:
--SQL 中提供了用来计算子字符串的函数 SUBSTRING(),其参数格式如下: SUBSTRING(string,start_position,length) 其中参数 string 为主字符串,start_position 为子字符串在主字符串中的起始位置,length 为子字符串的最大长度。在 MYSQL 和 MSSQLServer 中支持这个函数,而在 Oracle 和 DB2 中这个函数的名称则为 SUBSTR(),仅仅是名称不同而已,在用法没有什么不同。 执行下面的 SQL 语句:
--MYSQL、MSSQLServer:

SELECT SUBSTRING('abcdef111',4,5)

 

--- 从左侧开始取子字符串
REPLACE()函数可以用来将字符串的指定的子字符串替换为其它的字符串,比如将 “Hello World”中的“rl”替换为“ok”后得到“Hello Wookd”,而把“Just so so”中的“s” 替换为“z”后得到“Juzt zo zo” 。REPLACE()函数的参数格式如下: REPLACE(string,string_tobe_replace,string_to_replace)
--其中参数stirng 为要进行替换操作的字符串,参数string_tobe_replace 为要被替换的字符串,而string_to_replace将替换string_tobe_replace中所有出现的地方。
执行下面的SQL语句:


LTRIM()、RTRIM()和 TRIM()都只能删除两侧的字符串,无法删除字符串中间的空格, 而使用 REPLACE()函数也可以完成这个功能,也就是用空字符串替换中所有的空格。执行 下面的 SQL 语句: MYSQL、MSSQLServer: SELECT REPLACE(' abc 123 wpf',' ','') , REPLACE(' ccw enet wcf f',' ','') Oracle

---得到一个字符串的 ASCII码
ASCII()函数用来得到一个字符的ASCLL码,他有且只有一个参数,这个参数为待求ASCII码的字符,如果参数为一个字符串函数返回第一个字符的ASCII码,比如执行下面的SQL语句

Select ASCII('a'),ASCII('abc')

 

---- 得到一个ASCII码对应的字符串,与ASCII(函数正好相反,SQL还提供了用来得到一个字符的ASCII码函数,CHAR(),在Oracle中这个函数的名字为CHR();

select CHAR(56),CHAR(97),CHAR(90),'A',CHAR(ASCII('a'))

 

----下面的SQL语句讲FWeight转换成为整数,然后得到他对应的字符

select FWeight,CEILING(FWeight),CHAR(CEILING(FWeight)) FROM T_Person

 

----SQL 中提供了SOUNDEX()函数用于计算一个字符串的发音特征,这个特征值为一个四个字符的字符串,特征值的第一个字符总是初始字符串的第一个字符,而其后则是一个三位数值,下面的SQL语句

SQL中提供了SOUNDEX()函数用于计算一个字符串的发音特征,这个特征值为一个四个字符串,特征的第一个字符总是初始字符串中的第一个字符而其后则是一个字符串的数值,下面的SQL语句用于查询几个名字的发音特征

SELECT SOUNDEX('JACK'),SOUNDEX('jeck'),SOUNDEX('joke'),SOUNDEX('juke'),SOUNDEX('look'),SOUNDEX('jobe')

 


-----分析两个字符串的发音相似特征值函数,DIFFERENCE()用来简化两个字符串的发音相相似度比较,这个函数是计划两个数的发音相似度,返回一个0-4的数,这个值越大则表示两个字符串发音思想度越大

select FName,DIFFERENCE(FName,'XGJ')from T_Person

 


---日期时间函数

--- GETDATE()用于得到当前时间的函数GETDATE()

SELECT GETDATE() AS 当前时间

 

---可以看到GETDATE()返回的信息 是包括了日期,时间(精度到秒以后的部分),MSSQLServer没有专门提供取得当前日期,,时间的函数,可以通过处理来得到

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

 

----日期的增减
有时我们需要在一个 日期的基础上增加某个时间长度或者减去某一个时间长度,比如我们知道每一个员工的出生日期,而想计算他出生10000天以后的日期

---函数DATE_ADD()函数用于进行日期时间的加法运算,这个函数还有一个别名为ADDDATE,DATE_ADD函数的参数格式如下:

 

posted @ 2017-06-19 14:54  邵世铨  阅读(479)  评论(0编辑  收藏  举报