zoukankan      html  css  js  c++  java
  • mysql之查询


    #数据准备
    drop table if exists class;
    create table class(
        class_no int(2) unsigned zerofill primary key auto_increment comment '班级编号',
        class_name varchar(30) not null comment '班级名称'
    );
    insert into class values(1, '培优班');
    insert into class values(2, '普通班');

    drop table if exists student;
    create table student(
        stu_no int(2) unsigned zerofill primary key auto_increment comment '学员编号',
        stu_name varchar(30) not null comment '学员姓名',
        stu_sex varchar(3) not null comment '学员性别',
        stu_age tinyint(2) unsigned zerofill comment '学员年代',
        grade double(5,2) zerofill comment '成绩',
        class_no int(2) unsigned zerofill comment '所在班级编号',
        foreign key(class_no) references class(class_no)  
    );
    insert into student values(01, '李白', '男', 18, 60, 01);
    insert into student values(02, '杜甫', '男', 20, 76, 01);
    insert into student values(03, '张飞', '男', 32, 80, 02);
    insert into student values(04, '韩信', '男', 26, 98, 02);
    insert into student values(05, '了龙', '男', 27, 56, 02);
    insert into student values(06, '大乔', '女', 17, 88, 01);
    insert into student values(07, '小乔', '女', 16, 96, 01);
    insert into student values(08, '小乔', '女', 16, 90, 01);
    insert into student values(09, '关哥', '男', 32, 80, 02);
    insert into student values(10, '刘备', '男', 36, 98, null);
    alter table student drop foreign key `student_ibfk_1`;
    *******************************************************************************************************************************

    1: [ group by ] 分组   
        需求: 查询出每一个班级最高成绩是多少
        例: select class_no, max(grade) from student group by class_no;  --先按class_no分组,然后再拿到每一组的最高成绩
        例: select class_no, sum(grade) from student group by class_no;  --查询每一个班级的总成绩
        例: select class_no, min(grade) from student group by class_no;  --查询每一个班级的最低成绩
        例: select class_no, avg(grade) from student group by class_no;  --查询每一个班级的平均成绩
        例: select class_no, count(*) from student group by class_no;    --查询每一个班级的人数
        ps: group by一般要与max,min,avg等这些函数一起使用
        例: select * from student group by class_no;

        --可以进多重分组
        需求: 查询出每一个班级男学生和女学生的最高成绩分别是多少
        例: select class_no, stu_sex ,max(grade) from student group by class_no, stu_sex;

        例: select class_no, stu_name, max(grade) from student group by class_no;   --不能这样做
        ps: 在要查询的字段集中,这些字段要么是包含在group by语句的后面的字段, 要么就是被包含在聚合函数中, 否则会报错


        --还可以对满足条件的记录进行分组
        select class_no, max(grade) from student where class_no is not null group by class_no;
    *******************************************************************************************************************************

    2: having
        例: select * from student where class_no = 1 and stu_sex = '男';
        例: select * from student having class_no = 1 and stu_sex = '男';

        例: select class_no, max(grade) from student group by class_no having class_no is not null;   --having
        例: select class_no, max(grade) from student group by class_no where class_no is not null;    --报错
        ps: having需要跟在group by后面,而where不能跟在group by后面
    *******************************************************************************************************************************

    查询它可以配合5个字句来执行,查询到相应数据(where, order by ,limit, group by, having)
    这个子句有一个顺序,需要按照顺序来写
        select * from student [where] [group by] [having] [order by] [limit];
        例: select class_no, stu_sex, avg(grade) from student where(class_no is not null) group by class_no,stu_sex having(stu_sex = '男') order by class_no desc limit 1;
    *******************************************************************************************************************************

    3: [ in ](集合运算符)
        需求: 查询出学号是2,3,5的学生
        例: select * from student where stu_no = 2 or stu_no = 3 or stu_no =5;   --使用or运算符
        例: select * from student where stu_no in (2,3,5);                       --使用in集合运算符

        例: select * from student where class_no in (2, null);                   --in集合运算符查询不到null值

        --还可以有not in
        例: select * from student where stu_no not in (2,3,5);
        例: select * from student where class_no not in (2, null);          --查询结果为空
    *******************************************************************************************************************************

    4: 子查询
        需求: 获取student表里成绩成绩最高的学员
        例: select * from student order by grade desc limit 1;   --这里不满足需求
        例: select * from student where grade = max(grade);      --报错

        例: select * from student where grade = (select max(grade) from student);
        ps: 在查询里边还有其它的查询,那么我们就把里边的查询叫做子查询,子查询需要括号包起来, 子查询可以有多个


        ps: 子查询其实也就是一个查询,所以它返回的结果有以下几种情况(单一值),(一列),(一行或者一行多列),(多行多列)
        根据返回值的情况不同,可以把子查询分为四种情况
        1: 单一值(标量子查询)
            需求: 获取student表里成绩成绩最高的学员
            例: select * from student where grade = (select max(grade) from student);

        2: 一列(列子查询)
            例: select stu_age from student where grade < 95;

            需求: 查询出成绩小于95的学员年龄
            [ in ](集合运算符)
                例: select * from student where stu_age in (select stu_age from student where grade < 95);     --in在集合中存在的
                例: select * from student where stu_age not in (select stu_age from student where grade < 95); --not in在集合中不存在的
            [ any ]
                例: select * from student where stu_age = any(select stu_age from student where grade < 95);   -- =any等于集合中任意一个就行
                例: select * from student where stu_age != any(select stu_age from student where grade < 95);  -- !=any不满足集合中任意一个就行
            [ all ]
                例: select * from student where stu_age = all(select stu_age from student where grade < 95);   -- =all等于集合中所有元素
                例: select * from student where stu_age != all(select stu_age from student where grade < 95);  -- !=不等于集合中的所有元素(意思就是集合中不存在的)

        3: 一行(行子查询)
            需求: 查询出同一班中相同成绩的    学生的姓名,班级,成绩;
            select stu_name, class_no, grade from student where (class_no, grade) = (select class_no,grade from student group by class_no, grade having count(*) > 1);
            ps: (class_no, grade)意思是临时构造成一个行,根据子查询到一行去比较;


        4: 多行多列(表子查询)
            需求: 查询出表中的stu_name,stu_sex的字段,要使用子查询
            例: select * from (select stu_name, stu_sex from student) as stu;
            ps:from后面需要跟一个表,如果是跟着是一个子查询得的一个临时表,那么你需要给这个字查询起一个加名;

  • 相关阅读:
    构建之法阅读笔记04
    构建之法阅读笔记03
    关于博客园的一些建议
    书的价钱
    找水王续
    《用户故事与敏捷开发》阅读笔记04
    每周学习进度——第六周
    每周学习进度——第五周
    《用户故事与敏捷开发》阅读笔记03
    软件需求与分析课堂讨论一
  • 原文地址:https://www.cnblogs.com/wadmwz/p/7612608.html
Copyright © 2011-2022 走看看