一、知识点总结与拓展
1)字符串的常见处理
a、将字母转换为大写格式upper( )
b、索引式提取substring_index(字段名,'索引符号',位置)
c、直接提取substring(字段名,开始位置,结束位置)
d、计算字符串长度char_length(字段名) 和 length(字段名)
c、直接提取substring(字段名,开始位置,结束位置)
d、计算字符串长度char_length(字段名) 和 length(字段名)
* length(字段名)汉字算3个字符
* char_length(字段名) 汉字算1个字符
e、转换数据格式:cast(字段名 AS 数据类型)
2)表连接
常见的表连接主要有两种方式。
a、第一种方式是直接从两张表里筛选数据:
常见的写法有SELECT 字段名 FROM 表名1,表名2(具体的书写案例见下方解题步骤);
b、第二种方式是使用join来连接数据(左右内外连接)(详见下方连接,之前解题种整理的内容)。
二、解题步骤
1)试卷的类别tag可能出现大小写混乱的情况
- 字符的大写转换函数upper()
- 统计各类试卷作答情况,并命名为t1
SELECT tag,COUNT(uid) answer_cnt FROM exam_record LEFT JOIN examination_info USING(exam_id) GROUP BY tag
3)统计将其转换为大写后对应的原本试卷作答数。
- 自连接t1表,左边命名为a,右边命名为b
WITH t1 as ( SELECT tag, COUNT(uid) as answer_cnt FROM exam_record LEFT JOIN examination_info USING(exam_id) GROUP BY tag ) SELECT a.*, b.* FROM t1 a,t1 b;#自连接t1表
- 先看那些大小写被混写的数据:把左边数据都转换为大写后的数据
WITH t1 as ( SELECT tag, COUNT(uid) as answer_cnt FROM exam_record LEFT JOIN examination_info USING(exam_id) GROUP BY tag ) SELECT a.*, b.* FROM t1 a,t1 b WHERE UPPER(a.tag)=b.tag; #取a表中tag改为大写情况后和b的tag表相同的数据
从上表数据可以看出,目前存在两种情况,第一种情况,左边tag本身就是大写,第二种情况左边tag是小写。
4)如果转换后tag并没有发生变化,不输出该条结果。
- tag没有变化的意思就是左边的tag和右边的tag是不相等的,即a.tag<>b.tag。
- 以及加上筛选条件a.answer<3。完成~
WITH t1 AS ( SELECT tag,COUNT(uid) answer_cnt FROM exam_record LEFT JOIN examination_info USING(exam_id) GROUP BY tag ) /*建立子表,查询每个tag的答题数*/ SELECT a.tag,b.answer_cnt FROM t1 a,t1 b # 表自连接 WHERE UPPER(a.tag)=b.tag #取a表中tag改为大写情况后和b的tag表相同的数据 AND a.tag<>b.tag #取a表的tag为小写b表的tag为大写 AND a.answer_cnt<3;#取小写tag(a表)的作答数小于3的数据