目录
例3、按照性别分组,分别查询男女同学的平均分、人数(分数低于70分的人不参与)
例4、按照性别分组,分别查询男女同学的平均分、人数(分数低于70分的人不参与,分组之后只保留大于两个人的组)
查询语法: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组之后的条件 ORDER BY 排序 LIMIT 分页限定
比如 在stu表中查找所有数据: SELECT * FROM stu;
说明:MySQL的语句不区分大小写;本文为了区别语句和我们的变量名,本文SQL语句全部大写。
准备工作
建议:使用SQLyog,复制下面的代码做好查询之前的准备。
我们先创建一个表,插入数据:
CREATE TABLE student (
id INT,-- 编号
NAME VARCHAR(20),-- 姓名
age INT,-- 年
sex VARCHAR(5),-- 性别
address VARCHAR(100),-- 地址
math INT,-- 数学
english INT -- 英语
);
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
说明:上面的语句如果报错,请同学们手敲一遍,很有可能是空格的原因导致报错。下面的代码,为了排版 敲了很多空格,不能复制过去直接执行。
一、基础查询
1、多个字段的查询
SELECT 字段1,字段2 FROM 表名;
比如:查询姓名和年龄
SELECT NAME ,age FROM student;
2、去除重复的结果集
SELECT DISTINCT 字段 FROM 表名;
比如:查询 address 都有哪些地方,不想看重复的地域名
SELECT DISTINCT address FROM student;
比如:查询姓名和年龄,并且对结果集去重
SELECT DISTINCT NAME,age FROM student;
3、计算字段1与字段2的和
SELECT 字段1,字段2,字段1+字段2 FROM 表名;
比如:查询英语成绩 与 数学成绩之和
SELECT math, english,math+english FROM student;
4、避免有 NULL 参与的运算,计算结果为 NULL
SELECT 字段1,字段2,字段1+IFNULL(字段2,0) FROM 表名;
比如:查询英语成绩 与 数学成绩之和,避免和为NULL
SELECT math, english,IFNULL(math,0)+IFNULL(english,0) FROM student;
5、起别名
比如:查询查询英语成绩 与 数学成绩之和,第三列显示名字太长、不好看
SELECT math, english,math+IFNULL(english,0) AS 总分 FROM student;
SELECT math, english,math+IFNULL(english,0) 总分 FROM student;
SELECT math 数学, english 英语,math+IFNULL(english,0) 总分 FROM student;
二、条件查询
1、where 子句后面条件
SELECT * FROM 表名 WHERE 条件;
比如:查询年龄大于、大于等于20岁有哪些人
SELECT * FROM student WHERE age>20;
SELECT * FROM student WHERE age>=20;
比如:查询年龄等于、不等于20岁有哪些人
SELECT * FROM student WHERE age=20;
SELECT * FROM student WHERE age!=20;
SELECT * FROM student WHERE age<>20;
2、根据两个及以上的条件查询
比如:查询年龄大于等于20、小于等于30岁有哪些人
SELECT * FROM student WHERE age>=20 && age<=30 ;
SELECT * FROM student WHERE age>=20 AND age<=30 ;
3、条件是两个数值之间
例1:查询年龄大于等于20、小于等于30岁有哪些人
SELECT * FROM student WHERE age BETWEEN 20 AND 30 ;
4、多个条件,满足其一就可
例1:查找22岁、18岁、20岁的人员信息
SELECT * FROM student WHERE age=22 or age= 18 or age=20;
SELECT * FROM student WHERE age IN (18,20,22);
5、字段中有数据为NULL
例1:查询英语缺考的同学
SELECT * FROM student WHERE english IS NULL;
例2:查询英语参加考试的同学
SELECT * FROM student WHERE english IS NOT NULL;
6、模糊查询
占位符:_ 表示单个任意字符 % 表示多个任意字符
例1:查找表中姓马的人
SELECT * FROM student WHERE NAME LIKE '马%';
例2:查找表中名字中第二个字是华的人
SELECT * FROM student WHERE NAME LIKE '_华%';
例3:查找表中姓名是三个字的人
SELECT * FROM student WHERE NAME LIKE '____';
例4:查找表中名字里面有‘‘马”字的人
SELECT * FROM student WHERE NAME LIKE '%华%';
三、排序查询
语法:SELECT * FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
排序方式:ASC 是升序方式 , DESC是降序方式,不写代表默认ASC。
例1:按照数学成绩对表中数据进行排序
SELECT * FROM student ORDER BY math--升序;
SELECT * FROM student ORDER BY math ASC;
SELECT * FROM student ORDER BY math DESC--降序;
例2:按照数学成绩排名,如果数学成绩一样,则按照英语成绩排名
SELECT * FROM student ORDER BY math ASC,english ASC;
SELECT * FROM student ORDER BY math ASC,english DESC;
*注意
*如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件
四、聚合函数
将一列数据作为一个整体,进行纵向的计算
1、COUNT:计算个数
2、MAX:计算最大值
3、MIN:计算最小值
4、SUM:求和
5、AVG:计算平均值
例1:查询 student 表中一共有多少个人
SELECT COUNT(NAME) FROM student;
注意:聚合函数的计算会排除NULL值
解决方案:
1、选择不包含NULL的列进行计算:主键的列
2、IFNULL函数
例2:根据english查询 student 表中一共有多少个人,但是english里有NULL
SELECT COUNT(IFNULL(english,0)) FROM student;
SELECT COUNT(IFNULL(english,0)) FROM student;
例3:求数学成绩的最大值
SELECT MAX(math) FROM student;
例4:求数学成绩的最小值
SELECT MIN(math) FROM student;
例5:求数学成绩的和
SELECT SUM(math) FROM student;
例6:求数学成绩的平均值
SELECT AVG(math) FROM student;
五、分组查询
1、语法
SELECT 字段1,聚合函数1,聚合函数2 FROM 表名 GROUP BY 字段1;
注意:分组查询的字段,只能是分组字段;查询条件只能是聚合函数
例1、按照性别分组,分别查询男女同学的平均分
SELECT sex,AVG(math) FROM student GROUP BY sex;
例2、按照性别分组,分别查询男女同学的平均分、人数
SELECT sex,AVG(math),COUNT(id) FROM student GROUP BY sex;
例3、按照性别分组,分别查询男女同学的平均分、人数(分数低于70分的人不参与)
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math>70 GROUP BY sex;
例4、按照性别分组,分别查询男女同学的平均分、人数(分数低于70分的人不参与,分组之后只保留大于两个人的组)
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math>70 GROUP BY sex HAVING COUNT(id) >2;
WHERE 与 HAVING的区别:
- WHERE在分组之前进行限定
- HAVING在分组之后根据条件筛选
- WHERE后不可以跟聚合函数
- HAVING可以进行聚合函数的判断
六、分页查询
1、语法:
...... LIMIT 开始的索引,每页查询的条数
例1、每页显示3条数据
SELECT * FROM student LIMIT 0,3; -- 第一页
SELECT * FROM student LIMIT 3,3; -- 第二页
公式:
开始的索引 = (当前的页码 - 1)* 每页显示多少条数据
注意:LIMIT是一个方言,其他数据库的分页查询用的语句不是LIMIT