博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL基础语句
阅读量:6155 次
发布时间:2019-06-21

本文共 7819 字,大约阅读时间需要 26 分钟。

SQL语句1

要求:将本机数据库2中表的数据导入到本机数据库1的表中。

方法:使用sqlserver编写如下代码即可:

insert intoSB(SB_ID,YSXZ_ID,XQ_ID,SB_KHH,SB_KHXM,SB_BH,SB_YSRS,SB_DH,SB_DZ,SB_WZ,SB_XH,SB_YE,SB_CJ,SB_DQBDS,SB_ZJCBRQ,SB_BZ,SB_SFYX)

selectSB_ID,YSXZ_ID,XQ_ID,SB_KHH,SB_KHXM,SB_BH,SB_YSRS,SB_DH,SB_DZ,SB_WZ,SB_XH,SB_YE,SB_CJ,SB_DQBDS,SB_ZJCBRQ,SB_BZ,SB_SFYX

from HelperLY.dbo.SB b

注意:数据库1中的表字段与数据库2中的表字段要一一对应。

要求:使用select语句完成功能:利用表达式查询水表中的用水人数和水表位置。

方法:如果直接按照如下写法:

select SB_YSRS +SB_WZ

from SB

会出现错误:在将varchar 值'2#东北' 转换成数据类型int 时失败。

在C#中如果一个int类型的数据和一个string类型的数据进行+运算,则结果返回string类型;但是在SqlServer中,一个int类型的数据和一个char(数据库中没有string类型)类型的数据进行+操作,而不做任何类型转变的话,就会出现错误。

正确的写法应该是:

select convert(varchar(100),SB_YSRS) +SB_WZ

from SB

注意:在数据库中int类型和char类型进行+运算,要进行强制类型转换。

如果两个类型的值进行+运算,且其中有一个值是null类型,则返回结果是null类型。

要求:从SB中查出小区名称中包含“物资”两个字的信息列表。

方法:使用带有in的sql语句如下所示:

select *

from SB

where XQ_ID in

(select XQ_ID from XQ where XQ_MC like '%物资%')

注意:in后面不仅仅可以跟一个条件列表,还可以跟一个sql语句。

要求:区分简单case和布尔case的区别,及其应注意的事项。

方法:如下sql语句是简单case:

select *,

case substring(SB_DH,1,3)

when '151' then '移动'

when '130' then '联通'

else '未知'

end as 电话服务商

from SB

如下sql语句是布尔case:

select *,

case

when substring(SB_DH,1,3) in ('151') then '移动'

when substring(SB_DH,1,3) in ('130') then '联通'

else '未知'

end as 电话服务商

from SB

注意:简单case和布尔case的select语句后面都有逗号,;简单case后面会有一个表达式,但是布尔case后面是空的;简单case只能进行相等比较,布尔case在when后面会有一些简单的判断。

要求:在录入表底数模块中,按照时间选择抄表项的时候,应该选择离目前时间最近的时间,这里会用到sql语句。

方法:sql语句如下所示:

select MAX(CB_ID) from CB WHERE CB_YF=(select MAX(CB_YF) from CB)

注意:要注意本sql语句中where子句的条件:

WHERE CB_YF=(select MAX(CB_YF) from CB)

要求:将水表表和抄表明细表进行关联。

方法:sql语句如下所示:

select a.SB_KHH,a.SB_KHXM,a.SB_YSRS,b.*

from SB a,CBMX b

where a.XQ_ID =34 and b.CB_ID =8 and b.CBMX_BCBDS is not null

and a.SB_ID=b.SB_ID

注意:将两个表的关联放在后面的原因是:两个表的关联比较耗时。某些时候where条件的顺序不同可能会导致查询结果所需时间可以相差十几倍。

SQL语句2

要求:统计每个小区的水量、水费

方法: sql语句如下所示:

select b.XQ_ID,SUM(a.CBMX_BCBDS -a.CBMX_SCBDS) as SL,SUM(a.CBMX_YJSF) as YJSF,

SUM (a.CBMX_SJSF) as SJSF

from CBMX a,SB b

where a.SB_ID =b.SB_ID

group by b.XQ_ID

或者使用下面的sql语句:

select x.*,y.XQ_MC

from

(

select b.XQ_ID,sum(a.CBMX_BCBDS -a.CBMX_SCBDS) as SL, SUM(a.CBMX_YJSF) as YJSF,

SUM (a.CBMX_SJSF) as SJSF

from CBMX a,SB b

where a.SB_ID =b.SB_ID

group by b.XQ_ID

)x,XQ y

where x.XQ_ID=y.XQ_ID

注意:如果使用了group by,那么色了传统中的字符按,要么在group by中出现,要么使用了聚合函数。

要求:显示小区名称、用水人数和水表数量

方法:sql语句如下所示:

select a.XQ_ID,b.XQ_MC, COUNT(a.SB_ID) as SBSL,SUM(a.SB_YSRS) as YSRS

from SB a,XQ b

where a.XQ_ID =b.XQ_ID

group by a.XQ_ID ,b.XQ_MC

注意:count的使用和sum的使用

①如果要求显示水表数量大于100的小区名称和用水人数,则sql语句如下所示:

select a.XQ_ID,b.XQ_MC, COUNT(a.SB_ID) as SBSL,SUM(a.SB_YSRS) as YSRS

from SB a,XQ b

where a.XQ_ID =b.XQ_ID

group by a.XQ_ID ,b.XQ_MC

having COUNT(a.SB_ID)>100

注意:having的使用(在分组的基础之上进一步过滤,过滤的条件是某个聚合的结果)。having之和group by一起使用

②如果要显示用水性质是居民用水的小区名称和用水人数,则sql语句如下所示:

select a.XQ_ID,b.XQ_MC, COUNT(a.SB_ID) as SBSL,SUM(a.SB_YSRS) as YSRS

from SB a,XQ b

where a.XQ_ID =b.XQ_ID and a.YSXZ_ID =1

group by a.XQ_ID ,b.XQ_MC

注意:在条件的过滤之下进行分组

要求:根据SB表中的用水人数分析用水家庭的情况

方法:sql语句如下所示:

select a.SB_KHXM,

case SB_YSRS

when 1 then '可能是一个光棍'

when 2 then '可能是一对夫妻'

when 3 then '可能是一家三口'

when 5 then '可能是两代人住在一起'

else '不能预测'

end 分析结果

from SB a

注意:简单case是相等比较

要求:根据SB表中的用水人数分析用水人数的多或少

方法:sql语句如下所示:

select SB_KHXM,

case

when SB_YSRS<2 then '用水人数比较少'

when SB_YSRS <4 then '用水人数一般'

else '人数比较多'

end 分析结果

from SB

注意:复杂case后面没有表达式

行变列问题

①方法:sql语句如下所示:

select

SUM(case when SB_DH like '131%' then 1 else 0 end) as 联通131,

SUM(case when SB_DH like '134%' then 1 else 0 end) as 联通134,

SUM(case when SB_DH like '138%' then 1 else 0 end) as 移动138,

SUM(case when SB_DH like '151%' then 1 else 0 end) as 移动151

from SB

注意:在本例中给列起别名时,不能使用数字。

②要求:计算平均成绩

方法:sql语句如下所示:

select

AVG

(

case

when Score_Subject ='数学' then Score_FS

else 0

end

) 数学,

AVG

(

case

when Score_Subject='语文' then Score_FS

else 0

end

) 语文

from Score

注意:两个AVG之间使用 , 相隔

SQL语句3

要求:判断两个字符串是否相等。

方法:sql语句如下所示:

if('abc'='Abc')

print '二者相等'

else

print '二者不相等'

返回结果是:二者相等

if('abc'='Abec')

print '二者相等'

else

print '二者不相等'

返回结果是:二者不相等

注意sql中判断两个字符串是否相等时,不区分大小写。

要求:判断某个字符串中是否存在空格。

方法:sql语句如下所示:

if (CHARINDEX(' ','ac dc',1)>0)

print '字符串中包含空格'

else

print '字符串中不包含空格'

返回结果是:字符串中包含空格

if (CHARINDEX(' ','acdc',1)>0)

print '字符串中包含空格'

else

print '字符串中不包含空格'

返回结果是:字符串中不包含空格

要求:计算SB表中sb_dh字段中的数据中3的个数

方法:sql语句如下所示:

select sb_dh,LEN(SB_DH)-LEN(REPLACE(sb_dh,3,'')) from SB

注意:在计算某个字段中包含什么值时,可以使用如下方式:总长度-将目标字符替换成空后的长度。

要求:将SB进行分页时,如果每页放10行,计算可以放多少页

方法:sql语句如下所示:

select CEILING(COUNT(*)/10.0) from SB

注意:在这里使用的是10.0,而不是整数10

要求:保留两位小数位数

方法:sql语句如下所示:

select CONVERT(decimal(18,2),ROUND(18.12345,2))

要求:如果某小区拥有的水表数量是,则显示为0;并显示相应的小区名称。

方法:sql语句如下所示:

select x.XQ_MC,ISNULL(y.水表数量,0)

from XQ x

left join

(

select xq_id,COUNT(SB_ID) as 水表数量

from SB

group by XQ_ID

) y

on x.XQ_ID=y.XQ_ID

要求:找到工资最高的员工

方法:sql语句如下所示:

select * from Employee where Salary =

(select MAX(Salary)

from Employee)

要求:找到每个部门的最低工资的职工

方法:sql语句如下所示:

select * from Employee where Salary in

(select MIN(Salary)

from Employee

group by DepID)

也可以使用如下sql语句:

select x.*,y.*

from Employee x,

(select DepID,MIN(Salary) as minsalary

from Employee

group by DepID) y

where x.DepID=y.DepID and x.Salary=y.minsalary

在上面的基础上显示职工所隶属的部门:

with temp as

(select x.*,y.minsalary

from Employee x,

(select DepID,MIN(Salary) as minsalary

from Employee

group by DepID) y

where x.DepID=y.DepID and x.Salary=y.minsalary

)

select a.*,b.Name

from temp a,Department b

where a.depid=b.depid

要求:查找水表个数低于100的小区

方法:sql语句如下所示:

with temp as

(

select XQ_ID,COUNT(SB_ID) as sbsl

from SB

GROUP by XQ_ID

having COUNT(SB_ID)<100

)

select a.*,b.*

from temp a,XQ b

where a.XQ_ID=b.XQ_ID

SQL 语句4

要求:更新Employee表中的Salary项(条件是:Salary=a.Salary *(1+b.RaiseFactor))

方法:sql语句如下所示:

update Employee

set Salary=a.Salary *(1+b.RaiseFactor)

from Employee a,Department b

where a.DepID=b.DepID

要求:将名字用,隔开

方法:sql语句如下所示:

declare @name varchar(20)

set @name=''

select @name =@name+','+name from Employee

print @name

要求:找到工资大于小叶子工资的员工

方法:sql语句如下所示:

declare @salary money

select @salary=salary from Employee

where Name='小叶子'

select * from Employee

where Salary>@salary

也可以使用如下sql语句完成上述功能:

select *

from Employee

where Salary>

(select Salary from Employee where Name='小叶子')

要求:@@ERROR示例

方法:sql语句如下所示:

insert into Employee(DepID,Name,Salary,DateHire,Address)

values(10,'江户川柯南',1000,' 2010-10-10','河北理工大学')

print '错误号:'+convert(varchar(100),@@error)

insert into Employee(DepID,Name,Salary,DateHire,Address)

values(100,'毛利兰',2000,'2011-11-11','河北理工大学')

print '错误号:'+convert(varchar(100),@@error)

运行结果是:消息547,级别16,状态0,第1 行

INSERT 语句与FOREIGN KEY 约束"FK_Employee_Department"冲突。该冲突发生于数据库"dbXDL",表"dbo.Department", column 'DepID'。

语句已终止。

错误号:

消息547,级别16,状态0,第4 行

INSERT 语句与FOREIGN KEY 约束"FK_Employee_Department"冲突。该冲突发生于数据库"dbXDL",表"dbo.Department", column 'DepID'。

语句已终止。

错误号:

要求:@@identity示例

方法:sql语句如下所示:

insert into Employee(DepID,Name,Salary,DateHire,Address)

values(1,'江户川柯南',1000,'2010-10-10','河北理工大学')

print @@identity

insert Card(UserName,Balance)

values('新一',1000)

print @@identity

运行结果是:(1 行受影响)

21

(1 行受影响)

3

要求:计算员工的平均工资,如果高于2000,显示“高工资”,如果低于2000,则显示“低工资”

方法:sql语句如下所式:

declare @avgSalary money;

select @avgSalary=AVG(salary) from Employee

if(@avgSalary>2000)

begin

print '高工资'

end

else

begin

print '低工资'

end

要求:给员工提高工资,要求都在2000元以上,加工资的规则是:全部加100,看是否满足要求;如果不满足,再加,直到满足要求。

方法:sql语句如下所示:

declare @minSalary money;

select @minSalary=MIN(salary) from Employee

while(@minSalary<2000)

begin

update Employee set Salary=Salary+100;

select @minSalary=MIN(salary) from Employee;

end

也可以使用如下sql语句完成上述功能:

declare @minSalary money;

select @minSalary=MIN(salary) from Employee

while(@minSalary<2000)

begin

update Employee set Salary=Salary+100;

set @minSalary=@minSalary+100;

end

要求:临时表示例

方法:sql语句如下所示:

select * into #EmployeeTemp

from Employee where Salary>2000

select * from #EmployeeTemp

注意:临时表创建完后,当确定不在使用后,应该将其删除,sql语句如下所示:

drop table #EmployeeTemp

转载于:https://www.cnblogs.com/gaodao/archive/2011/12/11/2283855.html

你可能感兴趣的文章
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>