SQL:基本概念
1、关系模型
关系模型本质上是若干个存储数据的二维表:
每一行称为记录(Record),一个记录是一个逻辑意义上的数据;
每一列称为字段(Column),每个记录都有相同的若干字段。
1.1、主键Primary Key:能够唯一区分出不同记录的字段
选取主键的基本原则:不使用任何业务相关的字段作为Key。
一般把主键字段命名为id,常见的可作为id的类型有:
- 自增整数BIGINT(最常用);
- 全局唯一GUID。
联合主键(尽量少用)
通过多个字段标识一条记录,这些字段都设置为主键称为联合主键。
对于联合主键,允许一列重复,但不允许全部重复。
1.2、外键(Foreign Key)
一个表的某个属性,为另一个表的主键,这个属性称为这个表的外键。
这个表通过外键字段与另一个表形成关联。
如果当前有两个表:classes与students
- classes为班级信息表
- students为学生信息表
students表中有字段class_id表示他所处的班级,它必须是classes表中存在的班级,即它必须是classes表中id列中存在的id;
外键并非通过列名实现,而是通过定义外键约束实现:
ALTER TABLE students ADD CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES classes (id);
- fk_class_id:外键约束名称;
- FORIEIGN KEY(class_id):哪个字段为外键;
- REFERENCES classes (id):将这个外键关联到classes表的id列(classes表的主键)
通过定义外键约束,可以避免插入无效数据,即如果classes表中没有id=99的记录,那students表就无法插入class_id=99的记录。
由于外键约束会降低数据库的性能,大部分互联网应用程序为追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。此时,class_id仅仅是一个普通的列,它只是起到一个外键的作用。
删除外键约束
ALTER TABLE students DROP FOREIGN KEY fk_class_id;
删除外键约束而非删除外键列
1.3、多对多关系
一对多关系是通过一个表的外键关联到另一个表。
多对多的关系则是通过两个一对多关系表实现的,其中一个是中间表,用于关联两个一对多关系,就形成了多对多关系。
2、索引
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,可以大大加快查询速度。
例如,对于表students
如果经常访问score列,可以建立score列上的索引:
ALTER TABLE students ADD INDEX idx_score(score);
通过ADD INDEX idx_socre(score)创建了一个名为idx_score,使用列score的索引。索引名是任意的,如果索引有多列,可以在括号中依次写上:
ALTER TABLE students ADD INDEX indx_name_score (name,score);
索引的效率取决于索引列的值是否散列,即该列值越互不相同,效率越高。反之如果存在大量相同值,比如对于gender列,M、F值一样多,那么对该列创建索引就没意义了。
可以对同一张表创建多个索引。
优点:提高查询效率;
缺点:在增删改后,需要同时修改索引,因此索引越多,增删改的速度就越慢。
对于主键,关系数据库会自动创建索引。因此使用主键索引的效率是最高的,因为主键会保证绝对唯一。
2.1、唯一索引
有的列,比如身份证号、邮件地址等,也具有唯一性,但由于包含了业务信息,因此不宜作为主键。
这些列具有唯一性约束:即不能出现两个记录具有相同的列值,这时就可以给该列添加一个唯一索引。比如,我们假设students表的name不能重复:
ALTER TABLE students ADD UNIQUE INDEX uni_name(name);
通过关键字UNIQUE关键字,我们就添加了一个唯一索引。
也可以只对某一列添加唯一约束而不创建唯一索引:
ALTER TABLE students ADD CONSTRAINT uni_name UNIQUE (name);
此时,name列没有索引,但仍具有唯一性保证。
不过有无索引对我们使用关系数据库没有任何区别——有索引时,数据库会自动使用索引来提高查询效率,没有时也能正常执行,只是速度会变慢。因此索引可以在使用数据库过程中逐步优化。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性