安承悦读

数据库知识总结(5篇)

admin
导读 (2)DDL(Data Definition Language)数据库定义语言 如:create table之类_ Teachers SET Title = '副教授' WHERE Tno='B050041';

数据库知识总结 第1篇

CHAR(n) VAECHAR(n) BIT(n) BIT VARYING(n) INT SMALLINT NUMERIC(p,d) DEC(p,d) FLOAT(n) REAL DATA TIME

1.创建基本表

CEARTE TABLE Teachers(Tno CHAR(7) PRIMARY KEY,Tname CHAR(10) NOT NULL,Sex CHAR(2) CHECK (Sex='男' or Sex='女'),Birthday DATE,Title CHAR(6),Dno CHAR(4),FOREIGN KEY(Dno) REFERENCES Departments(Dno));

2.修改基本表

使用 ALTER TABLE语句修改基本表向基本表中添加列:ALTER TABLE <> ADD []<>对于已存在的列修改缺省值:ALTER TABLE Student ALTER Sex DEFAULT '女';ALTER TABLE Student ALTER Sex DROP DEFAULT;删除已存在的列ALTER TABLE Courses DROP Pno

3.删除基本表

DROP TABLE <表名> {CASCADE|RESTRICT}

CREATE [UNIQUE][CLUSTER] INDEX <索引名>DROP INDEX <索引名>

CREATE SCHEMA Supply_schema AUTHORRIZATION wangqiang;DROP SCHEMA <模式名> CASCADE|RESTRICT

数据库知识总结 第2篇

INSERT INTO Students VALUES(......);

INSERT INTO Students(......) VALUES(......);

INSERT INTO Cardinf(Card-no,Name,Balance) SELECT Tno,Tname, FROM Teachers WHERE Dno ='IE';

DELETE FROM Students WHERE Sno ='98757';

DELETE FROM Students;删除所有记录

DELETE FROM SC WHERE Sno IN (SELECT Sno FROM Students WHERE Speciality = '计算机软件于理论');

_ Teachers SET Title = '副教授' WHERE Tno='B050041';

_ SC SET Grade = Grade + 5 WHERE Grade < 60 AND Cno IN (SELECT Cno FROM Courses WHERE Cname='软件工程');

数据库知识总结 第3篇

什么是事务

数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

简单的说:事务就是将一堆的SQL语句(通常是增删改操作)绑定在一起执行,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。

下面以银行转账为例,A转100块到B的账户,这至少需要两条SQL语句:

给A的账户减去100元; update 账户表 set money=money**-100** where name=‘A’;

给B的账户加上100元。 update 账户表 set money=money**+100** where name=‘B’;

如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么B的账户没有加上100元,而A却减去了100元,在现实生活中这肯定是不允许的。

如果在转账过程中加入事务,则整个转账过程中执行的所有SQL语句会在一个事务中,而事务中的所有操作,要么全都成功,要么全都失败,不可能存在成功一半的情况。

也就是说给A的账户减去100元如果成功了,那么给B的账户加上100元的操作也必须是成功的;否则,给A减去100元以及给B加上100元都是失败的。

事务4个特性ACID

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

隔离级别

事务隔离分为不同级别,包括

读未提交(Read uncommitted) 安全性最差,可能发生并发数据问题,性能最好 读提交(read committed) Oracle默认的隔离级别 可重复读(repeatable read)MySQL默认的隔离级别,安全性较好,性能一般 串行化(Serializable) 表级锁,读写都加锁,效率低下,安全性高,不能并发

查询mysql的隔离级别

在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要手动开启事务和结束事务。

开启事务:start transaction; 结束事务:commit(提交事务)或rollback(回滚事务)。 在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所做出的影响会持久化到数据库中。或者rollback,表示回滚,即回滚到事务的起点,之前做的所有操作都被撤消了!

SELECT @@tx_isolation;

Repeatable Read(可重读)

MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。

事务处理

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务 事务处理可以用来维护数据的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行 事务用来管理 insert、update、delete 语句,因为这些操作才会“破坏”数据,查询select语句是不会的 MySQL默认数据库的事务是开启的,执行SQL后自动提交。 MySQL的事务也可以改成手动提交,那就有两个步骤:先开启,写完SQL后,再手动提交。

提交 commit

#多条语句时,批量执行,事务提交

#有了事务,多步操作就形成了原子性操作,高并发下也不会引起数据错乱

#mysql的事务默认就是开启的 – 多条语句一起操作时,要么一起成功要么一起失败

回滚 rollback

#多条语句,批量执行,insert插入重复的主键导致失败时,事务回滚

非空约束 not null

唯一约束 unique Name字段创建了唯一约束,插入数据时数据库会进行检查,如果插入的值相同,就会检查报错:

主键约束 primary key 主键是一条记录的唯一标识,具有唯一性,不能重复

外键约束 foreign key

默认约束 default

默认值

检查约束 check 很少使用,了解即可,录入age超过200将报错

概念 表table代表了生活中一个主体,如部门表dept,员工表emp。表关联则代表了表之间的关系,如:部门和员工,商品和商品分类,老师和学生,教室和学生。

同时,也要知道,表并不都有关系,它们形成自己的小圈子。如商品和商品详情一圈,部门和员工一圈,出圈就可能没关系了,如商品和员工无关,商品和学生无关。

下面我们讨论表的关系分为四种:

一对一 one to one QQ和QQ邮箱,员工和员工编号 一对多 one to many 最常见,部门和员工,用户和订单 多对一 many to one 一对多反过来,员工和部门,订单和用户 多对多 many to many 老师和学生,老师和课程

创建表 表设计特点:

表都以s结束,标识复数 字段多以表的首字母作为开头,在多表联查时,方便标识出是哪个表的字段

插入测试数据

笛卡尔积 Cartesian product 多表查询是指基于两个和两个以上的表的查询。在实际应用中,查询单个表可能不能满足你的需求,如显示员工表emp中不只显示deptno,还要显示部门名称,而部门名称dname在dept表中。

#把两个表的数据都拼接起来

上面这种查询两个表的方式称为:笛卡尔积(Cartesian product),又称直积。一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,再进行数据的筛选过滤。

这点很值得注意,实际开发中尽量少用多表联查,其根本原因就在这里,查询过程中,现在内存中构建一个大大的结果集,然后再进行数据的过滤。那这个构建过程,和所使用的内存资源,包括过滤时的判断,都是既耗费资源,又浪费时间。

这就是阿里规范中禁止3张表以上的联查的原因:

三种连接 join 内连接 inner join 左(外)连接 left join 右(外)连接 right join

案例:列出research部门下的所有员工的信息

案例:怎么用内链接 INNER JOIN 实现上面的需求?

案例:列出tony的扩展信息

inner join、left join、right join的区别? INNER JOIN两边都对应有记录的才展示,其他去掉 LEFT JOIN左边表中的数据都出现,右边没有数据以NULL填充 RIGHT JOIN右边表中的数据都出现,左边没有数据以NULL填充 子查询 subquery 概念 子查询是指嵌入在其他select语句中的select语句,也叫嵌套查询。子查询执行效率低慎用。记录少时效率影响不大、图方便直接使用,记录多时最好使用其它方式替代。

单行子查询 = 返回结果为一个

多行子查询 in in子查询

定义 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法。这种数据结构就叫做索引。

一般来说索引本身也很大,不可能全部存储在内存中,因此往往以索引文件的形式存放在磁盘中。目前大多数索引都采用BTree树方式构建。

分类 单值索引:一个索引只包括一个列,一个表可以有多个列 唯一索引:索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引 复合索引:一个索引同时包括多列 创建索引 #查看索引,主键会自动创建索引

#创建普通索引

创建唯一索引

创建复合索引

删除索引

索引扫描类型 type:

ALL 全表扫描,没有优化,最慢的方式 index 索引全扫描,其次慢的方式 range 索引范围扫描,常用语<,<=,>=,between等操作 ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中 eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询 const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询,system是const的特殊情况 null MySQL不访问任何表或索引,直接返回结果

最左特性

当我们创建一个联合索引(复合索引)的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)、(k1,k3)和(k1,k2,k3)索引,这就是最左匹配原则,也称为最左特性。

为何索引快? 明显查询索引表比直接查询数据表要快的多,首先,索引表是排序了,可以类似二分查找,非常有效的提高了查询的速度。

其过程如下图,先到事先排序好的索引表中检索查询,找到其主键后,就直接定位到记录所在位置,然后直接返回这条数据。

排序,tree结构,类似二分查找 索引表小

小结 优点: 索引是数据库优化 表的主键会默认自动创建索引 每个字段都可以被索引 大量降低数据库的IO磁盘读写成本,极大提高了检索速度 索引事先对数据进行了排序,大大提高了查询效率

缺点: 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间 索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的” 虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引

概念 可视化的表,视图当做是一个特殊的表,是指,把sql执行的结果,直接缓存到了视图中。 下次还要发起相同的sql,直接查视图。现在用的少,了解即可. 使用: 1,创建视图 2,使用视图

测试

创建mysql-db库

准备student表

准备tb_dept表

准备tb_user表

*查询SQL尽量不要使用select ,而是具体字段

避免在where子句中使用or来连接条件

使用varchar代替char

尽量使用数值替代字符串类型

查询尽量避免返回大量数据

如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。同时,大量数据返回也可能没有实际意义。如返回上千条甚至更多,用户也看不过来。

通常采用分页,一页习惯10/20/50/100条。

使用explain分析你SQL执行计划 SQL很灵活,一个需求可以很多实现,那哪个最优呢?SQL提供了explain关键字,它可以分析你的SQL执行计划,看它是否最佳。Explain主要看SQL是否使用了索引。

是否使用了索引及其扫描类型

type:

ALL 全表扫描,没有优化,最慢的方式 index 索引全扫描 range 索引范围扫描,常用语<,<=,>=,between等操作 ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中 eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询 const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询 null MySQL不访问任何表或索引,直接返回结果 key:

真正使用的索引方式 创建name字段的索引

优化like语句 模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效

反例:

正例:

字符串怪现象 反例:

正例:

理由: 为什么第一条语句未加单引号就不走索引了呢?这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为数值类型再做比较

索引不宜太多,一般5个以内 索引并不是越多越好,虽其提高了查询的效率,但却会降低插入和更新的效率 索引可以理解为一个就是一张表,其可以存储数据,其数据就要占空间 再者,索引表的一个特点,其数据是排序的,那排序要不要花时间呢?肯定要 insert或update时有可能会重建索引,如果数据量巨大,重建将进行记录的重新排序,所以建索引需要慎重考虑,视具体情况来定 一个表的索引数最好不要超过5个,若太多需要考虑一些索引是否有存在的必要 索引不适合建在有大量重复数据的字段上 如性别字段。因为SQL优化器是根据表中数据量来进行查询优化的,如果索引列有大量重复数据,Mysql查询优化器推算发现不走索引的成本更低,很可能就放弃索引了。

where限定查询的数据 数据中假定就一个男的记录

反例:

正例:

理由:

需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销

避免在where中对字段进行表达式操作 反例:

正例:

理由:

SQL解析时,如果字段相关的是表达式就进行全表扫描 避免在where子句中使用!=或<>操作符

应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。记住实现业务优先,实在没办法,就只能使用,并不是不能使用。如果不能使用,SQL也就无需支持了。

反例:

理由:

使用!=和<>很可能会让索引失效 去重distinct过滤字段要少

索引失效

索引生效

理由:

带distinct的语句占用cpu时间高于不带distinct的语句。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较、过滤的过程会占用系统资源,如cpu时间

where中使用默认值代替null #修改表,增加age字段,类型int,非空,默认值0

批量插入性能提升 大量数据提交,上千,上万,批量性能非常快,mysql独有

多条提交:

批量提交:

理由:

默认新增SQL有事务控制,导致每条都需要事务开启和事务提交;而批量处理是一次事务开启和提交。自然速度飞升 数据量小体现不出来

批量删除优化 避免同时修改或删除过多数据,因为会造成cpu利用率过高,会造成锁表操作,从而影响别人对数据库的访问。

反例:

#一次删除10万或者100万+?

采用单一循环操作,效率低,时间漫长

正例:

//分批进行删除,如每次500

理由:

一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作

伪删除设计 商品状态(state):1-上架、2-下架、3-删除

理由: 这里的删除只是一个标识,并没有从数据库表中真正删除,可以作为历史记录备查 同时,一个大型系统中,表关系是非常复杂的,如电商系统中,商品作废了,但如果直接删除商品,其它商品详情,物流信息中可能都有其引用。 通过where state=1或者where state=2过滤掉数据,这样伪删除的数据用户就看不到了,从而不影响用户的使用 操作速度快,特别数据量很大情况下

提高group by语句的效率 可以在执行到该语句前,把不需要的记录过滤掉

反例:先分组,再过滤

正例:先过滤,后分组

复合索引最左特性 创建复合索引,也就是多个字段

满足复合索引的左侧顺序,哪怕只是部分,复合索引生效

没有出现左边的字段,则不满足最左特性,索引失效

复合索引全使用,按左侧顺序出现 name,salary,索引生效

虽然违背了最左特性,但MYSQL执行SQL时会进行优化,底层进行颠倒优化

理由: 复合索引也称为联合索引 当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则 联合索引不满足最左原则,索引一般会失效,但是这个还跟Mysql优化器有关的

排序字段创建索引 什么样的字段才需要创建索引呢?原则就是where和order by中常出现的字段就创建索引。

#使用 *,包含了未索引的字段,导致索引失效

#name字段有索引

#排序字段未创建索引,性能就慢

删除冗余和重复的索引

#创建索引index_name

#删除student表的index_name索引

#修改表结果,删除student表的index_name索引

#主键会自动创建索引,删除主键索引

不要有超过5个以上的表连接 关联的表个数越多,编译的时间和开销也就越大 每次关联内存中都生成一个临时表 应该把连接表拆开成较小的几个执行,可读性更高 如果一定需要连接很多表才能得到数据,那么意味着这是个糟糕的设计了 阿里规范中,建议多表联查三张表以下

inner join 、left join、right join,优先使用inner join 三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小

inner join 内连接,只保留两张表中完全匹配的结果集 left join会返回左表所有的行,即使在右表中没有匹配的记录 right join会返回右表所有的行,即使在左表中没有匹配的记录

理由: 如果inner join是等值连接,返回的行数比较少,所以性能相对会好一点 同理,使用了左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少。这是mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优

in子查询的优化 日常开发实现业务需求可以有两种方式实现:

一种使用数据库SQL脚本实现 一种使用程序实现 如需求:查询所有部门的所有员工:

#in子查询

#这样写等价于:

#先查询部门表

#再由部门dept_id,查询tb_user的员工

假设表A表示某企业的员工表,表B表示部门表,查询所有部门的所有员工,很容易有以下程序实现,可以抽象成这样的一个嵌套循环:

上面的需求使用SQL就远不如程序实现,特别当数据量巨大时。

理由: 数据库最费劲的就是程序链接的释放。假设链接了两次,每次做上百万次的数据集查询,查完就结束,这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,就会额外花费很多实际,这样系统就受不了了,慢,卡顿

概述 简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式,也是作为数据库 设计的一些规则.

关系型数据库有六种范式: 第一范式(1NF)、 第二范式(2NF)、 第三范式(3NF)、巴斯-科德范式(BCNF) 第四范式(4NF) 第五范式(5NF,又称完美范式)。 范式越高,冗余最低,一般到三范式,再往上,表越多,可能导致查询效率下降。所以有时为了提高运行效率,可以让数据冗余.

1NF的定义为:符合1NF的关系中的每个属性都不可再分

2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖,也就是说,表里的每个字段都要依赖于主键 第一步:找出数据表中所有的码。 第二步:根据第一步所得到的码,找出所有的主属性。 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。 第四步:查看是否存在非主属性对码的部分函数依赖

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖 就是指没个属性都跟主键有直接关系而不是间接关系。 像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。 比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)

总结 三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。

1、create database cgb210801 default character set utf8; #指定字符集,避免了中文乱码 2、表里有几个字段values需要提供几个值+值的顺序和字段顺序一致 3、主键约束,给字段添加PRIMARY KEY ,特点是:字段值必须唯一 + 值不能为null, 主键自增策略:是指主键的值不需要程序员数, 交给数据库自增,给主键添加 AUTO_INCREMENT 4、查询多个字段的值时用逗号隔开 5、like模糊查询 %是通配符,通配0~n个字符 6、汉字排序时会查utf8里对应的数字,按照数字升序排序 7、按照什么分组?按照非聚合列分组 8、什么时候要分组?查询时出现了混合列 9、group by后的过滤必须用having 10、where里不能用别名,不能出现聚合函数,比having高效 11、having和where能互换吗?效率谁高? 可以,但如果有别名或者值聚合函数就不能互换,where的效率比having高 12、检查约束:给字段使用check添加合法性的检查 14、外键foreign key的作用: 通过两张表的主键来约束两张表,防止了冗余的数据,并通过外键来描述两张表的关系 外键约束:给字段添加外键约束 特点:给子表中的主键的值添加数据时,子表的主键值 必须 取自主表 当主表删除数据时,子表没有相关的记录,子表不在占用主表资源 创建外键的语法:foreign key(本表的主键名) references 对方的表名(对方的主键) 15、索引的使用步骤:创建索引(索引创建原则:经常按照指定字段查询)+使用索引 16、索引的操作可以增删改查 17、主键自带索引,提高查询效率 18、explain关键字:查询SQL的执行计划/性能(看看用没用索引)和sql一起执行,用来查看在查询中有没有用索引,possible_keys用到的索引 19、创建索引的时候一般把表设计好以后就创建了,因为在填充数据以后再来添加索引的话,比如像唯一索引有时候就不太方便了 21、字段里面的信息如果有重复的话,不能创建唯一索引 21、复合索引可能会存在一种特殊情况,复合索引失效,查询要满足最左特性【A,B,C】不管怎么查多要包括字段A, 另外比如查询(C,A)也不会影响 不按照最左特性来查询的话,最坏的结果也就是查询的慢一些,像是不加索引一样 优势:简化了一个一个创建索引的方式,多个列同时使用一个复合索引 22、索引:好处是:提高查询效率 坏处是:索引需要单独的一张表 23、创建单值索引:一个索引只包含一个字段 24、视图: 语法:create view 视图名 as 查询的SQL语句 (1)创建唯一索引:一个索引只包 含一个字段,索引列值不能重复、 (2)视图查询的优势感受比索引更直观,但前提是把SQL写出来,然后不执行结果存在视图中 (3)视图的增删改效率很低,所以视图通常用来查询 (4)和索引一样,都是对数据库优化的有效方案. (5)特点: 1, 可以把视图当做表来使用 2,视图里存的数据是 SQL查询到的结果 3,SQL无法优化,要合理的使用视图 (6)好处和坏处: 好处是: 1.简化了查询的SQL(相同的SQL需求不必再写SQL了,直接查视图) 2.视图可以被共享,视图屏蔽了真实业务表的复杂性 坏处是:视图一旦创建,SQL无法被优化

26、多表联查三种方式

数据库知识总结 第4篇

什么是数据库

简而言之,就是存储数据,管理数据的仓库。

常见的数据库分为:

关系型数据库: Oracle、MySQL、SQLServer、Access 非关系型数据库: MongoDB、Redis、Solr、ElasticSearch、Hive、HBase

关系型和非关系型

早期发展的数据库建立在数据的紧密关系基础之上(如:父子关系、师生关系),我们称其为关系型数据库,也称为传统数据库;现今数据库建立在数据的松散关系基础之上(如:中国人和美国人、中国人和印度人、视频、音频),我们称其为非关系型数据库nosql(not only sql)。业界总在争论nosql能否干掉传统数据库,很多初学者也有这个困惑。以我来看,两者没有矛盾,它们各有特点,根据业务情况互补才是真谛。但总的来说原来关系型数据库一统天下的格局早被打破,领土不断被蚕食,规模一再的缩小,虽然无法全面被替代,但却早已风光不在,沦落到一偶之地,Oracle的衰落就是最好的证明,早期只要是全球大企业无一例外都是部署Oracle,但现在都在去Oracle化,阿里就已经全面排斥Oracle。 既然干不掉,很多传统项目的还是围绕关系型数据库的居多,所以我们先来学习关系型数据库,目前最流行的关系型数据库是MySQL。

关系型数据库 关系型数据库有特定的组织方式,其以行和列的形式存储数据,以便于用户理解。关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据集合。

Mysql数据库 (1)mysql服务端,它来处理具体数据维护,保存磁盘 (2)mysql客户端,CRUD新增,修改,删除,查询

数据存放在哪里?

在MySQL的配置文件中会进行默认配置 服务端 Mysql数据库默认的编码是latin1等价于iso-8859-1,修改为utf-8 注意:配置完,mysql开始执行,最后一步出错有时仍可以使用,使用SQLyog工具测试,如不行,再执行安装程序,选择remove,删除,然后重新安装。同时注意必须是管理员权限。

客户端1:DOS窗口

mysql -uroot -proot

语法:执行文件

代表参数 -u 用户名,紧接着写的 -p 密码,紧接着写的

客户端2:可视化工具

数据库结构

定义 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ “S-Q-L”),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。

分类 (1)DML(Data Manipulation Language)数据操纵语言 如:insert,delete,update,select(插入、删除、修改、检索)简称CRUD操新增Create、查询Retrieve、修改Update、删除Delete

(2)DDL(Data Definition Language)数据库定义语言 如:create table之类

(3)DCL(Data Control Language)数据库控制语言 如:grant、deny、revoke等,只有管理员才有相应的权限

(4)DQL(Data Query Language)数据库查询语言 如: select 语法 注意:SQL不区分大小写

建库 创建数据库,数据库名称:cgb2022

删库 删除名称是cgb2022的数据库

查看所有数据库 查看所有数据库

使用数据库

表设计 门店表:** tb_door**

订单详情表:** tb_order_detail**

创建表 创建tb_door表,有id,door_name,tel字段

修改表 添加列

删除表 删除名称是tb_door的表

查看所有表 查看所有表

查看表结构/设计表 查看tb_door表结构

插入记录 向tb_door表中插入2条记录

查询记录 查询tb_door表中的所有记录

修改记录 修改tb_door表中id为1的记录

删除记录 删除tb_door表中id为2的数据

排序 将tb_door表记录按照tel排序

记录总数 查询tb_door表中的总记录数

命名规则 (1)字段名必须以字母开头,尽量不要使用拼音 (2)长度不能超过30个字符(不同数据库,不同版本会有不同) (3)不能使用SQL的保留字,如where,order,group (4)只能使用如下字符az、AZ、0~9、$ 等 (5)racle习惯全大写:USER_NAME,mysql习惯全小写:user_name (6)多个单词用下划线隔开,而非java语言的驼峰规则

字符 (1)char长度固定,不足使用空格填充,最多容纳2000个字符,char(11)存储abc,占11位。查询速度极快但浪费空间 (2)varchar变长字符串,最多容纳4000个字符,varchar(11)存储abc,只占3位。查询稍慢,但节省空间。Oracle为varchar2 (3)大文本: 大量文字(不推荐使用,尽量使用varchar替代)

以utf8编码计算的话,一个汉字在u8下占3个字节 注:不同数据库版本长度限制可能会有不同

数字 (1)tinyint,int整数类型 (2)float,double小数类型 (3)numeric(5,2) decimal(5,2)—也可以表示小数,表示总共5位,其中可以有两位小数 (4)decimal和numeric表示精确的整数数字

日期 (1)date 包含年月日 (2)time时分秒 (3)datetime包含年月日和时分秒 (4)timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数

图片 blob 二进制数据,可以存放图片、声音,容量4g。早期有这样的设计。但其缺点非常明显,数据库庞大,备份缓慢,这些内容去备份多份价值不大。同时数据库迁移时过大,迁移时间过久。所以目前主流都不会直接存储这样的数据,而只存储其访问路径,文件则存放在磁盘上。

部门表 dept

员工表 emp Mysql:

主键约束 **主键约束:**如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。通常情况下,每张表都会有主键。

添加主键约束,例如将id设置为主键:

主键自增策略当主键为数值类型时,为了方便维护,可以设置主键自增策略(auto_increment),设置了主键自增策略后,数据库会在表中保存一个AUTO_INCREMENT变量值,初始值为1,当需要id值,不需要我们指定值,由数据库负责从AUTO_INCREMENT获取一个id值,作为主键值插入到表中。而且每次用完AUTO_INCREMENT值,都会自增1. AUTO_INCREMENT=1

非空约束 非空约束:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。

添加非空约束,例如为password添加非空约束:

唯一约束 唯一约束:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。

添加唯一约束,例如为username添加唯一约束及非空约束:

数据库知识总结 第5篇

数据库的完整性是指数据库中的数据的正确性、一致性和相容性。数据库中的数据要成为有意义的信息,必须满足一定的语义约束条件。

实体完整性是一种关系约束,参照完整性是一种数据库约束,而用户定义的完整性可以是上述四种约束的任何一种

静态约束是关于数据库正确状态的约束动态约束是数据库从一种正确状态转移到另一种状态的约束