#目的
系统总结一下常用的数据库基础知识和操作。刷面试题也可以。
分为4个阶段:
1、E-R图建数据库,常用sql语句
2、高级使用:事务等
3、mysql优化,必考
4、NoSQL:Redis等
#数据库高级使用补漏
1、索引:加快查询速度
2、分页:limit,top,row_number()命令
2、视图:是从一个或多个表导出的虚拟表,其内容由查询sql语句定义create or replace view v_student as select * from student;简化了操作,把经常使用的数据定义为视图。
3、存储过程:类似函数。有输入、输出,函数体就是sql语句集。尽量用存储过程执行查询。
4、游标:结果集常常是多条记录。游标可以理解为指向记录的指针,每次取一条记录出来处理。
5、事务:简单理解就是比如3条insert语句,有顺序关系,希望一次执行成功,则用事务。事务的原子性:3条insert语句要么全部成功,要么全部失败,失败则回滚。事务的隔离性:允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。不同的隔离级别,比如串行读,隔离级别最高,牺牲并发性,解决脏读幻读问题。
6、触发器:简单理解为一种特殊的存储过程。如当我对表work进行insert操作完后,会触发执行delete操作,或执行要校验其年龄,暂定其年龄必须大于18,否则新增失败 。容易造成代码复杂,慎用。
#MySQL优化
最起码能系统的答上来几句,刷面试题也可以。
分3个层面:1、硬件优化 2、MySQL配置参数优化(修改最大连接数)3、软件优化(SQL语句及表优化)
其中SQL语句优化:
当只要一行数据时使用LIMIT 1。
为搜索字段建立索引。
避免使用SELECT *
选择正确的存储引擎(在MYSQL中有两个存储引擎MyISAM和InnoDB,每个引擎都有利有弊。MyISAM适合于一些需要大量查询的应用,但是对于大量写操作的支持不是很好。InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。)
表优化(水平拆分、垂直拆分)
#NoSQL
1、not only sql,非关系型的数据库
2、分类
键值(Key-Value)存储数据库:Redis
列存储数据库:HBase,应对分布式存储的海量数据
文档型数据库:MongoDb
图形(Graph)数据库:Neo4J
#SQL语句补漏
http://www.w3school.com.cn/sql/sql_top.asp
熟悉的就不写了。
1、IN
希望从上表中选取姓氏为 Adams 和 Carter 的人:感觉用OR也可以
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
2、AS 别名
可以为列名称和表名称指定别名。
我们有两个表分别是:“Persons” 和 “Product_Orders”。我们分别为它们指定别名 “p” 和 “po”。印象中项目中打个空格就可以的,不需要AS。
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
SELECT LastName AS Family, FirstName AS Name
FROM Persons
3、JOIN
需要从***两个或更多的表中***获取结果。知道有这么个东西,不用也可以。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
也可以写成:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
4、UNION
合并两个或多个 SELECT 语句的结果集。默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。知道概念即可,未必用的到。
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
5、SELECT INTO
从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件。
制作 “Persons” 表的备份复件:
SELECT *
INTO Persons_backup
FROM Persons
6、INDEX 索引
创建一个简单的索引,名为 “PersonIndex”,在 Person 表的 LastName 列:索引使数据库应用程序可以更快地查找数据
CREATE INDEX PersonIndex
ON Person (LastName)
7、AUTO INCREMENT
希望在***每次插入新记录时,自动地创建主键字段的值***。默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
8、视图 VIEW
视图是基于 SQL 语句的结果集的可视化的表。个人理解可以看做是一张虚拟表,可以查询,但不能对视图增删改。视图可以提高安全性,可以提高查询速度。
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
SELECT * FROM [Products Above Average Price]
#基础知识
1、知识图谱,作为参考
https://www.jianshu.com/p/a8239b6b5841
1、E-R图
辅助建表的工具。图形化。
2、第一、二、三、四、五、BC范式
一般情况的数据库只需满足第三范式即可。
规范数据库表的设计。
第一范式就是无重复的列。(一个人可能有一部办公电话和一部移动电话),这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。
如果关系模式R是1NF,且每一个非主属性完全依赖于主键,那么就称R是第二范式。例如:在选课关系表中(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但是非主属性学分对关键字只是部分依赖,而不是完全依赖。 解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分)。新关系通过学生表中外关键字课程号联系,在需要时进行连接。
第三范式(3NF):符合2NF,并且,消除传递依赖。老师——>老师职称。一个老师一定能确定一个老师职称。因此,老师-老师职称单独建子表。
3、存储过程
类似函数。有输入、输出,函数体就是sql语句集。
尽量用存储过程执行查询。
4、游标
使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
5、分页
top not in 实现:
select top 5* from UserInfo where UserID not in
(select top (n-1)*5 UserID from UserInfo order by UserID asc)
order by UserID asc
缺点:数据量不大时适用。
limit实现:
select * from tablename LIMIT ((页码-1)*页大小), 页大小;
缺点:数据量不大时适用。
ROW_NUMBER()实现:
数据量大时,比not in有优势。
#NOSQL,HADOOP、非关系型数据库