MySQL数据库概述

MySQL数据库概述

1 SQL

SQL语句大小写不敏感。
SQL语句末尾应该使用分号结束。

1.1 SQL语句及相关操作示例

  • DDL:数据定义语言,负责数据库定义、数据库对象定义,由CREATE、ALTER与DROP三个语法所组成
  • DML:数据操作语言,负责对数据库对象的操作,CRUD:create、read、update、delete增查、改、删
  • DCL:数据控制语言,负责数据库权限访问控制,由GRANT和REVOKE两个指令组成
  • TCL:事务控制语言,负责处理ACID事务,支持commit、rollback指令
    创建表示例
# GRANT授权、REVOKE撤销:
grant all on crashsource.* to 'test_user'@'%' identified by 'cli*963.';  -- 在所有主机上,对test_user用户,授权操作数据库crashsource中的所有表。 .*表示所有表, '%'通配符revoke all on *.* from test_use; -- 撤销test_user用户对所有表的配置权限。# 删除用户
drop user test_user; -- 删除用户test_user,慎用。# 创建数据库
create database if not exists gogs character set utf8mb4 collate utf8mb4_general_ci;  -- 创建数据库# 删除数据库
drop database if exists gogs; -- 如果数据库gogs存在,则删除。# 创建表
CREATE TABLE `reg` (`loginname` varchar(48) NOT NULL,`name` varchar(64) NOT NULL,`password` varchar(255) NOT NULL,KEY `ln` (`loginname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  -- 创建表,反引号标注的名称,被认为是非关键字。# DESC查看列信息
desc products;  -- 查看列信息
desc products '%name'; -- 查看以name结尾的列信息

1.2 主键PRIMARY KEY *

主键PRIMARY KEY,表中一列或多列(一个字段或多个字段)组成组成唯一的key,通过这个key能唯一的标识一条记录。主键的列不能使用空值NULL。主键往往设置为整型、长整型,(字符串、日期型都可以,但是开发中一般不这么做,因为存在性能上的问题);通过自增AUTO_INCREMENT来保证主键的唯一性。通常实践结果表明,也不怎么使用多列组合来组成主键。

自增AUTO_INCREMENT:自己管理一个数字,每增加一行,数字+1,删除一行这个数字不变。数字绝不回头。

表中也可以没有主键,但不符合惯例。


1.3 索引INDEX *

索引可以看做是一本大字典的目录,为了快速检索用的。空间换时间,显著提高查询效率(同时会带来插入、删除、修改的效率问题,比如要修改某一个字段,可能需要同时去更新索引)。

可以对一列或多列设定索引。

**主键索引:**主键会自动建立主键索引,主键本身就是为了快速定位唯一记录的。
**唯一索引:**表中的索引列组成的索引必须唯一,但可以为空,非空值必须唯一。 主键索引和唯一索引的显著差异,就是主键不可以为NULL,唯一键可以为NULL。
**普通索引:**没有唯一性的要求,就是建立了一个字典的目录而已。


1.4 约束Constraint *

unique约束(唯一键约束):定义了唯一键索引,就定义了唯一键约束。唯一约束就是不允许重复,但是可以为NULL,为NULL只允许某一行的一个字段为NULL。

primary key约束:定义了主键,就定义了主键约束。主键约束就是不允许为NULL,而且不允许重复。

外键约束Foreign Key
**外键:**在表B中的列,关联表A中的主键,表B中的列就是外键。

1、如果在表B插入一条数据,B的外键列插入了一个值,这个值必须是表A中存在的主键值。
2、修改表B的外键值,同样要在表A中存在。
3、如果表A要删除一条记录,那么就等于删除了一个主键,那么如果表B中引用了这个主键,就必须先删除表B中引用这个主键的记录,然后才能删除表A的记录,否则删除失败。
4、修改表A的主键,由于主键的唯一性,修改的主键相当于插入新的主键,那么表B引用过这个主键,将组织表A的主键修改,必须删除表B的相关记录后,才能修改表A的主键。

外键约束,为了保证数据完整性、一致性,杜绝数据冗余、数据讹误。


1.5 视图

视图,也称续表,看起来像表。它是由查询语句生成的。可以通过视图进行CRUD增删改查操作。

视图的作用:

  • 简化操作,将复杂的SQL查询语句定义为视图,可以简化查询。
  • 数据安全,视图可以只显示真实表的部分列,或计算后的结果,隐藏真实表的数据。
# 创建视图示例
create view ProductCustomers AS select cust_name, cust_contact, prod_id FROM customers, orders, orderitems WHERE customers.cust_id=orders.cust_id AND orderitems.order_num=orders.order_num; 

2 MySQL数据类型 *

下列常用的数据类型必须牢记:

类型含义
tinyint1字节,带符号的范围是128到127。无符号的范围是0到255。bool或boolean,就是tinyint,0表示假,非0表示真
smallint2字节,带符号的范围是-32768到32767。无符号的范围是0到65535
int整型,4字节,同Integer,带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295
bigint长整型,8字节,带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615
float单精度浮点数精确到大约7位小数位
double双精度浮点数精确到大约15位小数位
DATE日期。支持的范围为1000-01-019999-12-31
DATETIME支持的范围是1000-01-0100:00:009999-12-3123:59:59
TIMESTAMP时间戳。范围是1970-01-0100:00:00到2037年
char(M)固定长度,右边填充空格以达到长度要求。M为长度,范围为0~255。M指的是字符个数
varchar(M)变长字符串。M表示最大列长度。M的范围是0到65535。但不能突破行最大字节数65535
text大文本。最大长度为65535(2^16-1)个字符
BLOB大字节。最大长度为65535(2^16-1)字节的BLOB列

LENGTH函数:返回字节数。而char和varchar定义的M是字符数限制。

char可以将字符串变成等长的,空间换时间,效率略高(查询、存储效率)
varchar变长,省了空间。但是会带来效率问题。因为存的数据参差不齐,带来读取的问题,比如存了一百万条记录,单要对前面的数据进行修改,而这个数据恰恰引起了长度的变化,导致整个IO开始变动,上百万条整体挪动。。。

所以到底用什么,要根据实际项目评估。比如数据库经常修改,还不如用char呢。但是用char,一个主从、多从的数据库架构,那要浪费多少磁盘空间啊。。。


2.1 使用Navicat设计表示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uAF2gcKc-1692374636464)(设计表示例.jpg)]
保存后生成的SQL语句:

CREATE TABLE `reg` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`loginname` varchar(48) NOT NULL,`name` varchar(64) NOT NULL,`password` varchar(255) NOT NULL,`reserved1` varchar(255) DEFAULT NULL,`reserved2` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ln` (`loginname`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.2 使用Navicat创建视图示例

  1. 点击视图-> 新建视图
    在这里插入图片描述

  2. 点击视图创建工具 -> 拖拽需要创建视图的表salariesemployees到窗口,勾选需要查看的字段first_name、last_name、salary、emp_no -> 构建:

  3. 预览:
    在这里插入图片描述

  4. 点击保存,然后双击打开保存的视图,新建视图查询语句-> 点击运行:
    在这里插入图片描述
    在这里插入图片描述


3 关系操作

关系:在关系型数据库中,关系就是二维表。关系操作就是对表的操作。

  • 选择:selection,又称为限制,是从关系中选择出满足给定条件的元组。
  • 投影:projection,在关系上投影就是从选择出若干属性列组成新的关系。
  • 连接,join,将不同的两个关系连接成一个关系。

3.1 DML

CRUD:增create、查read、改update、删delete。

3.1.1 Insert语句

INSERT INTOcustomers (cust_name, cust_address, cust_city, cust_country, cust_contact, cust_email)
VALUES ('Li Ming', 'JIN NIU', 'ChengDU', 'China', '02811111', 'test@email.com');  -- 基本的insert语句。主键自动递增可以不指定。INSERT INTOorders (order_date, cust_id)
VALUES (database(), 123)
ON DUPLICATE KEYUPDATE order_date=database();  -- 如果主键冲突、唯一键冲突就执行Upgdate后的设置。主键不在新增记录,主键存在更新部分字段。INSERT IGNORE INTOvendors (vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES ('Huawei', 'PIDU', 'CHENGDU', 'SICHUAN', 123454, 'CHINA'); -- 如果主键冲突、唯一建冲突就忽略错误,返回一个告警。

3.1.2 Update语句

UPDATE IGNORE vendors SET vend_address='Pi DU', vend_city='CHENG DU' where vend_name='Huawei';  -- 要有where语句,否则就会更新所有行。ignore同上

3.1.3 DELETE语句

DELETE IGNORE FROM vendors WHERE vend_name='HUAWEI'; -- 删除符合条件的记录; 没有where子句将删除所有行,可以通过日志恢复。delete不会删除表本身。

truncate语句
作用是清空表或者说是截断表,只能作用于表。truncate的语法很简单,后面直接跟表名即可 truncate是DDL语句。

TRUNCATE vendors -- 不记录数据的变动,可以通过日志恢复

truncate与drop,delete的对比
truncate与delete,drop很相似,其实这三者还是与很大的不同的,下面简单对比下三者的异同。

  • truncate与drop是DDL语句,执行后无法回滚;delete是DML语句,可回滚。
  • truncate只能作用于表;delete,drop可作用于表、视图等。
  • truncate会清空表中的所有行,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等。
  • truncate会重置表的自增值;delete不会。
  • truncate不会激活与表有关的删除触发器;delete可以。
  • truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉。

3.1.4 select语句

查询的结果称为结果集record set。

/*SELECT[DISTINCT]select_expr,...[FROM table_references[WHERE where_definition][GROUP BY {col_name | expr | position}[ASC | DESC],... [WITH ROLLUP]][HAVING where_definition][ORDER BY {col_name I expr I position][ASC I DESC],..][LIMIT ([offset,] row count I row_count OFFSET offset}][FOR UPDATE | LOCK IN SHARE MODE]]*/

for update 会把进行写锁定,这是排他锁。

SELECTDISTINCTvend_name, vend_address
FROM vendors
WHERE vend_country IN('USA', 'ENGLISH', 'CHINA')
GROUP BY vend_country DESC
HAVING vend_country IN('USA', 'ENGLISH', 'CHINA')
ORDER BY vend_country
LIMIT 5 OFFSET 2
FOR UPDATE;SELECT 1;
-- 最简单的查询
SELECT * FROM vendors;-- 字符串合并
SELECT vend_id, vend_name + vend_address FROM vendors;
SELECT vend_id, COUNT(vend_name, ' ', vend_address, ' ', vend_city) FROM vendors;
-- as 定义别名
SELECT vend_id, COUNT(vend_name, ' ', vend_address, ' ', vend_city) as vend_info FROM vendors;-- limit子句
SELECT * FROM orders LIMIT 5;  -- 提取前5行
SELECT * FROM orders LIMIT 5 OFFSET 4; -- 提取5条记录,偏移4条。偏移可以用作分页读取;比如每次偏移20,读取20条记录,每读取一次偏移增加20.
SELECT * FROM orders LIMIT 4, 5; -- 上条语句的另外一种写法。

– where子句
where子句涉及的运算符:

运算符描述
=等于
<>不等于
>,<,>=,<=大于、小于、大于等于、小于等于
BETWEEN在某个范围之内,between a andb等价于[a,b]
LIKE字符串模式匹配,%表示任意多个字符,表示一个字符
IN指定针对某个列的多个可能值
AND
OR

**注意:**如果很多表达式需要使用AND、OR计算逻辑表示式的值的时候,由于结合律问题,可以使用小括号来避免错误。

-- 条件查询
SELECT * FROM vendors WHERE vend_id<1006 and vend_city in ('New York', 'Pairs', 'London') and vend_name like 'J%';
SELECT * FROM vendors WHERE vend_id BETWEEN 1000 AND 1005 AND vend_name LIKE 'J%';
SELECT * FROM vendors WHERE vend_id IN (1003, 1004, 1005);-- order by子句
# 对查询结果进行排序,可以升序ASC、降序DESC
-- 降序
SELECT * FROM vendors WHERE vend_id IN (1003, 1004, 1005) ORDER BY vend_id DESC;-- DISTINCT
# 不返回重复记录
SELECT DISTINCT vend_id FROM vendors;
SELECT DISTINCT vend_id, vend_city FROM vendors;

聚合函数

函数描述
COUNT(expr)返回记录中记录的数目,如果指定列,则返回非NULL值的行数
COUNT(DISTINCT expr,[expr..)返回不重复的非NULL值的行数
AVG(IDISTINCT]expr)返回平均值,返回不同值的平均值
MIN(expr), MAX(expr)最小值,最大值
SUM(IDISTINCT]expr)求和,Distinct返回不同值求和
-- 聚合函数
SELECT COUNT(*), AVG(quantity), SUM(quantity), MIN(quantity), MAX(quantity) FROM orderitems;

分组查询
使用group by子句,如果有条件,使用HAVING子句过滤分组、聚合过滤后的结果。

-- 聚合所有
SELECT SUM(item_price), AVG(item_price), COUNT(order_item) FROM orderitems;
-- 聚合被选择的记录
SELECT order_item, SUM(quantity), AVG(item_price), COUNT(order_item) FROM orderitems WHERE order_item=1;
-- 按照不同的order_item分组,分组分别聚合
SELECT order_item, SUM(quantity), AVG(item_price), COUNT(order_item) FROM orderitems WHERE item_price<10 GROUP BY order_item;
-- HAVING子句对分组结果过滤
SELECT order_item, SUM(quantity), AVG(item_price), COUNT(order_item) FROM orderitems GROUP BY order_item HAVING AVG(quantity)>3;
-- 使用别名
SELECT order_item, SUM(quantity), AVG(item_price) as avg_q FROM orderitems GROUP BY order_item HAVING AVG(quantity)>3;
-- 最后对分组过滤后的结果进行排序
SELECT order_item, SUM(quantity), AVG(item_price) as avg_q FROM orderitems GROUP BY order_item HAVING AVG(quantity)>3 ORDER BY avg_q;

子查询
查询语句可以嵌套,内部查询就是子查询。子查询必须在一组小括号中。子查询不能使用order by

SELECT * 
FROM orderitems 
where item_price IN (SELECT item_price FROM orderitems WHERE item_price<10) 
ORDER BY item_price 
DESC;SELECT order_item 
FROM (SELECT * FROM orderitems WHERE item_price<10) as ord_items 
where item_price<9 
ORDER BY order_item 
DESC;

子查询存在性能问题,建议少用,改用join


连接join

在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。
没有WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起,这种联结就是笛卡尔联结。

内联结:

  • 没有where限定的内联结,就是笛卡尔联结,又称叉联结。有的说法,叉联结是叉联结,使用CROSS JOIN;内联结是内联结,使用INNER JOIN;只是两种联结的语法相同。
SELECT vend_name, prod_name, prod_price FROM vendors, products;
SELECT vend_name, prod_name, prod_price FROM vendors CROSS JOIN products; -- 叉联结,使用CROSS JOIN
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products; -- 内联结,使用INNER JOIN,因为没有where限定,得出的结果也是叉联结的结果。
  • 等值联结,有where限定的内联结

在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE 子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。
没有 WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。

SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id;
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;  -- 更推荐使用inner join... on... 语法
-- 自联结,特殊的等值联结
-- 找出与Mr Wang在同一个国家的所有顾客,然后给他们发邮件。先使用子查询
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_country = (SELECT cust_countryFROM CustomersWHERE cust_contact = 'Mr Wang');
-- 使用自联结
SELECT a.cust_id, a.cust_name, a.cust_email
FROM customers AS a INNER JOIN customers AS b ON a.cust_country = b.cust_country AND b.cust_name='Mr Wang';-- 自然联结:等值连接中,若干个联结的表,会产生重复的列。自然联结就是没有重复的列,是一种特殊的等值连接。
-- 没有内置的DBMS语法支持自然联结,需要用户自己实现。一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成
SELECT C.*, O.order_num, O.order_date,OI.prod_id, OI.quantity, OI.item_price
FROM Customers AS C, Orders AS O,OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
  • 外联结:分为左外联结,右外联结

许多联结将一个表中的行与另一个表中的行相关联,但有时候需要包含没有关联行的那些行。
例如,对每个顾客下的订单进行计数,包括那些至今尚未下订单的顾客;列出所有产品以及订购数量,包括没有人订购的产品。

-- 使用 LEFT OUTER JOIN 从 FROM 子句左边的表(Customers 表)中选择所有行.检索包括没有订单顾客在内的所有顾客
SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
-- 使用 RIGHT OUTER JOIN 从 FROM 子句右边的表(Customers 表)中选择所有行.检索包括没有订单顾客在内的所有顾客
SELECT customers.cust_id, orders.order_num FROM orders RIGHT OUTER JOIN customers ON customers.cust_id = orders.cust_id;-- 带聚集函数的联结
SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord
FROM Customers
INNER JOIN Orders ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id; -- 先执行INNER JOIN... ON...,将两张表关联;然后按顾客ID分组;最后通过聚集函数,统计出每个顾客的订单数。-- 联结多个表
-- 使用子查询
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01'));
-- 使用联结
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于小程序收集用户手机号行为的规范

手机号在日常生活中被广泛使用&#xff0c;是重要的用户个人信息&#xff0c;小程序开发者应在用户明确同意的前提下&#xff0c;依法合规地处理用户的手机号信息。 而部分开发者在处理用户手机号过程中&#xff0c;存在不规范收集行为&#xff0c;影响了用户的正常使用体验&a…

k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置&#xff08;centos7 2G内存2个处理器&#xff09;2.2、基础环境准备2.3、docker安装&#xff08;易踩坑&#xff09;2.4、安装k8s组件2.5、master节点部署…

提高批量爬虫工作效率

大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我今天要和大家分享一些关于提高批量爬虫工作效率的实用技巧。无论你是要批量采集图片、文本还是视频数据&#xff0c;这些经验都能帮助你在大规模数据采集中事半功倍。废话不多说&#xff0c;让我们开始吧&#xff01;…

SUMO 创建带有停车位的充电站 在停车位上充电

前言 SUMO提供的Charging Station是没有停车位的&#xff0c;车辆只有在通过充电站区域或者停在充电站区域内时才能被充电&#xff0c;这时充电的车辆就会占用道路。然而&#xff0c;真实世界中的情况通常是充电站设在路边&#xff0c;且提供一定量的车位用于停车&#xff0c;…

半导体自动化专用静电消除器主要由哪些部分组成

半导体自动化专用静电消除器是一种用于消除半导体生产过程中的静电问题的设备。由于半导体制造过程中对静电的敏感性&#xff0c;静电可能会对半导体器件的质量和可靠性产生很大的影响&#xff0c;甚至造成元件损坏。因此&#xff0c;半导体生产中采用专用的静电消除器是非常重…

Linux Day09

目录 一、进程替换 二、Linux信号的使用 2.1 kill() 发送信号 2.2 signal() 改变进程对信号的响应方式 2.3 处理僵死进程 2.3.1 在信号处理函数中调用wait 2.3.2 Linux特有的 2.3.3 结果 一、进程替换 linux上创造一个新进程&#xff0c;没有create创建方法&#xf…

数据分析15——office中的Excel基础技术汇总

0、前言&#xff1a; 这部分总结就是总结每个基础技术的定义&#xff0c;在了解基础技术名称和定义后&#xff0c;方便对相关技术进行检索学习。笔记不会详细到所有操作都说明&#xff0c;但会把基础操作的名称及作用说明&#xff0c;可自行检索。本文对于大部分读者有以下作用…

优化视频流:利用美颜SDK提升直播质量的方法

随着互联网的迅猛发展&#xff0c;视频直播已成为人们分享、交流和娱乐的重要方式。然而&#xff0c;在实际的直播过程中&#xff0c;视频画质可能受到诸多因素的影响&#xff0c;例如摄像头品质、网络状况等。为了提升观众的体验和吸引更多的观众&#xff0c;美颜技术逐渐成为…

Git分享-规范/建议/技巧

1. Git多人协作开发流程图 1.1 processOn默认的模板 1.2 改造之后 https://www.processon.com/view/link/64ccaf56a433c931b2f9428a 访问密码&#xff1a;512I ① 总流程图 ② feat分支&#xff08;功能/需求 分支&#xff09;流程 ③ bugfix分支&#xff08;紧急补丁分支&…

Qt平滑弹出页面

目标功能&#xff1a; (1)按下btn&#xff0c;弹出绿色页面。 (2)按下btn2,绿色页面隐藏。 (3)按下左边余下的区域&#xff0c;绿色页面也隐藏。 (4)平滑地显示和隐藏 效果&#xff1a; form.h #ifndef FORM_H #define FORM_H#include <QWidget>namespace Ui { class…

上半年营收19亿,金融壹账通第二增长曲线“加速上坡”

8月16日&#xff0c;壹账通金融科技有限公司&#xff08;下称“金融壹账通”&#xff09;发布了截至2023年6月30日中期业绩报告。 根据财报&#xff0c;2023年上半年&#xff0c;金融壹账通实现营收18.99亿元&#xff0c;毛利润为6.96亿元&#xff1b;归母净利润率从-26.1%提升…

卷积神经网络全解!CNN结构、训练与优化全维度介绍!

目录 一、引言1.1 背景和重要性1.2 卷积神经网络概述 二、卷积神经网络层介绍2.1 卷积操作卷积核与特征映射卷积核大小多通道卷积 步长与填充步长填充 空洞卷积&#xff08;Dilated Convolution&#xff09;分组卷积&#xff08;Grouped Convolution&#xff09; 2.2 激活函数R…

相机的位姿在地固坐标系ECEF和ENU坐标系的转换

在地球科学和导航领域&#xff0c;通常使用地心地固坐标系&#xff08;ECEF&#xff0c;Earth-Centered, Earth-Fixed&#xff09;和东北天坐标系&#xff08;ENU&#xff0c;East-North-Up&#xff09;来描述地球上的位置和姿态。如下图所示&#xff1a; ​地心地固坐标ecef和…

EV PV AC SPI CPI TCPI

SPI EV / PV CPI EV / ACCPI 1.25 SPI 0.8 PV 10 000 BAC 100 000EV PV * SPI 10 000 * 0.8 8000 AC EV / CPI 8000 / 1.25 6400TCPI (BAC - EV) / (BAC -AC) (100 000 - 8 000) / (100 000 - 6 400) 92 000 / 93 600 0.98290598

SCSS 学习笔记 和 vscode下载live sass compiler插件配置

1、下载livelive sass compiler插件并配置 // 在 已有代码 下面 添加下面 代码&#xff0c;一般刚刚下载打开最后一行是&#xff1a;// "liveSassCompile.settings.autoprefix": [],// 所以直接 把下面复制进去保存就行"liveSassCompile.settings.autoprefix&qu…

基于Java+SpringBoot+Vue的乌鲁木齐南山冰雪旅游服务网站【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推…

MVCC 是否彻底解决了事物的隔离性 ?

目录 1. 什么是 MVCC 2. MVCC 是否彻底解决了事物的隔离性 3. MySQL 中如何实现共享锁和排他锁 4. MySQL 中如何实现悲观锁和乐观锁 1. 什么是 MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种多版本并发控制机制&…

webpack 和 ts 简单配置及使用

如何使用webpack 与 ts结合使用 新建项目 &#xff0c;执行项目初始化 npm init -y会生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…

自动驾驶数据集汇总

1.Nuscenes 数据集链接&#xff1a;nuScenes nuscenes数据集下有多个任务&#xff0c;涉及Detection&#xff08;2D/3D&#xff09;、Tracking、prediction、激光雷达分割、全景任务、规划控制等多个任务&#xff1b; nuScenes数据集是一个具有三维目标注释的大型自动驾驶数…

2023-8-15差分矩阵

题目链接&#xff1a;差分矩阵 #include <iostream>using namespace std;const int N 1010;int n, m, q; int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] c;b[x1][y2 1] - c;b[x2 1][y1] - c;b[x2 1][y2 1] c; }int main…