C# 中有许多内存数据库供开发人员使用,以下是几个常用的内存数据库:

Redis

Redis 是一个开源的 In-Memory 数据库系统,支持多种数据类型。可以用来做缓存、消息队列及分布式锁等。

SQLite

SQLite 是一个轻量级的数据库系统,支持 ACID 事务,使用内存数据库时,会将数据存储在内存中而不是硬盘上。

Apache Ignite

Apache Ignite 是一个分布式的高可用性内存数据库,提供分布式事务、分布式 SQL 查询、分布式计算等功能。

Microsoft SQL Server In-Memory OLTP

这是一个基于内存的事务处理引擎,可以明显提升 SQL Server 数据库的性能,支持多种 OLTP 需求场景。

RavenDB

RavenDB 是一个基于 NoSQL 的文档数据库,具有内存数据库的优点,并支持强大的多租户特性。

MongoDB

MongoDB 是一个开源的文档数据库,支持各种丰富的查询语言,并且具有内存数据库的优点,使得它可以处理大量的数据。

这些内存数据库各自有优点和适用场景,选择哪一个取决于具体的应用需求和使用方案。

SQL Server 2019 支持正则表达式,您可以使用LIKE运算符与正则表达式元字符结合使用来匹配模式。

以下是一个示例,用于使用正则表达式从表中选择具有特定字符模式的行:

假设您有一个名为employees的表,其中包含full_name列。您可以使用以下查询来选择full_name列中以字母“a”开头,并以字母“y”结尾的所有行:

SELECT full_name
FROM employees
WHERE full_name LIKE 'a%y';

在上面的查询中,%是一个SQL通配符,代表零个或多个任意字符。因此,查询选择了full_name列中以字母“a”开头,并以字母“y”结尾的所有行。 此查询仅匹配以字母“a”开头,并以字母“y”结尾的字符串,而不是包含任意位置的字母“a”和“y”的字符串。

如果要使用更复杂的模式,可以将通配符与正则表达式结合使用。例如,要选择所有包含至少一个数字的full_name,您可以执行以下查询:

SELECT full_name
FROM employees
WHERE full_name LIKE '%[0-9]%';

在上面的查询中,[0-9]是一个正则表达式字符集,代表任何数字字符。因此,查询选择了full_name列中包含至少一个数字的所有行。

请注意,正则表达式功能在不同数据库管理系统和版本之间可能会有所不同。如果您使用的是不同的版本或数据库,建议您查看相关文档以了解它们支持的SQL语言和函数。

在 SQL Server 中,可以使用 JSON_VALUE 函数查询 JSON 数据的特定值,使用 JSON_QUERY 函数查询 JSON 数据的特定对象,使用 JSON_MODIFY 函数更新 JSON 数据。

以下是一些示例:

1. 查询特定 JSON 字段的值:

SELECT JSON_VALUE(json_column, '$.field_name')
FROM table_name;

2. 查询 JSON 对象并返回整个 JSON 字符串:

SELECT JSON_QUERY(json_column)
FROM table_name;

3. 查询 JSON 对象中的特定字段:

SELECT JSON_QUERY(json_column, '$.field_name')
FROM table_name;

4. 在 JSON 对象中更新现有值:

UPDATE table_name
SET json_column = JSON_MODIFY(json_column, '$.field_name', 'new_value')
WHERE some_condition;

SQL Server 中的 CROSS APPLY 类似于 INNER JOIN,但 CROSS APPLY一般用于连接带参表值函数和带参数子查询;而 OUTER APPLY 则类似于 LEFT JOIN,也是用于连接带参表值函数和带参数子查询 。

以下示例假定数据库中存在以下表和表值函数:

对象列名
DepartmentsDeptID、DivisionID、DeptName、DeptMgrID
EmpMgrMgrID、EmpID
EmployeesEmpID、EmpLastName、EmpFirstName、EmpSalary
GetReports(MgrID)EmpID、EmpLastName、EmpSalary

GetReports 表值函数返回直接或间接报告给指定 MgrID 的所有员工的列表。

该示例使用 CROSS APPLY 返回所有部门和部门中的所有员工。 如果某个部门没有任何员工,则将不返回该部门的任何行。

SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary  
FROM Departments d    
CROSS APPLY dbo.GetReports(d.DeptMgrID);

如果您希望查询为那些没有员工的部门生成行(这将为 EmpIDEmpLastName 和 EmpSalary 列生成 Null 值),请改用 OUTER APPLY

SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary  
FROM Departments d   
OUTER APPLY dbo.GetReports(d.DeptMgrID);

MySQL 8.0.18 稳定版(GA)已于14/10正式发布,Hash Join 也如期而至。

快速浏览一下这个版本的亮点!

1.Hash Join

Hash Join 不需要任何索引来执行,并且在大多数情况下比当前的块嵌套循环算法更有效。

2.EXPLAIN ANALYZE

EXPLAIN ANALYZE 将运行查询,然后生成 EXPLAIN 输出,以及有关优化程序估计如何与实际执行相匹配的其他信息。

3.创建用户时可以随机生成密码

为 CREATE USERALTER USER和 SET PASSWORD语句添加了语法,以生成强随机密码,并将其作为结果返回给客户端。

添加的语法是:

CREATE USER user IDENTIFIED BY RANDOM PASSWORD;
ALTER USER user IDENTIFIED BY RANDOM PASSWORD;
SET PASSWORD [FOR user] TO RANDOM;

4.群组复制

group_replication_exit_state_action 增加了 OFFLINE_MODE 模式,用于指定当服务器无意离开群组时群组复制的行为。

OFFLINE_MODE 行为将关闭所有连接,并禁止非 CONNECTION_ADMIN 或 SUPER 权限的用户建立新连接,否则它的行为类似于现有 READ_ONLY 模式。

5.innodb 增加一个空闲状态下控制写入 IOPs 的选项

该选项在 InnoDB 空闲时控制写 IOP。目的是减少写 IO,以延长闪存的寿命。

此外,还有很多内部细节的改进,详细请访问:

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-18.html

适用于:

允许将显式值插入到表的标识列中。

语法

SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }

参数

参数名
简要说明
database_name 指定的表所在的数据库的名称。
schema_name 表所属架构的名称。
table_name 包含标识列的表的名称。

备注

任何时候,一个会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。 如果某个表已将此属性设置为 ON,则对另一个表发出 SET IDENTITY_INSERT ON 语句时,SQL Server 将返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON,并报告已将其属性设置为 ON 的表。

如果插入值大于表的当前标识值,则 SQL Server 自动将新插入值作为当前标识值使用。

SET IDENTITY_INSERT 的设置是在执行或运行时设置的,而不是在分析时设置的。

权限

用户必须拥有表,或对表具有 ALTER 权限。

示例

下面的示例将创建一个包含标识列的表,并说明如何使用 SET IDENTITY_INSERT 设置来填充由 DELETE 语句导致的标识值中的空隙。

USE AdventureWorks2012;  
GO  
-- Create tool table.  
CREATE TABLE dbo.Tool(  
   ID INT IDENTITY NOT NULL PRIMARY KEY,   
   Name VARCHAR(40) NOT NULL  
);  
GO  
-- Inserting values into products table.  
INSERT INTO dbo.Tool(Name)   
VALUES ('Screwdriver')  
        , ('Hammer')  
        , ('Saw')  
        , ('Shovel');  
GO  
  
-- Create a gap in the identity values.  
DELETE dbo.Tool  
WHERE Name = 'Saw';  
GO  
  
SELECT *   
FROM dbo.Tool;  
GO  
  
-- Try to insert an explicit ID value of 3;  
-- should return an error:
-- An explicit value for the identity column in table 'AdventureWorks2012.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
-- SET IDENTITY_INSERT to ON.  
SET IDENTITY_INSERT dbo.Tool ON;  
GO  
  
-- Try to insert an explicit ID value of 3.  
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
  
SELECT *   
FROM dbo.Tool;  
GO  
-- Drop products table.  
DROP TABLE dbo.Tool;  
GO  

Microsoft SQL Server

非官方MS SQL Server 2019,2017,2016,2014,2012,2008 R2,2008,2005,2000版本对照表。

发布版本
RTM
累积更新
SQL Server 2019
SQL Server 15
SQL Server 2017
SQL Server 14
14.0.1000.169
(CU17 Latest)14.0.3238.1
SP1
SP2
SP3
SP4
SQL Server 2016
SQL Server 13
13.0.1601.5
13.0.4001.0
13.1.4001.0
13.0.5026.0
13.2.5026.0
SQL Server 2014
SQL Server 12
12.0.2000.8
12.0.4100.1
12.1.4100.1
12.0.5000.0
12.2.5000.0
12.0.6024.0
12.3.6024.0
SQL Server 2012
SQL Server 11
11.0.2100.60
11.0.3000.0
11.1.3000.0
11.0.5058.0
11.2.5058.0
11.0.6020.0
11.3.6020.0
11.0.7001.0
11.4.7001.0
SQL Server 2008 R2
SQL Server 10.5
10.50.1600.1
10.50.2500.0
10.51.2500.0
10.50.4000.0
10.52.4000.0
10.50.6000.34
10.53.6000.34
SQL Server 2008
SQL Server 10
10.0.1600.22
10.0.2531.0
10.1.2531.0
10.0.4000.0
10.2.4000.0
10.0.5500.0
10.3.5500.0
10.0.6000.29
10.4.6000.29
SQL Server 2005
SQL Server 9
9.0.1399.06
9.0.2047
9.0.3042
9.0.4035
9.0.5000
SQL Server 2000
SQL Server 8
8.0.194
8.0.384
8.0.532
8.0.760
8.0.2039

MongoDB 索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

createIndex() 方法

语法

createIndex()方法基本语法格式如下所示:

>db.collection.createIndex(keys, options)

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

实例

>db.testdb1.createIndex({"title":1})

createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

>db.testdb1.createIndex({"title":1,"description":-1})

createIndex() 接收可选参数,可选参数列表如下:

参数
类型
描述
background
Boolean
建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
unique
Boolean
建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name
string
索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
sparse
Boolean
对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds
integer
指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v
index version
索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights
document
索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language
string
对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override
string
对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

实例

在后台创建索引:

db.testdb1.createIndex({"title":1,"description":-1}, {background: true})

通过在创建索引时加 background:true 的选项,让创建工作在后台执行

1、 查看当前sql-mode

select @@sql_mode;
MySQL @@sql_mode

2、设置 sql-mode

拷贝原来的值,移除 NO_ZERO_IN_DATENO_ZERO_DATE 两项即可

SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

3、使新的 sql-mode 生效

FLUSH PRIVILEGES;