栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据库知识大全

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据库知识大全

数据库是什么?存储数据和管理数据。

数据库有哪些类型?关系型数据库和非关系型数据库.数据间关系紧密/松散.

常用的关系型数据库有?Oracle/MySQL/SQLServer/Access/DB2.

常用的非关系型数据库?MongoDB/Redis/Solr/ElasticSearch/Hive/HBas.

什么是CRUD操作?新增Create、检索Retrieve、修改Update、删除Delete.

结构化查询语言SQL有哪些?DDL,DML,DQL,DCL(grant/deny/revoke),TCL(commit/savepoint/rollback),指针控制语言CCL(Cursor Control Language)用于对表单独行的操作,DECLARE CURSOR,FETCH INTO和UPDATE WHERe CURRENT。

数据库常用操作有哪些?create/alter/drop/show/desc/insert/update/delete/select
create database dbname;database/use dbname;show databases;

数据库表名和字段名命名规则是怎样的?$_,保留字,字母开头,30字符,Oracle大写/MySQL小写,_隔开.

一个汉字占几个字节?在utf8下占3个字节,GBK2个字节.

char和vachar的区别?char定长,最多2000个字符,查询快浪费空间;vachar边长,最多4000个字符,查询慢节省空间.Oracle为varchar2。int默认长度11,char默认长度1,varchar必须指定长度;

2.数字:tinyint,int整数类型;float,double小数类型;decimal,numeric表示精确的整数数字;
numeric/decimal(n,m):也可以表示小数,表示总共n位,其中可以有m位小数;
3.日期:date年月日;time时分秒;datetime包含年月日和时分秒;
timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数;
4.图片:blob二进制数据,可以存放图片、声音,容量4g。
数据库庞大,备份缓慢,迁移时间过久,价值不大。
目前主流只存储其访问路径,文件则存放在磁盘上。

#字段约束
1.主键约束(primary key ):添加了主键约束的列,就是主键,主键的特点是唯一且不能为空。
通常情况下,每张表都会有主键。联合主键:多个字段;
2.主键自增策略(auto_increment):当主键为数值类型时,可以设置主键自增策略,方便维护。
数据库在表中保存一个变量值AUTO_INCREMENT,需要时获取一个值,作为主键值插入到表中。
AUTO_INCREMENT初始值为1,而且每次用完值都会自增1。
3.非空约束:not null;不能为空,可以重复。
4.唯一约束:unique;唯一(不能重复),可以为空。

#基础函数:as/lower/upder/length(column),substr,concat,replace,ifnull;
SUBSTr(字段名,n):[n,尾]截取字符串,字母汉字一样;
SUBSTr(column,n,length) :从第n个字符截取指定长度字符;
CONCAt(column,str1,str2,...):拼接字符串;
REPLACE(字段,'s','str') :替换字段中的字符串;
IFNULL(字段,数据) :字段为空时,换位指定数据;
#对小数的处理:round-四舍五入,ceil-向上,floor-向下;
round(字段):四舍五入取整;round(字段,n):保留n位小数;
#对日期的处理:now(),year/month/day(date),hour/minute/second(now());
now():年与日 时分秒;curdate():年与日;curtime():时分秒;
#UUID():返回uuid:a08528ca-741c-11ea-a9a1-005056c00001
#转义字符:'作为sql语句符号,内容中出现单撇就会乱套,进行转义即可;
'ab'cd'; -- 数据中有单引号时,用一个转义变成普通字符

----------------------------------
SQL的执行顺序:
(1) FROM [left_table] 选择表
(2) ON 链接条件
(3) JOIN 链接
(4) WHERe 条件过滤
(5) GROUP BY 分组
(6) AGG_FUNC(column or expression),... 聚合
(7) HAVINg 分组过滤
(8) SELECt (9) DISTINCT column,... 选择字段、去重
(9) ORDER BY 排序
(10) LIMIT count OFFSET count; 分页

#条件查询
-- 执行顺序:from-where-group by-having-select
#distinct:去除重复的记录行;
#where:只能使用表的别名;不能使用列别名;不能出现聚合函数;比having效率高;
SELECT * FROM dept WHERe 1=1;
-- and/between and/in/not in;is null/is not null;
-- like+通配符:%(0到n个字符),_(1个字符);
-- limit:limit n-返回前n条;limit m,n-从第m-1条开始展示n条记录;
-- order by:desc/asc;字母表,日期,汉字utf8中对应的数字;
#聚合aggregation:根据一列统计结果;count/max/min/sum/avg;
-- count(1)比count(*)高效;count不能统计null;
#分组group:对查询的结果进行分组统计;group by分组,having过滤结果;
-- 查询中出现非聚合列必须按照非聚合列分组;
#UNIOn合并重复内容;union all 不合并重复内容

#MySQL注释: #单行注释 -- 单行注释
修改中文编码格式:
alter table tbName convert to character set utf8;
解决中文乱码:set names gbk;
create database dbname charset utf8;

#主键、外键、唯一索引的区别?现今弱化关系型数据库;
Primary Key 主键约束,唯一且不为空,自动创建唯一索引;
Foreign Key 外键约束,引用另一表的字段内容;
Unique Index 唯一索引,唯一值但不是主键;
数据库提供了丰富的约束检查;数据库会进行检查,违反约束会报错,操作失败。

#drop、delete和truncate之间的区别?
drop删除库/表的数据和结构定义;
delete只删除表的数据;truncate删除表数据和定义;
delete不会自增值清零;truncate自增主键会重头开始计数;
delete可以指定where条件;tuncate删除所有记录;

-------------------------------

#数据库事务(Database Transaction):作为单个逻辑单元执行一系列操作。
将一堆的SQL语句绑定在一起执行,要么都执行成功,要么都执行失败。
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务;
事务用来管理DML 语句的: insert、update、delete;

#事务4个特性ACID:
原子性Atomicity:多条SQL看做一个原子,全成功或者全失败;
一致性Consistency:在事务前后,数据库的完整性没有被破坏;
隔离性/独立性Isolation:防止多个事务并发执行而导致数据不一致;
持久性Durability:对数据库的操作影响是持久生效的;

#事务的隔离级别:从上到下,安全性变好,性能变差;
读未提交(Read uncommitted):安全性最差,可能发生并发数据问题,性能最好;
读提交(read committed) :Oracle默认的隔离级别;
确保同一事务的多个实例在并发读取数据时,会看到同样的数据行;
可重复读(repeatable read):MySQL默认的隔离级别,安全性较好,性能一般;
串行化(Serializable):表级锁,读写都加锁,效率低下,安全性高,不能并发;

#MySQL每执行一条SQL语句,都是一个单独的事务。
如果需要在一个事务中包含多条SQL语句,那么需要手动开启事务和结束事务。
开启事务:start transaction;
结束事务:commit(提交事务)或rollback(回滚事务)。

#表设计特点:表名都以s结束,标识复数;
字段多以表的首字母作为开头,标识出是哪个表的字段;
表的关系分为四种:一对一,一对多,多对一,多对多;

#约束constraints:check/not null/unique/default/primary key/foreign key;
外键约束:子表添加数据时,主键值必须取自主表;主表删除数据时,子表不能有相关记录;

#索引:排好序的快速查找的数据结构,提高查询效率;
额外的存储空间,满足特定查找算法,以某种方式指向数据;
索引本身占用存储空间,往往以索引文件的形式存放在磁盘中;
目前大多数索引都采用BTree树方式构建;

#分类:单值,唯一,复合;
单值索引:只包括一个列;
唯一索引:只有一个列,索引列的值唯一,允许有空值;主键会自动创建唯一索引;
复合索引:一个索引包括多列;遵循最左特性,否则索引失效;
查看索引:show index from tb_name;
创建单值索引:create index 索引名 on 表名(字段名);
创建唯一索引:create unique index 索引名 on 表名(字段名);
创建复合索引:create index 索引名 on 表名(字段名1,字段名2);
alter table 表名 add index 索引名(字段名);
使用索引:按照索引列去查;EXPLAIN:possible_keys用到的索引;
删除索引:alter table 表名 drop index 索引名;

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

#为何索引快?
索引表排序了,tree结构,类似二分查找;索引表小;
先到事先排序好的索引表中检索查询,找到其主键后,就直接定位到记录所在位置,然后直接返回这条数据。

#索引的优点和缺点
1.优点:优化数据库查询;事先对数据进行了排序,提高了检索速度;
主键会自动创建索引;每个字段都可以被索引;
2.缺点:索引也是一张表,本身也要占用空间;
该表保存了主键与索引字段,并指向实体表的记录;
索引表中的数据是重复的,浪费空间;
对数据的增、删、改的操作需要更新索引表信息,影响更新效率;
业务变化,需要消耗时间去更新索引;

#视图view:缓存QL语句的执行结果,当做表来用;
好处:简化了SQL,相同SQL只需写一次;
屏蔽了业务表的复杂性;可以被共享;
坏处:SQL无法被优化;
创建视图:create view 视图名 as SQL语句;
使用视图:select * from 视图名;

#表关联:多表查询:阿里规范中禁止3张表以上的联查。
1.笛卡尔积(Cartesian product),又称直积。没有实际的业务意义。
select * from 表1,表2,表3;通过逗号连接表名,得到数据为两表数据之积;
描述表之间的关系:where 表名.字段名=表名.字段名;
多表查询都是先生成笛卡尔积(构建一个大大的结果集),再进行数据的筛选过滤。
构建过程,使用的内存资源,过滤时的判断,都是既耗费资源,又浪费时间。
2.连接查询:内连接 inner join;左(外)连接 left join;右(外)连接 right join;
select * from 表1 join 表2 on 表1.字段=表2.字段 where 条件;
INNER JOIN:两边都对应有记录的才展示,其他去掉
LEFT/RIGHT JOIN:左/右边表中的数据都出现,右/左边没有数据以NULL填充;
3.子查询/嵌套查询:嵌入在其他select语句中的select语句;
把查询结果作为查询条件;执行效率低慎用;
单行子查询 =;多行子查询 in;

----------------------------------

#中文乱码问题:设置客户端字符集和服务器端相同。
mysql和客户端工具都有习惯的默认编码设置;
Mysql数据库默认字符集是lantin1,也就是网页中ISO8859-1,是英文字符集,不支持存放中文。
创建库时,指定字符集:create database 库名 charset utf8/gbk;
sqlYog客户端执行:set names utf8/gbk;
show variables like 'collation_%';show variables like 'character_set%';
修改数据库的编码:alter database 数据库名 character set utf8;
修改表的编码:ALTER TABLE 表名 ConVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
修改配置文件字符集编码:my.ini 配置文件,修改如下:
[mysql]  default-character-set=utf8  
[client]  default-character-set=utf8  
[mysqld]  default-character-set=utf8  character_set_server=utf8  
init_connect='SET NAMES utf8' 

#char和varchar有什么区别?
char为定长字符串,char(n),n最大为255;字符长度不足用空格补齐;
varchar为不定长字符串,varchar(n),n最大长度为65535;使用字符实际长度;

#datetime和timestamp有什么区别?
date是年与日,time是时分秒;
datetime年月日时分秒,存储和显示是一样的;
timestamp时间戳,存储是从1970年1月1日到指定日期的毫秒数;

Count(*), Count(1) 和Count(字段)的区别:
1.执行结果:
count(1)和count(*)执行效果没有区别,都不会去过滤空值;
count(字段) 统计该字段在表中出现的次数,不统计字段为null 的记录;
2.执行效率:
count(主键列名)效率优于count(1);count(1)效率优于count(非主键列名)  ;
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*);
如果表只有一个字段,则count(*)最优。
3.原理 
count(1),相当于表中有一个固定值1的字段;
count(*),自动会优化指定到某一个字段,多了一个翻译的动作,比count(1)效率稍微低一些;

#索引失效
1.查询条件中没有复合索引中最左边的字段;
2.模糊查询时,通配符%和_最左的情况;
3.字符串怪现象:索引为字符串,使用数字匹配;NAME=123;
不加单引号时,是字符串跟数字的比较,会做隐式的类型转换为数值类型再做比较;
4.使用or可能会使索引失效,从而全表扫描;

--------------
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/697693.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号