导图社区 数据库思维导图
数据库是按照数据结构来组织、存储和管理数据的仓库。下图整理了数据库的基本概念、主要的 SQL 语句,并使用C#语言展示了通过程序访问数据库。
编辑于2021-09-05 10:09:38介绍归纳 C Sharp 语音的基础重点知识。包括语言基础、字面常量、程序集、不安全代码、基础类、枚举、数组、泛型、字符串、正则表达式、委托与事件、文件、异常、多线程、异步、反射、网络、绘图、WinForm、Windows、跨平台调用等内容。思维导图示例中,有示例代码,方便学习与练习。
这份思维导图归纳了一些HTML基本的元素标签、布局、表单,以及 HTML5 API 如 WebSockets、Fetch API 等内容。CSS 主要是归纳了选择器。JavaScript 主要是包含了函数与箭头函数、this 关键字、Promise 异步对象。此外还有AJAX、jQuery 与 jQuery AJAX、JSONP 等内容。导图中的注释有很多相关的详细说明与示例代码,其中后端的测试代码是用的 PHP。希望能帮到大家!
WPF开发相关的笔记。WPF基本概念、XAML基本语法、控件与布局、Binding、依赖属性与附加属性、路由事件与附加事件、命令、资源、模板与样式、2D绘图与动画、3D绘图等内容。导图中的注释还有很多相关的详细说明与示例代码,希望能帮到大家!
社区模板帮助中心,点此进入>>
介绍归纳 C Sharp 语音的基础重点知识。包括语言基础、字面常量、程序集、不安全代码、基础类、枚举、数组、泛型、字符串、正则表达式、委托与事件、文件、异常、多线程、异步、反射、网络、绘图、WinForm、Windows、跨平台调用等内容。思维导图示例中,有示例代码,方便学习与练习。
这份思维导图归纳了一些HTML基本的元素标签、布局、表单,以及 HTML5 API 如 WebSockets、Fetch API 等内容。CSS 主要是归纳了选择器。JavaScript 主要是包含了函数与箭头函数、this 关键字、Promise 异步对象。此外还有AJAX、jQuery 与 jQuery AJAX、JSONP 等内容。导图中的注释有很多相关的详细说明与示例代码,其中后端的测试代码是用的 PHP。希望能帮到大家!
WPF开发相关的笔记。WPF基本概念、XAML基本语法、控件与布局、Binding、依赖属性与附加属性、路由事件与附加事件、命令、资源、模板与样式、2D绘图与动画、3D绘图等内容。导图中的注释还有很多相关的详细说明与示例代码,希望能帮到大家!
数据库
数据库
数据库管理系统
DataBase Management System (DBMS)
功能
数据定义
提供数据定义语言
Data Definition Language (DDL)
用户可以对数据库的结构进行描述,包括外、概念、内模式的定义
数据库的完整性定义
安全保密定义
如口令、级别和存取权限等
数据库操作
提供数据操纵语言
Data Manipulation Language (DML)
实现对数据库中数据的基本操纵
如检索、插入、修改、删除
分类
宿主型
将DML语句嵌入某种主语言使用
自含型
可单独使用DML语句
数据库运行管理
数据的组织、存储和管理
数据库的建立和维护
其他功能
数据模型
概念
基本概念
数据模型是对现实世界数据特征的抽象
分类
概念数据模型
也称信息模型,按用户的观点对数据和信息建模
主要用于数据库设计
分类
实体-联系模型(Entity-Relationship Model)
来源于P.P.S.Chen于1976年提出的实体-联系方法(Entity-Relationship Approach),该方法用E-R图描述现实世界的概念模型,称为E-R模型。
基本数据模型
按计算机系统的观点对数据建模
主要用于DBMS实现
分类
层次模型
网状模型
关系模型
面向对象模型
三要素
数据结构
是所研究的对象类型的集合
是对系统静态特性的描述
数据操作
是对系统动态特性的描述
数据的约束条件
是一组完整性规则的集合
以保证数据的正确、有效、相容
E-R模型
实体
概念
实体
每个实体由一组特性(属性)表示
其中某部分属性可以唯一标识实体
实体集
是具有相同属性的实体集合
E-R图构件
在E-R图中,实体集中作为主码的一部分属性以下划线标明;实体集与联系的线段上标上联系的类型。
实体集
弱实体集
联系
分类
实体内部的联系
反映数据在同一记录内部各字段间的联系
实体之间的联系
两个不同实体之间的联系
1:1
1:n
m:n
同一实体集内的各实体之间的联系
1:1
1:n
m:n
两个以上不同实体集之间的联系
1:1:1
1:1:n
1:m:n
r:m:n
E-R图构件
联系集
弱实体集对应的标识性联系
连接
属性与实体集、或实体与联系集的连接
一个实体全部参与到联系集中的连接
属性
概念
是实体某方面的特性
分类
简单属性
原子的、不可再分的
复合属性
可以细分出其他属性
单值属性
一个属性对应一个值
多值属性
一个属性对应一组值
NULL属性
属性没有值或属性未知时,使用NULL值
派生属性
可以从其他属性得来
E-R图构件
属性
多值属性
派生属性
扩充的E-R模型
弱实体
概念
一个必须以另一个实体为前提才能存在的实体
特殊化
特殊化
将一个实体集按照某些特性区分为几个子实体的过程
普遍化
将几个具有共同特性的实体集概括为一个更普遍的实体集的过程
关系模型
应用
关系数据库系统采用关系模型作为数据的组织方式
实体集之间的的联系使用表格结构表达
是若干个关系模式组成的集合
一个关系模式相当于一个记录型
其实例叫关系,以一张表表示
关系代数
概念
属性
用于描述一个事物的若干特征
域
每个属性对应取值范围的值的集合
笛卡尔积
对于N个集合的笛卡尔积
元组(元素)的个数称为基数
积中每个元素是一个N元组
元组的每个值称为一个分量
元素的每个分量来自不同的域(/集合)
关系
D1×D2×...Dn的子集
称为在域D1,D2,...Dn上的关系
记为R(D1,D2,...Dn)
称关系R为n元关系
R表示关系的名字
n是关系的目或度
一个关系可以用二维表表示
元组的个数称为基数
属性的个数称为元数
相关名词
候选码(Candidate Key)
能唯一标识一个元组的某一属性或属性组
包含在候选码的各属性称为主属性,否则为非码属性
主码(Primary Key)
若一个关系有多个候选码,则选定其中一个为主码
外码(Foreign Key)
来源于其他关系的属性或属性组
全码(All-Key)
关系模型的所有属性组是这个关系模式的候选码,称为全码
3中类型
基本关系
也称基本表、基表
是实际存储数据的逻辑表示
查询表
是查询结果对应的表
视图表
是由其他基本表或视图表导出的表
数据库中只存放它的定义,常称为虚表
关系数据库
数据库中区分
型
关系数据库的型称为“关系数据库模式”
是关系数据库结构的描述
值
关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常称为“关系数据库”
关系
其描述称为“关系模式”(Relation Schema)
表示为 R(U, D, dom, F)
R:关系名
U:属性名集合
D:属性的域
dom:属性向域的映射
F:属性间数据的依赖关系集合
通常简记为 R(A1, A2, ..., An)
R:关系名
A1, A2, ..., An:属性名或域名
作为主码的一部分属性以下划线标明
术语对比理解
SQL
核心功能
数据定义
CREATE
数据库
创建
CREATE DATABASE 数据库名;
使用
USE 数据库名;
表
创建
CREATE TABLE 表名(列名 数据类型 [列级完整性约束条件][,...][,表级完整性约束条件][,...]);
列级条件
NOT NULL
UNIQUE
表级条件
PRIMARY KEY(主码列名)
FOREIGN KEY(外码列名) REFERENCES 来源表名(来源列名)
修改
ALTER TABLE 表名 [ADD 新列名 数据类型 [完整性约束条件]][DROP 完整性约束条件][MODIFY 列名 数据类型];
删除
DROP TABLE 表名;
索引
创建
CREATE [UNIQUE] [CLUSTER] INDEX 索引名ON 表名(列名[次序][,...]);
UNIQUE
每个索引值只对应一个数据记录
CLUSTER
聚簇索引,索引项顺序与表中记录的物理顺序一致
次序
ASC 升序 (默认)
DESC 降序
删除
DROP INDEX 索引名;
MySQL
ALTER TABLE 表名 DROP INDEX 索引名;
视图
创建
CREATE VIEW 视图名AS SELECT 查询子句[WITH CHECK OPTION];
查询子句一般不允许有ORDER BY子句和DISTINCT短语
AS子句
旧名称 AS 新名称
可为关系、属性重新命名
WITH CHECK OPINION表示保证对视图执行的数据操作符合查询子句的谓词条件
删除
DROP VIEW 视图名;
用户
MySQL
创建
CREATE USER 用户[, 用户...] [IDENTIFIED BY ′密码′];
用户书写格式:′用户′[@′主机′]
'%'代表任意主机,但不包括'localhost'
主机未指定时默认'%'
修改
ALTER USER 用户 IDENTIFIED BY ′密码′;
MySQL 8.0以上版本设置5.0版本加密规则方法:ALTER USER 用户 IDENTIFIED mysql_native_password BY '密码';
删除
DROP USER 用户[, 用户...];
授权
GRANT 权限[, 权限...] ON 对象 TO 用户[, 用户...] [WITH GRANT OPTION];
权限
属性列
对象类型
TABLE
操作权限
SELECT、INSERT、UPDATE、DELETE
ALL PRIVILEGES
指定的方法
权限名(属性名)
视图
对象类型
TABLE
操作权限
SELECT、INSERT、UPDATE、DELETE
ALL PRIVILEGES
基本表
对象类型
TABLE
操作权限
SELECT、INSERT、UPDATE、DELETE、ALTER、INDEX
ALL PRIVILEGES
数据库
对象类型
DATABASE
操作权限
CREATETAB
对象
格式
数据库.表
*.* 表示任意数据库.任意表
WITH GRANT OPTION
表示获得了权限的用户还可以将权限赋给其他用户
收权
REVOKE 权限[, 权限...] ON 对象 FROM 用户[, 用户...];
刷新
FLUSH PRIVILEGES;
查看
SHOW GRANTS FOR 用户;
DROP
ALTER
数据查询
SELECT
SELECT [ALL|DISTINCT] 目标列表达式[, 目标列表达式]...FROM 表名或视图名[, 表名或视图名]... [FORCE INDEX(索引名)][WHERE 条件表达式][GROUP BY 列名 [HAVING 条件表达式]][ORDER BY 列名 [ASC|DESC]...][LIMIT 起始偏移, 返回记录数|LIMIT 返回记录数];
例:SQL查询:SELECT A1, A2,…,AnFROM r1, r2,…rmWHERE p; 对应关系代数表达式:ΠA1,A2,...,An(σp(r1×r2×...×rm))
SELECT
对应关系代数投影运算,用于列出查询结果中的属性
输出可以是列名、表达式、聚集函数
成员访问符. : 数据库名.表名 '数据库名'.'表名' 表名.列名 '表名'.'列名'
*表示列出所有列
ALL表示返回所有元组
DISTINCT表示返回不重复元组
FROM
对应关系代数笛卡尔积
FORCE INDEX
指定本次查询(条件表达式、条件列)强制使用的索引(可以提高性能)
WHERE
对应关系代数选择谓词
可用运算符
集合成员
IN
在集合中
NOT IN
不在集合中
字符串匹配
LIKE
与_或%进行单个或多个字符匹配
例:SELECT Sname FROM S WHERE Sname LIKE '%数据库'; 关于转义字符:若要匹配特殊字符,需使用转义字符'\'或使用ESCAPE关键字定义转义字符,例如匹配ac%cd:LIKE 'ab\%cd'LIKE 'abT%cd' ESCAPE 'T'
空值比较
IS NULL
为空
IS NOT NULL
不能为空
比较
>、≥、<、≤、=、≠
逻辑
AND
与
OR
或
NOT
非
子查询
也称嵌套查询
例:SELECT Sno, Sname FROM S WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM C WHERE Cname='MS'));
聚集函数
以一个值的集合为输入,返回单个值
预定义聚集函数
COUNT([DISTINCT|ALL]*)
统计元组个数
COUNT([DISTINCT|ALL]列名)
统计一列中值的个数
SUM([DISTINCT|ALL]列名)
AVG([DISTINCT|ALL]列名)
MAX([DISTINCT|ALL]列名)
MIN([DISTINCT|ALL]列名)
ANY和ALL谓词
使用时必须同时使用比较运算符
例:
相对来说,聚集函数效率一般高一些。
等价关系
>ANY
等价于
>MIN()
>ALL
等价于
>MAX()
查询
SELECT Sname, Age FROM S WHERE Age<ALL (SELECT Age FROM S WHERE SD=′CS′) AND SD<>′CS′;
SELECT Sname, Age FROM S WHERE Age<(SELECT MIN(Age) FROM S WHERE SD=′CS′) AND SD<>′CS′;
GROUP BY
用于对SELECT查出的元组进行分组
SELECT的输出中没有使用聚集函数的列,必须出现在分组属性中
关键字后跟一个分组属性
只有SELECT输出的列,才能出现在分组属性中
HAVING子句
可以理解为作用于分组的选择谓词
关于NULL值
在任何聚集操作中被忽视
在分组属性中被当做一般的值
例:
SELECT Jno, AVG(Qty) FROM SPJ GROUP BY Jno HAVING COUNT(DISTINCT(Sno))>2 ORDER BY Jno DESC;
数据操纵
INSERT
插入指定元组
INSERT INTO 表名[(列名[, 列名...])] VALUE[S](值[, 值...]);
插入选出的元组
INSERT INTO 表名 SELECT * 查询语句;
要求源表和目标表的关系模式相同。
INSERT INTO 表名(列名[, 列名...]) SELECT (列名[, 列名...]) 查询语句;
不要求源表和目标表的关系模式相同,但要求指定的字段属性相同。
UPDATE
UPDATE 表名SET 列名=值[, ...][WHERE 条件表达式];
DELETE
DELETE FROM 表名[WHERE 条件表达式];
数据控制
GRANT
REVORK
事务管理
BEGIN TRANSACTION;
MYSQL:BEGIN;或START TRANSACTION;
事务开始
COMMIT;
事务提交
ROLLBACK;
事务回滚
其他
MySQL
连接
连接
mysql [-h主机名] [-P端口号] -u用户名 -p(密码) [-D默认数据库名]
密码回车后输入。
断开
exit
并发控制
并发带来的问题
丢失修改
不可重复读
读脏数据
控制技术
封锁
排它锁(X锁或写锁)
共享锁(S锁或读锁)
封锁协议
一级封锁协议
解决丢失修改问题
二级封锁协议
解决丢失修改、读脏数据问题
三级封锁协议
解决丢失修改、读脏数据、不可重复读问题
通过程序访问数据库
方式发展
Open Database Connectivity (ODBC)
Data Access Object (DAO) 用于Microsoft的Access产品
Remote Data Object (ROD) 用于Visual Basic组件
ActiveX Data Object (ADO) 用于Object Linking and Embedding Database (OLE DB)
ADO.NET
ADO.NET数据访问层
连接数据源
数据提供程序
Microsoft SQL Server
使用SQL Server数据提供程序
命名空间 System.Data.SqlClient
其他数据源
使用OLE DB数据提供程序
命名空间 System.Data.OleDb
或使用数据源提供的专用数据提供程序
例
MySQL的数据提供程序 MySql.Data.dll
命名空间 MySql.Data.MySqlClient
主要对象
DataAdapter
表示一组数据命令和一个数据库连接,它们用于填充DataSet和更新数据源
Connection
负责建立和控制用户程序和数据库之间的连接
Command
表示要对数据源执行的SQL语句或存储过程
DataReader
提供从数据源读取数据行的方法
处理数据的主要命名空间 System.Data
DataSet
DataTable
DataRow
DataColumn
DataRelation
例:
MySQL
using System;using System.Data;using System.Windows.Forms;using MySql.Data.MySqlClient; namespace WindowsFormsApp1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string connStr = "Data Source=IP地址;Port=端口号;User ID=账号;Password=密码;Database=数据库;Pooling=true;Charset=utf8mb4"; string cmdStr = "SELECT * FROM 数据表"; #region DataAdapter方式 MySqlDataAdapter adp = new MySqlDataAdapter(cmdStr, connStr); //用 SelectCommand 初始化 DataAdapter 类的新实例 DataSet set = new DataSet(); adp.Fill(set); //填充 DataSet dgv.DataSource = set.Tables[0]; //操作数据 #endregion #region Connection方式 MySqlConnection conn = new MySqlConnection(connStr); //使用指定的连接字符串初始化 Connection 类的新实例 MySqlCommand cmd = new MySqlCommand(cmdStr, conn); //初始化具有查询文本和 Connection 的 Command 类的新实例 conn.Open(); //使用连接字符串所指定的属性设置打开数据库连接 MySqlDataReader reader = cmd.ExecuteReader(); //将 CommandText 发送到 Connection 并生成一个 DataReader object[] row = new object[reader.FieldCount]; while (reader.Read()) //使 DataReader 前进到下一条记录 { //一次读取该行所有字段 reader.GetValues(row); txt.AppendText(string.Join("\t", row)); //一次读取该行某个字段 //for (int i = 0; i < reader.FieldCount; i++) //{ // txt.AppendText(reader.IsDBNull(i) ? "(NULL)\t" : $"{reader.GetString(i)}\t"); //} txt.AppendText(Environment.NewLine); } conn.Close(); //关闭到数据源的连接 cmd.CommandText = "INSERT INTO 数据表 VALUES (...);"; //重新设置要对数据源执行的 SQL 语句或存储过程 conn.Open(); //使用连接字符串所指定的属性设置打开数据库连接 //int affect = cmd.ExecuteNonQuery(); //针对 Connection 执行 SQL 语句并返回受影响的行数 conn.Close(); //关闭到数据源的连接 #region 参数化SQL(可以防止SQL注入) //使用: // 1.定义包含参数的SQL语句,用@符号声明参数; // 2.为SQL语句中出现的每一个参数定义参数对象SqlParameter,并将参数对象加入到SqlCommand对象中; cmd.CommandText = "SELECT * FROM 数据表 WHERE 字段1=@参数1 AND 字段2=@参数2"; //声明参数 cmd.Parameters.AddRange( new MySqlParameter[] { new MySqlParameter("@参数1", MySqlDbType.数据类型) { Value = 参数值1 }, new MySqlParameter("@参数2", MySqlDbType.数据类型) { Value = 参数值2 } }); //定义参数对象、赋值,添加 conn.Open(); reader = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); dgv.DataSource = dt; conn.Close(); #endregion #endregion } }}
Excel
//需安装Access Database Engine using System.Data.OleDb; string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='xlsx文件路径';Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1'";string cmdStr = "SELECT * FROM [表名$]"; 关于扩展属性:Excel 97-2003 Workbook (.xls) → "Excel 8.0"Excel Workbook (.xlsx) → "Excel 12.0 Xml"Excel Macro-enabled workbook (.xlsm) → "Excel 12.0 Macro"Excel Non-XML binary workbook (.xlsb) → "Excel 12.0" HDR=Yes:第1行作为标题;HDR=No:第1行作为数据;当 IMEX=0 时为“输出模式”,这个模式打开的 Excel 文件只能用来做“写入”用途。当 IMEX=1 时为“输入模式”,这个模式打开的 Excel 文件只能用来做“读取”用途。当 IMEX=2 时为“连接模式”,这个模式打开的 Excel 文件可同时支持“读取”与“写入”用途。