SQL语句

1:写一个包含连接和分组的sql
--1

select s.Id,s.Name,g.GradeName from Student s
inner join Grades g on s.GradeId=g.Id

2:写一个包含连接和case when的sql
--2查出每个年级总人数

select COUNT(1),
CASE GradeName
 WHEN 's1' THEN '一年级'
 WHEN 's2' THEN '二年级'
 end
 from Student s
inner join Grades g on s.GradeId=g.Id
GROUP BY
 CASE GradeName
 WHEN 's1' THEN '一年级'
 WHEN 's2' THEN '二年级'
 end

3:写一个包含连接和Cast()函数的sql
---3

select CAST(s.Id AS decimal),s.Name,g.GradeName from Student s
inner join Grades g on s.GradeId=g.Id

4:写一个包含连接和Convert()函数的sql
--4

select s.Id,s.Name,g.GradeName,CONVERT(varchar(100),s.Time, 12) as time from Student s
inner join Grades g on s.GradeId=g.Id

5:写一个包含子查询的sql
--5

select s.Id,s.Name from Student s
where s.GradeId in(select g.Id from Grades g where g.GradeName='s1')

6:写一个视图的sql
--6

Create view vw1 as
select s.Id,s.Name,g.GradeName from Student s
inner join Grades g on s.GradeId=g.Id
select * from vw1


7:创建索引的sql
--7

CREATE INDEX index_name
ON Student (Name)

8:分页存储过程sql
--8

CREATE PROC Proc_Paging
 @TableFields NVARCHAR(512),
 @TableName NVARCHAR(512),
 @SqlWhere NVARCHAR(512),
 @OrderBy NVARCHAR(64),
 @PageIndex INT,
 @PageSize INT,
 @TotalCount INT OUTPUT
AS
 DECLARE @SQL1 NVARCHAR(2048), @SQL2 NVARCHAR(2048)  
 --SET @SQL1 = N'SELECT TOP ' + CONVERT(VARCHAR(2), @PageSize) + ' * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS NID, ' + @TableFields + ' FROM ' + @TableName + ' WHERE ' + @SqlWhere + ') AS TmpTable WHERE TmpTable.NID > (@PageIndex - 1) * @PageSize SELECT @TotalCount = COUNT(1) FROM ' + @TableName + ' WHERE ' + @SqlWhere  --用TOP关键字进行筛选
 SET @SQL1 = N'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS NID, ' + @TableFields + ' FROM ' + @TableName + ' WHERE ' + @SqlWhere + ') as TmpTable WHERE TmpTable.NID BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex* @PageSize SELECT @TotalCount = COUNT(1) FROM ' + @TableName + ' WHERE ' + @SqlWhere
 SET @SQL2 = N'@TableFields NVARCHAR(512),@TableName NVARCHAR(512),@SqlWhere NVARCHAR(512),@OrderBy NVARCHAR(64),@PageIndex INT,@PageSize INT,@TotalCount INT OUTPUT'
EXEC SP_EXECUTESQL @SQL1, @SQL2, @TableFields, @TableName, @SqlWhere,@OrderBy,@PageIndex,@PageSize,@TotalCount OUTPUT
PRINT @SQL1  --打印执行语句
9:写一个触发器sql
CREATE TRIGGER TRI_BIISBN1
ON dbo.Student  
FOR UPDATE  
AS
IF UPDATE(Name)    
BEGIN
 UPDATE dbo.Student SET Time =2000/2/2 FROM dbo.Student
END

10:写一个存储过程包含事务的sql
ALTER proc kkk
 @Name nvarchar(50)
 as
 begin
if(isnull(@Name,'')='')
begin
print('名字不能为空');
return;
end
begin tran  --开启事务
insert into Students(Name) values(@Name)
commit tran
end
11:如何一次性往一张表【插入/更新】10条数据,存储过程实现。
Create proc sp_Insert_Student
 @No char(10),
 @Name varchar(20),
 @Sex char(2),
 @Age int,
 @rtn int output
 as
 declare
 @tmpName varchar(20),
 @tmpSex char(2),
 @tmpAge int
 
 if exists(select * from Student where No=@No)
 begin
 select @tmpName=Name,@tmpSex=Sex,@tmpAge=Age from Student where No=@No
 if ((@tmpName=@Name) and (@tmpSex=@Sex) and (@tmpAge=@Age))
 begin
 set @rtn=0  --有相同的数据,直接返回值
 end
 else
 begin
 update Student set Name=@Name,Sex=@Sex,Age=@Age where No=@No
 set @rtn=2  --有主键相同的数据,进行更新处理
 end
 end
 else
 begin
 insert into Student values(@No,@Name,@Sex,@Age)
 set @rtn=1  --没有相同的数据,进行插入处理
 end
12:分页的实现方式?至少写3种
--第一种
SELECT TOP 10 A.* FROM (SELECT TOP 20 * FROM Student ORDER BY ID ASC)A  ORDER BY A.ID asc
--第二种
select top 10*
from Student
where Id>=
(select max(Id)
from (select top 1 Id
from Student
order by  Id asc) temp_max_ids)
order by Id
--第三种
select top 10 *
from (select row_number()
over(order by Id asc) as rownumber,*
from Student) temp_row
where rownumber>0
13:写一个包含连接和分组,并且根据某个字段拼接的sql
select GradeName,stuff((select ',' + Name from Student for xml path('')),1,1,'')  as  field from Student s
inner join Grades g on s.GradeId=g.Id
group by GradeName
14:写一个包含having写法的sql
select s.Id,s.Name,g.GradeName from Student s
inner join Grades g on s.GradeId=g.Id
group by g.GradeName,s.Id,s.Name
having g.GradeName='s1'
15:写一个包含连接和分组,排序的sql。
select s.Id,s.Name,g.GradeName from Student s
inner join Grades g on s.GradeId=g.Id
group by g.GradeName,s.Id,s.Name
order by s.Id
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的代码。MyBatis动态SQL语句是指在编写SQL语句时可以根据不同的条件动态生成不同的SQL语句。 MyBatis提供了以下几种方式来实现动态SQL语句: 1. if元素:通过if元素可以根据条件判断来生成不同的SQL语句片段。例如: ``` <select id="getUserList" parameterType="User" resultType="User"> SELECT * FROM user WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> ``` 上述示例中,如果传入的User对象中name属性不为空,则会生成AND name = #{name}这段SQL语句。 2. choose、when、otherwise元素:通过choose、when、otherwise元素可以实现类似于switch语句的功能,根据不同的条件选择不同的SQL语句片段。例如: ``` <select id="getUserList" parameterType="User" resultType="User"> SELECT * FROM user WHERE 1=1 <choose> <when test="name != null"> AND name = #{name} </when> <when test="age != null"> AND age = #{age} </when> <otherwise> AND status = 'ACTIVE' </otherwise> </choose> </select> ``` 上述示例中,如果传入的User对象中name属性不为空,则会生成AND name = #{name}这段SQL语句;如果name为空而age不为空,则会生成AND age = #{age}这段SQL语句;如果name和age都为空,则会生成AND status = 'ACTIVE'这段SQL语句。 3. foreach元素:通过foreach元素可以实现对集合类型的参数进行遍历,并生成相应的SQL语句片段。例如: ``` <select id="getUserList" parameterType="List" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 上述示例中,如果传入的List参数中包含[1, 2, 3]三个元素,则会生成SELECT * FROM user WHERE id IN (1, 2, 3)这段SQL语句。 这些是MyBatis动态SQL语句的几种常用方式,通过它们可以根据不同的条件生成不同的SQL语句,提高了SQL语句的灵活性和可复用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值