数据库基础-2

本文详细介绍了数据库的基础知识,包括数据完整性(实体完整性、域完整性、引用完整性)及其约束,如主键、唯一约束、自动增长列、非空约束和默认值约束。此外,还讲解了索引的作用、创建方法和实现原理,以及数据库的三大范式和事务的基本概念。同时,探讨了SQL优化策略,如避免全表扫描和合理使用索引。最后,分享了两种修改数据库密码的方法。
摘要由CSDN通过智能技术生成

1 数据完整性

数据库基础-1: 点击访问.

1.1 数据库的完整性

用来保证存放到数据库中的数据是有效的,即数据的有效性和准确性
确保数据的完整性 = 在创建表时给表中添加约束

完整性的分类:

 - 实体完整性(行完整性):
 - 域完整性(列完整性):
 - 引用完整性(关联表完整性):

1.2 实体完整性

实体:即表中的一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复。
约束类型:

  • 主键约束(primary key)
  • 唯一约束(unique)*
  • 自动增长列(auto_increment)*

1.2.1 主键约束(primary key)

注:每个表中要有一个主键,但一张表的主键约束只能有1个
特点:数据唯一,且不能为null
主键约束,主键字段中的数据不能为NULL,也不能重复。
主键相关的术语?

	- 主键约束 : primary key
	- 主键字段 : id字段添加primary key之后,id叫做主键字段
	- 主键值 : id字段中的每一个值都是主键值。

主键有什么作用?

 - 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
 - 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)

主键的分类?


1:根据主键字段的字段数量来划分:
	 - 单一主键(推荐的,常用的。)
	 - 复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)
	 - 
2:根据主键性质来划分:
	- 自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
	- 业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
				最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要        
				,随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。           
	

第一种添加方式:在列名后面直接添加:

	--stuId作为主键
	CREATE TABLE student( id int primary key, stuId varchar(50) );     

第二种添加方式:此种方式优势在于,可以创建联合主键

	CREATE TABLE student
	( 
		id int, name varchar(50),
		primary key(id)
	); 
	
	--可以创建联合主键
	CREATE TABLE student
	(
		classid int, stuid int, name varchar(50),
		primary key(classid,stuid)
	);

第三种添加方式:在创建好表之后添加

	CREATE TABLE student
	( 
		id int, name varchar(50) 
	); 
	--在创建表之后对表的列进行添加主键
	ALTER TABLE student ADD PRIMARY KEY (id);

1.2.2 唯一约束(unique)

唯一约束修饰的字段具有唯一性,不能重复。但可以为NULL。

	create table t_user(
		id int,
		username varchar(255) unique  // 唯一约束
	);

1.2.3 自动增长列(auto_increment)

自增是给主键添加自动增长的数值,列只能是整数类型


	create table t_user(
		id int primary key auto_increment, // id字段自动维护一个自增的数字,从1开始,以1递增。    
		username varchar(255)
	);
	--用了自增,插入数据时,就不需要自己赋值
	insert into t_user(username) values('a');
	insert into t_user(username) values('b');
	insert into t_user(username) values('c');

1.3 域完整性

域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域完整性约束:数据类型 非空约束(not null) 默认值约束(default)

1.3.1 数据类型

只选取了常见的数据类型:
字符型:

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYTEXT0-255字节短文本字符串
TEXT0-65 535字节长文本数据

数值类型

类型大小范围(有符号)范围(无符号 )用途
tinyint1 字节(-128,127)(0,255)小整数值
smallint2 字节(-32 768,32 767)(0,65 535)大整数值
INT4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值

日期类型:

类型大小(字节)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值

1.3.2 非空约束

非空约束就是在字段的后面加上:not null


CREATE TABLE student
( 
	Id int primary key, 
	Name varchar(50) not null, --表示name字段一定要有值,不能为空
	Sex varchar(10) --sex字段,就可以为空,因为没有任务约束
); 

1.3.3 默认值约束

默认值约束:就是使用default,可以指定默认指定的值


CREATE TABLE stud
( 
	Id int primary key, Name varchar(50) not null,
	Sex varchar(10) default '男' 
);

insert stud values(1,'tom','女'); --也可以自己写
insert stud values(2,'jerry',default); --自己也可以直接使用defalut       
insert stud values(3,'jerry',DEFAULT);

1.4 引用完整性(外键约束:FOREIGN KEY)

关于外键约束的相关术语:

	 - 外键约束: foreign key
	 - 外键字段:添加有外键约束的字段
	 - 外键值:外键字段中的每一个值

业务背景:


		请设计数据库表,用来维护学生和班级的信息?
		分析:多个学生是对应一个班级的,一个班级里可以有多个学生,
			 可以说明是典型的一对多的关系,所有需要建立两张表
			 表关系:在多的表中建立一个外键,引用另一张表的主键

sql设计

		create table t_class(
			cno int,
			cname varchar(255),
			primary key(cno)
		);
	
		create table t_student(
			sno int,
			sname varchar(255),
			classno int,
			primary key(sno),
			foreign key(classno) references t_class(cno)--引用班级表的主键                           
		);	

2 索引

2.1 索引的作用

索引的作用:

索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。
		在数据库方面,查询一张表的时候有两种检索方式:
			第一种方式:全表扫描
			第二种方式:根据索引检索(效率很高)
		索引为什么可以提高检索效率呢?
			其实最根本的原理是缩小了扫描的范围。

什么时候考虑给字段添加索引?(满足什么条件)

	* 数据量庞大。(根据客户的需求,根据线上的环境)
	* 该字段很少的DML操作。(因为字段进行修改操作,索引也需要维护)
	* 该字段经常出现在where子句中。(经常根据哪个字段查询)

但注意:


		索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中   
		的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改  
		这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。   
		

2.2 创建索引

		创建索引对象:
			create index 索引名称 on 表名(字段名);
		
		删除索引对象:
			drop index 索引名称 on 表名;

2.3 索引的实现原理

简单的描述:


 - 索引底层采用的数据结构是:B + Tree

 - 通过B+Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,
   最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。

索引什么时候失效?

	select ename from emp where ename like '%A%';
	模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。

3 数据库的三大范式和事务

请点击访问:三大范式和事务介绍

4 SQL 优化


	1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引              
	2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,  
		如:select id from stu where num is null
		提示:最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.
	3.应尽量避免在 where 子句中使用 !=<> 操作符,否则引擎将放弃使用索引而进行全表扫描。
	4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描    
		如:select id from t where num=10 or Name = 'admin'
		可以这样查询:
				select id from t where num = 10 union all select id from t where Name = 'admin'
	5.in 和 not in 也要慎用,否则会导致全表扫描	            

5 拓展(如何修改数据库密码)

5.1 方法一


1.打开cmd进入MySQL的bin目录;(如我的路径是D:\MySQL\mysql-5.7.24-winx64\bin)

2.通过输入命令 mysql -u root -p 指定root用户登录MySQL,输入后回车会提示输入密码,输入我们原来的密码然后回车。

3.修改MySQL的root用户密码,格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例如(上面例子将用户root的密码更改为root):mysql> set password for root@localhost = password(‘root’);

4.退出mysql重新登录,输入新密码root登录就可以了;

5.2 方法二


1.打开cmd进入MySQL的bin目录

2.修改MySQL的root用户密码格式:mysqladmin -u用户名 -p旧密码; password 新密码
例如(第一种方法中我将密码改成了root,这里再改回123):
mysqladmin -uroot -proot password 123(这里一定要注意-uroot和 -proot是整体,不要写成-u root -p root)

重新登录,输入新密码123就ok了;

最后,如果有问题,希望指正,一起进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值