一、DQL
DQL是数据查询语言(Data Query Language)的缩写,是一种专门用于查询数据库中数据的语言。DQL允许用户从数据库表中检索数据,并可以使用条件和操作符来过滤和排序返回的结果。常见的DQL语言包括SQL(结构化查询语言)和JPQL(Java持久化查询语言)。DQL主要用于从数据库中获取数据,并不用于修改或更新数据。
二、查询语句(单表查询)
当前有一个学生表student,其中有学生id、姓名name、年龄、性别以及班级
1、查询student表所有数据
select * from student;
查询表student 的所有数据,其中*表示通配,即所有字段的内容
例如:选中运行即可得到student内容
2、查询学生表的学生的姓名和年龄
select name,age from student;
运行即可查询,如图所示:
3、查询学生表中大于22岁的学生
select * from student where age>22;
使用where,where后面跟上条件,*号表示所有字段,如果想只查询id或者其他,可在select后面写,但是只能是在当前表中的字段名
4、查询学生表中大于22岁的男生
select * from student where age>22 and gender='男';
使用and将条件合起来,表示同时满足条件
5、查询文科六班的学生
select * from student where clazz='文科六班\r';
或者使用下一条的用法不使用特定的转置符号
在上节课中我们看到每条数据后面都有换行符,linux中的换行符为\r,Windows为\n
6、查询文科班的学生
select * FROM student WHERE clazz like "文科%"
这里使用like,%表示 "文科" 后面的数据全部通配,
7、查询六班的学生
select * FROM student WHERE clazz like "%六班%"
前后都通配即可
8、查询姓施的名字是三个字的学生
select * from student where name LIKE '施__';
其中使用一个下划线表示匹配一个单字符
9、查询所有学生按照年龄排序
select * from student ORDER BY age;
order by 默认升序,可在age后面增加一个desc 表示降序
10、查询所有学生按照班级、年龄排序
select * from student ORDER BY clazz,age;
可以同时排序多个
11、查询十条数据
select * from student LIMIT 10;
使用limit限制输出行数
12、查询 10-20条数据 LIMIT offset,length
select * from student LIMIT 10,10;
其中第一个10表示从第10行开始,后一个10为输出长度为10条
13、分组 一般和聚合函数一起使用max min avg sum count
max表示求最大值
min求最小值
avg求平均值
sum求和
count求行条数
SELECT clazz,COUNT(id) as con FROM student GROUP BY clazz;
代码意思是:对班级clazz进行分组,后面使用count(id)即表示求id中行的格式,因为班级进行了分组,相当于一个班级对应所有的数据,每个班级则对应每个班的所有数据,在使用count(id)对分组后的每个组进行求个数,即可得到每个班级的人数。其中的as con 表示对count(id)取别名为con,as可以省略
注意:select后面写的东西都要在后面的group by后跟上,group by 后面写的不一定需要全部写到select后面,但是select后面可以写n个聚合函数
14、求每个班的平均年龄
SELECT clazz,AVG(age) FROM student GROUP BY clazz;
使用聚合函数avg求平均值
15、求每个班的男女人数
SELECT clazz,gender,COUNT(id) FROM student GROUP BY clazz,gender;
对班级和性别进行分组,班级在前性别在后,表示一个班级对应两个性别,分别对每个性别求count数量,然后输出出来
16、求女生人数大于40人的班级
SELECT
clazz
,COUNT(gender) cnt
FROM student
GROUP BY clazz,gender
HAVING gender='女' and cnt>40
此时不能将条件写在where后,因为where的执行顺序比group by高,having后也是写条件,但是他的执行顺序比group by 低,另外这里的别名cnt也是
17、可在group by之前过滤
select
clazz
,gender
,COUNT(*) as cnt
from student
where clazz like '文科%'
group by clazz,gender
having cnt>40 and gender='女';
18、文科班女生人数大于40的前三名
select
clazz
,gender
,count(*) as cnt
from student
where clazz like '文科%'
group by clazz,gender
having cnt > 40 and gender ='女'
order by cnt DESC
limit 3;
19、查询出的数据如果是一个值 那么可以当作是一个值去使用
可以使用下列代码输出所有人分数的平均分
select avg(age) from student
其结果为:
此时可以把这个查询当做一个值来使用,求班级比平均分高的学生的信息,使用下列代码,直接将上述代码插入条件即可
select *
from students
where age > (select avg(age) from students);
20、如果查询出的数据是一列 那么可以使用where in 去检索
首先使用下列命令查询所有的立刻班级,
select distinct clazz from student where clazz like '理科%'
其得到的结果为一列数据代表所有的理科班级:
那么便可使用 in 来检索这一整个列,如下查询理科班的所有学生信息:
select *
from student
where clazz in
(select distinct clazz from student where clazz like '理科%')