MySQL——DQL、约束、范式

内容

    一、 DQL 查询语句
        1.排序查询
        2.聚合函数
        3.分组查询
        4.分页查询
    二、约束
    三、多表间关系
    四、范式
    五、数据库备份与还原

DQL 查询语句

排序查询

语法ORDER BY 子句
eg:

ORDER BY 排序字段1 排序方式1, 排序字段2 排序方式2 ....

排序方式:

ASC 升序 默认方式
DESC 降序 

注意: 如果有多个排序条件,则当前面的条件值相同时才考虑后面的排序条件

聚合函数

    将一列数据作为一个整体,进行纵向计算
  1. count
  2. max, min
  3. sum, avg

:聚合函数的计算排除了 NULL值,

解决方案:
1.一般选择非空的列:主键
2.IFNULL

eg:

SELECT COUNT(english)) FROM student;//排除NULL
SELECT COUNT(IFNULL(english, 0)) FROM student; //有NULL作0

分组查询

语法GROUP BY 子句
注意!:
1.分组之后查询的字段: 分组字段、聚合函数

  1. where 和 having 的区别

    a. where 在分组前进行限定,若不满足条件,则不参与分组。having 在分组之后进行线性,若不满足条件,则不会被查询出来。
    b. where 后不可以跟聚合函数, having 可以进行聚合函数的判断

eg:

-- 按照性别分组,分别查询男女同学平均分
SELECT  sex, AVG(math) 
FROM student GROUP BY sex;

-- 按照性别分组,分别查询男女同学平均分,人数
SELECT sex, AVG(math), COUNT(id) 
FROM student GROUP BY sex;

-- 按照性别分组,分别查询男女同学平均分,人数 要求:分数低于70分的人,不参与分组(分组前添加限定条件)
SELECT sex, AVG(math), COUNT(id) 
FROM student
WHERE math> 70 GROUP BY sex;

-- 按照性别分组,分别查询男女同学平均分,人数 要求:分数低于70分的人,不参与分组,分组之后,人数要大于两个人(分组之后限定条件)
SELECT sex, AVG(math), COUNT(id) number
FROM student
WHERE math>70
GROUP BY SEX
HAVING number >2; //起别名判断更方便

分页查询

语法limit 开始的索引, 每页查询的条数;
公式开始的索引 = (当前页码 - 1) * 每页显示的条数
limit 是一个“方言”,不同数据库对应函数不同。
eg:

-- 每页显示三条记录
SELECT *FROM student LIMIT 0,3;    --第一页
SELECT *FROM student LIMIT 3,3;    --第二页
SELECT *FROM student LIMIT 6,3;    --第二页

约束

概念:对表中数据进行限定,保证数据的正确性、有效性、完整性
分类:
1.主键约束: primary key
2.非空约束: not null
3.唯一约束: unique
4.外键约束: foreign key

非空约束 NOT NULL

某一列值不能为NULL;

1.创建表时添加约束

CRETE TABLE stu{
    id INT,
    name VARCHAR(20) NOT NULL  --name非空
};

-- 删除 name的非空约束
ALTER TABLE stu  MODIFY NAME VARCHAR(20);

2 . 创建表后,添加约束

       ALTER TABLE stu  MODIFY NAME VARCHAR(20) NOT NULL;

唯一约束

某一列值不能重复

注意:唯一约束可以NULL值,但只能有一条记录为NULL。
1.创建表时添加约束

CRETE TABLE stu{
    id INT,
    phone_number VARCHAR(20) UNIQUE  --name非空
};

-- 删除唯一约束(错误方法 ×),和删除非空约束不太一样
ALTER TABLE stu  MODIFY phone_number VARCHAR(20);
-- 删除唯一约束的正确操作
ALTER TABLE stu DROP INDEX phone_numher;

2.创建表后添加约束

ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

主键约束

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 modiy id int;
         (并不会删除主键)
4. --添加自动增长
    alter table stu modiy id int auto_increment;

外键约束

让表间产生关系,保证数据的正确性
  1. 创建表时,可以添加外键
    语法:

    create table 表名{
        ...
        外键列,
        constraint 外键名称 foreign key ( 外键列名称) references 主表名称(主表主键名称)
    };

    eg:

    --部门表
    CREATE TBALE department{
            id INT PRIMARY KEY AUTO_INCREMENT,
            dep_name VARCHAR(20),
            dep_lacation VARCHAR(20)
    };
    
    --创建员工表    多方、从表
    CREATE TBALE employee{
            id INT PRIMARY KEY AUTO_INCREMENT,
            name VARCHAR(20),
            age INT,
            dep_id INT,    -- 外键对应主表的主键
            CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id);
    };
  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; --更新

2.分类:
a.级联更新: ON UPDATE CASCADE (谨慎使用级联)
b.级联删除:ON DELETE CASCADE


数据库设计

一.多表之间的关系

   A.  分类
        1.一对一
        2.一对多(多对一)
            *分析:部分和员工间
        3.多对多
            *分析:学生和课程选课关系

   B.  实现    
        1.一对多(多对一)
            * 实现方式: 在多的一方(从表)建立外键,指向一(主表)的主键
        2.多对多 (学生选课)

            * 实现方式: 引入中间表
             三种方式图解如下  

一对一关系实现

一对一关系实现.bmp-2398.6kB

一对多关系实现

一对多关系实现.bmp-2398.6kB

多对多关系实现

多对多关系实现.bmp-2398.6kB

二.数据库设计范式

1、第一范式(1NF):数据库表的每一列都是不可分割的原子数据项
2、第二范式(2NF)
在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
3、第三范式(3NF)
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

对三大范式的通俗理解:

1.第一范式:
    原子性,不可分割
2.第二范式:
    消除部分依赖(通过表的拆分)
3.第三范式:
    消除传递依赖(还是通过表的拆分)

*** 几个概念   
     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.码: 如果一张表中,一个属性或者属性组 被 其他所有属性所完全依赖,则称这个属性(属性值)为该笔的码。
     例如:该表中为(学号,课程名称)
            * 主属性: 码属性组中的所有属性
            * 非主属性: 不是码中的属性

数据库的备份和还原

1.命令行:

备份语法: mysqldump -u用户名 -p密码 数据库名称 >保存路径
还原: 
    1.登录数据库
    2.创建数据库   create database ***
    3.使用数据库   use ***
    4.执行文件( source  数据库路径)

2.图形界面
导出sql 文件
用Navicat导入时,我发现不能直接导入数据,必须新建数据库,再在表里右键选择导入sql 文件。


总结:

这算是在MySQL 基础上进一步说了一些知识了,关于 范式的内容也明白清晰了不少,还是觉得sql语句应该多用才能孰能生巧,并且应用到实际开发过程中,不能纸上谈兵!!!


   转载规则


《MySQL——DQL、约束、范式》 Adward 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
MySQL——多表 & 事务 MySQL——多表 & 事务
今日内容1. 多表查询 2. 事务 3. DCL多表查询一、内连接查询 1.隐式内连接:使用where条件 消除无用 SELECT t1.name, -- 员工表姓名 t1.gender, -
2020-03-24
下一篇 
Java 基础 Java 基础
Day04IntelliJ使用小技巧 输入Psvm自动生成主方法入口 输入sout自动生成输出语句 Alt 加数字 4 打开运行输出框 快捷键设置 Settings - Keymap - Default copy - Code - Comp
2020-03-14
  目录