-- 单表查询对应练习题 https://blog.csdn.net/ksaar_/article/details/103811410
-- 创建表
CREATE TABLE stu (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(32),
age int(11),
sex varchar(1),
address varchar(20),
math double(5, 2) NOT NULL DEFAULT 0.00,
english double(5, 2) NOT NULL DEFAULT 0.00,
PRIMARY KEY (id)
) AUTO_INCREMENT = 1;
-- 添加数据
INSERT INTO `stu` VALUES (1, '浩诚', 35, '女', '阿富汗', 90.00, 30.00);
INSERT INTO `stu` VALUES (2, '彭超', 20, '男', '阿富汗', 70.00, 60.00);
INSERT INTO `stu` VALUES (3, '余旭', 20, '男', '阿富汗', 50.00, 30.00);
INSERT INTO `stu` VALUES (4, '刘诚', 18, '女', '湖北', 90.00, 98.00);
INSERT INTO `stu` VALUES (5, '雨晴', 19, '女', '上海', 60.00, 70.00);
INSERT INTO `stu` VALUES (6, '唐三藏', 35, '男', '东土大唐', 0.00, 00.00);
INSERT INTO `stu` VALUES (7, '孙悟空', 500, '男', '花果山', 10.00, 00.00);
INSERT INTO `stu` VALUES (8, '猪悟能', 360, '男', '高老庄', 0.00, 00.00);
INSERT INTO `stu` VALUES (9, '沙悟净', 180, '男', '瑶池', 30.00, 10.00);
INSERT INTO `stu` VALUES (10, '白龙马', 100, '男', '东海龙宫', 50.00, 30.00);
INSERT INTO `stu` VALUES (11, '柯南', 15, '男', '日本', 90.00, 100.00);
INSERT INTO `stu` VALUES (12, '李太宗', 50, '男', '东土大唐', 50.00, 10.00);
INSERT INTO `stu` VALUES (13, '西王母', 1000, '女', '瑶池', 0.00, 00.00);
INSERT INTO `stu` VALUES (14, '马云', 55, '男', '杭州', 66.00, 78.00);
INSERT INTO `stu` VALUES (15, '马化腾', 45, '女', '深圳', 98.00, 87.00);
INSERT INTO `stu` VALUES (16, '马景涛', 55, '男', '香港', 56.00, 77.00);
INSERT INTO `stu` VALUES (17, '柳岩', 20, '女', '湖南', 76.00, 65.00);
INSERT INTO `stu` VALUES (18, '柳青', 20, '男', '湖南', 86.00, 00.00);
INSERT INTO `stu` VALUES (19, '刘德华', 57, '男', '香港', 99.00, 99.00);
INSERT INTO `stu` VALUES (20, '马德', 22, '女', '香港', 99.00, 99.00);
INSERT INTO `stu` VALUES (21, '德玛西亚', 18, '男', '南京', 56.00, 65.00);
-- 查询的书写顺序
-- SELECT ... FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 条件 ORDER BY 排序 LIMIT 分页
-- 查询的解析(运行)顺序
-- FROM 表名 WHERE 条件 GROUP BY 分组 SELECT ... HAVING 条件 ORDER BY 排序 LIMIT 分页
-- 基础查询 SELECT
-- 查询学生中的所有学生信息
SELECT * FROM stu;
-- 查询学生中的所有学生的姓名
SELECT name FROM stu;
-- 条件查询 WHERE 条件
-- 查询所有男性的信息
SELECT * FROM stu WHERE sex = '男';
-- AND,&& 并且
-- 查询所有男性中数学成绩大于80的信息
SELECT * FROM stu WHERE sex = '男' AND math > 80;
SELECT * FROM stu WHERE sex = '男' && math > 80;
-- OR,|| 或者
-- 查询所有女性的数学成绩,或者成绩大于90的信息
SELECT * FROM stu WHERE sex = '女' OR math > 90;
SELECT * FROM stu WHERE sex = '女' || math > 90;
-- NOT,! 非
-- 查询所有非男性的信息
SELECT * FROM stu WHERE sex != '男';
-- DISTINCT 去重
-- 查询居住地有多少种
SELECT DISTINCT address FROM stu;
-- BETWEEN a AND b a 和 b 之间
-- 查询再数学成绩早90到100之间的所有信息
SELECT * FROM stu WHERE math BETWEEN 90 AND 100;
-- IN(a,b,c,...) 再a,b,c...之中
-- 查询数学成绩等于90和等于10的人
SELECT * FROM stu WHERE math IN(90,10);
-- LIKE 好像 后面加 _ 表示一个未知字符 % 表示未知字符,也不知的个数,可以是0个
-- 查询姓柯的,并且名字只有两个子的人
SELECT * FROM stu WHERE name LIKE '柯_';
-- 查询名字为三个字的人的信息
SELECT * FROM stu WHERE name LIKE '___';
-- 查询姓马的人
SELECT * FROM stu WHERE name LIKE '马%';
SELECT * FROM stu WHERE SUBSTRING(`name`,1,1) = '马';
-- 查询名字中有马的人
SELECT * FROM stu WHERE name LIKE '%马%';
-- 排序查询 ORDER BY
-- 查询所有学生的信息,按照数学成绩 从小到大,升序(ASC),排序....不加排序规则默认升序
SELECT * FROM stu ORDER BY math;
SELECT * FROM stu ORDER BY math ASC;
-- 查询所有学生的信息,按照英语成绩 从大到小,升序(DESC),排序
SELECT * FROM stu ORDER BY english DESC;
-- 查询所有学生的信息,先按数学成绩的从小到大(默认) 排序,数学成绩相同,按照英语成绩从大到小排序
SELECT * FROM stu ORDER BY math,english DESC;
-- 聚合函数
-- 查询数据的条数
SELECT COUNT(*) FROM stu;
-- 查询数学最高分
SELECT MAX(math) FROM stu;
-- 查询数学最低分
SELECT MIN(math) FROM stu;
-- 查询数学总分
SELECT SUM(math) FROM stu;
-- 查询数学平均分
SELECT AVG(math) FROM stu;
-- 分组查询 GROUP BY
-- 一但分组之后,查询的结果也应该是分组字段,或者聚合函数
-- 按照性别分组,分别查询男,女同学的平均分数,人数
SELECT sex,AVG(math),COUNT(*) FROM stu GROUP BY sex;
-- 按照性别分组,分别查询男,女同学的平均分数,人数 , 要求:成绩大于60的才参与分组
SELECT sex,AVG(math),COUNT(*) FROM stu WHERE math > 60 GROUP BY sex;
-- HAVING 条件判断
-- 按照性别分组,分别查询男,女同学的平均分数,人数 , 要求:成绩大于60的才参与分组 , 并且分组后的人数要大于5 才显示
SELECT sex,AVG(math),COUNT(*) 人数 FROM stu WHERE math > 60 GROUP BY sex HAVING 人数 > 5;
-- WHERE 与 HAVING 的区别
-- WHERE 是对分组前表的数据进行过滤的,WHERE 后面不能使用聚合函数,
-- HAVING 是对分组后形成的分组表进行过滤的,HAVING 后面可以使用聚合函数,
-- 分页查询 LIMIT 开始的索引,查询的条数 LIMIT是MySQL的方言
-- 每页显示5条数据
-- 公式: 开始的索引 = (当前的页码 -1) * 每页显示的条数
SELECT * FROM stu LIMIT 0,5; -- 第一页
SELECT * FROM stu LIMIT 5,5; -- 第二页
SELECT * FROM stu LIMIT 10,5; -- 第三页