【聚合函数】 COUT 数据的数量 SUM 数据求和 AVG 求平均数 MIN 最小数 MAX 最大数
create table emp( id int primary key auto_increment, name varchar(20) not null, role varchar(20) not null, salary numeric(11,2) );
insert into emp(name, role, salary) values ('马云','服务员', 1000.20), ('马化腾','游戏陪玩', 2000.99), ('孙悟空','游戏角色', 999.11), ('猪无能','游戏角色', 333.5), ('沙和尚','游戏角色', 700.33), ('隔壁老王','董事长', 12000.66);
// select count(*) from emp; 计算总行数 //select sum(salary) from emp; 计算总的salary //select max(salary) from emp; 最大数 //select mix(salary) from emp; 最小salary [注意]: select max(salary),name from emp; 会报错,因为max(salary)只有一行,而name 有六行,所以无法显示
group by 分组查询
select max(salary),role from emp group by role; 这样就不会报错
select max(salary),role,name from emp group by role; 还是会报错,因为group by role 之后会有四行,但是name有六行,所以啊还是无法显示
分组后的条件查询使用having: //查询角色分组后,salary>2000的角色 select sum(salary),role from emp group by role having sum(salary)>2000;
【联合查询】(内连接和外连接都属于多表查询) 【内连接】: (语法1): select * from classes,student where classes.id=1; //班级id为1所以学生数据 select cls.name classes_name,stu.name student_name from classes cls,student stu where cls.id=1; //班级id为1的所有同学 select cls.name classes_name,stu.name student_name from classes cls,student stu where cls.id=stu.classes_id and cls.id=1; //班级id为1的所有同学 //cls和stu分别为classes和student 的别名 , classes_name和student_name 分别为列的别名
(语法2): select cls.name classes_name,stu.name student_name from classes cls join student stu on cls.id=stu.id where cls.id=1; //班级id为1的所有同学 等同于语法1中的第二条,把,换成了join,还加了on..主键和外键的关系
select classes.name,student.name from classes,student where classes.id=student.classes_id; //查询的是每个学生的班级分布
student和course 多对多, score是中间表
【外连接】 【自连接】 【子查询】: 指嵌入在其他sql语句中的select语句,也叫嵌套查询 1、单行子查询: 例如:查询于“不想毕业”同学的同班同学 select * from student where classes_id =(select casses_id from student where name='不想毕业'); 2、多行查询 例如:查询语文或英文课程的成绩信息 (1)in查询 select * from score sco join course cou on sco.course_id=cou.id where cou.name='英文' or cou.name='语文'; (不用子查询方法查询) select * from score sco join course cou on sco.course_id=cou.id where cou.name in('英文','语文'); (子查询法 ) select * from score where course_id in(select id from course where name='语文' or name='英文'); (in) select * from score where course_id not in(select id from course where name!='语文' and name!='英文'); (not in) (2)exists查询 select * from score sco where exists(select * from course cou where cou.id=sco.course_id and(cou.name='语文' or cou.name='英文')); (exists) select * from score sco where not exists(select * from course cou where cou.id=sco.course_id and(cou.name=!'语文' and cou.name!='英文')); (not exists) 【合并查询】: 为了合并多个select执行结果,可以使用操作符union,union all 例如:查询id=1或3的成绩信息 select * from score where id=1 union(或union all) select * from score where id=2; union和union all的区别: union 可以自动去除重复部分,union all不行
select * from student,score; //笛卡尔积 (用一张表的每一行去遍历另一张表的每一行) 简易为: //显示每个同学的每门课程成绩及课程id (语法一) select sco.score,stu.name,sco.course_id from score sco,student stu where sco.student_id=stu.id; (语法二) select sco.score,stu.name,sco.course_id from score sco join student stu on sco.student_id=stu.id;
//查询许仙同学的所有成绩 select sco.score,stu.name,sco.course_id from score sco join student stu on sco.student_id=stu.id where stu.name='许仙';
//查询英语成绩在60以上的同学 (关联两张表) select * from score sco,course cou where sco.course_id=cou.id and cou.name='英文' and sco.score>=60; select * from score sco join course cou on sco.course_id=cou.id where cou.name='英文' and sco.score>=60; (关联三张表) select stu.name student_name,cou.name course_name,sco.score from score sco,student stu,course cou where sco.course_id=cou.id and sco.student_id=stu.id and cou.name='英文' and sco.score>=60;
//查询英语成绩在60以上的同学的英文分数总和
select sum(sco.score) from score sco join course cou on sco.course_id=cou.id where cou.name='英文' and sco.score>=60;
//查询平均成绩及格(>=60分)的信息 (要分组)
