网络营销网站推广的基本策略,同一个域名在一个服务器做两件网站,做响应式网站应该注意什么问题,姚家园做网站一、为什么使用数据库
数据储存在哪里#xff1f;
硬盘、网盘、U盘、光盘、内存#xff08;临时存储#xff09; 数据持久化
使用文件来进行存储#xff0c;数据库也是一种文件#xff0c;像excel #xff0c;xml 这些都可以进行数据的存储#xff0c;但大量数据操作…一、为什么使用数据库
数据储存在哪里
硬盘、网盘、U盘、光盘、内存临时存储 数据持久化
使用文件来进行存储数据库也是一种文件像excel xml 这些都可以进行数据的存储但大量数据操作还是用数据库文件效率最高
什么是数据库
数据库就是存储数据的“仓库” 数据库的作用 1.存储大量的数据访问和检索数据管理数据 2.保证数据的完整性 3.安全与共享 4.数据可以进行组合产生新的数据数据分析 数据库的发展历史
1.层次模型单个记录以父子关系形成的树状结构树创建了一个层次状结构在其中数据被分解为逻辑的分类和子类使用记录代表逻辑数据单元。
2.网状模型网状模型通过允许记录有多个父子关系来增强层次模型
3.关系模型独立于应用程序的。更改数据库设计而不会影响应用程序成为可能表的行和列这种结构来替换父子框架。使用关系模型我们可以克服早期模型的缺陷在表之间定义复杂的关系。 表
表table是关系型数据库的核心单元它是数据存储的地方
术语 行 记录实体 列字段 关系表与表之间的关系
1对1 一对一关系是比较少见的关系类型。很多数据库也很少包含一对一关系。
A 表中的一行最多只能匹配于 B 表中的一行反之亦然。
人 身份证号
1 1
1 1 1 : 1
1对多: 最常用的关系类型是一对多关系通常把一对多关系中“多边”的表称为从表把“一边”的表称为主表。
人 银行卡
1 N
1 1 1 N
多对多
学生 老师
1 N
N 1 N : N 非关系模型noSQL
关系型数据库
关系型数据库有哪些
Access Mysql (小型企业 免费)Sql Server(微软 ,中企) Oracle (大型) , DB2 , SyBase 等.. 数据库Database
DBMS(Database Manage System)
RDBMS( Relation Database Manage System) 数据库是存储和管理数据的仓库但数据库并不能直接存储数据数据是存储在表中的。
在存储数据的过程中一定会用到数据库服务器所谓的数据库服务器就是指在计算机上安装一个数据库管理程序。 关系与非关系数据库的对比
关系型数据库的优势:
1.复杂查询可以用SQL语句方便的在- -个表以及多个表之间做非常复杂的数据查询。
2.事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库对方的优势就是自己的弱势反之亦然。
非关系型数据库的优势:。
1.性能NOSQL是基于键值对的可以想象成表中的主键和值的对应关系而且不需要经过SQL层的解析所以性能非常高。
2.可扩展性同样也是因为基于键值对数据之间没有耦合性所以非常容易水平扩展。 MySQL数据库
发展史
2003年12月MySQL 5.0版本发布
2008年1月MySQL AB公司被Sun公司以10亿美金收购
2008年11月MySQL 5.1发布.
2009年4月Oracle公 司以74亿美元收购Sun公司
2010年12月MySQL 5.5发布
详细内容:
1、MySQL的历史可以追溯到1979年一个名为Monty Widenius的程序员在为TcX的小公司打工并且用BASIC设计了一个报表工具使其可以在4MHz主频和16KB内存的计算机上运行。当时这只是一个很底层的且仅面向报表的存储引擎名叫Unireg。 2、1990年TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码将它集成到自己的存储引擎中。令人失望的是效果并不太令人满意决心自己重写一个SQL支持。 3、 1996年MySQL 1.0发布它只面向一小拨人相当于内部发布。到了1996年10月MySQL 3.11.1发布(MySQL没有2.x版本)最开始只提供Solaris下的二进制版本。一个月后Linux版本出现了。在接下来的两年里MySQL被依次移植到各个平台。 4、19992000年MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作开发出了Berkeley DB引擎, 由于BDB支持事务处理因此MySQL从此开始支持事务处理了。 5、2000MySQL不仅公布自己的源代码并采用GPL(GNU General Public License)许可协议正式进入开源世界。同年4月MySQL对旧的存储引擎ISAM进行了整理将其命名为MyISAM。 6、2001年集成Heikki Tuuri的存储引擎InnoDB这个引擎不仅能持事务处理并且支持行级锁。后来该引擎被证明是最为成功的MySQL事务存储引擎。MySQL与InnoDB的正式结合版本是4.0 7、2003年12月MySQL 5.0版本发布提供了视图、存储过程等功能。 8、2008年1月MySQL AB公司被Sun公司以10亿美金收购MySQL数据库进入Sun时代。在Sun时代Sun公司对其进行了大量的推广、优化、Bug修复等工作。 9、2008年11月MySQL 5.1发布它提供了分区、事件管理以及基于行的复制和基于磁盘的NDB集群系统同时修复了大量的Bug。 10、2009年4月Oracle公司以74亿美元收购Sun公司自此MySQL数据库进入Oracle时代而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。 11、2010年12月MySQL 5.5发布其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时隔两年后的一次简单的版本更新而是加强了MySQL各个方面在企业级的特性。Oracle公司同时也承诺MySQL 5.5和未来版本仍是采用GPL授权的开源产品。
....
MySql 8.0 新版本。
一般使用的都是Mysql 5.x MySQL特点
安装简单部署迅速,
适合大批量快速部署
易于扩展扩展性能极佳
架构灵活可以根据业务特点配置适合自己的MySQL集群
开源可以根据自己的业务需求进行二次开发,
使用广泛几乎所有的互联网公司都在使用MySQL数据库
对于OLTP业务可以进行良好的支撑 SQL SQL(Structured Query Language)语言是1974年由Boyce和Chamberlin提出的一种介于关系代数与关系演算之间的结构化查询语言是一个通用的、功能极强的关系型数据库语言。 SQL语句 –数据定义语言DDL:data definition language (定义数据库定义表) –数据查询语言DQL: data query language 查询 数据 –数据操作语言DML: data manipulation language 操作数据 –数据控制语言DCL: data control language 用户控制 权限控制 DDL 定义数据库及表 1. 创建数据库 create database 数据库名; 2. 使用数据库 use database 数据库名; 3. 删除数据库 drop database 数据库名 数据库命名规范 1. 标识符不能是所用RDBMS的保留字 2. 不允许嵌入空格或其它特殊字符 3. 第一个字符必须是下列字符之一a-z 和 A-Z下划线 (_)、at 符号 () 或者数字符号 (#) 4. 后续字符可以是at符号、美元符号 ($)、数字符号或下划线,字母。 4. 创建表 (数据是放在表中) 语法 create table 表名 (列名 列的数据类型 [列的约束] , ...) 注: char , varchar 两个类型需要设置长度其它的类型都不需要设置 方法2复制表只能复制表的数据与表字段注表的约束不能复制 CREATE TABLE student2 SELECT * FROM student 5. 删除表 drop table 表名; 6. 修改表 增加列 alter table 表名 add 列名 数据类型 ALTER TABLE student ADD address VARCHAR(100) 删除列 alter table 表名 drop 列名 更改列 alter table 表名 modify 列名 类型 -- 只改列的类型 alter table 表名 change 旧列名 新列名 类型 重命名表 alter table 旧表名 rename 新表名 mysql中的数据类型 数字 A- 整型 int 4字节 B- 浮点 float 4字节 7位 double 8 字节 15位 decimal(总位数小数点后的位数) decimal(M,D) 17字节 30位小数 注意 M为总位数D为小数位M必须大于D 字符串 A- 固定长度字符串 char(长度 B- 可变长度字符串 varchar(最大的长度) C- 超长字符串 text nchar , nvarchar , ntext 前面加n, 说明支持unicode编码即可以显示中文
一般不会去使用n开头的类型为什么呢 因为在创建数据库时就已经指定了编码支持中文显示
3. 日期
A: date 年月日 yyyy - MM - dd
B datetime 年月日 时分秒 yyyy-MM-dd HH:mm:ss 扩展数据类型
text : 存放超长文本
blob: 二进制
enum: 枚举 数据完整性分类
什么是数据的完整性 完整性 准确性 可靠性
Q 如何保证数据的完整性
数据完整性(约束)的分类 –1.实体完整性 主键约束 、 唯一约束、 标识列 • 保证 一 行数据是有效的 主键约束 primary key 唯一约束 unique 标识列 : 系统给一个自增长的值这个值不会重复一般默认从1开始每次加1(步长) auto_increment –2. 域完整性 非空约束Not Null 默认约束Default定义与实体时都用default • 保证 一 列数据是有效的 –3. 引用完整性 外键约束 • 保证引用的编号是有效的 –4.用户自定义完整性 • 保证自定义规则 DML数据操作语言
表的curd:
CURD 操作即指对数据库中实体对象的增Create、改Update、查Read、删Delete操作。
增加数据 :
INSERT [INTO] 表名[(列名,...)] VALUES (值表达式,...)
-- 注 如果所有的列都要插入数据 表名后面的列名可以省略 INSERT [INTO] 表名SET 列名值表达式, ...
INSERT [INTO] 表名1[(列名,...)] SELECT {*|列名,...} FROM表名2
-- 上面这种方式添加数据要求查询的列与插入的列数量与数据类型要一致 注意
在MySQL3.0.2 之后 into关键字在INSERT中是可以省略的但是基于标准考虑建议大家在书写时保留该关键字
修改数据 UPDATE 表名 SET 列名 更新后的值, [WHERE 条件子句] 删除数据 方法1 : DELETE FROM 表名 [WHERE 子句] 方法2 TRUNCATE TABLE 表名 DELETE会记录日志意味着删除后的数据还可以恢复但是效率低。
TRUNCATE不会记录日志删除后的数据不能恢复但是效率高。TRUNCATE不能用于有外键约束引用的表 。
TRUNCATE 可以重置自增列 delete 不能重置自增列
TRUNCATE 只能删除整表不能删除部分
DQL:
查询数据: select * from 表名 -- 所有列 select 列名, 列名2 ... from 表名 -- 所有列 数据完整性分类
–1.实体完整性 主键约束 、 唯一约束、 标识列
•保证一行数据是有效的
–2.域完整性 非空约束Not Null 默认约束Default定义与实体时都用default check约束
•保证一列数据是有效的
–3.引用完整性 外键约束
-4. 自定义完整性
引用完整性( 外键约束 )
外键: 一个表某列与另一个表的某列存在着依附关系这关系是在设计这两个表时根据业务去创建, 但是并没有强制依赖
外键约束: 给外键加上一个强制的约束如果违反这个约束就报错不允许去修改数据
没有建立外键约束不等于没有外键 如何添加外键约束呢 了解两个概念 主表从表 创建外键约束时必须先创建主表再创建从表 创建约束 CONSTRAINT FOREIGN KEY(s_c_id) REFERENCES t_class(c_id)
-- 添加从表数据依赖的主表数据一定是存在 -- 删除主表数据必须保证从表没有对它的引用 问题 项目中要不要加外键约束
不要用代码去保证数据的完整性 为什么不加让数据操作更方便
DQL 数据查询语言
查询的机制
从表的第一开始把整个数据都进行查询 返回符合条件的数据 返回的数据也表格形式但是临时的不会进行保存 简单查询
投影操作
select * from 表名 -- 全部列
select 列名1 列名2 from 表名 -- 部分列
select 列名1 as 别名 from 表名 -- 部分列且改变列名
select 列名15 from 表名 -- 计算列
select distinct 列名1 from 表名 -- 去重复
select 列名 from 表名 limit 开始行数 返回的行数 -- 序号从0开始 选择操作
单条件
select * from 表名 where 列名 值; -- 还有 , ,!
多条件
and , or 进行条件 的连接
select * from 表名 where 条件1 and 或 or 条件2
条件范围
between... and ...
select * from 表名 where 列名 between 下限 and 上限 in, not in
select 列集合 from 表名 where in / not in (值列表)
like 模糊查询
select 列集合 from 表名 where 列名 like 模式
通配符
— 任何单个字符
%0个或多个任意字符
处理空值
select 列集合 from 表名 where 列名 is null / is not null
排序操作
单列排序
select 列名 from 表名 order by 列名
多列排序
select 列名 from 表名 order by 列名1 列名2
SQL的执行顺序
from - where - select - order by - limit
聚合函数
count
avg
max
min
sum
注只返回单个值只对不为null的数据进行统计
分组函数
select
from
where
group by
having
order by
SQL执行顺序
from - where - select - group by - having - order by - limit 分组统一
group by 列名 -- 根据指定的列名分组
having 分组后进行条件筛选 需求学生的平均成绩
每个组的平均成绩group by 组名, 性别 分组函数
select
from
where
group by
having
order by
limit SQL执行顺序 from - where - select - group by - having - order by - limit 子查询
一个查询语句在嵌套一个查询语句这就嵌套查询 语句就叫子查询 . 如下关键字后面都可以嵌套一个子查询
select
from
where
group by
having
order by
limit select 子查询 (单行单列) - 效率极低一般不用 SELECT *,(SELECT className FROM clazz WHERE idstudent2.classId) AS className FROM student2 from 子查询 (多行多列) SELECT * FROM ( SELECT * FROM student2 WHERE classId 3) AS a WHERE StudentName LIKE 张% where 子查询
关系表达式后( , ,, !)返回的是单行单列 SELECT * FROM student2 WHERE classId ( SELECT id FROM clazz WHERE className352) in/not in , 返回的多行单列
表联接
笛卡尔乘积 SELECT * FROM student2,clazz WHERE student2.classId clazz.Id -- 默认显示笛卡尔乘积 -- 写法 表联接 SELECT * FROM student2 JOIN clazz ON student2.classId clazz.Id 多表连接 SELECT * FROM student3 stu JOIN score s ON stu.id s.studentId JOIN course c ON s.courceId c.id JOIN teacher t ON c.teacherId t.id 表联接分类
内联接 inner join - join 外联接: 左外联接 outer left join - left join 右外联接 outer right join - right join 存储引擎
MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISAM、 Memory等。 简单地理解存储引擎就是指表的类型以及表在计算机上的存储方式。
存储引擎的概念是MySQL的特色使用的是一个可插拔存储引擎架构能够在运行的时候动态加载或者卸载这些存储引擎。 不同的存储引擎决定了MySQL数据库中的表可以用不同的方式来存储。我们可以根据数据的特点来选择不同的存储引擎。 MySQL支持哪些存储引擎?
MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多数的情况下,直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎. InnoDB和MyISAM有什么区别? InnoDB支持事物而MyISAM不支持事物 InnoDB支持行级锁而MyISAM支持表级锁 InnoDB支持MVCC, 而MyISAM不支持 InnoDB支持外键而MyISAM不支持 InnoDB不支持全文索引而MyISAM支持。 事务
事务就是把多个数据库操作打包成一个“不可分割”的整体来进行执行同时在这些操作执行后需要保证数据可靠且一致 创建事务
start transcation ; -- 开启事务 // begin
commit ; -- 提交
callback -- 回滚 ACID模型
ACID模型就是我们常说的数据库事务四大特性原子性一致性隔离性持久性由这四种特性保证了事务的可靠和一致 一致性是由原子性隔离性持久性共同保证的
原子性 需要向原子一样不可分割操作要么全部成功要么全部失败
如何实现 Innodb 提供了 undo log 机制
隔离性
事务的隔离性是指一个事务的执行不能被其他事务干扰即一个事务内部的操作及使用的数据对并发的其他事务是隔离的
并发执行的各个事务之间不能互相干扰。
分为写与写隔离写和读隔离 面试题
第一题一张自增表里面总共有7 条数据删除了最后 2 条数据重启 mysql 数据库又插入了一条数据此时 id 是几
8
第二题如何获取当前数据库版本
MySQL的两种方式
在cmd中输入mysql -V查看注意需要在对应的目录下执行
在MySQL的命令窗口[Command Line Client]中输入select version(); [函数]或者在Navicat或其他的工具中创建查询输入select version();
Oracle
select * from v$version;
select * from product_component_version;
第三题说一下ACID是什么
① 原子性(Atomicity,或称不可分割性)、
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
② 一致性(Consistency)、
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
③ 隔离性(Isolation,又称独立性)、
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
④ 持久性(Durability)。
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
第四题mysql 的内连接、左连接、右连接有什么区别
内连接只显示所有有关联的数据左表或右表没有的则不显示
左连接显示左表的所有数据右表没有的用null补全
右连接显示右表的所有数据左表没有的用null补全
第五题mysql 索引是怎么实现的
MySQL采用B Tree实现索引
B Tree的特点
单节点能存储更多的数据减少磁盘IO次数
叶子节点形成有序链表便于执行范围操作(如where id 10)
聚集索引叶子节点存储数据而非聚集索引叶子节点存储数据的地址
说一下数据库的事务隔离
第六题事务的隔离级别?
第一类丢失更新
第二类丢失更新当两个或多个事务更新同一行时都是基于最初选定的值更新由于事务是相互隔离的所以最后一个事物的更新覆盖其他事务的更新
脏读事务A读取了事务B还没有提交的数据(读未提交)
不可重复读在一个事务内多次读取了某个数据而读取出来的数据不一致(数据发生改变或被删除)
幻读在一个事务内的操作中发现了未被操作的数据幻读出现的前提是并发的事务中有事务发生了插入、删除操作
事务的隔离级别越高在并发下出现的上述五种问题越少但同时付出的性能开销也越大(并发和性能之间的权衡) DEFAULT默认隔离级别
每种数据库支持的数据隔离级别不一样
MySql可以使用select (global.(系统级别)|session级别)tx_isolation查看默认的事务隔离级别(REPEATABLE-READ)
Spring将事务隔离级别设置为DEFAULT表示使用底层数据库的默认事务隔离级别
READ-UNCOMMITTED读未提交
能读取到未被提交的数据无法解决脏读、不可重复读及幻读
READ-COMMITTED读已提交
能读取到已经提交的数据能防止脏读但是不能防止不可重复读和幻读
REPEATABLE-READ重复读取
在读取完数据之后加锁类似于”select * from XXX for update”明确表示读取数据为了更新REPEATABLE-READ读取一条数据事务不结束别的事务就不可以修改这条数据解决了脏读、不可重复读但是不能解决幻读
SERLALIZABLE串行读
最高事务隔离级别一个事务(包括子事务)接一个事务的执行解决了幻读问题
注意Oracle只支持Read Committed和Serializable和自定义的Read Only隔离级别
常用命令
修改隔离级别set tx_isolation “四种事务隔离级别”;
事务传播特性(面试) 7种传播特性
概念当事务方法被另外一个事务方法调用时指定事务应该如何传播
传播属性(默认REQUIRED)
REQUIRED事务内所有的子事务都成功执行结束后(都不抛出异常)才提交数据
REQUIRED_NEW事务内所有的子事务都是独立事务执行一个挂起一个(事务完成一个提交一个抛出异常的不提交并结束整个事务)不管是否存在事务都new一个新的事务将原来的事务挂起新的事务执行完毕后再执行老的事务
SUPPORTS如果有正在运行的事务则在该事务内运行否则可不运行在事务中
NOT_SUPPORTS当前方法不运行在事务中如果有正在运行的事务则将该事务挂起(不开启事务)
MANDATORY(强制)当前方法必须运行在事务中如果没有正在运行的事务则抛出异常
NERVER当前方法不运行在事务中如果有运行的事务则抛出异常
NESTED(嵌套)如果有事务在运行当前事务方法嵌套到运行事务中运行否则开启一个新事务运行
注MySql中索引是INNODB才支持事务MYISAM不支持事务
第七题:说一下mysql 的行锁和表锁
表锁
特点加锁快开销小不会出现死锁(一次性获取全部锁)发生锁冲突的概率高并发低
使用表锁的场景
场景一事务需要更新大部分或全部表数据
场景二事务需要使用多张表可能会引起死锁造成大量事务回滚
行锁
共享锁允许一个事务去读一行阻止其他事务获得相同数据集的排他锁
排他锁允许获取排他锁的更新数据阻止其他事务获取相同数据集的共享读锁和排他写锁
特点开销大加锁慢可能出现死锁发生锁冲突的概率低并发最高
注InnoDB行锁是通过索引上的索引项实现的而Oracle则是给数据行加锁InnoDB只有通过索引条件检索数据才会使用行锁否则使用表锁
注表锁适用于并发度不高以查询为主的小型web应用而行锁适用于高并发对事务完整性要求较高的系统
第八题:如何做mysql的性能优化(重要)
①用PreparedStatement一般来说比Statement性能高
②有外键约束会影响插入和删除性能如果程序能够保证数据的完整性在设计数据库时就去掉外键
看mysql帮助文档子查询章节的最后部分下面的子查询语句要比第二条关联查询效率高
select e.name,e.salary where e.managerid(select id from employee where namezxx);
select e.name,e.salary,m.name,m.salary from employees e,employees m where
e.managerid m.id and m.namezxx;
③表中允许适当冗余
④sql语句全部大写特别是列名和表名都大写。
⑤开启缓存查询(使用变量代替函数)根据缓存的特点不要拼凑条件而是用?和PreparedStatment
⑥对频繁查询的字段建立索引查询时尽量使用主键作为条件
⑦对于明确知道查询结果只有一条数据的使用limit 1
⑧不要使用select *需要什么字段就查询什么字段
⑨表设计时尽量用固定长度的类型如char
⑩垂直分割将表中的常用列和非常用列垂直拆分成多张表存储如将姓名和密码单独从用户表中独立出来。
使用expain关键字可以查看性能
批量插入(batch insertgroup commit)