对于逻辑运算符来说,可以将多个比较运行符连接起来,进行多条件的筛选,常用的运算符如下:
需要注意的是,当 AND 和 OR 同时出现时,AND 的优先级更高会先被执行。当如果存在 () 的话,则括号的优先级最高。
使用通配符过滤:
like:(%)代表零个或多个字符,(_)只代表一个字符
函数和编程语言中的定义的函数一样,SQL 同样定义了一些函数方便使用,比如求和,平均值,长度等。
常见的函数主要分为如下四类,分类的原则是根据定义列时的数据类型:
算术函数:
字符串函数
需要注意的是,在使用字符串比较日期时,要使用 DATE 函数比较。
日期函数
转换函数:
CAST 函数在转换数据类型时,不会四舍五入,如果原数值是小数,在转换到整数时会报错。
在转换时可以使用 DECIMAL(a,b) 函数来规定小数的精度,比如 DECIMAL(8,2) 表示精度为 8 位 - 小数加整数最多 8 位。小数后面最多为 2 位。
然后通过 SELECT CAST(123.123 AS DECIMAL(8,2)) 来转换。
聚集函数通常情况下,我们会使用聚集函数来汇总表的数据,输入为一组数据,输出为单个值。
常用的聚集函数有 5 个:
其中 COUNT 函数需要额外注意,具体的内容可以参考这篇。
如何进行分组在统计结果时,往往需要对数据按照一定条件进行分组,对应就是 GROUP BY 语句。
比如统计每个班级的学生人数:
SELECT class_id, COUNT(*) as student_count FROM student \ GROUP BY class_id;GROUP BY 后也可接多个列名,进行分组,比如按照班级和性别分组:
SELECT class_id, sex, COUNT(*) as student_count FROM \ student GROUP BY class_id, sex; HAVING 过滤和 WHERE 的区别和 WHERE 一样,可以对分组后的数据进行筛选。区别在于 WHERE 适用于数据行,HAVING 用于分组。
而且 WHERE 支持的操作,HAVING 也同样支持。
比如可以筛选大于2人的班级:
SELECT class_id, COUNT(*) as student_count FROM student \ GROUP BY class_id \ HAVING student_count > 20; 子查询在一些更为复杂的情况中,往往会进行嵌套的查询,比如在获取结果后,该结果作为输入,去获取另外一组结果。
在 SQL 中,查询可以分为关联子查询和非关联子查询。
假设有如下的表结构:
-- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL DEFAULT \'\', `age` int(3) NOT NULL, `sex` varchar(10) NOT NULL DEFAULT \'\', `class_id` int(11) NOT NULL COMMENT \'班级ID\', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of Student -- ---------------------------- INSERT INTO `student` VALUES (\'1\', \'胡一\', 13, \'男\', \'1\'); INSERT INTO `student` VALUES (\'3\', \'王阿\', 11, \'女\', \'1\'); INSERT INTO `student` VALUES (\'5\', \'王琦\', 12, \'男\', \'1\'); INSERT INTO `student` VALUES (\'7\', \'刘伟\', 11, \'女\', \'1\'); INSERT INTO `student` VALUES (\'7\', \'王意识\', 11, \'女\', \'2\'); -- ---------------------------- DROP TABLE IF EXISTS `student_activities`; CREATE TABLE `student_activities` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL DEFAULT \'\', `stu_id` int(11) NOT NULL COMMENT \'班级ID\', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; INSERT INTO `student_activities` VALUES (\'1\', \'博物馆\', 1); INSERT INTO `student_activities` VALUES (\'3, \'春游\', 3); 非关联子查询子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件接着执行。
这里想要查询和胡一相同班级的同学名称:
SELECT name FROM student WHERE class_id = \ (SELECT class_id FROM student WHERE name=\'胡一\')这里先查到胡一的班级,只有一次查询,再根据该班级查找学生就是非关联子查询。
关联子查询如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部