4.24总结

发布时间 2023-04-24 23:11:28作者: 封织云

-- 基础查询
-- 1.查询多个字段
/*
1.查询多个字段
SELECT 字段列表 FROM 表名;
SELECT * FROM 表名; -- 查询所有数据

  1. 去除重复记录
    SELECT DISTINCT 字段列表 FROM 表名;

3.起别名
AS:AS也可以省略
*/

drop table if exists stu;

CREATE TABLE stu(
id int,
name varchar(20),
age int,
sex varchar(5),
address varchar(100),
math double(5,2),
english double(5,2),
hire_date date
);

INSERT INTO stu(id,name,age,sex,address,math,english,hire_date)
VALUES
(1,'马云',55,'男','杭州',66,78,'1997-09-01'),
(2,'马化腾',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德华',57,'男','香港',99,99,'1998-09-01'),
(7,'张学友',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

SELECT * FROM stu;

-- 基础查询
-- 查询name age两列

SELECT name,age FROM stu;

-- 查询所有列的数据,列名的列表可以使用*替代。企业不建议使用!不方便加注释

SELECT id,name,age,sex,address,math,english,hire_date FROM stu;
SELECT * FROM stu;

-- 查询地址信息
SELECT address FROM stu; -- 会出现重复数据

-- 去除重复数据
SELECT DISTINCT address FROM stu;

-- 查询姓名,数学英语成绩
SELECT name,math as 数学成绩,english as 英语成绩 FROM stu;-- as 别名,可以不写,最少有一个空格隔开

-- 条件查询=====================================

-- 1.查询年龄大于20岁的学员信息
SELECT * FROM stu WHERE age > 20;

-- 2.查询年龄大于等于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;

-- 2.查询入学日期在'1998-09-01'到'1999-09-01'之间的学员信息
SELECT * FROM stu WHERE hire_date BETWEEN '1998-09-01' and '1999-09-01';

-- 3.查询年龄等于18岁的学员信息
SELECT * FROM stu WHERE age = 18;-- 等号只写一个

-- 4.查询年龄不等于18岁的学员信息
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18;

-- 5.查询年龄等于18岁,或者年龄等于20岁,或者年龄等于22的学员信息
SELECT * FROM stu WHERE age = 18 or age = 20 or age = 22;
SELECT * FROM stu WHERE age in (18,20,22);

-- 6.查询英语为null的学员信息
-- 注意:null值的比较不能使用= !=; 需要使用is is not;
SELECT * FROM stu WHERE english = null;-- 错误
SELECT * FROM stu WHERE english is null;
SELECT * FROM stu WHERE english is not null;

-- 模糊查询like==================
/*
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
*/

-- 1.查询姓'马'的学员信息
SELECT * FROM stu WHERE name LIKE '马%';

-- 2.查询第二个字是'化'的学员信息
SELECT * FROM stu WHERE name LIKE '_化%';

-- 3.查询名字中包含'德'的学员信息
SELECT * FROM stu WHERE name LIKE '%德%';

-- 排序查询===================

-- 1.查询学生信息,按照年龄升序排列
SELECT * FROM stu ORDER BY age asc;-- asc 升序(默认值) desc降序

-- 2.查询学生信息,按照数学成绩降序排列
SELECT * FROM stu ORDER BY math desc;

-- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
SELECT * FROM stu ORDER BY math desc,english asc;

-- 聚合函数:将一列作为一个整体,进行纵向计算

/* count:统计数量
* 取值情况:
1.主键(非空且唯一)
2.*
*/

-- 1.统计班级一共有多少个学生
SELECT COUNT(id) FROM stu;-- count 统计的列名不能为null
SELECT COUNT(english) FROM stu;-- 丢失null

SELECT COUNT(*) FROM stu;
-- 2.查询数学成绩最高分
SELECT MAX(math) FROM stu;

-- 3.查询数学成绩最低分
SELECT MIN(math) FROM stu;

-- 4.查询数学成绩总分
SELECT SUM(math) FROM stu;

-- 5.查询数学成绩平均分
SELECT AVG(math) FROM stu;

-- 6.查询英语成绩的最低分
SELECT MIN(english) FROM stu;-- null值不参与聚合函数的运算

-- 分组查询GROUP BY
-- 1.查询男同学和女同学各自的数学平均分
/SELECT 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;

-- 注意:where>聚合函数>having 执行时间不一样,所以
-- where 不能对聚合函数进行判断,having可以

-- 分页查询
-- 1.从0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0 , 3;-- 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) * 每页显示的条数