MYSQL之数据库设计范式和高级查询

1 数据库设计范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,
必须满足一定的范式。

范式一

确保每列保持原子性;数据库表中的所有字段都是不可分解的原子值;
例如:某表中有一个地址字段,如果经常需要访问地址字段中的城市属性,则需要将该字段拆分为
多个字段,省份、城市、详细地址等;

范式二

确保表中的每列都和主键相关,而不能只与主键的某一部分相关(组合索引);
这一范式的前提是主键是一个由多个列组成的主键。也是组合索引

范式三

确保每列都和主键直接相关,而不是间接相关;减少数据冗余;

反范式

范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦;但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低;因此处于性能考虑,可能需要进行反范式设计;

原先我理解的只有范式标准只有以上的标准,但是再网上查了一下发现还是有其他的范式来约束设计数据库。巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF),但是一般设计数据库时,只需要做到以上三个范式的约束即可。

高级查询

基础查询

-- 全部查询
SELECT * FROM student;
-- 只查询部分字段
SELECT `sname`, `class_id` FROM student;
-- 别名 列明 不要用关键字
SELECT `sname` AS '姓名' , `class_id` AS '班级ID' FROM student;
-- 把查询出来的结果的重复记录去掉
SELECT distinct `class_id` FROM student;

node:
1 select * 不建议使用,因为数据库会因为这种语句全表扫描,影响了数据库的执行效率。应该只查询自己需要的部分字段
2 查询时显示的表时。列名尽量不要用数据库的列名,通过as设置别名。
3 distinct 关键字可以把查询结果的重复记录给去掉

条件查询

-- 查询姓名为 邓洋洋 的学生信息
SELECT * FROM `student` WHERE `name` = '邓洋洋';
-- 查询性别为 男,并且班级为 2 的学生信息
SELECT * FROM `student` WHERE `gender`="男" AND `class_id`=2;

node
1 条件查询 where 或者 where(条件1) and (条件2)

范围查询

-- 查询班级id 13 的学生的信息
SELECT * FROM `student` WHERE `class_id` BETWEEN 1 AND 3;

node
1 关键字:between … and …

判空查询

# is null 判断造成索引失效
# 索引 B+ 树
SELECT * FROM `student` WHERE `class_id` IS NOT NULL; #判断不为空
SELECT * FROM `student` WHERE `class_id` IS NULL; #判断为空
SELECT * FROM `student` WHERE `gender` <> ''; #判断不为空字符串
SELECT * FROM `student` WHERE `gender` = ''; #判断为空字符串

node
1 再判空查询的时候不要用 is null 或者 is not null
因为 is null 或者 is not null 会导致数据库查找记录的时候走的不是索引而是全表扫描,这样会导致数据库的效率降低了。
应该用 <> ’ ’ 判断不为空 = ’ ’ 判断为空字符串

模糊查询

-- 使用 like关键字,"%"代表任意数量的字符,”_”代表占位符
-- 查询名字为 谢 开头的学生的信息
SELECT * FROM `teacher` WHERE `tname` LIKE '谢%';
-- 查询姓名里第二个字为 小 的学生的信息
SELECT * FROM `teacher` WHERE `tname` LIKE '_小%';

node
1 使用 like关键字,"%"代表任意数量的字符,”_”代表占位符

分页查询

SELECT * FROM `student` LIMIT 1,2;

node
1 - 分页查询主要用于查看第N条 到 第M条的信息,通常和排序查询一起使用
– 使用limit关键字,第一个参数表示从条记录开始显示,第二个参数表示要显示的数目。表中默认第
一条记录的参数为0。

查询后排序

  • 关键字:order by field, asc:升序, desc:降序
    SELECT * FROM score ORDER BY num ASC;
    – 按照多个字段排序
    SELECT * FROM score ORDER BY course_id DESC, num DESC;

聚合查询

聚合函数描述
sum ()计算某列的总和
avg()计算某列的平均值
max()计算某列的最大值
min()计算某列的最小值
count()计算某列的行数
SELECT sum(`num`) FROM `score`;
SELECT avg(`num`) FROM `score`;
SELECT max(`num`) FROM `score`;
SELECT min(`num`) FROM `score`;
SELECT count(`num`) FROM `score`;

分组查询

-- 分组加group_concat
SELECT `gender`, group_concat(`age`) as ages FROM `student` GROUP BY
`gender`;
-- 可以把查询出来的结果根据某个条件来分组显示
SELECT `gender` FROM `student` GROUP BY `gender`;
-- 分组加聚合
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender`;
-- 分组加条件
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender` HAVING num 

node
1 一般来说 分组查询和聚合函数一起使用。
2 group_concat() 函数的作用时将查询组成的字段拼接再一起。
3 group by 关键字 (列) 根据某一条件进行分组查询
4 group by 关键字 一般都是与having 配合使用。group by + 列名 having + 条件 使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值