数据库是什么?存储数据和管理数据。
数据库有哪些类型?关系型数据库和非关系型数据库.数据间关系紧密/松散.
常用的关系型数据库有?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)
(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可能会使索引失效,从而全表扫描;
--------------



