随笔-26  评论-12  文章-0  trackbacks-0
  2012年8月18日

什么是索引?

    提起索引,应该不会感到陌生,若说它就是目录,大概都知道了,数据库的索引与书的目录很相似,都叫index.书的内容相当于数据库表中的数据,书的目录通过页码指向书的内容,同样,索引也记录了表中的关键值,提供了指向表中行的指针.书的目录使读者很快的找到想看的内容,而不必翻看书的每一页,索引使得数据库应用程序能够不扫描全表而找到想要的数据.

 

索引是不是多多益善?

    索引可以创建在一列或多列的组合上,也可以在数据库表的多个列上建立不同的索引,但这些列应该是经常作为查询条件的列.需要指出的是,并不是表上的索引越多越好,在数据库设计过程中,还是需要为表选择一些合适的索引。宁缺勿烂,这是建立索引时的一个具体选择。在理论上,虽然一个表可以设置无限的索引,表中的索引越多,维护索引所需要的开销也就越大。每当数据表中记录有增加、删除、更新变化的时候,数据库系统都需要对所有索引进行更新。

 

索引的分类

    索引可以分为三类:聚集索引(clustered index),非聚集索引,唯一性索引(unique index).根据索引字段组成又有复合索引的说法,复合索引可以是唯一索引也可以不是唯一索引.一个表上最多创建一个聚集索引和249个非聚集索引.

 

创建索引的条件

(1)为经常出现在关键字orderby、group by、distinct后面的字段,建立索引。

(2)在union等集合操作的结果集字段上,建立索引。

(3)为经常用作查询选择的字段,建立索引。

(4)在经常用作表连接的属性上,建立索引。

(5)考虑使用索引覆盖。对数据很少被更新的表,如果用户经常只查询其中的几个字段,可以考虑在这几个字段上建立索引,从而将表的扫描改变为索引的扫描。

 

创建索引的限制

(1)限制索引数目。

 (2)唯一性太差的字段不适合单独创建索引;

 (3)更新频繁的字段不适合创建索引;

 (4)不会做为查询条件的字段不创建索引

posted @ 2012-08-18 23:09 地心引力 阅读(1471) | 评论 (0)编辑 收藏

      存储过程和触发器都是一组SQL语句集合,他们在数据库开发过程中,在对数据库的维护和管理等任务中,以及在维护数据库参照完整性等方面,具有不可替代的作用.而触发器是一种特殊的存储过程,存储过程独立于表,具有访问和操纵数据库数据的功能,使应用程序执行效率得到进一步提高.触发器也是T_SQL语句的集合,它与表密切结合,实现表中更为复杂的业务规则.

         存储过程是以一个名字存储在数据库中的,经过预编译的T_SQL语句集合,可以独立执行或通过应用程序的调用来执行.


        触发器是不由用户直接调用的,而是在对表或视图中数据进行update,insert或者delete操作时自动执行.一个表或视图可以有多个触发器,每个触发器可以包含复杂的SQL语句.数据库表之间的引用完整性约束,除了可以采用主键和外键的对应约束来实现之外,还可以使用触发器,从而实现更复杂的用户定义完整性约束.

    

posted @ 2012-08-18 23:09 地心引力 阅读(1169) | 评论 (0)编辑 收藏

字符函数

这个函数一般接收字符作为参数,并且可以返回字符或数字

其中最常用有以下两个函数


1.CONCAT函数

主要用于字符串的连接,具体语法如下

CONCAT(c1,c2)

接收两个参数,将第二个参数连接到第一个参数的末尾,假如第二个参数是NULL,

则函数返回第一个参数,假如第一个参数是NULL,则参数返回第二个参数,

假如都为NULL,则函数返回NULL


为商品价格添加元单位示例如下:



2.NVL函数

这个函数主要用于函数替换

NVL(e1,e2)

接收两个参数,假如第一个参数不为NULL时,函数返回第一个参数,

假如第一个参数为NULL时,函数返回第二个参数

具体的使用示例如下:

查询商品表的相关信息,对没有详细介绍的商品默认设置显示“暂无详细描述”


可使用暂无详细描述来代替NULL


字符常用函数还有很多,希望大家能在我的基础上评论补充

posted @ 2012-08-18 23:08 地心引力 阅读(1146) | 评论 (0)编辑 收藏

SQL语言是一种高级的非过程化的查询语言,用户使用它主要进行数据库的操作

可以把SQL语言看成是客户端与服务器端沟通的一个工具,用来存取,查询和更新,关系数据库系统


Insert语句

INSERT语句的语法结构如下:


table值的是要插入数据的表的表名,Column指的是要插入数据的列名,Value指的是要插入的具体数据值


例如往会员表中插入一个新的会员数据,可以这样添加:


前者的优点是可以指定哪些字段添加哪些数据,缺点是表名后面的小括号中的字段名需要和Value值相对照

后者的优点是书写简单,缺点是要把所有的字段都在Value中进行赋值

当需要插入数据包含有空值的时候,一般使用第一种方法,而第二种方法进行插入需要使用NULL关键字进行填充


假如插入的数据包含时间,而且时间是当前的时间,



假如插入的是时间,并且时间是某个具体的时间,我们可以将上述的语句进行修改如下:


以上操作的都是单行的数据,而下面的操作是多行的数据


插入多行数据示例如下:



UPDATE语句

UPDATE语句结构如下:



如初始化所有会员密码:



按条件更新:



做更新操作的时候,WHERE条件一般选择类似主键这样有唯一性约束的字段,除非特殊情况,

否则的话会引起意想不到的误操作,比如更新用户表时以name作为条件的话,就十分危险,

因为名字是可以重复的


Select语句

我们对数据库做得最多的操作是数据检索

select语句就显得极其重要

其中最简单的查询实例如下:


*指的是所有列


而查询所有VIP数据如下:



查询两个条件同时成立的示例如下:



查询两个条件成立其中一个,示例如下:



查询条件为空的示例如下:



当要查询会员中所有姓李的会员时,需要用到模糊查询:


% 能匹配0到多个字符

_ 能任意匹配单个字符


查询商品表中价格在300-400之间的商品数据;



而查询会员表中张三、李四、王五的信息方法如下:



使用别名查询:



其中查询中可能需要对查询的结果进行排序,其结构如下:



查询商品表,按上架时间进行排序:



如果想去掉查询结果中的重复数据,可以使用Distinction关键字,如下



Delete语句

语法结构如下


其中的table 和 condition在上面已经有提及

删除示例如下


在实际操作中我们应该使用假删除,就是再增加一个状态(一般为status)的字段

在删除错误之后,我们可以用 ROLLBACK来回滚事务

posted @ 2012-08-18 23:08 地心引力 阅读(1165) | 评论 (0)编辑 收藏
     摘要: 管理数据完整性一 学习目标  1.实现数据完整性约束  2.管理完整性约束  3.从数据字典中获取约束信息二 保证数据完整性的方法  1.应用程序代码控制  2.触发器控制  3.声明完整性约束三 约束的类型 (见图)    1.not null    (不能为空)  ...  阅读全文
posted @ 2012-08-18 23:07 地心引力 阅读(1323) | 评论 (0)编辑 收藏
  2012年8月8日

linux是一个多用户,多任务的操作系统,对于每一个文件它的属性中都包括:文件所有者(owner),文件所属组(group),其他用户(other),还必须具备与这三个角色对应的读,写,执行的权限,如下图:

在tmp目录下面有一个a.txt文件,我们通过ls -l命令可以查看其详细信息:

-:表示普通文件,d:表示目录文件,l:链接文件,b:设备文件中可以供存储的接口设备,c:设备文件中串行端口设备如键盘。

由于最前面是-:所以a.txt是普通文件。

再看  rw-r--r--部分,我们将其分为三组,分别对应文件所有者,文件所属组,其他用户的权限.

其中r代表读取权限,w:代表写权限,x:代表执行权限(这里没出现),-:代表没有某种权限。

那对上面的权限的解释就是:

owner:可以读和写,不能执行

group:可以读取不能写,不能执行

other:可以读取,不能写,不能执行

 

第一个root代表文件所有者,第二个root代表文件所属组

那么现在我如果想修改文件所有者,文件所属组,文件权限该怎么做,请继续向下阅读:

chgrp:修改用户所属组,chown:修改文件所有者,chmod:修改文件权限

 

假设我的系统中又一个叫gavin的组(通过/etc/group查看)

如上图,通过chgrp命令将该文件的group修改为了gavin

下面修改其所有者:

 

修改其权限:

 

chmod  777 a.txt   这个777代表什么?

在linux中使用数字代表权限:

r:4 w:2 x:1

r--   =4+0+0=4;

rw- =4+2+0=6;

rwx =4+2+1=7

相信写到这里大家都应该明白了吧。

 

权限对于文件和文件夹的意义是不一样的,

对于文件:

r:代表可以读取文件的内容,w:代表可以修改文件的内容,x:可以执行这个文件

对于文件夹:

r:可以获取文件夹中又哪些文件,w:可以添加和删除文件夹中的内容,x:可以进入文件夹,

如果某个角色对于一个文件夹的权限是rw-;

那么他仅仅可以使用ls获取文件夹中的内容,但是不可以使用cd进入该文件夹。

 

 

 

文件的权限告一段落,现在来看看linux中的那些常见目录中的内容:

/bin   系统有很多放置执行文件的目录,但是/bin比较特殊,因为/bin放置的是在单用户维护模式下还能够被操作的命令,在/bin下面的命令可以被root和一般账户使用,如:cat,chmod,chown,data,mv,mkdir,cp ,bash等常用命令。

/boot  主要放置开机使用到的文件

/dev  在linux系统中任何设备与接口设备都是以文件的形式存在于这个目录当中,你只要访问某个文件就相当于访问该设备

/etc  系统的主要配置文件几乎都在这个文件夹类。

/home 这是系统默认的用户主文件夹

/lib 系统的函数库非常多,二/lib放置的是开机会使用到的函数库

/mnt 如果你想临时挂在一些外部设备(光盘)一般建议放置到这个目录。

/opt 这是给第三方软件放置的目录

/root 系统管理员的主文件夹

/tmp 这是让一般用户或者正在执行的程序放置文件的地方,这个目录是任何人都可以访问的,所以你需要定期清理一下,当然重要数据时不能放到这里来的。

 

 

关于文件权限的最后一点就是:文件默认权限umask

现在我们已经知道如何新建或者改变一个目录的属性了,不过你知道当你新建一个新的文件或则目录是,它的默认权限是什么吗?那就是于umask这东西有关了,那么umask是在搞什么呢,基本上,umask就是制定目前用户在新建文件或目录的时候权限的默认值,如果获得或设置umask,方法如下:

#umask  或则  umask -S

(四位数,第一位我们先不管,表示特殊权限,我们从第二位开始看起)

在默认权限上,文件和目录是不一样的,对于一个目录,x权限是非常重要的 ,而对于一个文件,x权限在默认是不应该有的,因为文件大多是用来存储数据的,所以在linux中,文件的默认权限是666,目录的默认权限是777

 

 

要注意的是umask的分数指的是“默认值需要剪掉的权限”,

所以新建文件时权限:rw--r--r--

新建目录:r-xr-xr-x

posted @ 2012-08-08 23:41 地心引力 阅读(1033) | 评论 (0)编辑 收藏
#include <stdio.h>
#include <stdlib.h>

/*判断用户输入的字符串是否为回文
 *回文是指顺读和反读都一样的串
 *例:abccba为回文,abcdab不是回文
*/

int Palindrome(const char *str)
{
    int length = strlen(str);
    for(int i = 0; i <= length/2; i++)
    {
        if(str[i] != str[length-i-1])
        {
            return -1;
        }
    }
    return 1;
}

int main()
{
    char s[100];
    gets(s);
    int result = Palindrome(s);
    if(result == 1)
    {
        printf("字符串是回文");
    }
    else
    {
        printf("字符串不是回文");
    }
}


 
posted @ 2012-08-08 23:40 地心引力 阅读(6377) | 评论 (2)编辑 收藏
package com.xtfggef;

public class SelectSort {

    /**
     * 
@param args
     
*/
    public static void main(String[] args) {
        int[] data = new int[]{2,3,4,1,9,8};
        System.out.println("before sorted:");
        for(int k=0; k<data.length; k++){
            System.out.print(data[k]+" ");
        }
        System.out.println();
        int length = data.length;
        for(int i=0; i<length-1; i++){
            int flag = i;
            for(int j=i+1; j<length; j++){
                if(data[flag]>data[j]){
                    flag = j;
                }
            }
            if(flag!=i){
                int temp=0;
                temp=data[i];
                data[i]=data[flag];
                data[flag]=temp;
            }
        }
        System.out.println("after sorted:");
        for(int h=0; h<data.length; h++){
            System.out.print(data[h]+" ");
        }
        System.out.println();
    }

}
posted @ 2012-08-08 23:39 地心引力 阅读(823) | 评论 (0)编辑 收藏
  2012年8月1日

一.单行函数介绍

---单行函数对单行操作

---每行返回一个结果

---有可能返回值与原参数数据类型不一致(转换函数)

---单行函数可以写在SELECT,WHERE,ORDER BY子句中

---有些函数没有参数,有些函数有一个或多个参数

---函数可以嵌套

分类:字符函数,数字函数,日期函数,转换函数,通用函数


二.字符函数

1.简介

定义:主要指参数类型是字符型,不同函数返回值可能是字符或数字类型

<1>.LOWER:全小写

       LOWER('SQL Course')——>sql course

<2>.UPPER:全大写

       UPPER('SQL Course')——>SQL COURSE

<3>.INITCAP:首字母大写

       INITCAP('SQL Course')——>Sql course

<4>.CONCAT:字符串连接

       CONCAT('Good','String')——>GoodString

<5>.SUBSTR:字符串截取

       SUBSTR('String',1,3)——>Str

<6>.LENGTH:返回字符串长度

       LENGTH('String')——>6

<7>.INSTR:返回一个字符串在另一个字符串中的位置

       INSTR('String','r')——>3

<8>.LPAD:左填充

       LPAD(sal,10,'*')——>******5000

<9>.RPAD:右填充

        RPAD(sal,10,'*')——>5000******

<10>.TRIM:去掉左右两边指定字符

         TRIM('S' FROM 'SSMITH')——>MITH

<11>.REPLACE:替换字符串

         REPLACE('abc','b','d')——>adc


三.数字函数

<1>.ROUND:四舍五入函数

       ROUND(12.3)——>12

       ROUND(12.5)——>13

<2>.TRUNC:截断函数

       TRUNC(65.654,0)——>65

       TRUNC(65.654,-1)——>60

<3>.MOD:取余函数

       MOD(10,12)——>10

       MOD(7,12)——>7

       MOD(10,4)——>2


四.日期函数

<1>.SYSDATE:返回系统日期

<2>.MONTHS_BETWEEN:返回两个日期间隔的月数

       select months_between('02-2月-06','02-2月-06') from dual;

<3>.ADD_MONTHS:在指定日期基础上加上相应的月数

       select add_months('02-2月-06',8) from dual;

<4>.NEXT_DAY:返回某一日期的下一个指定日期

       select next_day('1-2月-12','星期一')  next_day from dual;

<5>.LAST_DAY:返回指定日期当月最后一天的日期

       select  last_day('1-2月-12') last_day from dual;

<6>.ROUND(date[,'fmt'])对日期进行指定格式的四舍五入操作,按照YEAR、MONTH、DAY等进行四舍五入

       SELECT  employee_id, hire_date, ROUND(hire_date, 'MONTH') FROM employees WHERE SUBSTR(hire_date,-2,2)='98';

<7>.TRUNC(date[,'fmt'])对日期进行指定格式的截断操作。按照 YEAR、MONTH、DAY等进行截断

       SELECT employee_id, hire_date, TRUNC(hire_date, 'MONTH') FROM employees WHERE SUBSTR(hire_date,-2,2)='98';

<8>.EXTRACT:返回从日期类型中取出指定年、月、日

       SELECT  last_name, hire_date, EXTRACT (MONTH FROM HIRE_DATE) MONTH FROM   employees WHERE  department_id = 90;


五.转换函数

---通常在字符类型、日期类型、数字类型之间进行显性转换。


<1>.TO_CHAR(date|number|'fmt'):把日期类型/数字类型的表达式或列转换为字符类型

--‘fmt’:指的是需要显示的格式,需要写在单引号中,并且是大小写敏感,可包含任何有效的日期格式

常用日期格式:

---YYYY:4位数字表示年份                                            ---DY:星期的英文前三位字母

---YY:两位数字年份,但是无世纪转换                          ---DAY:星期的英文拼写

---RR:2位数字表示年份,有世纪转换                           ---D:数字表示一星期的第几天,星期天是一周的第一天

---YEAR:年份的英文拼写                                                 ---DD:数字表示一个月中的第几天

---MM:两位数字表示月份                                              ---DDD:数字表示一年中的第几天

---MONTH:月份英文拼写                                                 ---AM或PM:上下午表示

---HH 或HH12或HH24:数字表示小时                            ---MI:数字表示分钟   

HH12代表12小时计时,HH24代表24小时计时                  ---SS:数字表示秒;

特殊格式:

TH:显示数字表示的英文序数词,如:DDTH显示天数的序数词
SP:显示数字表示的拼写
SPTH:显示数字表示的序数词的拼写

           select to_char(sysdate,’ddspth’) from dual;

“字符串”:如在格式中显示字符串,需要两端加双引号
           select to_char(sysdate,’dd “of” month ‘)
  from dual;        


数字到字符型转换:

进行数字类型到字符型转换,格式中的宽度一定要超过实际列宽度,否则会显示为###

-- 9:一位数字
-- 0:一位数字或前
-- $:显示为美元符
-- L:显示按照区域
--  .:小数点
--  ,:千位分割符 
        

select to_char(9832, '$9,999.00')  from  dual;      


<2>.TO_NUMBER(char[,’fmt’]): 把字符类型列或表达式转换为数字类型

       select to_number('9832', 9999)  from  dual;


<3>.TO_DATE(char[,‘fmt’]): 把字符类型列或表达式转换为日期类型

        select to_date('20120304', 'yy-mm-dd')  from  dual;


六.通用函数

<1>NVL(表达式1,表达式2)函数:该函数功能是空值转换,把空值转换为其他值,解决空值问题。如果表达式1为空,则表达式2就是要转换成的值。

注意:数据格式可以是日期、字符、数字,但数据类型必须匹配

      select nvl(null,1) from dual;
      select nvl(2,1) from dual;


<2>.NVL2(表达式1, 表达式2, 表达式3)函数:该函数是对第一个参数进行检查。如果第一个参数不为空,则输出第二个参数,如果第一个参数为空,则输出低三个参数,表达式1可以为任何数据类型

      select nvl2(null,1,2) from dual;
      select nvl2(3,1,2) from dual;


<3>.NULLIF(表达式1,表达式2)函数:该函数主要完成两个参数的比较。当两个参数不相等时,返回值是第一个参数值;当两个参数相等时,返回值是空值。

      select nullif(1,1) from dual;

      返回值是:不是null;
      select nullif(1,2) from dual; 


<4>.COALESCE(表达式1, 表达式2, ... 表达式n)函数:该函数是对NVL函数的扩展。COALESCE函数功能是返回第一个不为空的参数,参数个数不受限制。

      select coalesce(null,null,0,1) from dual;


<5>.CASE表达式

SELECT last_name, commission_pct,
(CASE commission_pct
WHEN 0.1  THEN '低'
WHEN 0.2  THEN '中'
WHEN 0.3  THEN '高'
ELSE '无'
END)   Commission
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY last_name;


<6>.DECODE函数

DECODE(字段|表达式, 条件1,结果1[,条件2,结果2…,][,缺省值])
 

 select last_name, commission_pct,decode( commission_pct,0.1,'低',0.2,'中',0.3 , '高','无') commission 

   from employees where commission_pct is not null orderbylast_name;

posted @ 2012-08-01 22:05 地心引力 阅读(749) | 评论 (0)编辑 收藏

刚开始学习存储过程的时候,就把它想象成生活中把一些东西存储在某些地方,需要的时候再把它取出来使用。而在数据库学习和总结中,才发现存储过程是一种数据库对象,是为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用。

 

posted @ 2012-08-01 22:04 地心引力 阅读(666) | 评论 (0)编辑 收藏
仅列出标题  下一页