CREATE INDEX 语句

CREATE INDEX 语句用于在表中创建索引。

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

索引

您可以在表中创建索引,以便更加快速高效地查询数据。

用户无法看到索引,它们只能被用来加速搜索/查询。

注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

SQL CREATE INDEX 语法

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

SQL CREATE UNIQUE INDEX 语法

在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

注释:用于创建索引的语法在不同的数据库中不一样。因此,检查您的数据库中创建索引的语法。

CREATE INDEX 实例

下面的 SQL 语句在 "Persons" 表的 "LastName" 列上创建一个名为 "PIndex" 的索引:

CREATE INDEX PIndex
ON Persons (LastName)

如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

Oracle 语法:

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>

  ON <schema>.<table_name>

       (<column_name> | <expression> ASC | DESC,

        <column_name> | <expression> ASC | DESC,...)

    TABLESPACE <tablespace_name>

    STORAGE <storage_settings>

    LOGGING | NOLOGGING

    COMPUTE STATISTICS

    NOCOMPRESS | COMPRESS<nn>

    NOSORT | REVERSE

    PARTITION | GLOBAL PARTITION<partition_setting>

相关说明

  • UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。

  • | ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”

  • TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)

  • STORAGE:可进一步设置表空间的存储参数

  • LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)

  • COMPUTE STATISTICS:创建新索引时收集统计信息

  • NOCOMPRESS | COMPRESS:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)

  • NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值

  • PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

Extract Method 提炼函数

过长的函数或者一段需要注释才能理解的代码,就将这段代码放进一个独立的函数中。

  • 函数粒度小,复用机会变大,覆写容易。

  • 高层函数如一系列注释

关键看函数名称和函数本体之间的语义距离。

变清晰,做什么来命名

Inline Method 内联函数

有时可内联到一个大函数后,再从中提炼出组织合理的小型函数。

Inline Temp 内联临时变量

return (order.basePrice>0); //可定义final确定是否被赋值一次

Replace Temp with Query 以查询取代临时变量

Introduce Explain Variable 引入解释性变量

表达式有可能复杂且难以阅读。

Split Temporary Variable 分解临时变量

做到每个变量只承担一个责任

Remove Assignments to Parameters 移除对参数的赋值

以一个临时变量取代该参数的位置

Replace Method with Method Object 以函数对象取代函数

参数就变成了对象的字段,在这个对象中大型函数可以分解为多个小型函数。

Substitute Algorithm 替代算法

将函数本体替换为另一个算法,复杂的可以先分解为小型函数

说明

SELECT INTO 语句

通过 SQL,您可以从一个表复制信息到另一个表。

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。

SQL SELECT INTO 语法

我们可以复制所有的列插入到新表中:

SELECT *
INTO newtable [IN externaldb]
FROM table1;

或者只复制希望的列插入到新表中:

SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;

提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。您可以使用 AS 子句来应用新名称。

SQL SELECT INTO 实例

创建 Customers 的备份复件:

SELECT *
INTO CustomersBackup2013
FROM Customers;

请使用 IN 子句来复制表到另一个数据库中:

SELECT *
INTO CustomersBackup2013 IN 'Backup.mdb'
FROM Customers;

只复制一些列插入到新表中:

SELECT CustomerName, ContactName
INTO CustomersBackup2013
FROM Customers;

只复制德国的客户插入到新表中:

SELECT *
INTO CustomersBackup2013
FROM Customers
WHERE Country='Germany';

复制多个表中的数据插入到新表中:

SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2013
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID;

提示:SELECT INTO 语句可用于通过另一种模式创建一个新的空表。只需要添加促使查询没有数据返回的 WHERE 子句即可:

SELECT *
INTO newtable
FROM table1
WHERE 1=0;

寻找引用点,很多重构都要求你找到对于某个函数、字段或某个类的所有引用点。

使用编译器查找注意的问题

  • 覆写多次的函数、继承

  • 编译器太慢

  • 使用了反射

重构的基本技巧--小步前进、频繁测试

说明

public final class Formatter extends Object implements Closeable, Flushable

printf风格的格式字符串的解释程序。此类提供了对布局对齐和排列的支持,以及对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。支持诸如 byteBigDecimalCalendar 等常见 Java 类型。任意用户类型的受限格式化定制都是通过 Formattable 接口提供的。

Formatter 对于多线程访问而言没必要是安全的。线程安全是可选的,它对此类中的方法用户负责。

示例程序(JUnit演示)

import java.util.Calendar;
import java.util.Formatter;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.junit.Before;
import org.junit.Test;
import static java.util.Calendar.*;
import static org.junit.Assert.*;

public class FormatterTest {

private Formatter formatter;

@Before
public void setUp(){
    StringBuilder sb = new StringBuilder();
    formatter = new Formatter(sb,Locale.US);         
}

//字符串填充、注意顺序
@Test
public void demoTest(){ 
     formatter = formatter.format("%4$2s %3$2s %2$2s %1$2s",
             "a", "b", "c", "d");
     assertEquals(" d  c  b  a", formatter.toString());     
}

//数字填充,注意空格,加号,逗号
@Test
public void demoTest1(){
     formatter = formatter.format(Locale.FRANCE, "e = %+10.4f", Math.E);
     assertEquals("e =    +2,7183", formatter.toString()); 
}

//浮点型数字填充,注意负号处理,逗号,小数点,括号
@Test
public void demoTest2(){    
     formatter =   formatter.format("Amount gained or lost since last statement: $ %(,.2f",
             -6217.58F);
     assertEquals("Amount gained or lost since last statement: $ (6,217.58)", 
             formatter.toString()); 
}

//系统格式化输出
@Test
public void demoTest3System(){
       // Writes a formatted string to System.out.
       System.out.format("Local time: %tT", Calendar.getInstance());
       // -> "Local time: 13:34:18"

       // Writes formatted output to System.err.
       System.err.printf("Unable to open file '%1$s': %2$s",
                         "food", "No such file or directory");
       // -> "Unable to open file 'food': No such file or directory"

}

//处理日期
@Test
public void demoTest4String(){
      Calendar c = new GregorianCalendar(1995, MAY, 23);
      String s = String.format("Duke's Birthday: %1$tm %1$te, %1$tY", c);
      assertEquals("Duke's Birthday: 05 23, 1995", s); 
}       
}

说明

使用时,可查阅JAVA API

UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

注释:默认地,UNION 操作符选取不同的值(123,2345-->12345)。如果允许重复的值,请使用 UNION ALL(123,2345-->1232345)。

SQL UNION ALL 语法

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。


INTERSECT操作符

interresct操作符返回在两个表中都存在的所有行(123,2345-->23)。

SQL INTERSECT 语法

SELECT column_name(s) FROM table1
INTERSECT
SELECT column_name(s) FROM table2;


MINUS操作符

minus操作符返回第一个表减去第二个表中相同行后剩余行(123,2345-->1)。

SQL MINUS 语法

SELECT column_name(s) FROM table1
MINUS
SELECT column_name(s) FROM table2;