概述
数据模型
数据库系统的核心和基础是数据模型,数据模型是严格定义的一组概念的集合。因此数据模型一般由数据结构、数据操作和完整性约束三部分组成。数据模型主要分为三种:层次模型,网状模型和关系模型。关系模型是目前使用最广泛的数据模型,关系型数据库采用的就是关系模型作为数据的组织方式,例如ORACLE,MYSQL等关系型数据库
- 关系模型特点
- 关系模型中数据的逻辑结构是一张二维表,或者说关系的数据结构就是一张表
- 关系数据模型的数据操作主要包含查询、插入、删除和更新数据
- 关系模型的完整性约束条件包含三大类:实体完整性、参照完整性和用户自定义的完整性
- 实体完整性规则:若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值(由此规则可得一直接结论:主键不能为空)
- 参照完整性规则:若属性(或属性组)F是某基本关系R的外键,且它与基本关系R1的主键相对应,则对于R中每个F上的值或为空值或者等于R1中的主键值
数据库分类
注意:
- OLTP(On-Line Transaction Processing)是指联机事务处理
- OLAP(On-Line Analytical Processing)是指联机分析处理
数据库主要分为关系型数据库非关系型数据库,各自特点如下
- 关系型数据库(RDBMS)
- 采用了关系模型来组织数据的数据库。关系模型的完整性规则是对关系的某种约束,分为实体完整性、参照完整性约束和用户定义完整性,即关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。关系数据库中关系称为表、元组称为行、属性也称为列
- 常见的关系型数据库如:Oracle、MySQL、SQL Server
- 非关系型数据库:
- 现在更多是指NoSQL数据库,如:基于键值对(redis)、基于文档型(mongodb)、基于列族(hbase)、基于图型(neo4j)
事务
事务是指用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务具有4个特性:原子性、一致性、隔离性、持续性。简称为ACID特性
- Atomicity(原子性):事务是一个不可分割的整体,事务内所有操作要么全做成功,要么全失败
- Consistency(一致性):事务执行前后,数据从一个状态到另一个状态必须是一致的(A向B转账,不能出现A扣了钱,B却没收到)
- Isolation(隔离性): 多个并发事务之间相互隔离,不能互相干扰
- Durability(持久性):事务完成后,对数据库的更改是永久保存的,不能回滚
索引
索引是对数据库中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的数据
- 索引优点
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- 可以大大加快数据的检索速度(创建索引的主要原因)
- 在使用分组(group by)和排序(order by)子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
- 可以加速表和表之间的连接,特别是在实现数据的参照完整性方面特别有意义
- 索引缺点
- 增加了数据库的存储空间
- 插入和删除数据时要花费较多时间(因为索引也要随之变动)
视图
- 视图是从一个或几个基本表(或视图)导出的表。与基本表不同,它是一个虚表
- 数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中
- 所以基本表中的数据发生变化时,视图中查询出的数据也就随之改变了
- 视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化
- 视图一经定义,就可以和基本表一样被查询、删除
主键与外键
- 候选码:关系(二维表)中能唯一标识一个元组的属性组
- 主键:如果一张表有多个候选码,则选定其中一个为主键
- 外键:如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键,则该属性集是关系模式
- 主属性与非主属性:候选码的主属性称为主属性。不包含在任何候选码中的属性称为非主属性
SQL分类
SQL全称Structured Query Language,指的是结构化查询语言。SQL语句主要包括
- 数据定义(DDL):create、drop、alter
- 数据查询(DQL):select
- 数据操作(DML):insert、update、delete
- 数据控制(DCL):grant、revoke
DDL数据定义语言
- create database <dbName>; ##创建数据库
- show databases; ## 显示当前数据库列表
- alter database <dbName> character set utf8; ## 修改数据库的字符集
- drop database <dbName>; ## 删除数据库
DQL数据查询语言
DQL用来从数据表中提取满足特定条件的记录
- 基本语法
- select columnName1 [columnName1, columnName2, ...] from <tableName> [where conditions]; # select 关键词后指定要显示查询到的记录的那些列
- Where子句: 在删除、修改及查询的语句后都可以添加where子句(条件),用于筛选满足特定的添加的数据进行删除、修改和查询操作。
- delete from tableName where conditions;
- update tableName set ... where conditions;
- select ... from tableName where conditions;
- LIKE子句: 在where 子句的条件中,我们可以用 like 关键字来实现模糊查询,
- select * from tableName where column like 'reg';
- 其中reg表达式中
- %表示任意多个字符【%o%包含字母o】
- _表示任意一个字符【_o%第二个字母为o】
- # 查询学生姓名包含字母o的学生信息
- select * from stus where stu_name like '%o%';
- # 查询学生姓名第一个字为‘张’的学生信息
- select * from stus where stu_name like '张%';
- # 查询学生姓名第二个字母为o的学生信息
- select * from stus where stu_name like '_o%';
- select * from tableName where column like 'reg';
- 排序 order by: 将查询到的满足条件的记录按照指定的列的值升序/降序排列
- select * from tableName where conditions order by columnName asc|desc;
- 聚合函数: SQL 中提供了一些可以对查询的记录的列进行计算的函数–聚合函数
- count()统计函数,统计满足条件的指定字段值的个数(记录数)
- max() 计算最大值,查询满足条件的记录中指定列的最大值
- min() 计算最小值,查询满足条件的记录中指定列的最小值
- sum() 计算和, 查询满足条件的记录中 指定的列的值的总和
- avg() 求平均值,查询满足条件的记录中 计算指定列的平均值
- 总数:select count(*) as totalcount from table1;
- 求和:select sum(field1) as sumvalue from table1;
- 平均:select avg(field1) as avgvalue from table1;
- 最大:select max(field1) as maxvalue from table1;
- 最小:select min(field1) as minvalue from table1;
- Group by: 根据一个或多个属性的值对元组分组,值相同的为一组,通常分组后聚集函数将作用于每一个组,即每一组都有一个函数值; 如果分组后还要求按一定的条件对这些分组进行筛选,最终只输出满足指定条件的组,则使用HAVING短语指定筛选条件
- # 按年龄分组,统计每个年龄的人数,并输出(年龄,该年龄的人数)
- select Sage, count(*) from Student group by Sage;
- # 按年龄分组,统计每个年龄的人数,选出人数大于1的分组,输出(年龄,该年龄的人数)
- select Sage, count(*) from Student group by Sage having count(*) > 1;
- 连接查询: 一次查询涉及多张表
- 假设有2个表——Student表和SC表(选课表):
- 内连接(自然连接):当使用内连接时,如果Student中某些学生没有选课,则在SC中没有相应元组。最终查询结果舍弃了这些学生的信息
- 查询每个学生及其选修课程的情况(没选课的学生不会列出)
- SELECT Student.*, SC.* FROM Student , SC WHERE Student.Sno=SC.Sno;
- 外连接:如果想以Student表为主体列出每个学生的基本情况及其选课情况。即使某个学生没有选课,依然在查询结果中显示(SC表的属性上填空值)。就需要使用外连接
- 查询每个学生及其选修课程的情况(没选课的学生也会列出)
- SELECT Student.*, SC.*
- FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno);
- 内连接(自然连接):当使用内连接时,如果Student中某些学生没有选课,则在SC中没有相应元组。最终查询结果舍弃了这些学生的信息
- 分页查询: 一次检索所有的记录,会占用系统很大的资源,因此常常采用分页语句:需要多少数据就只从数据库中取多少条记录;
- 不同的数据库分页语句有所不同,mysql关键字为limit,SqlServer为top,Oracle则为rowNum
DML数据操作语言
DML用来完成对数据表中数据的插入、删除、修改操作
- insert into <tableName>(columnName, columnName...) values(value1,value2...) #插入数据
- delete from <tableName> [where conditions] #删除数据
- update <tableName> set columnName=value [where conditions] #修改数据
DCL数据控制语言
DCL用来创建用户,管理用户权限
- create user 'user_name'@host_name [IDENTIFIED BY[PASSWORD ]'password' ]#createUsr
- select * from user #查看用户
- drop user '用户名'@主机名 #删除用户
- grant 权限1,权限2 on 数据库名称.表名称 to 用户名@用户地址 #赋予权限
- revoke 权限1,权限2 on 数据库名称.表名称 from 用户名@用户地址 #撤销权限