文章目录
关系型数据库
MYSQL
以管理员身份运行cmd
cd mysql的bin目录
安装mysql
mysqld --install
错误 The service already exists! The current server installed
解决方案 sc delete mysql
初始化mysql,记住初始化产生的随机密码sq;97S8ktY:d
mysqld --initialize --console
开启mysql的服务
net start mysql
错误NET HELPMSG3534
解决方案 mysqld –initialize初始化data目录
https://jingyan.baidu.com/article/47a29f24ba369bc0142399db.html
实例 MYSQL525
root
Liubo@123
ORACLE
数据的分类
1)冷数据:
是对于离线类不经常访问的数据,比如备份数据、档案与操作日志数据、话单凭证与统计数据。冷数据不需要实时访问到离线数据,
用于灾难恢复的备份或者因为要遵守法律规定必须保留一段时间的。
2)热数据:
是需要被计算节点频繁访问的在线类数据。指即时的位置状态、交易和浏览行为。
3)温数据:
是非即时的状态和行为数据。简单理解把热数据和冷数据混在一起就成了温数据。
冷数据存储在磁带、光盘,目前发展比较好的是蓝光光盘。热数据一般存放在SSD中,存取速度快,而温数据可以存放在7200转的硬盘
数据的拆分
通过某种特定的条件,按照某个维度,将存放在同一个数据库中的数据,分散存放到多个数据库(主机)上面,以达到分散单库(主机)负载的效果。拆分模式:
垂直拆分:专库专用。垂直拆分是把不同的表拆到不同的数据库中 。一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面。
水平拆分:把同一个表拆到不同的数据库中。 按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,主要有分库,分表两种模式 。
分库
分表
分区
1)范围分区:对某个值进行分区,如日期
CREATE TABLE 表名()
PARTITION BY RANGE(字段)
(
PARTITION 分区名 VALUES LESS THAN(分区值)
);
SELECT * FROM 表 PARTITION(分区名);
2)列表分区:应用于重复性高的数据;数据管理能力较强,但数据分布可能不均匀
create table 表名()
partition by list(字段)
(
partition 分区名 values(分区值)
);
select * from 表 partition(分区名);
3)哈希分区:应用于重复性低的数据;数据分布较为均匀。分区数一般为2的幂,适用于静态数据,数据管理能力弱
CREATE TABLE 表名()
PARTITION BY HASH(字段)
(
PARTITION 分区名
);
SELECT * FROM 表 PARTITION(分区名);
4)复合分区(范围-列表分区,范围-哈希分区)
范围-列表分区
CREATE TABLE 表名()
PARTITION BY RANGE(字段)
SUBPARTITION BY LIST(字段)
SUBPARTITION template
(
SUBPARTITION 分区名2 VALUES (分区值)
)
(
PARTITION 分区名1 VALUES LESS THAN(分区值)
)
SELECT * FROM 表 PARTITION(分区名);
SELECT * FROM 表 SUBPARTITION(子分区名);
子分区名 = 分区名1+分区名2
范围-哈希分区
CREATE TABLE 表名()
PARTITION BY RANGE(字段)
subpartition by hash(字段)
(
PARTITION 分区名 VALUES LESS THAN(分区值)
(
subpartition 子分区名
)
);
SELECT * FROM 表 PARTITION(分区名);
SELECT * FROM 表 SUBPARTITION(子分区名);
事务 Transaction
TCL:Transaction Control Language 事物控制语言。
一个或者一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。这个执行单元是一个不可分割的整体。 如果单元中某一条sql语句执行失败,整个执行单元将回滚(所有受影响的数据将返回到事务开始之前的状态)。如果单元中的sql语句都顺利执行,则事务将顺利执行。
例如:张三给李四转500块钱,sql语句编写的话,首先张三减少500,然后李四增加500元,这两条sql语句要么全部执行,要么全部不执行,这样子才能保障钱的总数是正确的。
-- MySQL中对事务操作的支持
start transaction;-- 代表开启一个事务
commit;-- 成功就提交事务
rollback;-- 失败就回滚事务
-- JDBC中事务操作代码
con.setAutoCommite(false);
con.commit();
con.rolllback();
-- MySQL中对事务隔离级别的支持
select @@tx_isolation; -- 查看当前级别
set session(blobal) transaction isolation level 级别;-- 设置隔离级别,要在开启事务之前设置
-- 级别
session -- 设置当前回话的隔离级别
global -- 设置全局的隔离级别
-- JDBC中事务隔离级别操作代码
con.setTransactionIsolation(隔离级别设置);
四大特征ACID
原子性(Atomicity):事务是一个不可分割的工作单位,事务的操作要么全部执行,要么全部不执行。
一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。即事务执行失败,就将对前面的操作进行回滚。
隔离性(Isolation):一个事务的执行不受其它事务的影响。
同时运行多个事务,当这些事务访问数据库中相同的数据。如果没有采取必要的隔离机制,会导致以下三种并发问题。
脏读:两个事务T1,T2。T1读取了已经被T2更新但还没有提交的字段,如果T2回滚,T1读取的数据将是临时无效的。
不可重复读:两个事务T1,T2。T1与T2读取了同一个字段,然后T2更新该字段,当T1再次读取该字段时,值就有可能不一样了。
幻读:两个事务T1,T2。T1从表中读取了字段,T2在该表插入了新数据,如果T1再次读取表,将会多出几行。
隔离级别 | 避免脏读 | 避免不可重复读 | 避免幻读 |
---|---|---|---|
Read uncommitted (读未提交) | √ | √ | √ |
Read committed (读已提交) | × | √ | √ |
Repeatable read (可重复读) | × | × | √ |
Serializable (串行化) | × | × | × |
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当级别越高执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。
在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
持久性(Durability):事务一旦被提交,则会对数据库中的数据永久性改变。
事务的创建
隐式事务:事务没有明显的开启与结束的标记。比如insert,update,delete语句,也是一个事务。但是这种事务是自动提交的。
显式事务:设置自动提交功能为禁用。
SET autocommit=0; -- 设置自动提交功能为禁用。
start transaction; -- 开启事务
-- sql语句(select,insert,update,delete这四种DML语言)
savepoint 回滚节点名;--一个事务中可以有多个 SAVEPOINT
RELEASE SAVEPOINT 回滚节点名;--一个删除事务
commit;/rollback; -- 成功就提交事务或失败就回滚事务,二选一。commit提交之后即可改变底层数据库数据
rollback to 回滚节点名; -- 回滚
锁
缓存 Memcache
二八定律:80%的业务访问集中在20%的数据上,所以把这一小部分数据缓存在内存中就能减少数据库的访问压力。
数据库
数据库文件
mdf 主数据文件,有且只有一个。
ndf 次要数据文件,0到多个。
idf 日志文件,一个以上。
数据库设计
1)需求分析: 分析用户的需求,包括数据、功能和性能需求;
2)概念结构设计:主要采用E-R模型进行设计,包括画E-R图;
3)逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换,进行关系规范化;
4)数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存储路径;
5)数据库的实施:包括编程、测试和试运行;
6)数据库运行和维护:系统的运行和数据库的日常维护。
表与字段
表与字段命名规范
1)字母开头
2)字母,数字,_,$,#组成
3)同一用户下表面不能与其他对象同名。
表设计三大范式
需求>性能>表结构。
第一范式:列的原子性。简记为1NF。
第二范式:所有列都与主键有关,无部分依赖。简记为2NF。
第三范式:所有列都与主键直接相关,无部分依赖,无传递依赖。简记为3NF。
E-R实体关系图
实体 - 矩形
属性 - 椭圆
实体之间 - 菱形
一对一:一个表
一对多:两个表
多对多:三个表
字段数据类型
类型 | SQL数据类型 | 数据特征 |
---|---|---|
数值 | TINYINT | 0-255 |
数值 | INT | 0到10位 |
数值 | BIGINT | 0到20位 |
数值 | FLOAT | |
数值 | DOUBLE | |
数值 | NUMBER(N,M) | 小数(精度,小数点后M位) |
时间 | DATE | YYYY-MM-DD |
时间 | TIME | hh:mm:ss |
时间 | DATETIME | YYYY-MM-DD hh:mm:ss |
时间 | TIMESTAMP | YYYY-MM-DD hh:mm:ss |
字符 | CHAR | 定长字符 |
字符 | VARCHAR | 可变长字符 |
字符 | TEXT | 文本 |
字符 | LONGTEXT | 大文本 |
图片 | IMAGE | 图片 |
二进制 | BIGARY | |
二进制 | VARBIGARY | |
货币 | MONEY | |
货币 | SMALLMINEY |
表空间
在创建用户的时候,为其指定表空间,最后不同的用户持有不同的表空间(当多人做同一项目时,可以使用同一表空间),如果没有指定表空间,用户就会默认使用system的表空间,不利于用户对数据进行持有和管理。
在表空间没有被删除的情况下,不能再物理上移除表空间对应的数据文件。
创建默认表空间
CREATE TABLESPACE 默认表
--创建默认表
DATAFILE '绝对路径\临时表.dbf'
--文件夹路径需提前指定
SIZE xxxM
--初始大小xxxM
AUTOEXTEND ON
--自动扩展
NEXT yyyM
--每次增加yyyM
MAXSIZE zzzM;
--最大可到zzzM
创建临时表空间
CREATE TEMPORARY TABLESPACE 临时表
--创建临时表
TEMPFILE '绝对路径\临时表.dbf'
--文件夹路径需提前指定
SIZE xxxM
--初始大小xxxM
AUTOEXTEND ON
--自动扩展
NEXT yyyM
--每次增加yyyM
MAXSIZE zzzM;
--最大可到zzzM
创建资源文件
CREATE PROFILE 资源文件名 LIMIT
FAILED_LOGIN_ATTEMPTS X
--指定用户登录失败次数X
PASSWORD_LOCK_TIME Y
--指定用户失败被锁定天数Y
PASSWOED_LIFE_TIME Z;
--指定用户可用权限天数Z
创建用户指定表空间
CREATE USER 用户名 IDENTIFIED BY 密码 DEFAULT
TABLESPACE 默认表
TEMPORARY TABLESPACE 临时表
PROFILE 资源文件名
删除表空间
--第一步:指定用户
DROP USER 用户名;
--第二步:删除默认表空间,临时表空间,资源文件
DROP TABLESPACE 默认表;
DROP TEMPORARY TABLESPACE 临时表;
DROP PROFILE 资源文件名;
数据库逻辑结构
索引
索引分为三大类:唯一索引、主键索引和聚集索引。
优点
第一,加快数据的检索速度。
第二,创建唯一性索引,保证数据库表中每一行数据的唯一性。
第三,在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
什么时候不创建索引
第一,在查询中很少使用到或者只做为参考的列不应该创建索引。
第二,只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。
存在索引但不能使用索引的场景
where | 数据类型出现隐式转换。以%开头的LIKE查询。IN(2个及以上参数) |
order by | 使用混合排序(DESC与ASC 都存在)。where条件列与order by列不一样。 |
CREATE TABLE 表 (
INDEX(字段名), -- 普通索引。可有多个,允许为null。
UNIQUE INDEX(字段名), -- 唯一索引。可有多个,允许为null。
KEY(字段名) -- 普通索引
PRIMARY KEY(字段名) -- 主键索引,每张表只能有一个主键索引。
UNIQUE KEY(字段名) -- 唯一索引,每张表可以有多个唯一索引。
FOREIGN KEY(字段名) -- 外键。相当于在这个key上建立了一个index。
)
-- 查看表是否建立索引
SHOW KEYS FROM 表名;
--开启与关闭表中的索引
开启:ALTER TABLE 表名 ENABLE KEYS;
关闭:ALTER TABLE 表名 DISABLE KEYS ;
-- 查看SQL是否使用索引
EXPLAIN sql语句;
唯一索引与主键索引 | 唯一索引 | 主键索引 |
---|---|---|
1、主键一定是唯一性索引,唯一性索引并不一定就是主键。 | ||
2、一个表中可以有多个唯一索引,但只能有一个主键。 | ||
3、主键列不允许空值null,而唯一性索引列允许空值null。 |
主键索引与聚集索引 | 主键索引 | 聚集索引 |
---|---|---|
用途 | 强制表的实体完整性 | 对数据行的排序,方便查询用 |
一个表多少个 | 一个表最多一个主键 | 一个表最多一个聚集索引 |
是否允许多个字段来定义 | 一个主键可以多个字段来定义 | 一个索引可以多个字段来定义 |
是否允许 null 数据行出现 | 如果要创建的数据列中数据存在null,无法建立主键。 创建表时指定的 PRIMARY KEY 约束列隐式转换为 NOT NULL。 | 没有限制建立聚集索引的列一定必须 not null . 也就是可以列的数据是 null 参看最后一项比较 |
是否要求数据必须唯一 | 要求数据必须唯一 | 数据即可以唯一,也可以不唯一。看你定义这个索引的 UNIQUE 设置。 (这一点需要看后面的一个比较,虽然你的数据列可能不唯一,但是系统会替你产生一个你看不到的唯一列) |
创建的逻辑 | 数据库在创建主键同时,会自动建立一个唯一索引。 如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则建立主键时候,同时建立一个唯一的聚集索引 | 如果未使用 UNIQUE 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。 必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。 |
--索引树:占存储空间。加速数据存取(类似树,树的节点存储的是每条记录的物理地址-伪列)
CREATE INDEX 索引树 ON 表(列,...,列)
REVERSE;
--防止某个字段的值为连续增长的值,形成歪脖子树,增加查询的层次,性能下降,可使索引值变得不规则,使索引树能均匀分布。
--视图:不占存储空间
CREATE VIEW 视图 AS SELECT语句
虚拟表(视图)
虚拟表:一行一列,做数据运算。
CREATE VIEW
CREATE VIRTUAL TABLE
CREATE TABLE dual
ROWID 伪列:像表中的列,但没有存储在表中,可查不可增删改
ROWNUM 分页查询
VIEW 结果集的可视化的虚拟表,即来自一个或多个真实表中的字段组合而成的虚拟表。只可查询,不可增删改。
优点
1)简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
2)安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
3)逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
缺点
1)性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
2)修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。
存储过程procedure
语法:
[proc] [MainTableName] By [FieldName(optional)] [Action]
[ 1 ] [2] [3] [4]
[1] 所有的存储过程必须有前缀“proc_”,所有的系统存储过程都有前缀“sp_”。
注释:假如存储过程以sp_ 为前缀开始命名那么会运行的稍微的缓慢,这是因为SQL Server将首先查找系统存储过程。
[2] 表名就是存储过程主要访问的对象。
[3] 可选字段名就是条件子句。比如: proc_UserInfoByUserIDSelect
[4] 最后的行为动词就是存储过程要执行的任务。
如果存储过程返回一条记录那么后缀是:Select
如果存储过程插入数据那么后缀是:Insert
如果存储过程更新数据那么后缀是:Update
如果存储过程有插入和更新那么后缀是:Save
如果存储过程删除数据那么后缀是:Delete
如果存储过程更新表中的数据 (ie. drop and create) 那么后缀是:Create
如果存储过程返回输出参数或0,那么后缀是:Output
注意:set变量前初始化
SELECT @变量=
SET @变量=
DELIMITER $$
USE `库名`$$
DROP PROCEDURE IF EXISTS `存储过程名称`$$
CREATE DEFINER=`webdev`@`%` PROCEDURE `存储过程名称`(
$字段,
)
BEGIN
业务语句
SET @变量 = ;
SET @SqlCmd = SQL语言;
PREPARE stmt FROM @SqlCmd;
EXECUTE stmt;
END$$
DELIMITER ;
游标
-- 定义游标,并将sql结果集赋值到游标中
DECLARE report CURSOR FOR 查询语句;
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @s=1;
-- 打开游标
OPEN report;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
FETCH report INTO white_id,con;
-- 当s不等于1,也就是未遍历完时,会一直循环
WHILE @s<>1 DO
IF cn==1 THEN
-- 如果只有一条的话,删除掉whiteid后,还需要根据whiteid删除掉`tbl_config_whitelist_alert`中的数据
SELECT 2;
ELSE
-- 如果有多条就只删除rule
SELECT $signatureid;
END IF
-- 将游标中的值再赋值给变量,供下次循环使用
FETCH report INTO white_id,con;
-- 当s等于1时表明遍历以完成,退出循环
END WHILE;
-- 关闭游标
CLOSE report;
权限
查询权限:
select * from system_privilege_map;
系统权限
用户使用数据库的权限(对用户而言)
系统权限 | 特点 | 可授予用户 |
---|---|---|
dba | 最高权限,只有dba才可以创建数据库结构 | dba管理员 |
resource | 只可以创建实体,不可创建数据库结构 | dba管理员 普通用户 |
connect | 只可以登录oracle,不可用创建实体与数据库结构 | dba管理员 普通用户 |
系统权限只能有dba用户授权,即最开始的两个用户是sys,system,普通用户提供授权也可以具有system相同的权限,但是无法达到与sys相同的权限,system的权限也能被回收。
系统权限传递
grant XXX to 用户名 whit admin option;
系统权限回收(只能有dba用户回收)
revoke XXX from 用户名
系统权限回收无级联,也可以跨用户回收
实体权限
对象A授予给对象B,去访问A成员的权限(对表,视图,索引而言),即某种权限用户对其他用户的表或视图存取的权限。
权限 | 表 | 视图 | |
---|---|---|---|
select | 选择 | √ | √ |
update | 更新 | √ | √ |
insert | 插入 | √ | √ |
alter | 修改 | √ | √ |
index | 索引 | √ | × |
delete | 删除 | √ | √ |
execute | 执行 | √ | × |
references | 关联 | √ | √ |
all | 所有权限 | √ | √ |
实体权限传递
grant XXX to 用户名 whit grant option;
实体权限回收
revoke XXX from 用户名
实体权限回收有级联,当回收权限时,传递的权限将全部失去。
角色
权限---->用户
变为
权限---->角色---->用户
创建角色
create role 角色名
把角色给用户
grant 角色 to 用户名
序列sequences
CREATE SEQUENCE 序列名
INCREMENT BY 数字
--每次增量
MINVALUE 数字
--最小值(noMINVALUE无最小值)
MAXVALUE 数字
--最大值(noMAXVALUE无最大值)
START WITH 数字
--初始值
CACHE 数字NUM
--先放NUM个数据到内存中,但当没取完NUM个数据发生异常时,下次会直接从NUM+1个开始取。noCACHE高并发慎用,实例间大量索引块争用。
CYCLE
--累加循环(NOCYCLE累加不循环)。到达最大值后,从最小值重新开始生成序列号。
order;
--排序(不排序noorder)
获取下一个序列值
序列名.nextVal()
SQL语言
数据定义 DDL
英文全称:Data Definition Language
-- 删除数据对象
DROP TABLE IF EXISTS 表/视图
-- 创建表
CREATE TABLE 表 (
字段 类型 约束 AUTO_INCREMENT COMMENT '字段备注'
NULLPRIMARY KEY (`AssetID`),
UNIQUE KEY `AssetIP` (`AssetIP`)
) ENGINE=MyISAM AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
-- 约束
CHECK
DEFAULT
-- 自增
AUTO_INCREMENT 设置字段为自增
AUTO_INCREMENT=1 设置自增起始值为100
-- 索引
KEY
PRIMARY KEY -- 主键索引
UNIQUE KEY -- 唯一标识数据库表中的每条记录,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY约束
FOREIGN KEY -- 在这个key上建立了一个index
-- 存储引擎ENGINE 数据以什么方式来存储。
INNODB --支持事务,MySQL默认。
MyISAM --不支持事务
MEMORY
show engines -- 查看MySQL支持的存储引擎
-- 编码格式
CHARSET
-- 虚拟表:临时表和视图
-- 创建临时表
-- 多表合成一张表,查询语句之间用UNION与UNION ALL连接;
-- 例如:表一查询语句 UNION与UNION ALL 表二查询语句
-- 其中UNION会连接后去重,UNION ALL不会去重。
CREATE TEMPORARY TABLE 临时表名 查询语句;
-- 创建视图
CREATE VIEW 视图 AS 查询语句;
-- 表添加字段
ALTER TABLE 表 ADD(字段);
-- 表修改字段
ALTER TABLE 表 modify(字段);
-- 表删除字段
ALTER TABLE 表 DROP(字段);
-- 用户
-- 创建新用户
create user 用户名 identified by 密码
--修改用户密码
alert user 用户名 identified by 新密码
--删除用户(用户不处于连接状态)
drop user 用户名;
drop user 用户名 cascade;
--用户存在实体(表,实体),用cascade关键字将实体一并删除
--授予权限
grant 权限 to 用户名
--回收权限(DBA才能操作)
revoke 权限 from 用户名
CREATE创建表/视图
-- 创建表
CREATE TABLE 表 (
字段 类型 约束 AUTO_INCREMENT COMMENT '字段备注'
NULLPRIMARY KEY (`AssetID`),
UNIQUE KEY `AssetIP` (`AssetIP`)
) ENGINE=MyISAM AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
------------------------------ 约束 ----------------------------
not null -- 单表 -- 非空 -- NN
check -- 单表 -- 取值范围 -- CK
uniqe -- 单表 -- 唯一值或null值 -- UK
default -- 单表 -- 默认值 -- DE
primary key -- 主键 -- PK
foreign -- 外键 -- FK
-- 自增
AUTO_INCREMENT 设置字段为自增
AUTO_INCREMENT=1 设置自增起始值为100
-- 索引
KEY
PRIMARY KEY -- 主键索引
UNIQUE KEY -- 唯一标识数据库表中的每条记录,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY约束
FOREIGN KEY -- 在这个key上建立了一个index
-- 存储引擎ENGINE 数据以什么方式来存储。
INNODB --支持事务,MySQL默认。
MyISAM --不支持事务
MEMORY
show engines -- 查看MySQL支持的存储引擎
-- 编码格式
CHARSET
-- 虚拟表:临时表和视图
-- 创建临时表
-- 多表合成一张表,查询语句之间用UNION与UNION ALL连接;
-- 例如:表一查询语句 UNION与UNION ALL 表二查询语句
-- 其中UNION会连接后去重,UNION ALL不会去重。
CREATE TEMPORARY TABLE 临时表名 查询语句;
-- 创建视图
CREATE VIEW 视图 AS 查询语句;
-- 用户
-- 创建新用户
create user 用户名 identified by 密码
CREATE index 索引名 on TAB_NAME(字段1,字段2...)
ALTER更新
-- 表添加字段
ALTER TABLE 表 ADD(字段);
-- 表修改字段
ALTER TABLE 表 modify(字段);
-- 表删除字段
ALTER TABLE 表 DROP(字段);
--修改用户密码
ALTER USER 用户名 IDENTIFIED BY 新密码
DROP删除表/视图
-- 删除数据对象
DROP TABLE IF EXISTS 表/视图
-- 创建表
CREATE TABLE 表 (
字段 类型 约束 AUTO_INCREMENT COMMENT '字段备注'
NULLPRIMARY KEY (`AssetID`),
UNIQUE KEY `AssetIP` (`AssetIP`)
) ENGINE=MyISAM AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
-- 约束
CHECK
DEFAULT
-- 自增
AUTO_INCREMENT 设置字段为自增
AUTO_INCREMENT=1 设置自增起始值为100
-- 索引
KEY
PRIMARY KEY -- 主键索引
UNIQUE KEY -- 唯一标识数据库表中的每条记录,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY约束
FOREIGN KEY -- 在这个key上建立了一个index
-- 存储引擎ENGINE 数据以什么方式来存储。
INNODB --支持事务,MySQL默认。
MyISAM --不支持事务
MEMORY
show engines -- 查看MySQL支持的存储引擎
-- 编码格式
CHARSET
-- 虚拟表:临时表和视图
-- 创建临时表
-- 多表合成一张表,查询语句之间用UNION与UNION ALL连接;
-- 例如:表一查询语句 UNION与UNION ALL 表二查询语句
-- 其中UNION会连接后去重,UNION ALL不会去重。
CREATE TEMPORARY TABLE 临时表名 查询语句;
-- 创建视图
CREATE VIEW 视图 AS 查询语句;
-- 表添加字段
ALTER TABLE 表 ADD(字段);
-- 表修改字段
ALTER TABLE 表 modify(字段);
-- 表删除字段
ALTER TABLE 表 DROP(字段);
-- 用户
-- 创建新用户
create user 用户名 identified by 密码
--修改用户密码
alert user 用户名 identified by 新密码
--删除用户(用户不处于连接状态)
drop user 用户名;
drop user 用户名 cascade;
--用户存在实体(表,实体),用cascade关键字将实体一并删除
--授予权限
grant 权限 to 用户名
--回收权限(DBA才能操作)
revoke 权限 from 用户名
示例
约束
约束 | 用途 | 缩写 |
---|---|---|
not null | 非空 | NN |
check | 取值范围 | CK |
uniqe | 唯一值或null值 | UK |
default | 默认值 | DE |
primary key | 主键 | PK |
foreign | 外键 | FK |
-- 建表时创建
create table TAB_NAME_A(
字段 int NOT NULL,
字段 int DEFAULT 2333,
字段 int UNIQUE,
字段 int CHECK(字段='A' OR 字段='B')
)
-- 建表后创建
ALTER TABLE 表 MODIFY 字段 CONSTRAINT NN_字段 NOT NULL;
ALTER TABLE 表 ADD CONSTRAINT CK_字段 CHECK(字段='A' OR 字段='B');
ALTER TABLE 表 MODIFY CONSTRAINT DE_字段 字段 DEFAULT 2333;
ALTER TABLE 表 ADD 字段 CONSTRAINT UN_字段 UNIQUE(字段);
-- 删除
ALTER TABLE 表 DROP CONSTRAINT NN_字段;
ALTER TABLE 表 DROP CONSTRAINT CK_字段;
ALTER TABLE 表 DROP CONSTRAINT UK_字段;
ALTER TABLE 表 DROP CONSTRAINT DE_字段;
主键 | 外键 | 索引 | |
---|---|---|---|
定义: | 唯一标识一条记录,不能有重复的,不允许为空 | 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 | 该字段没有重复值,但可以有一个空值 |
作用: | 用来保证数据完整性 | 用来和其他表建立联系用的 | 是提高查询排序的速度 |
个数: | 主键只能有一个 | 一个表可以有多个外键 | 一个表可以有多个惟一索引 |
-- 主表 创建主键
create table TAB_NAME_A(
xxxID int PRIMARY KEY
)
create table TAB_NAME_A(
xxxID int,
PRIMARY KEY(xxxID)
)
-- 从表 创建外键
create table TAB_NAME_B(
xxxID int REFERENCES 主表(主键)
)
-- 主表 添加主键
ALTER TABLE 主表 ADD CONSTRAINT PK_主键 PRIMARY KEY(主键);
-- 从表 添加主键
ALTER TABLE 从表 ADD CONSTRAINT FK_外键 FOREIGN KEY(外键) REFERENCES 主表(主键);
-- 主表 删除主键
ALTER TABLE 主表 drop PRIMARY KEY;
-- 从表 删除主键
ALTER TABLE 从表 drop CONSTRAINT 外键名;
注:
1)创建表
先创主表,后创从表。
2)删除表
先删从表,后删主表。
3)表添加数据
主表先添加从表指向的主键信息,然后从表再添加数据,不然会违反完整约束条件,使其未找到关键字。
数据操纵 DML
英文全称:Data Manipulation Language
INSERT表增加数据
INSERT INTO 表(列) VALUES(值);
DELETE表删除数据
TRUNCATE截断
DELETE FROM 表 WHERE 条件;
TRUNCATE TABLE; -- 保留表,删除表中所有记录
能把自动递增值的字段做计数重置归零重新计算。TRUNCATE TABLE 比 DELETE 速度快。
UPDATE表更新数据
UPDATE 表 SET 列 = 新值 WHERE 条件;
SELECT表查询数据
(7)SELECT 字段 as 别名
(8)DISTINCT 去重
UNION 合并多个结果集
INTO 创建新表并将查询内容插入新表中
字段a+字段b
如果两个字段都为数值,则求和;例如1+2为3
如果一个为字符型,另一个为数值型,则会试图把字符型转为数值型,字符型转换成功则求和。例如'1'+2 为3
如果一个为字符型,另一个为数值型,则会试图把字符型转为数值型,字符型转换失败则置0。例如'liubo'+2 为2
如果有一个为null,则结果为null。
CONCAT 拼接字段值,当有一个字段值为null时,拼接结果直接为null(可以用IFNULL做判断)。
(1)FROM 表 别名
(3)<join_type> JOIN <right_table>
(2)ON 条件
连接查询条件
(4)WHERE 条件
条件
(5)GROUP BY 字段
分组字段(除分组函数外的其他字段)
(6)HAVING 条件
中间结果集查询筛选
(9)ORDER BY 字段 ASC/DESC
排序
(10)LIMIT 1 1000;
1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。
2、ON: 对虚表VT1进行ON过滤,只有那些符合<连接查询条件>的行才会被记录在虚表VT2中。
3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。
4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<条件>的记录才会被插入到虚拟表VT4中。
5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。
6、HAVING: 对虚拟表VT5应用having过滤,只有符合<中间结果集查询筛选>的记录才会被 插入到虚拟表VT6中。
7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。
8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.
9、ORDER BY: 将虚拟表VT8中的记录按照<排序,默认升序>进行排序操作,产生虚拟表VT9.
10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。
注:
1)on与where的区别
on是生成临时表时使用的条件,无论真假都返回左表数据。
where在生成临时表之后使用的条件,返回满足条件的记录。
一.连接查询(多表查询)
1)交叉连接查询。这种查询方式得到的是两个表的乘积(笛卡儿集)
SELECT * FROM t_a,t_b WHERE aid=bid;
2)内连接:两个表的交集
等值内连接
SELECT * FROM t_a a,t_b b WHERE a.aid=b.bid; -- 隐式
SELECT * FROM t_a a JOIN t_b b on a.aid=b.bid; -- 显式
非等值内连接
SELECT * FROM t_a a,t_b b WHERE a.aid between b.value1 and b.value2;-- 隐式
SELECT * FROM t_a a JOIN t_b b on a.aid between b.value1 and b.value2;-- 显式
自连接
SELECT * FROM t_a a,t_a b WHERE a.aid=b.aid;-- 隐式
SELECT * FROM t_a a JOIN t_a b on a.aid=b.aid;-- 显式
3)外连接
左外连接
SELECT * FROM t_a LEFT JOIN t_b ON aid=bid;
右外连接
SELECT * FROM t_a RIGHT JOIN t_b ON aid=bid;
二.子查询:搜索条件在另外的表中
SELECT * FROM t_a WHERE aid IN(SELECT bid FROM t_b)
三.联合查询
UNION 合并多个结果集,联合查询条件:结果字段数相等
数据控制 DCL
英文全称:Data Control Language
GRANT
COMMIT
ROLLBACK
数据库权限
GRANT
REVOKE
COMMIT
ROLLBACK
事务控制 TCL
英文全称:Transaction Control Language
Mysql
逻辑架构
MySQL服务器逻辑架构从上往下可以分为三层:
1)第一层:处理客户端连接、授权认证等。
2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。
3)第三层:存储引擎,负责MySQL中数据的存储和提取。MySQL中服务器层不管理事务,事务是由存储引擎实现的。MySQL支持事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最为广泛;其他存储引擎不支持事务,如MyIsam、Memory等。
函数
INTERVAL SELECT INTERVAL(6,1,2,3,4,5,6,7,8,9,1); – 返回比N大的位置
SELECT NOW()-字段 24 HOUR/DAY – 时间比较;返回 前一天
INET_ATON 字符串的网络地址,返回一个代表地址数值的整数 INET_NTOA 给定一个数字网络地址,返回作为字符串的该地址的电地址表示
函数 | 用途 |
---|---|
EXISTS | 是否存在 |
LIKE | 模糊查询 。%代表匹配任意个任意字符;-代表匹配单个任意字符;转义用\,也可以通过ESCAPE去设置转义字符。 |
BETWEEN 值1 AND 值2 | 字段在值1与值2之间。[值1,值2] |
IN() | 字段值是否属于in列表中的某一项 |
EXISTS(查询语句) | 当查询到数据时,则返回true,否则为false。 |
UNION | 合并两个或多个 SELECT 语句的结果集并去重。 |
UNION ALL | 合并两个或多个 SELECT 语句的结果集。 |
LIMIT m,n | 从m+1行开始取,取n行 |
字符串函数
函数 | 用途 |
---|---|
ascll(x) | 返回x的ascii码 |
concat(x,y) | 连接字符串x与y |
CHARINDX() | |
LENGTH | 字符串的字节长度 |
UPPER | 大写 |
LOWER | 小写 |
SUBSTR(a,m,n) | 截取字符串a,从m开始,截取n个。 |
INSTR(字符串,子串) | 返回子串第一次出现的索引; 如果没有找到就返回0 |
TRIM(字符串) | 去除前后空格。如果想去除前后某个字符,可以写成TRIM(字符 from 字符串) |
LPAD(字符串,填充长度,字符) | 用指定字符实现左填充指定长度。如果填充长度小于字符串长度,将截取字符串。 |
RPAD(字符串,填充长度,字符) | 用指定字符实现右填充指定长度。如果填充长度小于字符串长度,将截取字符串。 |
REPLACE(字符串,字符1,字符2) | 将字符串中的字符1替换成字符2 |
LOCATE(substr,str) | 返回字符串substr中第一次出现子字符串的位置 str。 |
GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段][Separator ‘分隔符’]) | |
STRCMP(expr1,expr2) | 如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1。 |
IFNULL(expr1,expr2) | 如果expr1不是NULL,则返回expr1,否则返回expr2。 |
FIND_IN_SET(str,strlist) | 假如字符串str 在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间,如果没有的话返回0。 |
数字函数
数字函数 | 用途 |
---|---|
ROUND(x,y) | x在y的位置四舍五入取整 |
CEIL() | 向上取整 |
FLOOR() | 向下取整 |
TRUNCATE(x,y) | x直接截断到小数点后y位 |
MOD(a,b) | 取余。相当于%,a%b=a-a/b*b |
FORMAT(x,n) | 函数可以将数字x进行格式化,将x保留到小数点后n位。这个过程需要进行四舍五入 |
POWER(m,n) | m的n次幂 |
ABS() | 取绝对值 |
SQRT(n) | 根号n |
日期函数
日期函数 | 用途 |
---|---|
sysdate | 获取系统时间 |
add_months(month,n) | 在month当前月上增加n个月 |
lase_day(month) | month月份的最后一天 |
months_between(date1,date2) | date1与date2之间的月份 |
nex_day(date,weekday) | date下个星期weekday的时间 |
NOW()或GETDATE() | 获取当前时间。2008-08-08 08:08:08 |
CURDATE()或CURRENT_DATE或CURRENT_DATE() | 获取当前时间。2008-08-08 |
CURTIME()或CURRENT_TIME或CURRENT_TIME() | 获取当前时间。08:08:08 |
FROM_UNIXTIME | 数字时间戳 转换成 字符串时间 |
UNIX_TIMESTAMP(“YYYY-MM-DD hh:mm:ss”) | 字符串时间 转换成 数字时间戳 |
DATEDIFF(date1,date2) | 返回两个日期之间的天数。DATEDIFF(‘2008-12-29’,‘2008-12-30’) |
DATEDIFF(datepart,startdate,enddate) | 返回两个日期之间的时间,datepart参数 |
转换函数
转换函数 | 用途 |
---|---|
TO_CHAR(A,B) | 把A转换为B格式的字符串 A:日期或数字 B:格式化的字符串"yyyyMMddhhmmss" |
TO_DATE(A,B) | 把A转换为B格式的日期 A:字符串 B:格式化字符串 |
TO_NUMBER(A,B) | 把A转换为B格式的数字 A:字符串 B:格式化字符串 |
聚合函数
NVL(x,y)如果x为空,则返回yNVLZ(x,y,z)如果x为空,则返回z,否则返回ySUM()求和。忽略NULL值COUNT()计数。忽略NULL值MAX()最大值。忽略NULL值MIN()最小值。忽略NULL值AVG()平均值。忽略NULL值
函数
IF(expr1,expr2,expr3)相当于三目运算符case 参数
when ‘值1’ then 结果1
when ‘值2’ then 结果2
else 结果n
end相当于switchcase
when 条件1 then 结果1
when 条件2 then 结果2
else 结果n
end相当于if-elseif-elseIF THEN
ELSE
END IF;相当于if-else
数据结构
索引-B树/平衡树
BTree 元素自底向上插入,这与二叉树恰好相反。BTree 是一个n叉树,每个节点有多个叶子节点,一颗B+树包含根节点,内部节点,叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上叶子节点的节点。
BTree的性质:
1.n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
-
为什么要给表加上主键?
-
为什么加索引后会使查询变快?
-
为什么加索引后会使写入、修改、删除变慢?
-
什么情况下要同时在两个字段上建索引?
聚集索引 :带有主键的表
查询变快 。
写入、修改、删除变慢 。因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树的结构以确保它的正确 。
非聚集索引:索引
Mysql优化
https://www.cnblogs.com/kevingrace/p/6133818.html
https://blog.csdn.net/netwinds/article/details/50977527
定位:查找,定位慢查询,并优化
优化
1.创建索引:创建合适的索引,我们就可以在索引中查询,查询到以后直接找对应的额记录
2,分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表或垂直分表来优化,比如spu表
3,读写分离:当一台服务器不能满足需要时,采用将读写分离的方式进行集群
4.缓存:使用redis来进行缓存
性能参数
问题确认:数据库分析可以提供详细的数据库性能参数。
例如MySQL数据库(当前线程连接数、连接数和最大连接数、连接失败的线程、QPS、TPS、慢查询次数相关的状态量、日志相关的状态等)。
my.ini
(1)、max_connections:
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 too many connections 错误。 默认数值是100 。
(2)、record_buffer:
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128k) 。
(3)、key_buffer_size:
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8m),我的mysql主机有2gb内存 。
4)、back_log:
要求 mysql 能有的连接数量。当主要mysql线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log 值指出在mysql暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的tcp/ip连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | null | connect | null | login | null 的待连接进程时,就要加大 back_log 的值了。默认数值是50 。
(5)、interactive_timeout:
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 client_interactive 选项的客户。 默认数值是28800 。
(6)、sort_buffer:
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速order by或group by操作。默认数值是2097144(2m) 。
(7)、table_cache:
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。mysql对每个唯一打开的表需要2个文件描述符。默认数值是64 。
(8)、thread_cache_size:
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较 connections 和 threads_created 状态的变量,可以看到这个变量的作用。
(9)mysql的搜索功能
用mysql进行搜索,目的是能不分大小写,又能用中文进行搜索
只需起动mysqld时指定 --default-character-set=gb2312
(10)、wait_timeout:
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800 。
在Mysql数据库安装成功后,会在mysql根目录下存在四个.ini文件,分别为my-huge.ini、my-innodb-heavy-4G.ini、my-large.ini、my-medium.ini、my-small.ini,这几个启动配置文件中,分别对Mysql启动参数给出了如下的默认值:
sql优化
DDL优化:
- 通过禁用索引来提供导入数据性能,这个操作主要针对有数据的表追加数据
- 关闭唯一校验
- 修改事务提交方式(导入)(变多次提交为一次)
DML优化: 把多条插入的语句合并为一条(变多次提交为一次)
DQL优化:
Order by 优化
多用索引排序
普通结果排序(非索引排序)
Group by 优化:如果对排序的结果没有排序的需求,可以考虑在其后面加上order by nul
子查询优化
Or优化:
1.or两边都是用索引字段做判读,性能好
2.or两边,有一边不用,性能差
3.如果name=”a” or name=”b”,这种方式,索引失效
Limit优化
《阿里巴巴JAVA开发手册》里面写超过三张表禁止join 这是为什么?
需要 join 的字段,数据类型必须绝对一致;多表关联查询时, 保证被关联的字段需要有索引。 说明:即使双表 join 也要注意表索引、SQL 性能
这样的话那sql要怎么写?
Oracle
oracle服务器=数据库+实例;
实例=分配内存结构+管理数据库的后台线程
用户–会话–>数据库
启动数据库实例–>sqlplus连接到数据库–>创建用户进程–>创建服务器进程–>提交sql查询
数据库备份与还原
String backUpSQL = "cmd /C mysqldump -uroot -proot tistone_base tbl_ass_icareuserinfo > F:\\testdb\\base1.sql";
try {
int result = Runtime.getRuntime().exec(backUpSQL).waitFor();
System.out.println("--------"+result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
还原:
Mysql -uroot -p tistone_base > f:/testdb/yuanshi.sql
Mysql -uroot -p tistone_base < f:/testdb/yuanshi.sql
标签:关系,--,数据库,视图,索引,TABLE,主键 来源: https://blog.csdn.net/weixin_42607437/article/details/114483508
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。