总结数据库,非常简单的那种总结,简单到不想拿来复习的那种。
数据库(DataBase,简称DB)
概念:就是存放数据的仓库,是为了实现一定目的,按照某种规则组织起来的数据的集合。
必要性:1.可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。
2.可以有效地保持数据信息的一致性、完整性,降低数据冗余。
3.可以满足应用的共享和安全方面的要求。
常见数据库的主要分为两个类型,分别是关系型数据库和非关系型数据库。
关系型数据库(SQL):MySQL、Oracle、SQLite、SQLServer、DB2等,虽然关系型数据库不利于数据的分散,但还是当下的主流。
非关系型数据库(NoSQL):文档存储数据库--MonggoDB,键值存储数据库--Redis,Memcached,列存储数据库--HBase,图形数据库--Neo4J等。菲关系型数据库主要在有大量数据写入的时候运用。
MySQL是现在比较流行的开源免费的关系型数据库,有以下几个特点:首先就是免费...开源;小巧的同时功能也比较齐全;使用便捷、操作简单;移植性强,可运行于Windows、Linux、UNIX等操作系统;中小型企业甚至大型的网站都有应用。
数据库管理系统(DataBase Management System,DBMS)是一种系统软件,有一个互相关联的数据集合和一组访问数据的程序构成,简言之,就是管理数据库的系统。数据库管理系统的基本目标是提供一个可以方便有效地存取数据库信息的环境。
数据库系统(DataBase System,DBS)是一个实际可运行的系统,可以对系统提供的数据进行存储、维护和应用,它是由存储介质、处理对象和管理系统共同组成的集合体,通常由软件、数据库以及数据库管理员组成。
数据库管理员(DataBase Administrator,DBA)是指在数据库系统中负责创建、监控和维护整个数据库的专业管理人员。
SQL(Structured Query Language)结构化查询语言是只能被数据库识别的指令,但是在程序中,可以利用其它编程语言组织SQL语句发送给数据库,数据库再执行相应的操作。
SQL语言主要由以下四部分组成:
DML:数据操作语言,用来插入、修改和删除数据库中的数据,如INSERT、UPDATE、DELETE等。
DDL:数据定义语言,用来建立数据库、数据库对象,定义数据表结构等,大部分都是以CREATE开头的命令,如CREATE TABLE、CREATE VIEW及DROP TABLE等。
DQL:数据查询语言,用来对数据库中的数据进行查询,如SELECT等,这个使用最多。
DCL:数据控制语言,用来控制数据库组件的存取许可、存取权限等,如GRANT、REVOKE等。
SQLyog:是一款简洁高效、功能强大的MySQL数据库管理工具。优点是易用、简洁、图形化。
常用的数据类型:
数值类型:tinyint非常小的整型,int最常用的整型,double浮点型,decimal精度高常用于货币。
字符类型:char长度固定检索快,varchar长度可变省空间,text长文本。
日期类型:datetime和timestamp时间戳。
MySQL存储引擎主要介绍两种:InnoDB和MyISAM
功能 | InnoDB | MyISAM |
支持事务 | 支持 | 不支持 |
支持全文索引 | 不支持 | 支持 |
外键约束 | 支持 | 不支持 |
表空间大小 | 较大 | 较小 |
数据行锁定 | 支持 | 不支持 |
数据文件:
InnoDB类型的表文件有 .frm(表结构定义文件) 和 idbtal(数据文件) 两个相关文件。
MyISAM类型的表文件有 .frm(表结构定义文件).MYD(数据文件) .MYI(索引文件)三个相关文件。
常用函数:
聚合函数
函数名 | 作用 |
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
例如:SELECT SUM(studentResult)FROM result;计算总成绩
字符串函数
函数名 | 作用 | 例 |
CONCAT(str1,str2...) | 连接字符串str1,str2...为一个完整字符串 | SELECT CONCAT('My','SQL');返回MySQL |
INSERT(str,pos,len,newstr) | 将字符串str从pos位置开始,len个字符长的字符替换为字符 串newstr | SELECT INSERT('这是MySQL数据库',3,10, ‘MySQL’);返回:这是MySQL |
LOWER(str) | 将字符串str中的所有字符变为小写 | SELECT LOWER('MySQL');返回mysql |
UPPER(str) | 将字符串str中所有字符变为大写 | 略 |
SUBSTRING(str,num,len) | 返回字符串str的第num个位置开始长度为len的字符串 | SELECT SUBSTRING('JavaMySQLOracle' ,5,5);返回:MySQL |
还有char_length( )返回字符串个数,LEFT( ) RIGHT( ) 从左或者右截取,REPLACE()替换,REVERSE()反转
时间日期函数
函数名 | 作用 |
CURDATE( ) | 获取当前日期 |
CURTIME( ) | 获取当前时间 |
NOW() | 获取当前日期和时间 |
WEEK(date) | 返回日期date为一年中的第几周 |
YEAR(date) | 返回日期date的年份 |
HOUR(time) | 返回时间time的小时值 |
MINUTE(time) | 返回时间time的分钟值 |
数学函数
函数名 | 作用 |
CEIL(x) | 返回大于或等于数值x的最小整数 |
FLOOR(x) | 返回小于或等于数值x的最大整数 |
RAND() | 返回0~1间的随机数 |
还有ABS( )绝对值,CEILING(x)=CEIL(x)SIGN()正数返回1,负数返回-1,0返回0,是个符号函数。
ORDER BY:排序,默认使用的是ASC升序,可通过DESC设置按降序排列。
LIMIT【位置偏移量】,行数:分页查询,位置偏移量指从结果几种第几条数据开始显示,此参数可选,当省略时默认从第一条记录开始显示。行数指显示记录的条数。好处就是在查询后不至于出现一大堆,便于浏览。
EXISTS和NOT EXISTS:EXISTS主要是用来确认后边的查询是否继续进行,返回值是true或false。NOT EXISTS表示不存在对应查询条件的记录。
子查询的关键点:
1.子查询语句可以嵌套在SQL语句中任何表达式出现的位置。
2.只出现在子查询中而没有出现在父查询中的表不能包含在输出列中。
GROUP BY:分组,按照自己需要的结果设置条件,不讲。
DISTINCT:去除重复项。
HAVING:筛选,HAVING WHERE 可以在同一个SELECT语句中使用,使用顺序为:WHERE--GROUP BY--HAVING
提一句,当查询的列取别名后,不能拿别名当WHERE的列名,却可以当HAVING的列名,可以这样简单理解, 别名影响查询结果,不修改原表。WHERE联系的是原表,HAVING联系的是新表,别名在原表中并不存在,而HAVING是在新表中筛选。
内连接:INNER JOIN...ON 连接两个表共同查询,取得的结果是两个表的交集。语法 SELECT 字段 FROM 表1 INNER JOIN 表2 ON 关联条件;
外连接:左外连接:LEFT JOIN...ON,以左表为准,结果包括左表的所有行,如果右表没有值与之匹配,则均为空值。
右外连接:RIGHT JOIN...ON,同上,方向反一下。
自连接:将一张表看做两张表,然后进行连接查询,通常是在一张表中的某些属性出现父子类关系时使用。
模糊查询:先是两个通配符,一个%,一个_,%代表0到任意个的字符,而_只代表一个字符。
比如想查询一个人的名字,名字有三个字,却只知道姓:‘李%’‘李_ _’效果相同。
in和null也是模糊查询,in是在查询条件返回值不唯一的情况下使用,类似于:WHERE student_no in(1,2,3,4);
而null不能使用等于号,要使用 is ,比如 is null 或者 is not null ;类似于:WHERE xx=' ' OR xx is null;xx等于空或者null;
然后讲一讲事务
事务是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则这个批次内的所有SQL语句都将被取消执行。事务只支持InnoDB和BDB。
事务的ACID原则:
A(atomicity)原子性:事务是一个完整的操作,事务的各元素是不可分的,事务中的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败。
C(consistency)一致性:当事务完成时,数据必须处于一致状态。意思就是,在事务开始之前,数据是处于一致状态的,在事务进行的过程中,数据可能处于不一致的状态,当事务完成时,数据必须再次回到已知的一致状态,通过事务对数据所做的修改不能损坏数据,或者说事务不能使数据存储处于不稳定的状态。
I(isolation)隔离性:对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的, 它不能以任何方式依赖或影响其它事务。
D(durability)持久性:事务的持久性指不管系统是否发生了故障,事务处理的结果都是永久的,
开启一个事务的流程:
首先将自动提交关闭:SET AUTOCOMMIT=0;
开始事务:BEGIN 或 START TRANSACTION;
执行需要执行的各种操作。
提交:COMMIT;或者出现差错后回滚:ROLLBACK;
SET AUTOCOMMIT=1;(在MySQL中事务的默认隔离级别是REPETABLE-READ(可重读))
编写事务原则:
1.事务尽可能简短。事务的启动至结束在数据库管理系统中会保留大量资源。
2.事务中访问的数据量尽量减少。将并发执行事务处理时,事务操作的数据量越少,事务之间对操作数据的争夺就越少。
3.查询数据时不要使用事务。对数据进行浏览查询操作并不会更新数据库的数据,因此不使用事务查询数据,以避免占用过量的系统资源。
4.在事务处理过程中尽量不要出现等待用户输入的操作。有可能会造成系统阻塞。
视图,不讲。
索引:索引相当于是表的目录,为了加快检索速度,改善数据库性能。
索引的分类:普通索引,唯一索引,主键索引,复合索引,全文索引,空间索引。
需要讲的就是唯一索引和主键索引的区别,个人认为就一点不同,唯一索引中可以有一个值为null,而主键在保证所有值不同的情况下还得保证不能有null值。
创建索引:CREATE【UNIQUE|FULLTEXT|SPATIAL】索引名 on 创建索引的表名(列名);
删除索引:DROP INDEX 表名.索引名;
查看索引:SHOW INDEX FROM 表名;
提一下全文索引,全文索引只有MyISAM类型的数据表可以用,只能用于CHAR 、VARCHAR、TEXT数据列类型,适合大型数据集。使用全文索引的语法:SELECT * FROM 表名 WHERE MATCH(列名)AGAINST(‘查找内容’);
索引原则:不是越多越好,不要对经常变动的数据列加索引,小数据量的表不需要加索引,索引一半应该加在查找条件的字段
MySQL的备份和恢复:
数据备份的重要性就不说了,数据库的备份有几个方法,比如mysqldump、SQLyog数据库管理工具、直接拷贝、还有使用sql命令的方式备份恢复的。讲一下mysqldump。
mysqldump在dos窗口不登录进入数据库使用,命令:mysqldump -h 主机名 -u用户名 -p密码 数据库名 表名>路径;
还有一点,使用sql命令备份时,可以只备份表里的数据,但是备份出去的文件不能事先存在,必须通过备份命令创建。
数据库的设计:
这个没什么可讲的,讲一下概念。
阶段:收集信息——标识实体——标识每个实体需要存储的详细信息——标识实体之间的关系
第一范式:目标是确保每列的原子性。如果每列都是不可再分的最小数据单元,则满足第一范式。
第二范式:目标是确保表中的每列都和主键相关。如果一个关系满足第一范式并且除了主键以外的其他列都全部依赖于主键,则满足第二范式。
第三范式:目标是确保每列都和主键列直接相关,而不是间接相关,如果一个关系满足第二范式,并且除了主键以外的其他列都只能依赖于主键列,列和列之间不存在互相依赖的关系,则满足第三范式。
写两条语法 T.T~
语法:
显示所有可使用xxx的指令:?xxx;
dos启动数据库:net start mysql;
显示当前时间,用户名,版本:select now(),user(),version();
查看系统所支持的引擎类型:SHOW ENGINES;
设置严格检查模式:SET sql_mode=`strict_trans_tables`;
设置自增列的步长:AUTO_INCREMENT=XX;
查看默认存储引擎:SHOW VARIABLES LIKE 'storage_engine%';
刷新:FLUSH PRIRILEGES;
退出:exit;
查询所有用户信息(\G控制输出格式):SELECT * FROM USER\G;
查看数据库的定义:SHOW CREATE DATABASE 数据库名;
创建数据库:CREATE DATABASE 数据库名;
查看数据库列表:SHOW DATABASE;
选择数据库:USE 数据库名;
删除数据库:DROP DATABASE 数据库名;
创建表:CREATE TABLE 【IF NOT EXISTS】 表名(
字段1 数据类型【字段属性|约束】【索引】【约束】,
字段2 数据类型【字段属性|约束】【索引】【约束】,
字段3 数据类型【字段属性|约束】【索引】【约束】
)【表类型】【表字符集】【注释】;(中括号选填,每个字段最后英文逗号,最后一行不加)
字段约束不讲。
查看表:SHOW TABLES;
查看表的定义:DESCRIBE 表名;
删除表:DROP TABLE【IF EXISTS】表名;
修改表名:ALTER TABLE<旧表名>RENAME 【TO】<新表名>;
添加字段:ALTER TABLE 表名 ADD 字段名 数据类型【属性】;
修改字段:ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型【属性】;(修改数据类型可能会影响数据表中已有的数据,因此,已有数据的情况下不应轻易修改数据类型)
删除字段:ALTER TABLE 表名 DROP 字段名;
添加主键约束:ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY 表名(主键字段);
添加外键约束:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段)REFERENCES 关联表名(关联字段)注:InnoDB存储类型的表支持外键,MyISAM存储类型的表不支持外键。
建议在插入数据时指定具体的字段名。
将查询结果插入到新表中:CREATE TABLE 新表(SELECT 字段1,字段2,...FROM 原表);
更新数据记录:UPDATE 表名 SET 列名 =更新值【WHERE 更新条件】;SET后面可跟随多个,不同列之间使用逗号隔开,如果不用WHERE条件限制,则整个表的所有数据行都将被更新。
删除数据记录:DELETE【FROM】表名【WHERE<删除条件>】;TRUNCATE TABLE用来删除表中的所有行,功能上类似于没有WHERE字句的DELETE语句,执行比DELETE快,但是不能用于有外键约束引用的表。实际工作中不建议使用TRUNCATE TABLE语句,因为他删除的数据是不能恢复的。
查询所有的数据行和列:SELECT * FROM 表;
查询+WHERE+别名(AS可省略):SELECT student_no AS 学号 FROM student WHERE student_name='张三';