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