03之数据库语言(模糊查询,排序,分组查询,exists)

模糊查询(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,这一行行可作为外查询的结果行,否则不能作为结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值