模糊查询(like,between,is null):
- 模糊查询—LIKE
- 查询时,字段中的内容并不一定与查询内容完全匹配,只要字段中含有这些内容
查询姓张的学生信息
SELECT id,NAME FROM student WHERE NAME LIKE '张%';
查询姓第二个字为朱的学生信息
SELECT id,NAME FROM student WHERE NAME LIKE '_朱%';
查询最后一个字为朱的学生信息
SELECT id,NAME FROM student WHERE NAME LIKE '%朱';
其中%是代表的有多个任意值,_代表一个任意值
- 模糊查询—BETWEEN
把某一字段中内容在特定范围内的记录查询出来
SELECT NAME,age FROM student WHERE age BETWEEN 20 AND 30;
等价于
SELECT NAME,age FROM student WHERE age>=20 AND age<=30;
- 模糊查询—IS NULL
把某一字段中内容为空的记录查询出来
SELECT id,NAME FROM student WHERE NAME is NULL;
数据查询-排序 :
SELECT <列名> FROM <表名> [WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]]
asc:升序(默认) desc:降序
默认id是升序排序
SELECT * FROM student ORDER BY id
按照升序排序
SELECT * FROM student ORDER BY id asc
按照降序排序
SELECT * FROM student ORDER BY id desc
按多列排序(先按年龄排序,年龄相同时再按id排序)(如果最后边加一个desc排序,那么仅仅id是按照desc排序)
SELECT * FROM student ORDER BY age,id
分组查询—GROUP BY:
group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。
CREATE TABLE `user_info` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_id` VARCHAR(50) NOT NULL,
`grade` VARCHAR(50) NOT NULL
)
INSERT INTO `user_info` (`user_id`,`grade`) VALUES ('10230','C'),('10229','C'),('10227','B'),('10225', 'B'),('10222','A'),('10221','A');
数据按照grad字段分组,查询每组最大的user_id以及当前组内容
SELECT MAX(user_id),grade FROM user_info GROUP BY grade ;
将grade不满足’>A’的过滤掉
SELECT MAX(user_id),grade FROM user_info GROUP BY grade HAVING grade>'A'
查询总价大于 100 的商品是那几个。
select product ,sum(price) from orders group by product having sum(price)>100
建议: 在使用分组的时候,只去书写分组的列,以及聚集函数, 其他的列的内容,就不
要去显示了。
需求:除了洗衣粉。其他商品 总价花费 》 100 的商品。
查询: 商品 ,product
条件: product <> 洗衣粉
sum(price) > 100
select product from orders where product<> ‘洗衣粉’ group by product having sum(price) > 100;
select product from orders where product != '洗衣粉' group by product having sum(price) > 100;
- WHERE子句从数据源中去掉不符合其搜索条件的数据
- GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值
- HAVING子句去掉不符合其组搜索条件的各组数据行
- WHERE—>GROUP BY—>HAVING
EXISTS子查询
- 要点1:DROP TABLE IF EXISTS temp;
- 要点2:SELECT …… FROM 表名 WHERE EXISTS(子查询);
子查询有返回结果: EXISTS子查询结果为TRUE
子查询无返回结果: EXISTS子查询结果为FALSE,外层查询不执行
采用EXISTS检测是否有人考试成绩达到80分以上,如果有,使用SELECT语句按成绩从高到低排序,显示前5名学员学号和成绩
SELECT gradeId,score FROM grade WHERE EXISTS (SELECT * FROM grade WHERE score>80) ORDER BY score LIMIT 5
使用NOT EXISTS子查询
SELECT gradeId,score FROM grade WHERE NOT EXISTS (SELECT * FROM grade WHERE score>80) ORDER BY score LIMIT 5
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。
EXISTS内部有一个子查询语句(SELECT …FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。
EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。