首页 > 技术文章 > MySql数据库约束

cqyp 2020-03-06 16:44 原文

一、DQL:查询语句    

1. 排序查询
     * 语法:order by 子句

     * 排序方式:
   * ASC:升序,默认的。
   * DESC:降序。

 2. 聚合函数:     

      1. count:计算个数
         1) 一般选择非空的列:主键
         2) count(*)
      2. max:计算最大值
   3. min:计算最小值
      4. sum:计算和
      5. avg:计算平均值

* 注意:聚合函数的计算,排除null值。
 解决方案:
     1. 选择不包含非空的列进行计算
      2. IFNULL函数

3. 分组查询:
     1. 语法:group by 分组字段;
     2. 注意:
         1. 分组之后查询的字段:分组字段、聚合函数
          2. where 和 having 的区别?
             1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
             2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。

-- 按照性别分组。分别查询男、女同学的平均分

        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分的人,不参与分组,分组之后。人数要大于2个人
        SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
        
        SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;

4. 分页查询

       1. 语法:limit 开始的索引,每页查询的条数;

       2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

-- 每页显示3条记录 

        SELECT * FROM student LIMIT 0,3; -- 第1页
        
        SELECT * FROM student LIMIT 3,3; -- 第2页
        
        SELECT * FROM student LIMIT 6,3; -- 第3页

二、约束      

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

1. 创建表时添加约束

CREATE TABLE stu(
           id int primary key auto_increment,-- 给id添加主键约束
            NAME VARCHAR(20) NOT NULL -- name为非空
            phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
        );

 

2. 创建表完后,添加约束

1. 创建表完后,添加非空约束
        ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
2.在创建表后,添加唯一约束
        ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

3.添加自动增长
        ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

3.删除约束

               1.删除name的非空约束
        ALTER TABLE stu MODIFY NAME VARCHAR(20);
              2.删除唯一约束
        ALTER TABLE stu DROP INDEX phone_number;
               3.删除主键
        ALTER TABLE stu DROP PRIMARY KEY;
* 外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
    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 

案例:

 

-- 创建旅游线路分类表 tab_category
        -- cid 旅游线路分类主键,自动增长
        -- cname 旅游线路分类名称非空,唯一,字符串 100
        CREATE TABLE tab_category (
            cid INT PRIMARY KEY AUTO_INCREMENT,
            cname VARCHAR(100) NOT NULL UNIQUE
        );
        
        -- 创建旅游线路表 tab_route
        /*
        rid 旅游线路主键,自动增长
        rname 旅游线路名称非空,唯一,字符串 100
        price 价格
        rdate 上架时间,日期类型
        cid 外键,所属分类
        */
        CREATE TABLE tab_route(
            rid INT PRIMARY KEY AUTO_INCREMENT,
            rname VARCHAR(100) NOT NULL UNIQUE,
            price DOUBLE,
            rdate DATE,
            cid INT,
            FOREIGN KEY (cid) REFERENCES tab_category(cid)
        );
        
        /*创建用户表 tab_user
        uid 用户主键,自增长
        username 用户名长度 100,唯一,非空
        password 密码长度 30,非空
        name 真实姓名长度 100
        birthday 生日
        sex 性别,定长字符串 1
        telephone 手机号,字符串 11
        email 邮箱,字符串长度 100
        */
        CREATE TABLE tab_user (
            uid INT PRIMARY KEY AUTO_INCREMENT,
            username VARCHAR(100) UNIQUE NOT NULL,
            PASSWORD VARCHAR(30) NOT NULL,
            NAME VARCHAR(100),
            birthday DATE,
            sex CHAR(1) DEFAULT '',
            telephone VARCHAR(11),
            email VARCHAR(100)
        );
        
        /*
        创建收藏表 tab_favorite
        rid 旅游线路 id,外键
        date 收藏时间
        uid 用户 id,外键
        rid 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
        */
        CREATE TABLE tab_favorite (
            rid INT, -- 线路id
            DATE DATETIME,
            uid INT, -- 用户id
            -- 创建复合主键
            PRIMARY KEY(rid,uid), -- 联合主键
            FOREIGN KEY (rid) REFERENCES tab_route(rid),
            FOREIGN KEY(uid) REFERENCES tab_user(uid)
        );

 

推荐阅读