在观看本篇博客前,如果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结合使用,代码如下: