基础查询
条件查询(WHERE)
分组查询(GROUP BY)
排序查询(ORDER BY)
分页查询(LIMIT)
-- 删除stu表 drop table if exists stu; -- 创建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,'马云',18,'男','杭州',66,78,'1998-09-01'), (2,'马化腾',45,'女','深圳',98,87,'1998-09-01'), (3,'马斯克',55,'男','香港',56,77,'1999-09-02'), (4,'比尔盖茨',55,'男','深圳',56,77,'1999-09-02'), (5,'巴菲特',55,'男','深圳',56,null,'1999-09-02'), (5,'张一鸣',22,'男','深圳',56,null,'1999-09-02') ; -- 查整个表 select * from stu; -- 基础查询 ============================= -- 查询name age 两列 select name,age from stu; -- 查询所有列的数据,列名的列表可以使用*替代,不要使用!大部分公司不会允许你使用*号 select * from stu; -- 查询地址信息 select address from stu; -- 去除重复记录 select DISTINCT address from stu; -- 查询姓名,数学成绩,英语成绩 select name ,math as 数学成绩 ,english as 英语成绩 from stu ; -- 条件查询 =================== -- 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; -- 查询范围 20-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; -- 查询年龄不等于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 is not select * from stu where english is null;
-- 删除stu表 drop table if exists stu; -- 创建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,'马云',18,'男','杭州',66,78,'1998-09-01'), (2,'马化腾',45,'女','深圳',98,87,'1998-09-01'), (3,'马斯克',55,'男','香港',56,77,'1999-09-02'), (4,'比尔盖茨',55,'男','深圳',56,77,'1999-09-02'), (5,'巴菲特',55,'男','深圳',56,null,'1999-09-02'), (6,'张一鸣',22,'男','深圳',56,null,'1999-09-02'), (7,'刘德华',65,'男','深圳',56,null,'1999-09-02') ; -- 查整个表 select * from stu; -- 基础查询 ============================= -- 查询name age 两列 select name,age from stu; -- 查询所有列的数据,列名的列表可以使用*替代,不要使用!大部分公司不会允许你使用*号 select * from stu; -- 查询地址信息 select address from stu; -- 去除重复记录 select DISTINCT address from stu; -- 查询姓名,数学成绩,英语成绩 select name ,math as 数学成绩 ,english as 英语成绩 from stu ; -- 条件查询 =================== -- 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; -- 查询范围 20-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; -- 查询年龄不等于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 is not select * from stu where english is 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.概念:
将一列数据作为一个整体,进行纵向计算。
2.聚合函数分类
函数名 |
功能 |
count(列名) |
统计数量(一般选用不为null的列) |
max(列名) |
最大值 |
min(列名) |
最小值 |
sum(列名) |
求和 |
avg(列名) |
平均值 |
注意:null 值不参与所有聚合函数运算
-- 删除stu表 drop table if exists stu; -- 创建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,'马云',18,'男','杭州',66,78,'1998-09-01'), (2,'马化腾',45,'女','深圳',98,87,'1998-09-01'), (3,'马斯克',55,'男','香港',100,77,'1999-09-02'), (4,'比尔盖茨',55,'男','深圳',99,77,'1999-09-02'), (5,'巴菲特',55,'男','深圳',98,null,'1999-09-02'), (6,'张一鸣',22,'男','深圳',56,null,'1999-09-02'), (7,'刘德华',65,'男','深圳',56,null,'1999-09-02') ; -- 查整个表 select * from stu; -- 基础查询 ============================= -- 查询name age 两列 select name,age from stu; -- 查询所有列的数据,列名的列表可以使用*替代,不要使用!大部分公司不会允许你使用*号 select * from stu; -- 查询地址信息 select address from stu; -- 去除重复记录 select DISTINCT address from stu; -- 查询姓名,数学成绩,英语成绩 select name ,math as 数学成绩 ,english as 英语成绩 from stu ; -- 条件查询 =================== -- 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; -- 查询范围 20-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; -- 查询年龄不等于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 is not select * from stu where english is 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; select count(id) from stu; -- count 统计的列名不能为null select count(english) from stu; 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;
分组查询语法
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
Where 和 having 区别:
执行时机不一样;where是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
可判断的条件不一样:where不能对聚合函数进行判断,having可以。
执行顺序:where > 聚合函数 > having
-- 删除stu表 drop table if exists stu; -- 创建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,'马云',18,'男','杭州',66,78,'1998-09-01'), (2,'马化腾',45,'女','深圳',98,87,'1998-09-01'), (3,'马斯克',55,'男','香港',100,77,'1999-09-02'), (4,'比尔盖茨',55,'女','深圳',99,77,'1999-09-02'), (5,'巴菲特',55,'男','深圳',98,null,'1999-09-02'), (6,'张一鸣',22,'女','深圳',56,null,'1999-09-02'), (7,'查理芒格',65,'男','深圳',100,null,'1999-09-02'), (8,'贝索斯',65,'男','深圳',100,null,'1999-09-02') ; -- 查整个表 select * from stu; -- 基础查询 ============================= -- 查询name age 两列 select name,age from stu; -- 查询所有列的数据,列名的列表可以使用*替代,不要使用!大部分公司不会允许你使用*号 select * from stu; -- 查询地址信息 select address from stu; -- 去除重复记录 select DISTINCT address from stu; -- 查询姓名,数学成绩,英语成绩 select name ,math as 数学成绩 ,english as 英语成绩 from stu ; -- 条件查询 =================== -- 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; -- 查询范围 20-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; -- 查询年龄不等于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 is not select * from stu where english is 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; select count(id) from stu; -- count 统计的列名不能为null select count(english) from stu; 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; /* 分组函数 SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤] */ -- 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分的不参与分组 select sex,avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
分页查询
1.分页查询语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数
起始索引:从0开始
计算公式:起始索引=(当前页码-1) * 每页显示的条数
Tips :
分页查询limit是MySQL数据库的方言
Oracle 分页查询使用rownumber
SQL Server分页查询使用top
分页查询语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询条目数
起始索引:从0开始
计算公式:起始索引=(当前页码-1) * 每页显示的条数
Tips :
分页查询limit是MySQL数据库的方言
Oralcle分页查询使用rownumber
SQL Server 分页查询使用top
小结:
SELECT
字段列表
FROM
表名列表
WHERE
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定