DQL查询语句和约束

# DQL :查询语句
    1. 排序查询
        * 语法:order by 子句
            * order by 排序字段1 排序方式1,排序字段2 排序方式2...

        * 排序方式:
            * ASC:升序,默认的。不指定排序方式时默认升序。
                * select * from student group by math;
            * DESC:降序的。
                * select * from student group by math DESC;
            * 按照数学成绩排序,如果数学成绩一样,则按照英语成绩排名
                * select * from student group by math ASC,english ASC
        * 注意:
            * 如果有多个排序条件,则当前边的条件值一样时,才会去判断第二条件。
    2. 聚合函数:将一列数据作为一个整体,进行纵向的计算。
        1. count:计算个数
            * select count(列名) from 表名
            1. 一般选择非空的列:主键
            2. count(*)
        2. max:计算最大值
            * select max(列名) from 表名
        3. min:计算最小值
            * select min(列名) from 表名
        4. sum:计算和
            * select sum(列名) from 表名
        5. avg:计算平均值
            * select avg(列名) from 表名


        * 注意:聚合函数的计算,会排除null值。
            解决方案:
                1. 可以用ifnull方法解决
                2. count统计的是非空值的列
        * 求每个人的数学和英语成绩的和
            * SELECT NAME,math+IFNULL(english,0) 总分 FROM student
        * 求所有人数学成绩的总分
            * SELECT SUM(math) AS 数学总分 FROM student
        * 求所有人英语和数学成绩的总和
            * select sum(math+ifnull(english,0)) from student
            * SELECT SUM(math)+SUM(english) FROM student
    3. 分组查询:
        1. 语法:group by 分组字段;
        2. 注意:
            1. 分组之后查询的字段:分组字段、聚合函数
                * 按照性别分组,分别查询男、女同学的平均分
                    * select sex,svg(math) from student group by sex;
                * 按照性别分组,分别查询男、女同学的平均分,人数
                    * select sex,svg(math),count(id) from student group by sex;
                * 按照性别分组,分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
                    * select sex,svg(math),count(id) from student where math > 70 group by sex;
                * 按照性别分组,分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后人数要大于两个人
                    * select sex,svg(math),count(id) from student where math > 70 group by sex having count(id) > 2;
            2. where和having的区别:
                1. where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
                2. where后不可以跟聚合函数,having可以进行聚合函数的判断
            3. having要与group by一起连用,连用时having可省略,但是没有分组时不建议使用having,如果未分组时使用having,功能相当于where
    4. 分页查询
        1. 语法:limit 开始的索引,每页查询的条数

      limit 数字  ---->  取前多少条数据
            * 每页显示三条记录
                select * from student limit 0,3  第一页
                select * from student limit 3,3  第二页
                select * from student limit 6,3  第三页
        2. 公式:开始的索引 = (当前的页码-1)* 每页显示的条数
        3. limit是一个“方言”,只能在mysql中分页操作使用
## 约束
    * 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性
    * 分类:
        1. 主键约束:primary key
        2. 非空约束:not null
        3. 唯一约束:unique
        4. 外键约束:foreign key


    * 非空约束:not null,值不能为null
        1. 创建表时添加约束
            create table stu(
                id int,
                name varchar(20) not null
            )
             
        2. 创建表完后,添加非空约束
            alter table stu modify name varchar(20) not null;
        3. 删除非空约束
            删除name的非空约束
            alter table stu modify name varchar(20);

    * 唯一约束:unique,值不能重复
        1. 创建表时,添加唯一约束
            create table stu(
                id int,
                phone_number varchar(20) unique
            )
        2. 注意:mysql中,唯一约束限定的列的值可以有多个null
        3. 删除唯一约束
            错误方式:alter table stu modify phone_number varchar(20)
            正确方式:alter table stu drop index phone_number 
        4. 在创建表后,添加唯一约束
            alter table stu modify phone_number varchar(20) unique;(若表中准备设置为唯一约束的字段有重复数据时,不能设置唯一约束,需要先消除该字段重复数据)

    * 主键约束:primary key
        1. 注意:
            1. 含义:非空且唯一
            2. 一张表只能有一个字段为主键
            3. 主键就是表中记录的唯一标识
        2. 再创建表时,添加主键约束
            create table stu(
                id int primary key, -- 给id添加主键约束
                name varchar(20)
            )
        3. 删除主键
            错误方式:alter table stu modify id int
            正确方式:alter table stu drop primary key
        4. 创建完表后,添加主键
            alter table stu modify id int primary key

        5. 自动增长:
            1. 概念:如果某一列是数值类型的,使用auto_increment可以来完成值的自动增长
            
            2. 在创建表时,添加主键约束,并且完成主键自增长
                create table stu(
                id int primary key auto_increment, -- 给id添加主键约束
                name varchar(20)
                )
                *注意:设置了自动增长也可以手动添加主键,再自动增长时会从上一条数据主键继续增长

            3. 删除自动增长
                alter table stu modify id int;

            4. 添加自动增长
                alter table stu modify id int auto_increment;

            create table stu(
                id int primary key auto_increment,
                name carchar(20) not null,
                phone varchar(11) unique
            )
            insert into stu values (null,'张三','123456789')
            insert into stu values (null,'李四','123456788')
            insert into stu values (null,'王五','123456787')
            insert into stu values (null,'赵六','123456786')
            insert into stu values (null,'周七','123456785')
            insert into stu values (null,'王八','123456784')
            insert into stu values (null,'钱九','123456783')

            -- 删除张三和李四的数据
            delete from stu where name = '张三' or name = '李四'

            -- 再添加两条数据
            insert into stu values (null,'王八a','123456782')
            insert into stu values (null,'钱九b','123456781')
            此时前两条id如1,2不会继续存在

            --工作中常通过运用以下两种方式解决数据删除的问题
                1. 通过添加一个字段
                    create table stu(
                    id int primary key auto_increment,
                    name carchar(20) not null,
                    phone varchar(11) unique,
                    flag int -- 如果是0,表示已删除
                )
                2. 通过再建一张结构一样的表,将要删除的数据放到第二张结构一样的表中

    * 外键约束:foreign key,让表与表产生关系,从而保证数据的正确性
        * 表中数据有冗余
            解决方案-->做一个表的拆分
            外键值可以为null,但是不可以不存在
        1. 在创建表时,可以添加外键
            * 语法:
                create table 表名(
                    .... ,
                    外键列,
                    constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名称)
                )
        2. 删除外键
            alter table 表名 drop foreign key 外键名;
        3. 创建表之后,添加外键
            alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名称);
        
        4. 级联操作
            1. 在添加外键时,设置级联更新,设置级联删除
            alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名称) on update cascade on delete cascade;

            2. 分类:
                1. 级联更新:on update cascade
                2. 级联删除:on delete cascade(慎重使用)

## 数据库的设计

    1. 多表之间的关系
        1. 分类
            1. 一对一
                * 如:人和身份证
                * 分析:一个人只有一个身份证,一个身份证也只能对应一个人
            2. 一对多(多对一):
                * 如:部门和员工
                * 分析:一个部门有多个员工,一个员工只能对应一个部门
            3. 多对多:
                * 如:学生和课程
                * 分析:一个学生可以选择多门课程,一个课程也可以被许多学生选择
        2. 实现关系
            1. 一对多(多对一):
                * 在多的一方建立外键,指向一的一方的主键

            2. 多对多:
                * 多对多关系的实现,需要借助第三张中间表
                * 中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

            3. 一对一(了解):
                * 可以在任意的一方添加外键去指向另外一方的主键,并使外键唯一(unique)
                * 主键对应方式:在任意一张表的主键设置外键约束,并指向另外一张表的主键
                * 将数据合并到一张表

        3. 
    2. 数据库设计的范式
        * 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求。

            设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库
    
        * 分类:
            1. 第一范式(1NF):每一列都是不可分割的原子数据项
            2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分依赖函数)
                * 几个概念:
                    1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A
                        例如:学号-->姓名。
                            (学号,课程名称)-->分数  这成为属性组
                    2. 完全函数依赖:A-->B,如果A是一个属性组,则B属性值的确定需要依赖与A属性组中所有的属性值
                        例如:(学号,课程名称)-->分数
                    3. 部分函数依赖:A-->B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中的某一些值即可。
                        例如:(学号,课程名称)-->姓名
                    4. 传递函数依赖:A-->B,B-->C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值可以确定唯一的C属性的值,则称C传递函数依赖于A
                        例如:学号-->系名,系名-->系主任
                    5. 码:如果在一张表中,一个属性或属性组,则称这个属性(属性组)为该表的码
                        例如:该表中码为:(学号,课程名称)
                            * 主属性:码属性组中的所有属性
                            * 非主属性:除过码属性组的属性
            3. 第三范式(3NF):在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)
        
## 数据库的备份和还原

    1. 命令行:
        * 语法:
            * 备份:mysqldump -u用户名 -p密码 数据库名 >保存的路径
            * 还原:
                1. 登录数据库
                2. 创建数据库
                3. 使用数据库
                4. 执行文件。source 文件路径
    
    2. 图形化工具备份还原(更方便)

posted @ 2018-08-03 17:16  前进小白  阅读(273)  评论(0编辑  收藏  举报