• 3sql


    -------------------- 三范式
    -- 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。

    -- 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;
    -- 二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分,即字段必须完全依赖一个主关键字。

    -- 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。
    -- 即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况

    -- 1NF: 列原子性
    -- 2NF:同一表,如果主键是2个列,那么其他列的字段必须都依赖于这两个列,
    -- 如果有的列只依赖于其中一个主键的列,那么就要拆分表,
    -- 3NF:非主键一定要依赖主键,并且要直接依赖;不能传递依赖,如果有,也要拆分表

    create table goods (
    id int unsigned primary key auto_increment,
    name varchar(150) not null,
    cate_name varchar(40) not null,
    brand_name varchar(40) not null,
    price decimal(10, 3) not null default 0,
    is_show bit not null default 1,
    is_saleoff bit not null default 0
    );

    ----------------- SQL 强化
    -- 求所有电脑产品的平均价格,并且保留两位小数
    select round(avg(price),2) as avg_price from goods;
    -- 查询所有价格大于平均价格的商品,并且按价格降序排序
    select * from goods where price >
    (select avg(price) as avg_price from goods)
    order by price desc;
    -- 查询类型cate_name为 '超极本' 的商品名称、价格
    select name, price from goods where cate_name='超级本';
    -- 显示商品的种类
    select distinct cate_name from goods; -- 会按出现的顺序显示
    select cate_name from goods group by cate_name; -- 会按照cate_name排序
    -- 显示每种商品的平均价格
    select cate_name, avg(price) from goods group by cate_name;
    -- 查询每种类型的商品中 最贵、最便宜、平均价、数量
    select cate_name, max(price), min(price), avg(price), count(*) from goods group by cate_name;

    -- 查询每种类型中最贵的电脑信息*********************
    select * from goods where (cate_name, price) in
    (select cate_name, max(price) from goods group by cate_name);

    select * from goods inner join
    (select cate_name,max(price) as max_price from goods group by cate_name) as g
    on goods.cate_name=g.cate_name and goods.price=g.max_price;

    ----------------------------------------------------拆表
    -------------------------- "商品分类"
    ---- cate_name 是非主键,但是不依赖于主键goods.id,不符合3NF
    -------------- 1.创建 "商品分类"" 表
    create table if not exists goods_cates(
    id int unsigned primary key auto_increment,
    name varchar(40) not null
    );
    -- 查询goods表中商品的种类
    select distinct cate_name from goods;
    select cate_name from goods group by cate_name;
    -- 将分组结果写入到goods_cates数据表*********************
    -- 错误 :insert into goods_cates(name) values(select cate_name from goods group by cate_name);
    insert into goods_cates(name) select cate_name from goods group by cate_name;
    -------------- 2.同步表数据 *******************
    update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;
    -------------- 3.修改表goods表结构 *****************
    alter table goods change cate_name cate_id int unsigned not null;
    alter table goods add [constraint `约束名`] foreign key (cate_id) references goods_cates(id);

    -------------------------- "商品品牌"
    ---- brand_name 是非主键,但是不依赖于主键goods.id,不符合3NF
    -------------- 1.创建 "商品品牌"" 表,并直接从goods表中导入数据*********
    create table if not exists goods_brands (
    id int unsigned primary key auto_increment,
    name varchar(50) not null
    ) select brand_name as name from goods group by brand_name;
    -------------- 2.同步数据
    update goods as g inner join goods_brands as b on g.brand_name=b.name set g.brand_name=b.id;
    -------------- 3.修改表goods的表结构
    alter table goods change brand_name brand_id int unsigned not null;
    alter table goods add foreign key (brand_id) references goods_brands(id);


    -------------------------------------
    外键和主键的区别:
    外键受唯一性约束,也就是说外键不一定就是其他表的主键,可能是其他表中一个普通的列,但是这个列必须是unique的。
    但通常情况下外键就是其他表中的主键。
    主键本来就是unique的,而且是not null的,它受唯一性约束和非空约束。


    -------------------------------------删除外键约束
    alter table goods drop foreign key 约束名称;

  • 相关阅读:
    Jetty 的工作原理以及与 Tomcat 的比较
    基于Tengine的反向代理详细配置
    mysql定时脚本(event),类似oracle的job
    mysql 强制走索引
    如何检查mysql中建立的索引是否生效的检测方法及相关参数说明
    MySQL查询不使用索引汇总
    [大牛翻译系列]Hadoop 翻译文章索引
    [牛感悟系列]JAVA(1)理解JAVA垃圾回收
    [大牛翻译系列]Hadoop系列性能部分完结
    [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架
  • 原文地址:https://www.cnblogs.com/weiwei-python/p/9781243.html
Copyright © 2020-2023  润新知