-------------------- 三范式
-- 第一范式(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. js控制进度条数据

    <style><!-- #time{ width:500px; height: 20px; background: red; border-radius: 10px; } --> ...

  2. 关于kaggle注册无法显示人机验证码问题

    最近准备做项目,需要在kaggle上下载数据集,但注册时遇到了无法显示验证图片信息的问题,我也是通过百度最终找到解决方法,所以就准备记录下来啦:下面是解决步骤: step1:下载Google访问助手 ...

  3. SpringBoot是如何加载配置文件的?

    前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如: SpringBoot从哪里开始加载配置文件? Sp ...

  4. 前端技术之:JavaScript测试工具

    Mocha 一个用于Node.js与浏览器端的简单.自由.有趣的JavaScript测试框架. https://mochajs.org/ https://github.com/mochajs/moch ...

  5. 学习笔记47_关于Session局限性问题,Memcache

    三大问题: 1.Session性能问题 2.不能稳定输出.考虑使用进程外Session 3.组成集群,登录数据进行共享 (比如说像百度,百度网盘,百度文库等是使用不同的服务机器的,怎样避免使用的时候不 ...

  6. 读书笔记——《MySQL DBA 工作笔记》

    关于前言 作者在前言中提出的一些观点很具有参考价值, 梳理完整的知识体系 这是每一个技术流都应该追逐的,完整的知识体系能够使我们对知识的掌握更加全面,而不仅仅局限于点 建立技术连接的思维,面对需求,永 ...

  7. JC的小苹果 逆矩阵

    这题主要有两种做法:1种是用逆矩阵,转移时无须高斯消元.2是将常数项回代.这里主要介绍第一种. 首先题里少个条件:点权非负.设f [ i ][ j ]表示hp为i时,到达j点的期望次数. 那么若点权为 ...

  8. 提升jmeter脚本编写效率的方法:Fiddler导出jmx文件

    有效提升编写JMeter脚本效率的方法 jmeter的脚本来源有以下几种:badboy录制.jmeter自带的录制功能.手动编写脚本(使用fiddler/wireshark来抓包,然后构造协议写脚本) ...

  9. 字符串模拟大数相加——Java实现

    本题是CVTE二面编程题,首先考虑返回值肯定是一个字符串(int会有溢出可能),并且两个字符串只含数字,不含”+“.”-“这种. 代码如下: public static String add(Stri ...

  10. dhcpv6+radvd服务器搭建

    1.isc-dhcp-server install sudo apt update sudo apt-get install isc-dhcp-server 2.设置dhcp 创建/etc/dhcp/ ...