还不会窗口函数?进来看看

窗口函数

本文章基于MySQL数据库进行测试, 其他数据库可能存在差异。

1 什么是窗口函数

1.1介绍

窗口函数(Window Function)是一种在数据库中执行实时分析处理的函数。它可以用于排序并生成序列号,对一组相关的数据行(称为窗口)进行计算,并生成每个窗口内的聚合值。窗口函数允许用户对数据进行更灵活的分析和处理,例如计算排名、分组和计算移动平均等。

窗口函数的使用需要使用OVER子句来定义窗口的规则,并可以结合聚合函数(如sum、avg、count、max、min等)对数据进行计算。常见的窗口函数包括ROW_NUMBER()RANK()DENSE_RANK()NTILE()LAG()LEAD()等。

1.2 语法

窗口函数的语法通常由以下几部分组成:

  1. 函数名:指定要使用的窗口函数的名称。
  2. OVER 子句:定义窗口的规则,包括分区(PARTITION BY)和排序规则(ORDER BY)。
  3. 参数列表:指定窗口函数的参数,例如聚合函数中的参数。

下面是一个示例窗口函数的语法:

<窗口函数名称> OVER ([PARTITION BY <用于分组的列名>] [ORDER BY <用于排序的列名>])

其中,<窗口函数名称>可以是任何有效的窗口函数名称,例如ROW_NUMBER()RANK()DENSE_RANK()等。PARTITION BY子句用于指定分组规则,将数据分为多个窗口,而ORDER BY子句则用于指定每个窗口内的排序规则。

[]中的部分是可以省略的。在有的窗口函数中,PARTITION BY子句和ORDER BY子句都是可选的。

  • ROW_NUMBER()函数在省略PARTITION BY和ORDER BY子句时,会为结果集中的每一行分配一个唯一的序号。而如果在PARTITION BY子句中指定了分组列,则会在每个分组内为每一行分配一个序号。

  • 省略PARTITION BY子句将导致在整个结果集中进行计算,而省略ORDER BY子句将导致按照默认顺序(通常是按照行的物理顺序)进行计算。

2 案例数据

-- 员工信息表
CREATE TABLE employees (  
  id INT PRIMARY KEY,  
  name VARCHAR(50),  
  salary DECIMAL(10, 2),  
  department VARCHAR(50)  
);  
  
INSERT INTO employees (id, name, salary, department)  
VALUES  
  (1, 'John Doe', 5000, 'Sales'),  
  (2, 'Jane Smith', 5500, 'Marketing'),  
  (3, 'Bob Johnson', 4500, 'HR'),  
  (4, 'Alice Brown', 5400, 'Sales'),  
  (5, 'Mike Davis', 4800, 'Marketing'),  
  (6, 'Sarah Harris', 5400, 'HR'),  
  (7, 'Chris Thompson', 5300, 'Sales'),  
  (8, 'Emily Davis', 5400, 'Marketing'),  
  (9, 'Daniel Wilson', 4900, 'HR'),  
  (10, 'Olivia Martinez', 5400, 'Sales');
  
-- 每月实际工资表  
CREATE TABLE salary (  
  id INT PRIMARY KEY COMMENT 'ID',  
  actual_salary DECIMAL(10, 2) COMMENT '实际工资',  
  month INT COMMENT '月份',  
  employee_id INT COMMENT '员工ID'  
);

INSERT INTO Salary (id, actual_salary, month, employee_id)  
VALUES  
(1, 5000, 5, 1),  
(2, 5500, 5, 2), 
(3, 6000, 5, 3),  
(4, 6000, 6, 1),
(5, 6500, 6, 2),
(6, 7000, 6, 3),				
(7, 7000, 7, 1),  
(8, 7500, 7, 2),  
(9, 8000, 7, 3);
idnamesalarydepartment
1John Doe5000Sales
2Jane Smith5500Marketing
3Bob Johnson4500HR
4Alice Brown5400Sales
5Mike Davis4800Marketing
6Sarah Harris5400HR
7Chris Thompson5300Sales
8Emily Davis5400Marketing
9Daniel Wilson4900HR
10Olivia Martinez5400Sales

3 案例

3.1 ROW_NUMBER

ROW_NUMBER用于为结果集中的每一行分配一个唯一的序号。它通常与OVER子句一起使用,以指定排序顺序和分区方式。

3.1.1 每个部门的员工根据薪资排序
SELECT
	id,
	NAME,
	salary,
	department,
	ROW_NUMBER() OVER ( PARTITION BY department ORDER BY salary DESC ) AS row_num 
FROM
	employees;
idnamesalarydepartment
6Sarah Harris5400.00HR
9Daniel Wilson4900.00HR
3Bob Johnson4500.00HR
2Jane Smith5500.00Marketing
8Emily Davis5400.00Marketing
5Mike Davis4800.00Marketing
4Alice Brown5400.00Sales
10Olivia Martinez5400.00Sales
7Chris Thompson5300.00Sales
1John Doe5000.00Sales
3.1.2 对所有员工的按照薪资进行排序

如果去掉PARTITION BY department,查询将不再按照部门进行分区,而是对整个结果集进行排序,变成为对所有员工根据薪资进行排序。

SELECT
	id,
	NAME,
	salary,
	department,
	ROW_NUMBER() OVER ( ORDER BY salary DESC ) AS row_num 
FROM
	employees;
idnamesalarydepartment
2Jane Smith5500Marketing
4Alice Brown5400Sales
6Sarah Harris5400HR
8Emily Davis5400Marketing
10Olivia Martinez5400Sales
7Chris Thompson5300Sales
1John Doe5000Sales
9Daniel Wilson4900HR
5Mike Davis4800Marketing
3Bob Johnson4500HR
3.1.2 去除ORDER BY salary DESC

虽然不知道这个查询是否意义,但是还是展示一下查询结果

SELECT
	id,
	NAME,
	salary,
	department,
	ROW_NUMBER() OVER ( PARTITION BY department ) AS row_num 
FROM
	employees;
idnamesalarydepartment
3Bob Johnson4500HR
6Sarah Harris5400HR
9Daniel Wilson4900HR
2Jane Smith5500Marketing
5Mike Davis4800Marketing
8Emily Davis5400Marketing
1John Doe5000Sales
4Alice Brown5400Sales
7Chris Thompson5300Sales
10Olivia Martinez5400Sales

3.2 RANK和DENSE_RANK

3.2.1 RANK()函数:

RANK()函数返回结果集中每一行的排名,按照指定的排序顺序进行排名。默认情况下,RANK()函数使用升序排序,并返回每个值的位置。如果存在相同的值,则并列排名,下一个排名会跳过并列的数量。

SELECT
	id,
	NAME,
	salary,
	department,
	RANK() OVER ( ORDER BY salary DESC ) AS rn 
FROM
	employees;
idnamesalarydepartmentrn
2Jane Smith5500Marketing1
4Alice Brown5400Sales2
6Sarah Harris5400HR2
8Emily Davis5400Marketing2
10Olivia Martinez5400Sales2
7Chris Thompson5300Sales6
1John Doe5000Sales7
9Daniel Wilson4900HR8
5Mike Davis4800Marketing9
3Bob Johnson4500HR10
3.2.2 DENSE_RANK()函数:

DENSE_RANK()函数与RANK()函数类似,都用于对结果集进行排名。但是,DENSE_RANK()函数不会跳过并列排名的数量。即使存在相同的值,下一个排名仍然是连续的

SELECT
	id,
	NAME,
	salary,
	department,
	DENSE_RANK() OVER ( ORDER BY salary DESC ) AS rn 
FROM
	employees;
idnamesalarydepartmentrn
2Jane Smith5500Marketing1
4Alice Brown5400Sales2
6Sarah Harris5400HR2
8Emily Davis5400Marketing2
10Olivia Martinez5400Sales2
7Chris Thompson5300Sales3
1John Doe5000Sales4
9Daniel Wilson4900HR5
5Mike Davis4800Marketing6
3Bob Johnson4500HR7

3.3 NTILE

NTILE()用于将数据集分为n个相等的百分位数,每个百分位包含相同数量的数据, 计算方法是将数据集中的数据按照指定的百分位数进行分组,每个组包含相同数量的数据。每个组对应一个百分位数,因此总共有n个百分位数,每个百分位数包含的数据数量相同。

SELECT
	id,
	NAME,
	salary,
	department,
	NTILE( 4 ) OVER ( ORDER BY salary ) AS quartile 
FROM
	Employees;

在这个查询中,我们使用了NTILE函数将员工按照工资水平分为四个组。每个组对应一个百分位数,即前25%、25%-50%、50%-75%和75%-100%。每个员工所属的组由NTILE函数计算得到,并使用quartile列表示。

idnamesalarydepartmentquartile
3Bob Johnson4500HR1
5Mike Davis4800Marketing1
9Daniel Wilson4900HR1
1John Doe5000Sales2
7Chris Thompson5300Sales2
4Alice Brown5400Sales2
6Sarah Harris5400HR3
8Emily Davis5400Marketing3
10Olivia Martinez5400Sales4
2Jane Smith5500Marketing4

3.4 LAG和LEAD

LAGLEAD是窗口函数,用于获取当前行之前或之后的行的值,常用于时间序列数据或需要计算移动平均线等场合。

lead(EXPR,,)

lag(EXPR,,)

  1. EXPR:一般是列名,指定要获取之前或之后值的列;也可以是从其他行返回的表达式。
  2. OFFSET:这是一个整数,指定了要偏移的行数。它指定了要获取之前或之后多少行的值。在函数中,OFFSET通常为1,表示获取当前行之前的1行的值。
  3. DEFAULT:这是一个可选参数,指定当没有更早的行可用时返回的默认值。如果没有更早的行可用,将返回默认值。
3.4.1 LAG函数

LAG函数用于获取当前行之前的指定列的值, 第一行显示null。它需要指定要获取值的列和偏移量。偏移量指定了要获取之前多少行的值。

3.4.1.1 查询员工当月以及上月实际工资是多少
SELECT
	employee_id,
	MONTH,
	actual_salary,
	LAG( actual_salary ) OVER ( PARTITION BY employee_id ORDER BY MONTH ) AS previous_month_salary 
FROM
	salary;
employee_idmonthactual_salaryprevious_month_salary
155000
1660005000
1770006000
255500
2665005500
2775006500
356000
3670006000
3780007000
3.4.1.2 查询员工当月以及两个月前的实际工资是多少
SELECT
	employee_id,
	MONTH,
	actual_salary,
	LAG( actual_salary, 2 ) OVER ( PARTITION BY employee_id ORDER BY MONTH ) AS previous_month_salary 
FROM
	salary;
employee_idmonthactual_salaryprevious_month_salary
155000
166000
1770005000
255500
266500
2775005500
356000
367000
3780006000
3.4.1.3 查询员工当月以及上月实际工资是多少,第一个月返回0
SELECT
	employee_id,
	MONTH,
	actual_salary,
	LAG( actual_salary, 1, 0 ) OVER ( PARTITION BY employee_id ORDER BY MONTH ) AS previous_month_salary 
FROM
	salary;
employee_idmonthactual_salaryprevious_month_salary
1550000
1660005000
1770006000
2555000
2665005500
2775006500
3560000
3670006000
3780007000
3.4.2 LEAD函数

LEAD函数用于获取当前行之后的指定列的值,最后一行显示null。它同样需要指定要获取值的列和偏移量。偏移量指定了要获取之后多少行的值。

比如,查询员工当月以及下个月实际工资是多少

SELECT
	employee_id,
	MONTH,
	actual_salary,
	LEAD( actual_salary ) OVER ( PARTITION BY employee_id ORDER BY MONTH ) AS previous_month_salary 
FROM
	salary;
employee_idmonthactual_salaryprevious_month_salary
1550006000
1660007000
177000
2555006500
2665007500
277500
3560007000
3670008000
378000

关于LEAD()其他参数不再举例,详情请见LAG()函数

3.5 FIRST_VALUE与LAST_VALUE

FIRST_VALUELAST_VALUE用于获取查询结果集中每行的第一个值或最后一个值。它们通常在排序的窗口中使用,以便在每组中进行聚合操作。

FIRST_VALUE (EXPR)

LAST_VALUE (EXPR)

EXPR:一般是列名,指定要获取之前或之后值的列;也可以是从其他行返回的表达式。

3.5.1 FIRST_VALUE

FIRST_VALUE函数返回指定列的第一个值。

比如,获取每个员工每月的工资以及首月工资

SELECT
	employee_id,
	MONTH,
	actual_salary,
	FIRST_VALUE( actual_salary ) OVER ( PARTITION BY employee_id ORDER BY MONTH ) AS first_salary 
FROM
	salary;
employee_idmonthactual_salaryfirst_salary
1550005000
1660005000
1770005000
2555005500
2665005500
2775005500
3560006000
3670006000
3780006000
3.5.2 LAST_VALUE

LAST_VALUE函数返回指定列的最后一个值,。

比如,获取每个员工每月的工资以及最后一月工资

SELECT
	employee_id,
	MONTH,
	actual_salary,
	LAST_VALUE( actual_salary ) OVER ( PARTITION BY employee_id ORDER BY MONTH ) AS last_salary 
FROM
	salary;
employee_idmonthactual_salarylast_salary
1550005000
1660006000
1770007000
2555005500
2665006500
2775007500
3560006000
3670007000
3780008000

看到这里,你可能会好奇,没啥没达到理想的效果,请看下面这句sql

SELECT 
	employee_id, 
	month, 
	actual_salary, 
	LAST_VALUE(actual_salary) OVER (PARTITION BY employee_id ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_salary 
FROM salary;
employee_idmonthactual_salarylast_salary
1550007000
1660007000
1770007000
2555007500
2665007500
2775007500
3560008000
3670008000
3780008000

为啥加上ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, 这就涉及到一个叫**窗口帧(window frame)**的东西;

这里就不展开叙述,请看Window Function Frame Specification

3.6 统计函数(MAX、MIN、AVG、SUM、COUNT)

这里简单举几个例子;

3.6.1 MAX
SELECT 
  employee_id,
  month,
  actual_salary,
  MAX(actual_salary) OVER (PARTITION BY employee_id) AS max_salary
FROM 
  salary;
employee_idmonthactual_salarymax_salary
1550007000
1660007000
1770007000
2555007500
2665007500
2775007500
3560008000
3670008000
3780008000
3.6.2 MIN
SELECT 
  employee_id,
  month,
  actual_salary,
  MIN(actual_salary) OVER (PARTITION BY employee_id) AS min_salary
FROM 
  salary;
employee_idmonthactual_salarymin_salary
1550005000
1660005000
1770005000
2555005500
2665005500
2775005500
3560006000
3670006000
3780006000
3.6.3 AVG
SELECT 
  employee_id,
  month,
  actual_salary,
  AVG(actual_salary) OVER (PARTITION BY employee_id) AS avg_salary
FROM 
  salary;
employee_idmonthactual_salaryavg_salary
1550006000
1660006000
1770006000
2555006500
2665006500
2775006500
3560007000
3670007000
3780007000
3.6.4 SUM
SELECT 
  employee_id,
  month,
  actual_salary,
  SUM(actual_salary) OVER (PARTITION BY employee_id) AS sum_salary
FROM 
  salary;
employee_idmonthactual_salarysum_salary
15500018000
16600018000
17700018000
25550019500
26650019500
27750019500
35600021000
36700021000
37800021000
3.6.5 COUNT
SELECT 
  employee_id,
  month,
  actual_salary,
  COUNT(actual_salary) OVER (PARTITION BY employee_id) AS count_salary
FROM 
  salary;
employee_idmonthactual_salarycount_salary
1550003
1660003
1770003
2555003
2665003
2775003
3560003
3670003
3780003
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
没法下载,到这里折腾一把试试。 本文由abc2253130贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C#(WINFORM)学习 一、 C#基础 基础 类型和变量 类型和变量 类型 C# 支持两种类型:“值类型”和“引用类型”。值类型包括简单类型(如 char、int 和 float 等)、枚举类型和结构类型。引用类型包括类 (Class)类 型、接口类型、委托类型和数组类型。 变量的类型声明 变量的类型声明 每个变量必须预先声明其类型。如 int a; int b = 100; float j = 4.5; string s1; 用 object 可以表示所有的类型。 预定义类型 下表列出了预定义类型,并说明如何使用。 类型 object 说明 所有其他类型的最终 基类型 字符串类型; 字符串是 Unicode 字符序列 8 位有符号整型 16 位有符号整型 32 位有符号整型 64 位有符号整型 示例 object o = null; 范围 string sbyte short int long string s = "hello"; sbyte val = 12; short val = 12; int val = 12; long val1 = 12; -128 到 127 -32,768 到 32,767 -2,147,483,648 2,147,483,647 -9,223,372,036,854,775,808 到 第1页 C#(WINFORM)学习 long val2 = 34L; 到 9,223,372,036,854,775,807 byte ushort 8 位无符号整型 16 位无符号整型 byte val1 = 12; ushort val1 = 12; uint val1 = 12; uint 32 位无符号整型 uint val2 = 34U; ulong val1 = 12; ulong val2 = 34U; ulong 64 位无符号整型 ulong val3 = 56L; ulong val4 = 78UL; float 单精度浮点型 float val = 1.23F;7 位 double val1 = 1.23; double 双精度浮点型 double val2 = ±5.0 × 10?324 ±1.7 × 10 308 0 到 255 0 到 65,535 0 到 4,294,967,295 0 到 18,446,744,073,709,551,615 ±1.5 × 10?45 ±3.4 × 10 38 到 到 4.56D;15-16 布尔型;bool 值或为 真或为假 字符类型;char 值是 一个 Unicode 字符 精确的小数类型, 具有 28 个有效数字 bool val1 = true; bool val2 = false; char val = 'h'; decimal val = bool char decimal DateTime ±1.0 × 10?28 ±7.9 × 10 28 到 1.23M;28-29 变量转换 简单转换: float f = 100.1234f; 可以用括号转换: short s = (short)f 也可以利用 Convert 方法来转换: string s1; s1=Convert.ToString(a); MessageBox.Show(s1); 常用 Convert 方法有: 第2页 C#(WINFORM)学习 C# Convert.ToBoolean Convert.ToByte Convert.ToChar Convert.ToDateTime Convert.ToDecimal Convert.ToDouble Convert.ToInt16 Convert.ToInt32 Convert.ToInt64 Convert.ToSByte Convert.ToSingle Convert.ToString Convert.ToUInt16 Convert.ToUInt32 Convert.ToUInt64 备注 Math 类 常用科学计算方法: C# Math.Abs Math.Sqrt Math.Ro
初识Visual Leak Detector   灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题。当程序越来越复杂时,内存的管理也变得越加复杂,稍有不慎就出现内存问题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很严重,在短时间内对程序不有太大的影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的,从性能下降到内存耗尽,甚至影响到其他程序的正常运行。另外内存问题的一个共同特点是,内存问题本身并不有很明显的现象,当有异常现象出现时已时过境迁,其现场已非出现问题时的现场了,这给调试内存问题带来了很大的难度。   Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具。相比较其它的内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:   1、 可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号;   2、 可以得到泄露内存的完整数据;   3、 可以设置内存泄露报告的级别;   4、 它是一个已经打包的lib,使用时无须编译它的源代码。而对于使用者自己的代码,也只需要做很小的改动;   5、 他的源代码使用GNU许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。   可见,从使用角度来讲,Visual Leak Detector简单易用,对于使用者自己的代码,唯一的修改是#include Visual Leak Detector的头文件后正常运行自己的程序,就可以发现内存问题。从研究的角度来讲,如果深入Visual Leak Detector源代码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。   本文首先将介绍Visual Leak Detector的使用方法与步骤,然后再和读者一起初步的研究Visual Leak Detector的源代码,去了解Visual Leak Detector的工作原理。   使用Visual Leak Detector(1.0)   下面让我们来介绍如何使用这个小巧的工具。   首先从网站上下载zip包,解压之后得到vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等文件。将.h文件拷贝到Visual C++的默认include目录下,将.lib文件拷贝到Visual C++的默认lib目录下,便安装完成了。因为版本问题,如果使用windows 2000或者以前的版本,需要将dbghelp.dll拷贝到你的程序的运行目录下,或其他可以引用到的目录。   接下来需要将其加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。如下是一个示例程序:   #include   void main()   {   …   }   接下来让我们来演示如何使用Visual Leak Detector检测内存泄漏。下面是一个简单的程序,用new分配了一个int大小的堆内存,并没有释放。其申请的内存地址用printf输出到屏幕上。   #include   #include   #include   void f()   {   int *p = new int(0x12345678);   printf("p=%08x, ", p);   }   void main()   {   f();   }   编译运行后,在标准输出窗口得到:   p=003a89c0   在Visual C++的Output窗口得到:   WARNING: Visual Leak Detector detected memory leaks!   ---------- Block 57 at 0x003A89C0: 4 bytes ---------- --57号块0x003A89C0地址泄漏了4个字节   Call Stack: --下面是调用堆栈   d:\test\testvldconsole\testvldconsole\main.cpp (7): f --表示在main.cpp第7行的f()函数   d:\test\testvldconsole\testvldconsole\main.cpp (14): main –双击以引导至对应代码处   f:\rtm\vctools\crt_bld\self_x8
具体的内容有 公式编辑器快捷输入方法 一、常见的数学符号的快捷键(Ctrl是王道) 1、根式、分式及上下标 2、括号快捷键 3、希腊字母 4、数学符号 5、不等式 6、数学公式 7、向量 8、 9、放大或缩小尺寸,只是显示,并不改变字号 Ctrl+1(100%) Ctrl+2(200%) Ctrl+4(400%) Ctrl+8(800%) 10、空格和加粗 Ctrl+Shift+Space空格 Ctrl+Shift+B加粗 11、更改样式 数学 Ctrl+Shift+= 文字 Ctrl+Shift+E 函数 Ctrl+Shift+F 变量 Ctrl+Shift+I 希腊字母 Ctrl+Shift+G 矩阵向量 Ctrl+Shift+B (如果你要问如何记下这些快捷键,其实只要注意把那些字母和英文对应就很好记忆了。比如,R代表Root,F代表Fraction,I代表Integate,H代表Higher等等) 二、添加常用公式 MathType的一大特色就是可以自己添加或删除一些常用公式,添加的办法是:先输入我们要添加的公式,然后选中该公式,用鼠标左键拖到工具栏中适当位置即可。删除的方式是右击工具图标,选择“删除”命令即可。 三、元素间跳转 每一步完成后转向下一步(如输入分子后转向分母的输入等)可用Tab键,换行用Enter键 四、微移间隔 先选取要移动的公式(选取办法是用“Shift+箭头键”),再用“Ctrl+箭头键”配合操作 即可实现上、下、左、右的平移; 用“Ctrl+Alt+空格”键可适当增加空格。 五、批量修改公式的字号和大小 论文中,由于排版要求往往需要修改公式的大小,一个一个修改不仅费时费力还容易使word产生非法操作。 解决办法,批量修改:双击一个公式,打开mathtype,进入编辑状态, 点击size菜单->define->字号对应的pt值,一般五号对应10pt,小四对应12pt 其他可以自己按照具体要求自行调节。其他默认大小设置不推荐改动。 然后点击preference->equationpreference->savetofile->存一个与默认配置文件不同的名字,然后关闭mathtype回到word文档。 点击word界面上的mathtype->formatequation->loadequationpreferrence选项下面的browse按钮,选中刚才存的配置文件,点选wholedocument选项,确定,就安心等着公式一个个改过来。 六、公式的自动编号和引用功能 mathtype提供四种类型的公式输入:inline(文本中的公式),displaystyle没有编号的单行公式,leftnumbereddisplaystyle编号在左边,rightnumbereddisplaystyle编号在右边。 在编辑公式时,如果出现删除公式的情况,采用手动编号使得修改量变得很大,采用自动编号和自动引用方便很多,这些功能都已经在安装mathtype后集成在word的按钮上了,将鼠标悬停在相应的按钮上就可以看到具体的功能描述,由于应用十分简单,就不再此赘述了。 七、与latex代码之间的转换 mathtype编辑器中的translator里面提供了向latex,amslatex等格式的方便转换。选择相应的翻译目标后,将下面的两个inculde选项去掉,你的mathtype就可以直接将公式翻译称为latex代码了,这对于latex的初学者和记不住latex代码的人非常重要 八、在公式中使用特殊符号 MathType更多地为用户考虑到了使用上的方便,如一些特殊且经常在数学公式中用到的符号几乎都收录到了工具条上,只需轻轻一点,此符号便可在公式中轻松插入。 觉得符号还是太少了?别着急,点击“编辑”/“插入符号”,看看这里的符号够不够用?你也可以通过变换字体把汉字插入进来。 为了输入的方便,你甚至可以为这些符号分别制订一个快捷键——点击符号后,在“输入一个下标快捷键”按下你希望用的快捷键(对于同一个符号甚至可以定义几个快捷键),再单击“assign(指定)”按钮,此快捷键将出现于“当前键”下。以后在MathType窗口中,可以直接用快捷键来输入对应的符号。 九、更改公式文字的字体、颜色 如果说在“公式编辑器”更改文字字体不算麻烦的话,那么修改文字颜色就很难实现了。但在MathType中,一切变得极为简单。 小提示:在Powerpoint中更改公式文字的颜色可用以下方法:插入公式后,选中它,从有间菜单中选择“设置对象格式”,然后切换到对话框的“图片”选项卡下,点击“重新着色”按钮打开“图片重新着色”对话框,之后就可以把原来的颜色更换为新的颜色。(在Word中不可以更改公式文字颜色。)点击“样式”菜单下的“定义”项,在弹出的对话框中你可以设置默认用的字体效果:点选“高级”按钮后显示更多项目的字体设置,你可以为不同的文字、符号等设置不同的默认字体和风格
Visual Studio 2008提高工作效率的小技巧 时间往往在不经意间就浪费掉了,比如我们在寻找上一个光标位置的时候,好好学习并利用下面的技巧,提高工作效率,减少不必要浪费的时间,提高时间利用率,让生活更加美好。 1,回到上一个光标位置 使用组合键 Ctrl + - 键表示Navigate BackWard, 使用组合键 Ctrl + Shift + - 键表示 Forward. 2,删除多余的using指令,并且排序 当我们新一个类的时候,Visual Studio 将常用的命名空间using在类的头部。但是在我们写完一个类的时候,有些using是多余的,删除多余的using,再排一下序,可以使代码看起来更清晰。Visual Studio 2008 已经为我们做好了这一切。在代码编辑区点击右键,可以看到"组织 using"菜单,这就是我们需要的了。 3,复制或删除一行代码时,不用先选择它 如果你想复制一行代码,你只需要简单的按CTRL+c拷贝,然后按CTRL+v粘贴这行就可以了,而不需要选择整行的代码。如果你想删除一行代码,只需按CTRL+x就可以了。 4,取代其他编辑器里Ctrl+F的方便的增量查找 用过ultraedit对那两个上下搜索按钮印象深刻,Visual studio里有更厉害的。 操作方法: 1).按Ctrl+I键; 2).键入你要搜索的文本。注意:这时你看到光标跳至第一个匹配的地方,匹配的文本高亮显示; 3).再次按下Ctrl+I键,光标将跳至下一个匹配的文本; 4).按Ctrl+Shift+I可向后搜索; 5).要停止搜索,按ESC键; 5,如何在编辑器中进行框式选择 操作方法: 你是否知道VS提供了两种不同的选择模型:流式和框式吗? 大家应该都熟悉流式选择模型了,只要使用Shift+方向键即可(或者使用鼠标进行选择)。 框式选择则允许你同时对航和列进行选择。只要同时按下Shift+Alt+方向键,你就了解它的不同之处了。剪切,拷贝,粘贴,这些功能都能使用,只是需要记住从哪里开始选择的。啊,让我想起了那段做测试时的时光。 备注:也可以使用鼠标+Alt键完成该操作。前两天我还遇到该提示的一个有意思的用法。有时候我们拷贝网上的文章中的代码时将行号一起拷进来,使用框式选择可以只选择行号部分,将其删除。 6,如何使用快捷键在当前代码行的上面或下面插入一行(推荐,很实用) 按下Ctrl+Enter在上面插入一个空行,Ctrl+Shift+Enter则在下面插入一个空行。光标移至新行的开始处。 备注:这是我非常喜欢的一个快捷键,如果不用这个,则需要使用Home或End,然后使用方向键,再使用回车才能达到上面的效果。 7,安装之后,将您的IDE设置恢复到默认设置 如果IDE的设置在任何先前发布的版本中做了更改,它们都应该被恢复到默认设置。可以在Visual Studio 2008中点击菜单 Tools > Import and Export Settings… > Reset all settings,此外还有一些Import和Export的选项可用。 8,通过按"tab"两次插入代码块 操作步骤: 在编辑的中输入代码片段,比如"for" 在这个状态下,按两次"tab"键,将插入代码块,如下图所示 此时你可以把第一"i"改成"j",然后按Tab键,则所有的变量都变成了"j"。 备注:这样既快又不容易语法出错。 9,使用Ctrl+Tab打开IDE的导航,获得鸟瞰视图 同时在Visual Studio中导航到所有打开的文件和工具窗体 按"Ctrl+Tab"键,打开IDE导航窗口,按住Ctrl键,同时用方向键或鼠标选中一个文件或工具窗体来激活。 备注:这时最好不要松开"Ctrl+Tab",按方向键看鸟瞰图,全部松开后就定位到需要的文件或工具窗体,说实在的,这窗口挺酷的。 10,查找匹配的标记 某些标识总是成对出现。例如,"{"标识必须用对应的"}"标识关闭。虽然你点击一个{ 和它匹配的}就高亮显示,但是如果代码过长的话就不好找了,同样,编译器指示符"#region"必须有对应的"#endregion"指示符。当导航你的代码时,你有时需要查找对应的标识。通过按Ctrl-]你可以这样做。这个快捷键只有当光标在这些标识符的任何一个的下面时才起作用,它立即跳转到对应的标识符而不管它是开的或闭的标识。 如果你想显亮两个匹配的标识之间的所有代码时,按Ctrl-Shift-]显亮整个块,并移动光标到开的标识处。这个快捷键只有当光标在任意的标识的下面时才起作用(如光标在区域内它就不起作用了)。 Source:http://www.cnblogs.com/zhubo/archive/2010/04/16/1713792.html _________________________________________________________________ 1. 怎样调整代码排版的格式? 选择:编辑—>高级—>设置文档的格式 或 编辑—>高级—>设置选中代码的格式。 格式化cs代码:Ctrl+k+f 格式化aspx代码:Ctrl+k+d 2. 怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 单击状态栏中的行号 3. 怎样创建矩形选区? 两种方法:Ⅰ. 摁住alt键,然后拖动鼠标即可。 Ⅱ. 按住Shift+Alt点击矩形的左上和右下位置即可。 4. 怎样快速隐藏或显示当前代码段? Ctrl+M,M 5. 怎样快速切换不同的窗口? Ctrl+Tab 6. 怎样生成解决方案? Ctrl+Shift+B 7. 怎样快速添加代码段? 输入prop然后按两次tab即可插入自动属性 public int MyProperty { get; set; }, (输入try,class,foreach等等,按两次tab也有类似效果。) 8. 怎样调用智能提示? 两种方法:Ⅰ. Ctrl+J Ⅱ. Alt+→ 9. 怎样调用参数信息提示? 光标放到参数名上面,然后输入Ctrl+Shif+空格。 10. 怎样查看代码的详细定义? 打开:视图—>代码定义窗口 然后你再在页面中把鼠标点到某个方法上。 11. 怎样创建区域以方便代码的阅读? #region 代码区域 #endregion 12. 怎样同时修改多个控件的属性? 选中多个控件,然后右键属性,这个时候这些控件共有的属性就出现,修改之后所有的控件都变化。 13. 怎样快速添加命名空间? 对于引用了dll,但代码中没有引用其命名空间的类,输入类名后在类名上按Ctrl+.即可自动添加该类的引用命名空间语句。 14. 怎样实现快速拷贝或剪切一行? 光标只要在某行上,不用选中该行,直接按Ctrl+c 或Ctrl+x 就可以拷贝或剪切该行。 15. 怎样使用任务管理器? 假如我们开发的项目很大,在项目中有些代码没有完成,我们可以做一下标记,便于将来查找。 创建方法:在要标志的地方输入://TODO:…内容… 使用方法:视图—>任务列表—>注释 16、命令行快速启动 "Inetmgr" IIS管理器,不用到管理里去找了,很快就可以显示IIS管理了 "sqlwb" 快速启动SQL2005企业管理器 "isqlw" 这是SQL2000的我也提供一下吧,这个可以起到SQL2000的查询分析器。 "devenv" 启动相应版本的VS Studio 17、Ctrl提示透明窗口 这是一个比较有意思的键。VS2005下,当你在调试代码的时候,有时候提示信息遮挡代码,这个时候你按CTRL可以将提示透明。VS2008这个透明效果,在更多的地方可见了,你不妨自己亲自动手看看。 18、F12、Ctrl+减号、CTRL + SHIFT + 减号 这三个键在查看代码的时候,特别有用。通过F12你可以快速的找到一个函数的定义,通过Ctrl+减号你可以快速的返回到函数的调用处。
默认密码 000000 进入后在设置里 可以修改 //2.6.3 重点更新推出 文件备注功能 文件备注功能,能为每一个文件加上备注.在文件列表能显示一部分文件备注 . 使用文件备注功能在根目录生成一个 8db 文件夹来保存数据不要删除 这个功能看上去简单 但是非常实用 只要使用好此功能 能方便的管理一大堆文件 包括可以注明一些 开发思路 BUG 管理等. //2.62 修复了一堆BUG 增加了 防爆变量和防爆码 增加了 登陆框大小写 提示 防爆变量 和防爆码说明: 由于本系统对安全要求比较高为了防止其他人爆破出本系统页面特加防爆功能 启用防爆功能 填写防爆变量 和防爆码 不启用 直接留空 之后打开 本程序 页面显示空白 需要在路径后加参数( 路径?防爆变量=防爆码 )才能显示登录界面. 列:http://你的域名路径/8.php?a=123 之后才能显示登录界面 a为防爆变量 123为防爆码 //2.6.0 对编辑文件界面的 新文件加载 做了点修改 编辑界面 横向刻度尺 进行了调整可以正常滚动了 没有了就这些 最近太忙没时间弄 过几天忙过了在继续研究. //2.5.9 修正了一些细节 隐藏了临时记事本和 函数查询 在编辑器右侧 修正了一些错误 打开页面如果是空白需要刷新一下 就能看到登陆窗口了 (没找到什么原因 有的浏览器 这样) 识别 ICO文件 直接显示图标 识别 flash 宽高 增加预览 识别 flv 播放时间 识别 psd 文件 宽高 //2.5.7 移植了一个 危险文件扫描工具 不知道是谁开发的 很好用就弄进来了 增加了 在线更新系统功能(不用重新下载更新软件了,直接在线更新) //2.5.3 增加了 mp3 文件头ID3识别编辑 直接显示 mp3 歌曲名称 调整了图片 增加了文件编码识别 支持直接编辑 UTF8 文件 支持新建UTF8 文件 直接显示 图片大小 细节调整 BUG 修复了一些 //2.5更新----- 修正了文件 大小计算 调整了 探针 增加了 电子邮件发送功能 可以发送文件到 邮箱 增加了 快速备份文件到 邮箱 (可以专门申请个邮箱用来 备份文件 ) 邮件功能默认是关闭的,开启邮件功能方法 上传class.phpmailer.php class.smtp.php 到根目录 自动开启 或者服务器 支持 mail() 函数 文件说明: 8.php 八年文件管理器 主文件 独立上传就可以使用了 class.phpmailer.php class.smtp.php 这两个是 smtp类 上传这两个文件就可以 在不支持 email函数的情况下 发送邮件 把这两个文件上传到和 8.php 同一个文件夹下 系统就自动开心 电子邮件功能 如果不需要 电子邮件 快速备份功能可以不用上传 如果服务器支持 email函数 可以 不上传.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值