MySQL 外键的变种与单表查询

        一.外键
        
            1.创建被关联表(主表)
            create table dep(
                id int primary key auto_increment,
                name varchar(20) not null,
                descripe char(40) not null    
            );
            create table test(
                id int primary key auto_increment,
                name varchar(20) not null,
                descripe char(40) not null    
            );
            create table emp(
                id int primary key auto_increment,
                name varchar(20) not null,
                age int not null,
                dep_id int,
                test_id int,
                constraint fk_dep foreign key(dep_id) references dep(id)
                on delete cascade
                on update cascade,
                constraint fk_dep foreign key(test_id) references test(id)
                on delete cascade
                on update cascade
            );
            

        2.外键的变种
            - 一对多或多对一(两表(1主表1从表))
            - 多对多(三表(2主表1从表))
            -一对一(两表(1主表1从表))
        3.单表查询
            重点中的重点:关键字的执行优先级
                from   
                where  选择
                group by 分组
                having    过滤
                select    查询
                distinct 去重
                order by  按……排序   desc:倒序  asc:正序
                limit a,b 分页(a起始位置,b显示个数)
               

       执行顺序:

        1.找到表:from

                  2.拿着where指定的约束条件,去文件/表中取出一条条记录

                  3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组

                  4.将分组的结果进行having过滤

                  5.执行select

                  6.去重

                  7.将结果按条件排序:order by

                  8.限制结果的显示条数
                    ①where子句中可以使用
          1.比较运算符:>、<、>=、<=、<>、!=
          2.between 80 and 100 :值在80到100之间
          3.in(80,90,100)值是10或20或30
          4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
          5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

 


              ②group by

          1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的

          2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等

          3、为何要分组呢?
                取每个部门的最高工资
                取每个部门的员工数
                取男人数和女人数

            小窍门:‘每’这个字后面的字段,就是我们分组的依据

          4、大前提:
                可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
                      先sql_mode='ONLY_FULL_GROUP_BY'
                          select A.c from (select post,max(salary)as c from employee group by post) as A;
                          使用分组,将查询出来的表名设为A,然后查询表A
                
                
                
                        分组之后只能查询分组的字段,如果想查询组内的其它字段的信息,必须要借助聚合函数
                    例:
                        max()
                        min()
                        avg()
                        sum()
                        count()
                        查询岗位名以及岗位包含的所有员工名字
                        select post,group_concat(name) from employee group by post;
    
                  例子:
                        select post,avg(salary) from employee group by post having avg(salary) > 10000;
                
                        select post,group_concat(name),count(1)
                            from employee
                        group by post having count(1)< 2;
                
                
                        select post,avg(salary) as A from employee group by post having A > 10000 order by A desc;
                
                        select * from employee order by age asc,id desc;

          ③聚合函数
            max()求最大值
            min()求最小值
            avg()求平均值
            sum() 求和
            count() 求总个数

          ④HAVING过滤

            HAVING与WHERE不一样的地方在于

                          !!!执行优先级从高到低:where > group by > having
                          1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

                          2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

                        ⑤limit  限制查询的记录数:


                            示例:
                                SELECT * FROM employee ORDER BY salary DESC
                                 LIMIT 3;                    #默认初始位置为0

                                SELECT * FROM employee ORDER BY salary DESC
                                    LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条

                                SELECT * FROM employee ORDER BY salary DESC
                                    LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条

posted @ 2018-09-20 11:18  mike1607  阅读(80)  评论(0)    收藏  举报