1、主键/外键
-
表与表之间,可以建立关系,称为主外键
-
主键:
概念:是唯一标识的一条记录,不能有重复的,不允许为空,用来保证数据完整性 1、int类型,自增 2、varchar类型,UUID 3、自定义(当前时间+时间戳+机器码+int自增序列);使用于分布式系统
-
外键:
概念:是另一个表的主键,外键可以重复,可以是空值。涉及外键一定至少两张以上表。 --外键的使用需要满足下列的条件: 1. 两张表必须都是InnoDB表,并且它们没有临时表。 -- 注:InnoDB是数据库的引擎。MySQL常见引擎有两种:InnoDB和MyISAM,后者不支持外键。 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。 3. 建立外键关系的对应列必须建立了索引。 4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。
2、 一对一,一对多,多对多
-
一对一
-- 一个人 对应 一个身份证 人:姓名,身份证号码(主键唯一) 身份证:身份证号码(主键唯一,对应人的主键),出生地,出生日期
-
一对多
-- 一个班有多个学生,一个学生只能够属于某个班级 学生:学号(主键唯一),学生姓名,年龄,班号(多个,外键,对应班级的班号) 班级:班号(主键唯一),班级名称
-
多对多
-- 一个老师可以教多个班级,一个班级可以有多个老师 老师:教师编号(主键唯一),教师名 班级:班号(主键唯一),班级名称 关系表:关系编号(唯一),教师编号(外键,与教师编号 一对多),班号(外键,与班号 一对多)
3、数据库三范式(设计表的原则) NF:normal form
说明:严格意义上有5NF:1NF,2NF,3NF,4NF,5NF;BCNF;
- 第一范式(1NF)
定义:符合1NF的关系中,每一个属性都不可再分。1NF是所有关系数据库的最基本要求,如SQL Server,Oracle,MySQL中。
缺点:只满足第一范式会出现数据冗余过大,插入异常,删除异常,修改异常;
冗余:相同数据重复出现
插入问题: 3月份新开一个系,但是没有学生和班级; 如何插入数据?
删除问题: 某个班级不存在了,学生和系信息怎么办?
修改问题: 如果李四转到英语系,涉及到多条数据更改
- 第二范式(2NF)
定义:主键依赖,该表的所有其他字段,必须与主键相关。
如:生产一批香蕉,记录香蕉的时候,需要有香蕉的【编号】,然后【颜色】、【成熟度】于编号有关。
- 第三范式(3NF)
定义:主键以为的字段,不能有互相依赖的关系。
如:香蕉进行【编号】、【颜色】、【香味】、【香味得分】、【香味评级】这类列名,需要另开一张专门的香味表格
4、DQL
- 语法:SELECT列名FROM表名【WHERE–>GROUP BY–>HAVING–>ORDER BY–>LIMIT】
1、基础查询
select * from 表名 -- 查看表中所有记录
select 字段1,字段2 from 表名 -- 查看表某些字段
select distinct 字段 from 表名 -- 字段去重查询,非分组
-- 给字段取别名
select 字段1 别名1,字段2 别名2 from 表名 -- 适合在数据库中使用
select 字段1 as 别名1,字段2 as 别名2 from 表名 -- 使用在代码中使用
2、条件查询
比较运算符
= != (‘<>’也可以) > < >= <=
between A and B; -- 在A和B之间的值
in(值1,值2,值3); -- 在这些括号中的值
is null; -- 是否空
is not null -- 非空
关系运算符
and or not; -- 与或非
算数运算符(判断时,可用)
+ - * / %;
ifnull(x,0) -- 如果x是null,用0替换;
3、模糊查询
-- 通配符
_ (下划线):代表一个字符
%:代表任意一个或多个字符
-- 使用例子:
select * from 字段名 where 字段名 like '_i_'; -- 某个字段第二个字符为i
4、排序
order by 字段 asc/desc -- 自增asc,自减desc
order by 字段1 asc,字段2 desc -- 对两个字段进行不同的排序
5、聚合函数
count(); --统计不为null的行数
max(); -- 求字段的最大值
min(); -- 求字段的最小值
sum(); -- 求字段和
avg(); -- 求字段的平均值
# 当前时间 curdate();
# 当前时间 curTime();
# 当前日期和时间 NOW();
6、分组查询
group by 字段; -- 根据某个字段来分组
7、分页查询
limit 记录起始位置,记录条数; -- 查看多少条记录