数据库,又称“电子化的文件柜”,是“按照数据结构来组织、存储和管理数据的仓库”,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
1.1-数据库分类-
关系型数据库: 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。例如:Oracle和MySQL。
-
非关系型数据库: NoSQL,(NoSQL = Not only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。NOSQL典型产品有memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库)
一个数据库的服务器中有多个数据库,一个数据库中有多个表,
每个表有多个字段(字段和Java中类的属性是对应的),每一条记录对应是一个Java实例对象。
事务就是作为单个工作单元而执行的一系列操作,如查询和修改数据等。
1.3.1事务必须满足的4个条件(特性)- 原子性:在事务中进行的修改,要么全部执行,要么全不执行。
- 一致性:为了事务在查询和修改时数据不发生冲突。
- 隔离性:隔离性是一种用于控制数据访问的机制,能够确保事务只能访问处于期望的一致性级别下的数据。
- 持久性:在将数据修改写入到磁盘之前,总是先把这些修改写入到事务日志中。这样子,即使数据还没有写入到磁盘中,也可以认为事务是持久化的。
事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离。
一般的数据库,都包括以下四种隔离级别:
- 读提交(Read Committed):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。这种隔离级别能够有效的避免脏读,但除非在查询中显示的加锁。“读提交”只能避免“脏读”,并不能避免。
- 读未提交(Read Uncommitted):就是可以读到未提交的内容。因此,在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的,可能会产生“脏读”、“不可重复读”、“幻读”。
- 可重复读(Repeated Read):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,能够有效的避免“不可重复读”。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
- 串行化(Serializable):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。这种级别下,“脏读”、“不可重复读”、“幻读”都不会出现,但是执行效率非常差,性能开销也最大,所以基本没人会用。
-
数值型:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
-
大数据型:BLOB(二进制文件)、TEXT(文本)
-
字符串型:VARCHAR、CHAR
varchar和char的区别:
*varchar(经常使用)长度是可变的。name varchar(8)可以存入数据wangzhu(如果数据长度在范围之内,自动根据存放内容改变长度),但是如果存入wangguozhu就报错了;
*char长度是不可变的。name char(8)存入数据wangzhu,如果不够长度8用空格补全。(char效率高)
-
逻辑型:BIT(对应boolean)
-
日期型:
DATE:只包含日期
TIME:只包含时分秒
DATETIME:需要手动录入时间
TIMESTAMP:默认选择当前系统时间
(datetime和timestamp包含日期和时分秒)
-
AUTO_INCREMENT 自动递增 自动在上一条记录的基础下自动增加。通常用来设计唯一主键 --index 必须是整数类型。 可以自定义设置自增起始值和步长。
-
NULL ,NOT NULL 空/非空 假设为not null,当不赋值时,就会报错。NULL ,如果不填写值,默认为null。
-
DEFAULT 默认 设置默认值。如果不指定该列的值,则会存在默认的值。
(1)创建数据库:create database 数据库名称;
(2)创建指定字符集的数据库:create database 数据库名称 character set ‘字符集’;
(3)创建指定字符集并带校对规则的数据库(校对规则和编码是成对出现的):create database 数据库名称 character set ‘字符集’ collate ‘校对规则’;
举例(1)创建一个名称为students的数据库:
create database students;
(2)创建一个使用utf8字符集的数据库:
create database students character set ‘utf8’;
(3)创建一个使用utf8字符集,并带校对规则的数据库:
create database students character set ‘utf8’ collate ‘utf8_bin’;
3.1.2删除数据库(1)删除students数据库:
drop database students;
3.1.3查看数据库(1)查看当前数据库服务器中的所有数据库:
show databases;
(2)查看students数据库的定义信息:
show create database students;
3.1.4修改数据库(1)把students数据库的字符集修改成gbk:
alter database students character set ‘gbk’;
3.1.5备份、恢复数据库 SQL Server中- 备份:backup database 数据库名称 to disk 备份路径;
- 还原:restore database 数据库名称 to disk 备份路径;
(cmd命令窗口操作,需要配置MySQL环境变量)
- 备份:mysqldump -uroot -ppass database >备份路径
- 还原:mysql -uroot -ppass database <备份路径
root:用户名;pass密码;database:需备份的数据库名称
3.1.6其他操作(1)切换数据库:use 数据库名称;
(2)查看当前使用的数据库:select database();
3.2-数据库表的操作语句 3.2.1创建表格(4)创建表插入数据的SQL语句:
CREATE TABLE IF NOT EXISTS `test_student`( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号', `name` VARCHAR(20) NOT NULL DEFAULT '王国柱', `sex` VARCHAR(3) NOT NULL DEFAULT '女' COMMENT '性别', PRIMARY KEY(`id`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8
CREATE TABLE IF NOT EXISTS [`表名`]( `字段名` [列数据类型] [属性] [索引] [注释], `字段名` [列数据类型] [属性] [索引] [注释], `字段名` [列数据类型] [属性] [索引] [注释], ) [表类型] ENGINE=INNODB [字符集设置] DEFAULT CHARSET=UTF8 [表注释]3.2.2删除表格
(1)删除student表:
drop table student;
3.2.3修改表格(2)在student表上添加一个hoppy列:
alter table student add hoppy varchar(20);
(3)修改hoppy列的长度为60:
alter table student modify hoppy varcher(60);
(4)修改列名hoppy为like:
alter table student change hoppy like varchar(30);
(5)删除hoppy列:
alter table student drop hoppy;
(6)修改表名student为user:
rename table student to user:
3.3-数据库数据的操作语句 3.3.1添加数据- 语法:insert into 表名 values();
- 举例:向student表中插入数据
insert into student values (1,'小明','男','1999-08-07'); insert into student values (2,'小米','女','2000-11-09'); insert into student values (3,'小香','女','1999-01-19');
注意:
数据要与字段类型相同;
字段长度需要控制;
在values中列出的数据位置要与被加入的列的排列位置相对应;
字符和日期型数据应包含在单引号中
3.3.2删除数据-
语法:(1)删除数据:delete form 表名 [where];
(2)删除所有数据:truncate 表名;
-
举例:
(1)删除表中名称为’小米’的记录:delete from student where s_name = ‘小米’;
(2)删除student表中所有记录:delete from student;
(3)使用truncate删除student表中记录:truncate student;
3.3.3查询数据-
语法:
(1)select *from 表名;
(1)查询表中所有学生的信息:
selete *from student;
(2)查询表中所有学生的姓名和对应的英语成绩:
selete name,english from student;
去重查询-
语法:去除重复的数据:selete distinct 字段名 from 表名
-
举例:过滤表中重复的数据:
selete distinct english from student;
聚集函数 count获取数量(1)统计一个班学生的总人数:
selete count(*) from student;
(2)统计英语成绩大于90的学生数量:
selete count(*) from student where english >90 ;
(3)统计总分大于240的学生数量:
selete count(*) from student where (chinese+math+english) >240;
sum求和(1)统计班级的英语总成绩:
selete sum(english) from student;
(2)统计班级的数学成绩平均分:
selete sum(math)/count(*) from sum;
avg平均数(1)统计班级的数学成绩平均分:
selete avg(math) from student;
最大最小值(1)统计班级数学成绩最大值:
selete max(math) from student;
(2)统计班级数学成绩最小值:
selete min(math) from student;
group by 分组(条件过滤用having,不能使用where)
(1)对订单表中商品归类后,显示每一类商品的总价:
select product,count(*),sum(price) from oeder group by prodyct;
(2)查询购买了几类商品,并且每类总价大于100的商品:
select product,sum(price),from oeder group by product having sum(price) >100;
注意:where 和having条件语句的区别
- where是在分组前进行条件过滤,having是在分组后进行条件过滤;
- 使用where的地方都可以用having替换,但是只有having可以使用在分组函数中。
ORDER BY 语句用于根据指定的列对结果集进行排序。(默认按照升序对记录进行排序)
- 用于排序
- 写在where之后
语法:select column_name,column_name from table_name order by column_name,column_name asc|desc
即select 列名 from 表名 order by 列名 asc|desc
order by的方式:
- asc升序,因为是数据库默认的排序方式,可以省略
- desc,指定列按降序排列
数据库中的索引使用户可以快速找到表或索引视图中的特定信息。
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。就像字段,聚集索引是连续的,a后面肯定是b,非聚集索引就不连续了,就像图书馆的某个作者的书,有可能在第1个货架上和第10个货架上。还有一个小知识点就是:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
索引的分类-
主键索引 (PRIMARY KEY)
唯一的标识,主键不可重复
-
唯一索引 (UNIQUE KEY)
避免重复的列出现,唯一索引可以重复,多个列都可以表示为唯一索引
-
常规索引 (KEY/INDEX)
默认的。可以使用 index 或key关键字来设置
-
全文索引 (FullText)
在特定的数据库引擎下才有,MYISAM
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name
ON {table_name | view_name} [WITH [index_property [,…n]]
说明:
UNIQUE: 建立唯一索引。
CLUSTERED: 建立聚集索引。
NONCLUSTERED: 建立非聚集索引。
Index_property: 索引属性。
删除索引DROp INDEX table_name.index_name[,table_name.index_name]
说明:table_name: 索引所在的表名称。
index_name : 要删除的索引名称。
显示索引信息使用系统存储过程:sp_helpindex 查看指定表的索引信息。
执行代码如下:
Exec sp_helpindex book1;
索引原则- 索引不是越多越好
- 不要对进程变动数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
多表查询,即根据特定的连接条件从不同的表中获取所需的数据。两张表间有一个相同的字段,才能进行有效的多表查询。
-
语法:select table1.column,table2.column from table1,table2 where table1.column1=table2.column2;
-
举例:有emp和dept两个表,查询每个员工的工号、姓名、工资、部门名和工作地点:
select empno,ename,sal,dname,loc from emp,dep where emp.deptno=dept.deptno;
- 省略连接条件
- 连接条件无效
- 第一个表中的所有行与第二个表中的所有行相连接
内连接:只返回满足连接条件的数据。
外连接(LEFT JOIN)(RIGHT JOIN)-
左连接:从左表返回所有的行,如果右表中没有匹配,对应的列返回Null
-
右连接:从右表返回所有的行 ,如果左表中没有匹配,对应的列返回Null
- 语法:updata 表名 set 字段1=值1,字段2=值2…[where];
- 举例:
(1)将所有学生的成绩修改为90,年龄改为20:
updata student set score=90,age=20;
(2)将小米的成绩改为60:
updata student set score=60 where s_name=‘小米’;
(3)将小米的成绩在原有基础上增加30:
updata student set score =score+30 where s_name=‘小米’;
4.1-外键外键是在SQL Server数据库中强制引用完整性的约束。 它使用一列或多列组合,用于在两个表中的数据之间建立链接,以控制可存储在外键表中的数据。
- 在互联网场景里面,涉及到高并发,在外键的约束下,大量的插入、更新、删除操作的性能会降低。所以外键与级联更新适用于单机低并发,不适合分布式、高并发集群。
- 数据库需要额外的维护外键自身的内部管理;
- 外键相当于把数据的一致性事务的实现,全部交给了数据库服务器来完成;
- 有了外键以后,当做一些涉及到外键字段的增,删,改操作时,需要触发相关操作去检查,而不得不消耗资源;
- 每次更新数据,都需要额外的检查另外一张表的数据,容易造成死锁;