动态Sql语句,筛选查询,根据满足某个条件筛选、字段数据迁移数据恢复

动态sql语句 ----最初的经典 where 1=1

添加where
	<select id="findUserById" resultType="String">
		select user from UserTable  where 1=1     
		<if test="Id!='' and Id!=null and Id!=0">   如果这个条件满足,不至于丢失where
		     and   id=#{id}
		</if>
	</select>

org.apache.ibatis.annotations.Param注解 数据匹配 解释

在mybatis的Map类中,方法参数为多个时,前面一般需要加上@Param注解,例如

User getUser(@Param(“userId”)String userId,@Param(“password”)String password);

@Param注解分为spring的和mybatis的:

org.springframework.data.repository.query.Paramorg.apache.ibatis.annotations.Param

两者的区别在于
在使用org.springframework.data.repository.query.Param,参数要按照先后顺序传入

select * from user where user_id= #{0,jdbcType=VARCHAR} and password=#{1,jdbcType=VARCHAR}
而在使用org.apache.ibatis.annotations.Param时,只需要使用参数名即可

select * from user where user_id= #{userId,jdbcType=VARCHAR} and password=#{password,jdbcType=VARCHAR}
所以在使用上,我们一般都使用mybatis的@Param注解,如果没有使用@Param注解,则参数将会以它们的顺序位置来和SQL语句中的表达式进行映射。
————————————————
原文链接:https://blog.csdn.net/zk052300/article/details/100672072

数据匹配

	一:mybatis 接口类map  与mapper.xml 中参数匹配
	二:从数据库表中查询的字段与返回类的属性值匹配

动态if 判断的参数来自mapper.java类----接口层

  1. if中参数来自于@Param(‘这里参数’) ---------@Param(‘A’) String B -----将B的参数值传递给A
  2. 注意mapper 接口层方法中@Param注解 , 选择org.apache.ibatis.annotations.Param
——————》》》这是mapper.java
 List<User> findUserById( @Param("name") String name,@Param("id") String id);
——xml实现上边接口方法————》》》这是mapper.xml
<if test="id!='' and id!=null and id!=0">  if中参数来自于@Param('这里参数')
---注意上边的参数如何判断为空为null,不等于0----
			and id=#{id}                 -----#{id} 也可用${id}
</if>

# {id} 也可用${id}

比较一:
<if test="id!='' and id!=null and id!=0">             if中参数来自于@Param('这里参数')
			and id=#{id}                 -----#{id} 也可用${id}
</if>
比较二:
<if test="id!='' and id!=null and id!=0">             if中参数来自于@Param('这里参数')
			and id=${id}                 -----#{id} 也可用${id}
</if>

判断某个参数是否为空 用 单引号 ’ ’

	<if test="val !=' '">

数据分页----使用限制limit

limit子句用于限制查询结果返回的数量。

用法:【select * from tableName limit i,n 】

参数:

tableName : 为数据表;
i : 为查询结果的索引值(默认从0开始);
n : 为查询结果返回的数量

当用户点击某一页数据

 limit ${bNum},${rows}   //bNum  用户当前选择起始索引,rows 是查询返回记录数
 从哪一页开始,通过js发送请求命令,得到多少页的记录

查询某个时间段或某个时间范围的记录

BETWEEN 操作符
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期
方法一:
  <select id="findUserById"   resultType="User">
      SELECT * FROM  tableName   WHERE  createtime  BETWEEN   #{bt} and #{et}            
   </select>	
   
方法二:
		<if test="definedata==1">   <!--动态sql判断-->
		   AND m.CREATE_TIME <![CDATA[>=]]> #{bt}     //xml不能直接写  =<   或者>= 
		   AND m.CREATE_TIME <![CDATA[<=]]> #{et}
		</if>

字段为null ≠ 字段为空 记录查询

查询数据表中某个字段为空的记录或者不为空的记录 区分为空的记录
不是空的字符串 ’ ’ 字段 , 简而言之 null ≠ 字段为空

字段为null  ≠  字段为空
		<if test="currentState == 0 ">
			and cs.currentStateName  is not null 
		</if>
		<if test="currentState == 1 ">
			and cs.currentStateName    is  null  
		</if>

比较二
		<if test="fields!='' and fields!=null and fields!=0">
			and fieldsId=#{fieldsId}
		</if>

查询语句返回类问题 resultType=?

1.如果选择的类不正确,会导致从数据表中查询返回的字段不能匹配对应返回类的属性,导致类属性赋值失败
2.如果类中属性虽然包含了数据库表字段,但是多余表中字段,类中其他不能匹配的属性值为默认初始值,如String 为空字符串
3.返回类中属性可能与数据表中字段不一定完全相同,但是sql语句查询结束会进行模糊匹配,如表字段meterid 而类中属性是meter_id ,那么也会将meterid值赋给meter_id;
4.表中字段与返回类的属性字段模糊匹配 如,字段createtime ,类属性中createTime, 会进行查询出的字段值赋给类属性值

   <select id="findshenshuiDuiJie"   resultType="UserAndMeter">
      SELECT * FROM  tableName    where   meterid=#{meterId}   AND   imei=#{imei}         
   </select>
  <!-- 如果选择的类不正确,会导致返回的字段不能匹配类的属性-->

排除:选择不再某个时间范围或者不再某个时段的文本 ----not 应用

对应填写字段规范
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
实操:
SELECT * FROM Persons  WHERE LastName NOT  BETWEEN 'Adams' AND 'Carter'

参考 https://blog.csdn.net/yihanzhi/article/details/82784770

查询返回数据的总记录数

	<select id="selectTotalDataRecords" resultType="int">
	 	 select num from tableName  where condition=#{condition}
	</select>

表的左右连接

分为左外连接,右外连接,
左外连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
 右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
==================================================
--就是向 左边还是右边的表看齐,查找对应右边或者左边的表是否查询出对应的数据,
如果无,
当是左连接,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充
当是右连接,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充 
 参考连接: https://blog.csdn.net/csdn_life18/article/details/108099935?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-108099935-blog-106226111.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=2

嵌套查询 ——》》 in 语句 和 = 语句 区别


SELECT SName 
FROM Student 
WHERE  Sex='女' AND Sno NOT IN 
( 
    SELECT Sno 
    FROM Stduy 
    WHERE Grade<90 
)  
注意:这里子查询返回的Sno可能有多个,
	 所以要用到谓词 IN,如果用 =,则报错,因为 = 表示子查询的返回值是唯一的

嵌套对比

方法一:嵌套
SELECT Sno,SName 
FROM Student 
WHERE Sno IN 
( 
    SELECT Sno  
    FROM Study 
    WHERE Cno IN              //用  in 存储筛选的嵌套记录
    ( 
        SELECT Cno  
        FROM Course 
        WHERE CName='高等数学' 
    ) 
) 
方法一和方法二比较:相当于连接查询
SELECT
	Student.Sno, SName 
FROM
	Student, Course, Study 
WHERE
	Student.Sno = Study.Sno 
	AND Course.Cno = Study.Cno 
	AND Course.CName = '高等数学'
参考链接:同左右连接的链接

模糊查询

	<if test="screenkey !='' and  screenkey  is  not null ">
				and r.field  like '%${screenvalue}%'
	</if>

字段拼接

执行语句 SELECT CONCAT('M','y','S','Q','L') 可以达到如下效果

在这里插入图片描述
将三张表的地址数据进行拼接,然后显示记录

<select id="querytData" resultType="User">
	    select m.*,f.*,c.*,concat( m.area, f.address, c.address ) AS addr_yonghu 
	    from  tablename1  m ,tablename2  f,tablename3  c  
</select>	  

拼接举例子
mysql> SELECT CONCAT('my', 's', 'ql');
-> 'mysql'
mysql> SELECT CONCAT('my', NULL, 'ql');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'  

SQL之CASE WHEN用法详解 --应用场景

SELECT `currentName`, case  HIERARCHY   (拿表中字段数值进行判断)
when 1 then '管理员' 
when 2 then  '普通用户' 
end  as currentAuthory  FROM `AuthorityTable` 

注意:如果你想判断score是否null的情况,WHEN score = null THEN ‘缺席考试’,这是一种错误的写法,正确的写法应为:

CASE WHEN score IS NULL THEN '缺席考试' ELSE '正常' END

删除表的重复行和having 和where 区别

删除表的重复行:  	      https://www.yiibai.com/mysql/delete-duplicate-rows.html
having与where的区别:   https://segmentfault.com/a/1190000008284099

B表某些字段导入到A表某些数据字段–数据恢复

INSERT INTO  A表( 列名1,列名2 )  SELECT  对应前边列名1,对应前边列名2   FROM  B表    WHERE  [筛选的字段名]  in (  筛选的字段值--这里注意字段类型是int 还是varchar 等类型 );


INSERT INTO  A表( 列名1,列名2 )  SELECT  对应前边列名1,对应前边列名2   FROM  B表    WHERE  [筛选的字段名]  in ( );

order by desc group by 问题

等待更新详解....
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值