-------------------- 三范式
-- 第一范式(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 约束名称;

3sql的更多相关文章

  1. Ibatis学习总结3--SQL Map XML 映射文件

    在前面的例子中,只使用了 SQL Map 最简单的形式.SQL Map 的结构中还有其他更多 的选项.这里是一个 mapped statement 较复杂的例子,使用了更多的特性. <sqlMa ...

  2. Oracle性能优化3-sql优化一定要等价

    做sql优化的前提瞧见是sql等价 1.MAX MIN写法的分与合 drop table t purge; create table t as select * from dba_objects; a ...

  3. 关于面试总结3-SQL查询

    前言 select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此语法,mysql用limit来实现相关功能. LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数 ...

  4. sqlserver学习3---sql函数

    一.SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQL 语言也包含用于更新 ...

  5. 数据库系统概论学习3-SQL 语句和关系代数(一)SQL 入门

    3. SQL 语句和关系代数(一)SQL 入门 3.1 数据库的编程语言 SQL 的优点 SQL 集成了数据查询(data query).数据操作(data manipulation).数据定义(da ...

  6. PHP代码审计3-SQL注入,CSRF,动态函数执行与匿名函数执行,unserialize 反序列化漏洞,变量覆盖,文件管理,文件上传

    SQL注入 审计语句 [输入参数] SELECT,DELETE,UPDATE,INSERT 防御 转义: 1.开启gpc:判断解析用户提示的数据 2.mysql_real_escape_string( ...

  7. MySQL基础3-SQL语言

    1.DQL语句分类 重点在于Select语句 2.Sql语句的书写规则 3.怎样使用Navicat导入已经写好的sql文件 (1)在Navicat中右击选中的数据库 (2)将sql文件所在的路径添加进 ...

  8. 3-SQL过滤

    # 筛选最大生命值大于6000,最大法力值大1700的英雄,然后按照二者之和从高到低进行排序 SELECT NAME     ,     hp_max,     mp_max  FROM     he ...

  9. 数据库sql优化总结之3--SQL优化总结

    SQL是每个Java程序员必回的一项技能,  对于项目中的各种复杂业务, 你是否能写出高效率, 简洁的SQL对于项目的运行效率和稳定性是有非常大的作用的. 通过个人的理解和网上的资料总结了一下常见的S ...

随机推荐

  1. Java基础(二十七)Java IO(4)字符流(Character Stream)

    字符流用于处理字符数据的读取和写入,它以字符为单位. 一.Reader类与Writer类 1.Reader类是所有字符输入流的父类,它定义了操作字符输入流的各种方法. 2.Writer类是所有字符输出 ...

  2. 修改vuex状态机中的数据

    vuex状态机中的数据是必须提交mutation来修改,如果现实开发中,我们需要修改,而又不想提交mutaition,应该怎么做呢?   先来回顾一下场景,有一个列表是存在vuex中的   这个列表展 ...

  3. vue 首次加载缓慢/刷新后加载缓慢 原因及解决方案

    # vue 首次加载缓慢/刷新后加载缓慢 原因及解决方案 最近做项目发现一个问题,页面每次刷新后加载速度都非常慢,20s左右,在开发环境则非常流畅,几乎感觉不到,本文参考望山的各种方案优化 1,关闭打 ...

  4. Linux下基本操作

    强行转Linux,开始以为会很不适应,其实还好,换汤不换药 本文只讲基本操作,足够让你愉快的打代码,想飞上天的自行百度,或找其他大神(友链) Update 6/20:由于写得太烂被学长爆踩了一顿 直接 ...

  5. 死磕 java线程系列之终篇

    (手机横屏看源码更方便) 简介 线程系列我们基本就学完了,这一个系列我们基本都是围绕着线程池在讲,其实关于线程还有很多东西可以讲,后面有机会我们再补充进来.当然,如果你有什么好的想法,也可以公从号右下 ...

  6. P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

    暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...

  7. ElasticSearch(四):基本搜索

    ElasticSearch(四):基本搜索 学习课程链接<Elasticsearch核心技术与实战> URI Search 使用HTTP的GET方法,在URL中使用查询参数进行查询. GE ...

  8. BigInt 的使用!

    今天学长讲的卡特兰数真的是卡的一批,整个全是高精的题,这时我就使用重载运算符,然后一下午就过去了 首先来看一波水题(也就卡了2小时) . A. 网格 内存限制:512 MiB 时间限制:1000 ms ...

  9. python while指令

    while指令 1.它后面可以带一个 Ture 表示一直是真的,这样程序会在while循环里无限进行下去 eg: while Ture: print("打印这个...") 2.它后 ...

  10. 关于@Autowired 与@Resource的

    @Autowired注解是spring自己定义的,@Resource是由JSR-250规范定义的注解. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动 ...