数据库第四天[DQL数据查询语言]

条件查询

  1. 比较运算符

=等于、   >大于、   <小于、  <=小于等于、   >=大于等于、  <>或!=不等于

  1. 逻辑运算符

and(&&) 多个条件同时满足

or(||) 多个条件其中一个满足

not(!) 不满足

指定范围内查询 in

语法

SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);

in里面的每个数据都会作为一次条件,只要满足条件的就会显示。

范围

BETWEEN 值1 AND 值2,表示从值1到值2范围,包括开头值又包括结尾值。

比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100

模糊查询like

语法

SELECT * FROM 表名 WHERE 字段名 like '通配符字符串';
满足通配符字符串规则的数据就会显示出来。

MySQL通配符有两个:

%: 表示0个或多个字符(任意个字符)

_: 表示个字符

为空查询 is null

查询某个字段为空(null)的数据,不是使用=null(null和任何值都不相等),而是使用is null来进行判断。

 (二)查询结果排序

通过ORDER BY子句,可以将查询出的结果进行排序,排序只影响显示结果,不会影响数据库中数据的顺序。

语法

SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC];

ASC: 升序,默认是升序

DESC: 降序

1.单列排序

 单列排序就是使用一个字段排序。

2.组合排序

组合排序就是先按第一个字段进行排序,如果第一个字段相同按第个字段进行排序,依次类推。 上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序

语法

SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC];

 (三)单行函数

单行函数是指对于每一行数据进行计算后得到一行输出结果。SQL单行函数根据数据类型分为字符函数、数字函数、日期函数、转换函数等。

1.字符串函数

concat(s1,s2...sn)

字符串 s1,s2 等多个字符串合并为一个字符串

2.length(str)

返回字符串str的长度

3.replace(s,s1,s2)

 将字符串 s2 替代字符串 s 中的字符串 s1

4.substr(s, start, length)

从字符串 s 的 start 位置截取长度为 length 的子字符串  从1开始

2.流程控制函数

1.ifnull(expr1,expr2)

expr1不为null时返回expr1。expr1为null时返回expr2。

用此函数解决前面null运算结果为null的问题

解决方式

因为english有null值,所以用ifnull函数处理english

其他函数

1.user()

查看数据库当前用户

(四)聚合函数

聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。

聚合函数会忽略空值。

五个聚合函数

count: 统计指定列记录数,记录为NULL的不统计

sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0

max: 计算指定列的最大值

min: 计算指定列的最小值

avg: 计算指定列的平均值,如果不是数值类型,那么计算结果为0

(五)分组

分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组。

语法

 SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];

1、分组查询

说明

以上的操作是将分组字段结果中相同内容作为一组,并且返回每组的第一条数据。这样的操作显然没有什么意义。而且在有些数据库中(例如oracle)中,这样的语句是错误的!

分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

聚合函数是在分组后运行,统计每组的数据

注意事项

当我们使用某个字段分组,在查询的时候最好将这个字段查询出来,否则看不到数据属于哪组的。

 2、分组时的条件过滤

 一个SQL语句中不应该出现两个where子句!

3、wherehaving的对比

1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤

2.having语句中可以使用聚合函数,where后面不可以使用聚合函数

(六)limit

LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数。

语法

SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];

注意:limit子句要放在SQL语句的最后

LIMIT语法格式

LIMIT offset,length;或者limit length;

offset是指偏移量,可以认为是跳过的记录数量,默认为0,表示从哪开始

length是指需要显示的总记录数,表示显示几条

例如:只展示第2-6条记录

LIMIT的使用场景分页。比如我们登录京东、淘宝,返回的商品信息可能有几万条,不是一次全部显示出来,是一页显示固定的条数。 假设我们以每页显示5条记录的方式来分页。

SQL语句如下

-- 每页显示5条
-- 第一页: LIMIT 0,5; 跳过0条,显示5条
-- 第二页: LIMIT 5,5;  跳过5条,显示5条
-- 第三页: LIMIT 10,5; 跳过10条,显示5条

注意

  1. 如果第一个参数是0可以简写

SELECT * FROM student3 LIMIT 0,5;

SELECT * FROM student3 LIMIT 5;

  1. LIMIT 10,5; -- 如果不够5条,则有多少显示多少

(七)select语句总结

1、书写顺序

SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段 HAVING 条件 ORDER BY 字段 LIMIT offset,length;

其中,SELECT字段,FROM表名为 必写,其余均可根据情况而定。

2、执行顺序

1、from表名

2、where条件

3、group by 字段   

4、having 条件     

5、select 字段     

6、order by 字段

7、limit

-------------------------------------------------------------------------------------------------------------

作业

1、准备数据:

create table student(

id int,

name varchar(20),

chinese float,

english float,

math float

);

insert into student(id,name,chinese,english,math) values(1,'张小明',89,78,90);

insert into student(id,name,chinese,english,math) values(2,'李进',67,53,95);

insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);

insert into student(id,name,chinese,english,math) values(4,'李一',88,98,92);

insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);

insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);

insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);

(1)查询姓名为李一的学生成绩

(2)查询英语成绩大于90分的同学

(3)查询总分大于200分的所有同学

(4)查询英语分数在 80-90之间的同学。

(5)查询数学分数为89,90,91的同学。

(6)查询所有姓李的学生英语成绩。

(7)查询数学分>80并且语文分>80的同学。

(8)查询英语>80或者总分>200的同学

(9)对数学成绩排序后输出。

(10)对总分排序后输出,然后再按从高到低的顺序输出

(11)对姓李的学生成绩排序输出

(12)统计一个班级共有多少学生?

(13)统计英语成绩大于80的学生有多少个?

(14)统计总分大于220的人数有多少?

(15)统计一个班级数学总成绩?

(16)统计一个班级语文、英语、数学各科的总成绩

(17)统计一个班级语文、英语、数学的成绩总和

(18)统计一个班级语文成绩平均分

(19)求班级数学最高分

(20)求一个班级数学平均分?

(21)求一个班级总分平均分?

2、演示所有课上所有单行函数

3、create table orders(

id int,

product varchar(20),

price float

);

insert into orders(id,product,price) values(1,'电视',900);

insert into orders(id,product,price) values(2,'洗衣机',100);

insert into orders(id,product,price) values(3,'冰箱',1000);

insert into orders(id,product,price) values(4,'洗衣机',100);

insert into orders(id,product,price) values(5,'电视',900);

insert into orders(id,product,price) values(6,'笔记本电脑',1200);

insert into orders(id,product,price) values(7,'手电筒',50);

insert into orders(id,product,price) values(8,'手电筒',50);

  1. 对订单表中商品归类后,显示每一类商品的总价。
  2. 查询购买了几类商品,并且每类总价大于1000的商品

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜笙TUT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值