DQL
语法
select
字段列表
from
表名列表
where
条件列表
groub by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询
多个字段的查询
- select 字段1,字段2,… from 表名;
- 注意:如果查询所有字段,则可以使用*来替代字段列表
去除重复
- 使用 distinct 关键字可以去除重复,如果对多个字段使用,则必须完全一致才可以去重
计算列
-
一般可以使用四则运算计算一些列的值。一般只会进行数值型的计算
-
ifnull(表达式1,表达式2):null参与的运算,计算结果都是null
表达式1:哪个字段需要判断是否为null
表达式2:该字段如果为null后需要替换的值
起别名
- 使用 as关键字,as也可以省略
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
age INT,
sex VARCHAR(5),
address VARCHAR(20)
);
INSERT INTO student(id,NAME,age,sex,address) VALUES
(1,"小狗",55,"男","香港"),
(2,"麻花藤",66,"男","马窖"),
(3,"刘德华",53,"男","香港"),
(4,"柳岩",44,"女","湖南"),
(5,"盖伦",43,"男","德玛西亚"),
(6,"艾希",32,"女","弗雷尔卓德");
SELECT * FROM student;
-- 查询姓名 和 年龄
SELECT NAME,age FROM student WHERE age>40;
-- 查询address
SELECT DISTINCT address FROM student;
SELECT NAME,address FROM student;
-- 计算每个数据的id和年龄之和
SELECT NAME,id,age,id+age FROM student;
-- 如果有null参与的计算,计算结果都为null
SELECT NAME,id,age,id + IFNULL(age,0) FROM student;
-- 起别名
SELECT NAME,id,age,id + IFNULL(age,0) AS 总分 FROM student;
SELECT NAME 姓名,id 学号,age 年龄,id + IFNULL(age,0) 总分 FROM student;
SELECT * FROM student;
条件查询
where子句后面跟条件
运算符
-
>、<、<=、>=、=、<>不等号
-
BETWEEN…AND 在a到b之间
-
IN(集合) 在集合里
-
LIKE 模糊查询
_:单个任意字符
%:多个任意字符
-
IS NULL 判断是否为null
-
and 或 && a和b
-
or 或 || a或b
-
not 或 ! 取反
-- 查询所有内容
SELECT * FROM student;
-- 查询年龄大于20岁
SELECT * FROM student WHERE age=32;
-- 查询年龄大于等于30小于等于40
SELECT * FROM student WHERE age>=30 AND age<=40;
SELECT * FROM student WHERE age BETWEEN 40 AND 50;-- 使用between and也可以做到
-- 查询年龄等于44或等于34的人
SELECT * FROM student WHERE age=34 OR age=44;
-- 使用IN所有在集合内的元素都作为OR类型的条件判断
SELECT * FROM student WHERE age IN (34,44);
UPDATE student SET age=NULL WHERE id=2;
-- 找出年龄等于null的人
SELECT * FROM student WHERE age IS NULL;
-- 查询年龄不等于null的
SELECT * FROM student WHERE age IS NOT NULL;
-- 查询姓刘的人
SELECT * FROM student WHERE NAME LIKE '刘%';
-- 查询姓名中第二个字是德的人
SELECT * FROM student WHERE NAME LIKE '_德%';
-- 查询姓名是三个字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含花的人
SELECT * FROM student WHERE NAME LIKE '%花%';
SELECT * FROM student WHERE NAME LIKE '%华%';
排序查询
语法
- order by 子句
- order by 排序字段1 排序方式1,排序字段2 排序方式2…
排序方式
- ASC:升序
- DESC:降序
注意
- 如果有多个排序条件,则当前面的条件值一样时,才会判断后面的排序条件
#按年龄升序排序查询ASC
SELECT * FROM student ORDER BY age ASC;
#按年龄降序排序查询DESC
SELECT * FROM student ORDER BY age DESC;
#按照数学成绩排名,如果数学成绩一样,按英语成绩排名
SELECT * FROM student ORDER BY meth ASC,english ASC;
聚合函数
将一列数据作为一个整体,进行纵向的计算。(列的纵向计算)
-
count:计算个数
#计算学生个数 SELECT COUNT(NAME) FROM student;
-
max:计算最大值
#计算数学成绩最大值 SELECT MAX(meth) FROM student;
-
min:计算最小值
#计算数学成绩最小值 SELECT MIN(meth) FROM student;
-
sum:计算和
#计算数学成绩的和 SELECT SUM(meth) FROM student;
-
avg:计算平均值
#计算数学成绩平均值 SELECT AVG(meth) FROM student;
注意
-
聚合函数的计算,排除null值
-
解决方案1:选择不包含非空的列进行计算,对主键进行计算
-
解决方案2:IFNULL函数对null值进行替换
SELECT COUNT(IFNULL(english,0)) FROM student;
分组查询
语法
- group by 分组字段
#按照性别分组,查询男生女生的平均成绩
SELECT sex,AVG(meth) FROM student GROUP BY sex;
#按照性别分组,查询男生女生的平均成绩,人数
SELECT sex,AVG(meth),COUNT(id) FROM student GROUP BY sex;
#按照性别分组,查询男生女生的平均成绩,人数。要求分数低于70分不参与
SELECT sex,AVG(meth),COUNT(id) FROM student WHERE meth>70 GROUP BY sex HAVING COUNT(id)>=1;
#使用别名简化
SELECT sex,AVG(meth),COUNT(id) 人数 FROM student WHERE meth>70 GROUP BY sex HAVING 人数>=1;
注意
- 分组之后查询的字段:分组查询、聚合查询
- where和having的区别:
- where在分组之前进行限定,如果不满足条件,则不参与分组。having则在分组之后进行限定,如果不满足结果,则不会被查询出来
- where后不可以跟聚合函数,having可以进行聚合函数的判断。
分页查询
语法
- limit 开始的索引,每页查询的条数;
公式
- 开始的索引 = (想要查看页数 - 1)* 每页显示的条数
#每页2条记录,想看第一页
SELECT * FROM student LIMIT 0,3; -- 第一页
SELECT * FROM student LIMIT 3,3; -- 第二页
注意
- 分页操作是一个“方言”,各种数据库分页操作并不相同。limit语法是mysql的方言