2.5 DQL:查询表中的记录
select * from 表名; select [distinct] 列名,列名 from 表 where 条件
2.5.1 语法
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
2.5.2 基础查询
2.5.2.1 多字段的查询
select 字段名1,字段名2... from 表名;
-
注意:
-
如果查询所有字段,则可以使用*来替代字段列表。
-
2.5.2.2去除重复
-
distinct select distinct 列名 from 表名
2.5.2.3 计算列
-
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
-
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
-
表达式1:哪个字段需要判断是否为null
-
如果该字段为null后的替换值。
-
2.5.2.4 起别名
-
as:as也可以省略
select 列名1 as 新名,列名2 as 新名 from 表名
#查询结果是表达式(运算查询):将所有商品的价格+10元进行显示. select pname,price+10 from product;
2.5.2.5 条件查询
-
where子句后跟条件
-
运算符
-
、< 、<= 、>= 、= 、<>
-
BETWEEN...AND
-
IN( 集合)
-
LIKE:模糊查询
-
占位符:
-
_:单个任意字符
-
%:多个任意字符
-
-
-
IS NULL
-
and 或 &&
-
or 或 ||
-
not 或 !
-
例子:
-- 1.查询年龄大于20岁的学员信息 select * from stu where age > 20;
-- 2.查询年龄大于等于20岁的学员信息 select * from stu where age >= 20;
-- 3.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息 select * from stu where age >= 20 && age <= 30; select * from stu where age >= 20 and age <= 30; select * from stu where age BETWEEN 20 and 30; -- 4.查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息 select * from stu where hire_date BETWEEN '1998-09-01' and '1999-09-01';
-- 5. 查询年龄等于18岁的学员信息 select * from stu where age = 18;
-- 6. 查询年龄不等于18岁的学员信息 select * from stu where age != 18; select * from stu where age <> 18;
-- 7. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息 select * from stu where age = 18 or age = 20 or age = 22; select * from stu where age in (18,20 ,22);
-- 8. 查询英语成绩为 null的学员信息 -- 注意: null值的比较不能使用 = != 。需要使用 is null或者is not null select * from stu where english = null; -- 不行的 select * from stu where english is null; select * from stu where english is not null;
2.5.2.6 模糊查询(like)
通配符:(1):代表单个任意字符 (2)%:代表任意个数字符 —1.查询姓马同学信息: select *from stu where name like “马%”; —2.查询第二个字是花的学园信息: select *from stu where name like “花%”; —3.查询名字中包含德的学员信息: select *from stu where name like “%德%”;
2.5.2.7 排序查询
-
语法: SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
-
排序方式:
-
ASC:升序排列(默认值)
-
DESC:降序排列 */ -- 1.查询学生信息,按照年龄升序排列 select * from stu order by age ; -- 2.查询学生信息,按照数学成绩降序排列 select * from stu order by math desc ; -- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列 select * from stu order by math desc , english asc ;
-
#显示商品的价格(去重复),并排序(降序) SELECT` `DISTINCT` `price ``FROM` `product ``ORDER` `BY` `price ``DESC``;
-
2.5.2.8 聚合函数
(语法:select 聚合函数名 (列名)from 表名): count(统计数量)、max(最大值)、min(最小值)、sum(求和)、avg(平均值)
-
count:统计指定列不为NULL的记录行数;
-
sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
-
max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
-
min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
-
avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
注:null不参与聚合函数运算
eg:统计学生数量 select count(id) from stu;
2.5.2.9 分组函数
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]…; */ select * from stu ; -- 1. 查询男同学和女同学各自的数学平均分 select sex, avg(math) from stu group by sex; -- 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义 select name, sex, avg(math) from stu group by sex; -- 2. 查询男同学和女同学各自的数学平均分,以及各自人数 select sex, avg(math),count() from stu group by sex; -- 3. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组 select sex, avg(math),count() from stu where math > 70 group by sex; -- 4. 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的。 select sex, avg(math),count() from stu where math > 70 group by sex having count() > 2;
2.5.2.10 分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数 * 起始索引:从0开始*/ select * from stu ; -- 1. 从0开始查询,查询3条数据 select * from stu limit 0 , 3; -- 2. 每页显示3条数据,查询第1页数据 select * from stu limit 0 , 3; -- 3. 每页显示3条数据,查询第2页数据 select * from stu limit 3 , 3; -- 4. 每页显示3条数据,查询第3页数据 select * from stu limit 6 , 3; -- 起始索引 = (当前页码 - 1) * 每页显示的条数
2.5.2.11 分组查询
分组查询是指使用group by字句对查询信息进行分组。
格式:
SELECT` `字段1,字段2... ``FROM` `表名 ``GROUP` `BY``分组字段 ``HAVING` `分组条件;
分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
having与where的区别:
-
having是在分组后对数据进行过滤.
-
where是在分组前对数据进行过滤
-
having后面可以使用分组函数(统计函数)
-
where后面不可以使用分组函数。
#统计各个分类商品的个数 SELECT` `category_id ,``COUNT``(*) ``FROM` `product ``GROUP` `BY` `category_id ;
#统计各个分类商品的个数,且只显示个数大于1的信息 SELECT` `category_id ,``COUNT``(*) ``FROM` `product ``GROUP` `BY` `category_id ``HAVING` `COUNT``(*) > 1;