mysql--LIKE关键字与IN关键字组合查询02

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dear_Alice_moon/article/details/80766179

        在观看本篇博客前,如果sql编写能力弱的网友,可以先可以看我的另一片博客:  mysql--LIKE关键字与IN关键字组合查询     ,其可以帮助读者理解 LIKE关键字 与 IN关键字 组合使用。


       根据在工作开发过程中遇到的场景,我通过 student表、student_detail表 来进行讲解我所写的一条sql语句。LIKE关键字、IN关键字、子查询、Mybatis框架相互结合运用的案例。


      student表

SET FOREIGN_KEY_CHECKS=0;


-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `student_id` varchar(20) NOT NULL COMMENT '主键--学生证号',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `sex` int(1) DEFAULT '0' COMMENT '性别,0--男,1--女',
  `create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('st-011', '李辉', '12', '0', '2016-11-07 01:33:31');
INSERT INTO `student` VALUES ('st-012', '李俊云', '13', '0', '2015-06-13 10:18:50');
INSERT INTO `student` VALUES ('st-013', '李红', '12', '1', '2017-07-02 11:04:27');
INSERT INTO `student` VALUES ('st-024', '燕双玉', '12', '1', '2010-09-29 18:12:58');
INSERT INTO `student` VALUES ('st-025', '刘彩霞', '12', '1', '2013-04-04 15:39:01');
INSERT INTO `student` VALUES ('st-026', '王道清', '12', '0', '2018-08-22 19:05:05');

   student_detail表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for student_detail
-- ----------------------------
DROP TABLE IF EXISTS `student_detail`;
CREATE TABLE `student_detail` (
  `key_id` varchar(20) NOT NULL COMMENT '主键id',
  `student_id` varchar(20) DEFAULT NULL COMMENT '外键--学生证号',
  `clazz_code` varchar(12) DEFAULT NULL COMMENT '班级编号',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
  `type` int(1) DEFAULT NULL COMMENT '是否住校, 0-住校,1-不住校',
  `remark` varchar(255) DEFAULT NULL COMMENT '说明',
  `create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`key_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student_detail
-- ----------------------------
INSERT INTO `student_detail` VALUES ('te-001', 'st-011', 'clazz-01', '浙江省-杭州市-江干区--九堡-P学校', '230227197603306919', '0', '测试数据01', '2018-06-21 20:54:26');
INSERT INTO `student_detail` VALUES ('te-002', 'st-011', 'clazz-05', '黑龙江省-齐齐哈尔市-富裕县-A学校', '230227197603306919', '1', '测试数据02', '2018-06-21 20:54:27');
INSERT INTO `student_detail` VALUES ('te-003', 'st-011', 'clazz-02', '海南省-海口市-市辖区-B学校', '230227197603306919', '0', '测试数据03', '2018-06-21 20:54:28');
INSERT INTO `student_detail` VALUES ('te-004', 'st-012', 'clazz-03', '河北省-保定市-望都县-H学校', '460101198404240179', '0', '测试数据04', '2018-06-21 20:54:29');
INSERT INTO `student_detail` VALUES ('te-005', 'st-012', 'clazz-02', '浙江省-杭州市-江干区--九堡-G学校', '460101198404240179', '1', '测试数据05', '2018-06-21 20:54:30');
INSERT INTO `student_detail` VALUES ('te-006', 'st-013', 'clazz-04', '四川省-德阳市-绵竹市-M学校', '210904198302251924', '0', '测试数据06', '2018-06-21 20:54:31');
INSERT INTO `student_detail` VALUES ('te-007', 'st-024', 'clazz-05', '辽宁省-阜新市-太平区-T学校', '510683198606051145', '1', '测试数据07', '2018-06-21 20:54:32');
INSERT INTO `student_detail` VALUES ('te-008', 'st-025', 'clazz-03', '湖北省-恩施土家族苗族自治州-建始县-J校区', '422822197910045167', '1', '测试数据08', '2018-06-21 20:54:33');
INSERT INTO `student_detail` VALUES ('te-009', 'st-025', 'clazz-01', '云南省-大理白族自治州-大理市-D校区', '422822197910045167', '0', '测试数据09', '2018-06-21 20:54:34');
INSERT INTO `student_detail` VALUES ('te-010', 'st-026', 'clazz-03', '广东省-潮州市-饶平县-R校', '320981198701232137', '0', '测试数据10', '2018-06-21 20:54:35');
INSERT INTO `student_detail` VALUES ('te-011', 'st-026', 'clazz-04', '江苏省-盐城市-东台市-T校', '320981198701232137', '1', '测试数据11', '2018-06-21 20:54:37');

     student表是主表, student_detail表是明细表。 student表中的主键 student_id字段 与 student_detai表中的 student_id字段相关联。即 student表中的 student_id字段 是 student_detail表的外键。







      现在,根据 学生证号(student_id)、姓名(name)、年龄(age)、创建时间(create_time)、是否住校(type),来模糊查询 student表中的学生信息。 学生证号、姓名、年龄、创建时间在 student表中存在, 而“是否住校”是 student_detail表中字段。 


      根据以上的查询条件,我的思想是:根据 "是否住校" 字段 在 student_detail表中查询出 student_id字段的一系列值。 把这些值放在 IN()函数中, 在 student表中,根据 student_id 模糊查询。模糊查询使用的 LIKE关键字与 IN关键字组合使用。

sql语句如下:

SELECT student_id, name, age, sex, create_time
FROM student
WHERE
	student_id LIKE'%st_01%' 
	AND student_id IN(
	  SELECT student_id FROM student_detail
	  WHERE type = 0	
	)
	AND name LIKE '%李%'
	AND age > 10
	AND create_time BETWEEN '2015-06-01' AND '2017-06-01'


      运行结果:




与Mybatis框架中动态sql结合使用,代码如下:

<select id="selectStudent" resultMap="BaseResultMap">
	SELECT student_id, name, age, sex, create_time
	FROM student
	<where>
	  <if test="student_id != null and student_id != ''">
	      AND student_id LIKE CONCAT('%', #{student_id}, '%')
	      AND student_id IN (
	      SELECT student_id FROM student_detail
	      <where>
	          <if test="type == 1"> <!-- type为int类型字段 -->
	             AND type != 0
	          </if>
	          <if test="type == 0">
	            AND  type = 0
	          </if>
	      </where>
	      )
	  </if>
	  <if test="name != null and name != ''">  <!-- name为 varchar类型字段 -->
	      AND name LIKE CONCAT('%', #{name}, '%')
	  </if>
	  <if test="age != null"> <!-- age为 int类型字段 -->
	      AND age = #{age}
	  </if>
	  <if test="create_time_start != null and create_time_end !=null">  <!-- create_time为 timestamp类型字段 -->
	      AND create_time BETWEEN #{create_time_start, jdbcType =TIMESTAMP} AND #{create_time_end, jdbcType=TIMESTAMP}
	  </if>

	</where>
</select>



猜你喜欢

转载自blog.csdn.net/dear_Alice_moon/article/details/80766179