第一篇:黑马程序员c语言教程:视图 序列 索引概念
视图 序列 索引 视图的概念
--创建视图 是一个逻辑概念,本身没有数据,还是来源于表
--视图的优点 简化查询 创建视图
create view empincomeview as select e.empno, e.ename, e.sal, e.sal*12 annalsal, sal*12+nvl(comm, 0)income, d.dname from emp e, dept d where e.deptno = d.deptno;
--查询员工编号 名称 工资 年薪 年收入 部门名称信息
* 第 1 行出现错误: ORA-01031: 权限不足--需要有create view权限
用户管理中 权限管理 需要管理员登录进行授权
C:>sqlplus /as sysdba
SQL> grant create view to scott;创建视图的权限给scott用户 操作视图
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
-----------------------------------------------
DEPT TABLE
TEST2 TABLE
STUDENT TABLE
EMPINCOME TABLE
EMPINCOMEVIEW VIEW select * from empincomeview;
--视图的优点
简化复杂查询(封装 复杂sql语言)限制数据访问 银行系统视图呈现,而且只读视图, 通过存储过程和存储函数来做
通过视图修改表中的数据,不建议,有很多限制
提供数据的相互独立
同样的数据,可以有不同的显示方式
但视图不能提高性能视图的几个注意点
--视图 with check option
create view view1
as
select * from emp where deptno=10
with check option;
insert into view1 values(***,***,...., 10);
insert into view1 values(***,***,...., 20);
--通过视图只能看到10号部门的员工信息,不能插入20号部门员工
--视图with read only;
create or replace view empincomeview2
as
select e.empno, e.ename, e.sal, e.sal*12 annalsal, sal*12+nvl(comm, 0)income, d.dname
from emp e, dept d
where e.deptno = d.deptno
with read only;
--修改视图 视图只能替换,不能修改
--区分复杂视图和简单视图 没有太多实际意义,关键是求解问题--视图操作的限制
结论:一般不通过视图做insert/update/delete操作
视图的目的:就是简化查询的....====================--创建序列
create sequence myseq;序列基本概念 放在内存中速度快
auto_increment
[ 1 , 2, 3, 4......20 ]
▲
tableA 序列的应用
--创建表
create table tableA
(tid number,tname varchar2(40));
--从序列中取nextval,产生tableA的主键值
insert into tableA values(myseq1.nextval, 'aa');
序列的两个属性 NEXTVAL CURRVAL nextval应在currval之前被指定
select myseq.currval from dual;
SQL> select myseq.currval from dual;
select myseq.currval from dual
*
第 1 行出现错误:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义
select myseq.nextval from dual
select myseq.currval from dual 删除序列
--drop sequence myseq;序列需要注意的问题
多个表共用一个序列,造成序列不连续
回滚会造成,造成序列不连续
系统异常,内存序列丢失,造成序列不连续
================== 有关索引小专题 0 索引原始知识
索引和表 是 单独存放
索引对dba和开发人员,使用起来是透明的,只要创建索引 索引基本原理 图示 10号 20号部门
表记录
索引表
算法
--------▲
▲
b+树--------★
▲
--------▲
▲
--------`(*∩_∩*)′
▲
--------▲
★
--------★
★
--------▲
`(*∩_∩*)′
--------`(*∩_∩*)′
`(*∩_∩*)′建立索引
create index myindex on emp(deptno);create index myindex2 on emp(deptno, job);索引说明
主键本身就是索引
唯一约束也是自动索引
=========
同义词
create synonym em for emp;
管理给scott用户查询权限
ALTER USER “HR” ACCOUNT UNLOCK GRANT SELECT ON “HR”.“EMPLOYEES” TO “SCOTT”
select * from hr.employees;SQL> select count(*)from hr.employees;
为hr.employees创建一个别名
create synonym hremp for hr.employees;* 第 1 行出现错误: ORA-01031: 权限不足
---dba管理员分配权限
grant create synonym to scott;GRANT CREATE ANY SYNONYM TO “SCOTT” select count(*)from hremp;
图像界面熟悉 PK 命令行工具
第二篇:黑马程序员c语言教程:Oracle概念(推荐)
七、在执行SQL语句时绑定变量
1.接收和定义变量的SQL*PLUS命令 ACCEPT DEFINE UNDEFINE & 2.绑定变量SQL语句的例子(1)SQL> select id, last_name, salary from s_emp where dept_id = &department_number;Enter value for department_number: 10 old 1: select id, last_name, salary from s_emp where dept_id=&department_number;new 1: select id, last_name, salary from s_emp where dept_id= 10 SQL> SET VERIFY OFF | ON;可以关闭和打开提示确认信息old 1和new 1的显示.3.绑定变量SQL语句的例子(2)SQL> select id, last_name, salary from s_emp where title = '&job_title';Enter value for job_title: Stock Clerk 11
J2EE @ zxw SQL> select id, last_name, salary from s_emp where hiredate >to_date('&start_hire_date','YYYY-MM-DD');Enter value for start_hire_date : 2001-01-01 把绑定字符串和日期类型变量时,变量外面要加单引号 也可绑定变量来查询不同的字段名 输入变量值的时候不要加;等其它符号 4.ACCEPT的语法和例子
SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE] 说明: variable 指变量名 datatype 指变量类型,如number,char等 format 指变量显示格
式 prompt text 可自定义弹出提示符的内容text hide 隐藏用户的输入符号 使用ACCEPT的例子:
ACCEPT p_dname PROMPT 'Provide the department name: ' ACCEPT p_salary NUMBER PROMPT 'Salary amount: ' ACCEPT pswd CHAR PROMPT 'Password: ' HIDE ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):” 4.DEFINE的语法和例子
SQL> DEFINE variable = value 说明: variable 指变量名 value 指变量值
定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量
使用DEFINE的例子:
SQL> DEFINE dname = sales SQL> DEFINE dname DEFINE dname = “sales”(CHAR)SQL> select name from dept where lower(name)='&dname';NAME-------------------------sales sales SQL> UNDEFINE dname SQL> DEFINE dname Symbol dname is UNDEFINED 5.SQL*PLUS里传递参数到保存好的*.sql文件里 SQL> @ /路径名/文件名 参数名1[,参数名2, „.] SQL> start /路径名/文件名 参数名1[,参数名2, „.] 注意事项: 一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9 变量名后不要加特殊的结束符号
如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量define SQL> set define off;
八、概述数据模型和数据库设计 1.系统开发的阶段: Strategy and Analysis Design Build and Document Transition Production 12
J2EE @ zxw 2.数据模型
Model of system in client's mind Entity model of client's model Table model of entity model Tables on disk 3.实体关系模型(ERM)概念
ERM(entity relationship modeling)实体 存有特定信息的目标和事件 例如: 客户,订单等 属性 描述实体的属性 例如: 姓名,电话号码等 关系 两个实体间的关系 例如:订单和产品等 实体关系模型图表里的约定
Dashed line(虚线)可选参数 “may be”
Solid line(实线)必选参数 “must be”
Crow's foot(多线)程度参数 “one or more”
Single line(单线)程度参数 “one and only one” 4.实体关系模型例子
每个订单都必须有一个或几个客户
每个客户可能是一个或几个订单的申请者 5.实体关系的类型
1:1 一对一 例如: 的士和司机 M:1 多对一 例如: 乘客和飞机 1:M 一对多 例如: 员工和技能 6.校正实体关系的原则
属性是单一值的, 不会有重复
属性必须依存于实体, 要有唯一标记
没有非唯一属性依赖于另一个非唯一的属性 7.定义结构时的注意事项 减少数据冗余
减少完整性约束产生的问题 确认省略的实体,关系和属性 8.完整性约束的要求
Primary key 主关键字 唯一非NULL Foreign key 外键 依赖于另一个Primary key,可能为NULL Column 字段名 符合定义的类型和长度
Constraint 约束条件 用户自定义的约束条件,要符合工作流要求 例如: 一个销售人员的提成不能超过它的基本工资
Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的
9.把实体关系图映射到关系数据库对象的方法 把简单实体映射到数据库里的表
把属性映射到数据库里的表的字段, 标明类型和注释 把唯一标记映射到数据库里的唯一关键字 把实体间的关系映射到数据库里的外键 13
J2EE @ zxw 其它的考虑: 设计索引,使查询更快
建立视图,使信息有不同的呈现面, 减少复杂的SQL语句 计划存储空间的分配 重新定义完整性约束条件
10.实体关系图里符号的含义 PK 唯一关键字的字段 FK 外键的字段
FK1,FK2 同一个表的两个不同的外键
FK1,FK1 两个字段共同组成一个外键 NN 非null字段 U 唯一字段
U1,U1 两个字段共同组成一个唯一字段
九、创建表
1.ORACLE常用的字段类型 ORACLE常用的字段类型有
VARCHAR2(size)可变长度的字符串, 必须规定长度 CHAR(size)固定长度的字符串, 不规定长度默认值为1
NUMBER(p,s)数字型p是位数总长度, s是小数的长度, 可存负数 最长38位.不够位时会四舍五入.DATE 日期和时间类型
LOB 超长字符, 最大可达4G CLOB 超长文本字符串 BLOB 超长二进制字符串
BFILE 超长二进制字符串, 保存在数据库外的文件里是只读的.数字字段类型位数及其四舍五入的结果 原始数值1234567.89 数字字段类型位数 存储的值 Number 1234567.89 Number 12345678 Number 错
Number(9,1)1234567.9 Number(9,3)错 Number(7,2)错
Number(5,-2)1234600 Number(5,-4)1230000 Number(*,1)1234567.9 2.创建表时给字段加默认值 和约束条件 创建表时可以给字段加上默认值
例如 : 日期字段 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间 14
J2EE @ zxw 创建表时可以给字段加上约束条件 例如: 非空 NOT NULL 不允许重复 UNIQUE 关键字 PRIMARY KEY 按条件检查 CHECK(条件)外键 REFERENCES 表名(字段名)3.创建表的例子
CREATE TABLE DEPT(EPTNO NUMBER(2)CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14), LOC VARCHAR2(13));CREATE TABLE region(ID number(2)NOT NULL PRIMARY KEY, postcode number default '0' NOT NULL, areaname varchar2(30)default ' ' NOT NULL);4.创建表时的命名规则和注意事项
表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,# 大小写不区分
不用SQL里的保留字, 一定要用时可用双引号把字符串括起来. 用和实体或属性相关的英文符号长度有一定的限制 注意事项: 建表时可以用中文的字段名, 但最好还是用英文的字段名
创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面 建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引 一个表的最多字段个数也是有限制的,254个.5.约束名的命名规则和语法
约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字)约束名字符串的命名规则同于表和字段名的命名规则 6.使用约束时的注意事项
约束里不能用系统函数,如SYSDATE和别的表的字段比较 可以用本表内字段的比较
想在事务处理后, 做约束的检查
SQL> alter session set constraints deferred.7.由实体关系图到创建表的例子 s_dept 前提条件:已有region表且含唯一关键字的字段id SQL> CREATE TABLE s_dept(id NUMBER(7)CONSTRAINT s_dept_id_pk PRIMARY KEY, name VARCHAR2(25)CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7)CONSTRAINT s_dept_region_id_fk REFERENCES region(id), CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));8.较复杂的创建表例子 15
J2EE @ zxw SQL> CREATE TABLE s_emp(id NUMBER(7)CONSTRAINT s_emp_id_pk PRIMARY KEY, last_name VARCHAR2(25)CONSTRAINT s_emp_last_name_nn NOT NULL,first_name VARCHAR2(25), userid VARCHAR2 CONSTRAINT s_emp_userid_nn NOT NULL CONSTRAINT s_emp_userid_uk UNIQUE, start_date DATE DEFAULT SYSDATE, comments VARCHAR2(25), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7)CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), salary NUMBER(11,2), commission_pct NUMBER(4,2)CONSTRAINT s_emp_commission_pct_ck CHECK(commission_pct IN(10,12.5,15,17.5,20)));
第三篇:黑马程序员c语言教程:Oracle概念
一、选择行
1.简单的SELECT 语句
SELECT 字段名1 [AS] '字段名1 解释' FROM table;2.处理NULL NVL函数可把NULL转换成其它类型的符号
编程技巧: NVL函数在多条件模糊查询的时候比较有用 NVL函数可返回多种数据类型: 返回日期 NVL(start_date,'2002-02-01')返回字符串 NVL(title,'no title')返回数字 NVL(salary,1000)3.使用SQL*PLUS(1)
SQL> desc table;显示表结构
SQL> select * from tab;查看用户下所有的表
SQL> set pause on;可以使大量结果集在用户按“Enter”(回车)后翻页
SQL> set pagesize 100;设定SQL语句返回结果集一页的行数100, 默认值是14 SQL> set linesize 100;设定SQL语句返回结果集一行的宽度100, 默认值是80 4.SQL*PLUS里规定字段的显示格式 规定数字的显示格式
SQL>column 字段名 format 99999999999;SQL>column 字段名 format 999,999,999,999;SQL>column 字段名 format a数字 [word_wrapped];规定long字符的显示宽度 SQL>set long 200;规定字段名的显示内容
SQL> column 字段名 heading '字段名显示内容';SQL> set heading off;查询时不显示字段名称 规定字段的对齐方向
SQL> column 字段名 justify [left | right | center];清除字段的格式
SQL> column 字段名 clear;5.SQL*PLUS里规定字段的显示格式例子
SQL> column last_name heading 'Employee|Name' format a15;SQL> column salary justify right format $99,999.99;SQL> column start_date format a10 null 'Not Hired';说明:如果start_date为null, 显示字符串'Not Hired' 6.判断题(T/F)(1).SQL command are always held in sql buffer.[T](2).SQL*PLUS command assit with query data.[T] 5
J2EE @ zxw SQL*PLUS命令只控制SELECT结果集的显示格式及控制文件.只有SQL命令能访问数据库.二、限制选择行
1.按指定的规则排序
SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ];默认的排序是ASC升序(由小到大)还可以ORDER BY 字段名的位置[1]| [2] ASC| DESC;2.用WHERE限制选择行(1)比较操作符 = ><>= <=!= <> ^= 与NULL比较不能用上面的比较操作符 ANY SOME ALL SQL操作符 BETWEEN „ AND„ IN LIKE IS NULL NOT BETWEEN „ AND„ NOT IN NOT LIKE IS NOT NULL 逻辑操作符 AND OR NOT 3.用WHERE限制选择行(2)比较顺序(可以用括号改变它们的顺序)(1).= <>>= <= in like is null between(2).and(3).Or 4.LIKE操作
% 零到任意多个字符 _ 一个字符
例如: 字段名 like 'M%' 字段名 like '%m%' 字段名 like 'job_' 如果要找含下划线的字符, 要加反斜线 例如:字段名 like '%X/_Y%' escape '/' 5.日期字段的比较 举例: 日期字段 between to_date('2001-12-12','YYYY-MM-DD')and to_date('2002-02-01','YYYY-MM-DD')日期字段> to_date('2001-12-12','YYYY-MM-DD')and日期字段<= to_date('2002-02-01','YYYY-MM-DD');6.不能用到索引的比较操作符 IS NULL IS NOT NULL LIKE '%m%'
三、单行函数 1.数字函数
ABS 取绝对值 POWER 乘方 LN 10为底数取0 SQRT平方根 EXP e的n次乘方 LOG(m,n)m为底数n取0 数学运算函数:ACOS ATAN ATAN2 COS COSH SIGN SIN SINH TAN TANH CEIL 大于或等于取整数 FLOOR 小于或等于取整数 MOD 取余数
ROUND(n,m)按m的位数取四舍五入值如果round(日期): 中午12以后将是明天的日期.round(sysdate,'Y')是年的第一天
TRUNC(n,m)按m的位数取小数点后的数值如果trunc(日期), 确省的是去掉时间
J2EE @ zxw 2.字符函数
CHR 按数据库的字符集由数字返回字符
CONCAT(c1,c2)把两个字符c1,c2组合成一个字符, 和 || 相同 REPLACE(c,s,r)把字符c里出现s的字符替换成r, 返回新字符
SUBSTR(c,m,n)m大于0,字符c从前面m处开始取n位字符,m等于0和1一样, m小与0,字符c从后面m处开始取n位字符
TRANSLATE(c,f1,t1)字符c按f1到t1的规则转换成新的字符串 INITCAP 字符首字母大写,其它字符小写 LOWER 字符全部小写 UPPER 字符全部大写
LTRIM(c1,c2)去掉字符c1左边出现的字符c2 RTRIM(c1,c2)TRIM(c1,c2)去掉字符c1左右两边的字符c2 LPAD(c1,n,c2)字符c1按制定的位数n显示不足的位数用c2字符串替换左边的空位 RPAD(c1,n,c2)3.日期函数
ADD_MONTHS(d,n)日期值加n月
LAST_DAY 返回当月的最后一天的日期
MONTHS_BETWEEN(d1,d2)两个日期值间的月份,d1 DUAL是SYS用户下一个空表,它只有一个字段dummy 4.转换函数(1)TO_CHAR(date,'日期显示格式')TO_CHAR(number)用于显示或报表的格式对齐 TO_DATE(char,'日期显示格式')TO_LOB 把long字段转换成lob字段 TO_NUMBER(char)用于计算或者比较大小 4.转换函数(2)to_date里日期显示格式 YYYY 年 YEAR YYY YY Y Q 季度 MM 月 MONTH MON W 星期(week of month)WW, IW(week of year)(说明:周计是按ISO标准,从1月1日的星期数到后面七天为一周,不一定是从周一到周日)DD 日 DAY DY HH24 小时 HH12 HH MI 分钟 SS 秒 如果想固定日期的显示格式可以在数据库的参数文件initorasid.ora里新写一行参数 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的设置 NLS_DATE_FORMAT=yyyy-mm-dd 7 J2EE @ zxw hh24:mi:ss 4.转换函数(3)如果想固定日期的显示格式可以用alter session命令改变 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';它的作用顺序如下: initialization parameter Environment variable ALTER SESSION command 4.转换函数(4)to_char(number)里数字显示格式 9 数字位 0 数字前面补0 to_char(-1200,'00000.00').小数点的位置 , 标记位置的逗号 用在数字显示格式的左边 L 根据数据库字符集加货币符号 to_char(-1200,'L9999.99')B 把数字0显示为空格,用在数字显示格式的右边 MI 右边的负数标记 to_char(-1200,'9999.99MI')PR 括起来的负数 to_char(-1200,'9999.99PR')EEEE 用指数方式表示 to_char(-1200,'9999.99EEEE')5.输入字符,返回数字的函数 instr(c1,c2)字符c2出现在c1的位置, 不出现, 返回0, 常用于模糊查询 length 按数据库的字符集,算出字符c的长度,跟数据库的字符集有关, 一个汉字长度为1 6.有逻辑比较的函数NVL(EXPR1, EXPR2)函数 解释: IF EXPR1=NULL RETURN EXPR2 ELSE RETURN EXPR1 DECODE(AA0V10R10V20R2....)函数 解释: IF AA=V1 THEN RETURN R1 IF AA=V2 THEN RETURN R2..„ ELSE RETURN NULL 举例: decode(id,1,'dept sale',2,'dept tech') MySQL数据库中的索引 在数据库操作中,经常需要查找特定的数据,例如:当执行“select * from student where id = 10000”语句时,MySQL数据库必须从第一条记录开始遍历,直到找到id为10000的数据。这样的效率非常低。为此,MySQL允许建立索引来加快数据表的查询和排序。 索引的概念 数据库的索引好比字典的目录,是对数据库表中一列或者多了的值进行排序后的一种结构,其作用就是提高表中的数据查询速度。MySQL中的索引分为很多种,具体如下。 1.普通索引 普通索引是由key或index定义个索引,它是MySQL中的基本索引类型,可以创建在任何数据类型中。其值是否唯一和非空有字段本身的约束条件所决定。例如,在student表的id字段上建立一个普通索引,查询记录时,就可以根据该索引查询,从而提高效率。 2.唯一性索引 唯一性索引是指由unique定义个索引,该索引所在字段的值必须是唯一的。例如,在grade表的stu_id字段上建立唯一性索引,那么stu_id字段的值就必须是唯一的。 3.全文索引 全文索引是由fulltext定义的索引,它只能创建在char、varchar或text类型的字段上。并且现在只有MyISAM存储引擎支持全文索引。 4.单列索引 单列索引指的是在表中单个字段上创建索引,它可以是普通索引、唯一索引或者全文索引,只有保证该索引只对应表中一个字段即可。 5.多列索引 多列索引是指在表的多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。如,在student表的id、name和score字段上创建一个多列索引,那么只有查询条件中使用了id字段时,该索引才会被使用。 相较于单列索引,当我们频繁的需要同时检索表中多列时,多列索引的效率会高很多。6.空间索引 空间索引是由spatial定义的索引,它只能创建在空间数据类型的字段上。MySQL中的空间数据类型有4种:geometry、point、linestring和polygon。需要注意的是,创建空间索引的字段,必须将其声明为NOT NULL,并且空间索引只能在存储引擎为MyISAM的表中创建。 需要注意的是,虽然索引可以提高数据的查询效率,但索引会占用一定的存储空间。并且创建和维护索引所消耗的时间,是随着数据量的增加而增加的。因此,使用索引时,应综合考虑其优缺点,不能肆意创建。 创建索引 要想使用索引提高数据表的访问速度,首先要创建一个索引。创建索引的方式大致可分为三种。 创建表的同时创建索引 创建表的时候可以直接创建索引,这种方式最简单、方便,其基本语法格式如下所示: create table 表名(字段名数据类型 [完整性约束条件],字段名数据类型 [完整性约束条件], „„); 字段名数据类型 [unique|fulltext|spatial] index|key [别名](字段名1 [(长度)])[asc|desc] 关于上述语法相关解释具体如下: 1)unique:可选参数,表示唯一索引。2)fulltext:可选参数,表示全文索引。3)spatial:可选参数,表示空间索引 4)index和key:用来表示字段的索引,二者选一即可。5)别名:可选参数,表示穿件的索引名称。6)字段名1:指定索引对应字段的名称。7)长度:可选参数,用于表示索引的长度。 8)asc和desc:可选参数。asc表升序,desc表降序排列。 MySQL中的6种索引类型,如下: 1)创建普通索引 【例】在t1表中id字段上创建索引,SQL语句如下: create table t1(id int, name varchar(20), score float,);index(id)可使用explain语句查看索引是否被使用,SQL语句如下: explain select * from t1 where id = 1;2)创建唯一性索引 【例】创建一个表名为t2的表,在表中的id字段上建立索引名为unique_id的唯一性索引,并按升序排列,SQL语句如下: create table t2(id int not null,);name varchar(20)not null, score float, unique index unique_id(id asc)这样,便在id字段上建立了一个名为unique_id的唯一性索引。3)创建全文索引 【例】创建一个表名为t3的表,在表中的name字段上建立索引名为fulltext_name的全文索引,SQL语句如下: create table t3(id int not null,name varchar(20)not null, score float, fulltextindex fulltext_name(name))engine=MyISAM;这样,即可在name字段上建立一个名为fulltext_name的全文索引。 需要注意的是,由于目前只有MyISAM存储引擎支持全文索引,默认的InnoDB存储引擎不支持全文索引。因此,在建立全文索引时,一定要注意表存储引擎的类型,对于经常需要索引的字符串、文字数据等信息,可以考虑存储到MyISAM存储引擎的表中。 4)创建单列索引 【例】创建一个表名为t4的表,在表中的name字段上建立索引名为single_name的单列索引,SQL语句如下: create table t4(id int not null,);name varchar(20)not null, score float, index single_name(name(20))这样,即可在name字段上建立一个名称为single_name的单列索引,并且索引的长度为20。 5)创建多列索引 【例】创建一个表名为 t5的表,在表中的id和name字段上建立索引名为multi的多列索引,SQL语句如下: create table t5(id int not null,);name varchar(20)not null, score float, indexnulti(id, name(20))这样,即可在id和name字段上建立一个名为multi的多列索引。 需要注意的是,在多列索引中,只有查询条件中使用了这些字段中的第一个字段时多列索引才会被使用。 为了验证这个说法是否正确,将id字段作为查询条件,通过explain语句查可看索引的使用情况,SQL语句如下: explain select * from t5 where id = 1;但是,如果只使用name字段作为查询条件,multi索引不会被使用。6)创建空间索引 【例】创建一个表名为t6的表,在空间类型为geometry的字段上创建空间索引,SQL语句如下: create table t6(id int,space geometry not null, spatial index sp(space))engine=MyISAM;这样,即可在t6表中的space字段上建立名称为sp的空间索引了。 需要注意的是,创建空间索引时,所在字段的值不能为空值,并且表的存储引擎为MyISAM。 使用 create index 语句在已经存在的表上创建索引 若想在一个已经存在的表上创建索引,可以使用 create index语句,其创建索引的具体语法格式如下所示: create [unique|fulltext|spatial] index 索引名 on表名(字段名 [(长度)] [asc|desc]);在上述语法格式中,unique、fulltext和spatial都是可选参数,分别用于表示唯一性索引、全文索引和空间索引;index用于指明字段为索引。 为了更好的展示如何使用create index语句在已经存在的表上创建索引,接下来创建一个book表,该表中没有建立任何索引,创建book表的SQL语句如下: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null);创建好数据表book后,通过具体案例演示如何使用create index语句在已经存在的数据表中创建索引,具体如下: 1)创建普通索引 【例】在book表中的bookid字段上建立一个名称为index_id的普通索引,SQL语句如下: create index index_id on book(bookid);这样,即可在book表中,为bookid字段建立一个名称为index_id的普通索引。2)创建唯一性索引 【例】在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,SQL语句如下: create unique index uniqueidx on book(bookid);这样,即可在book表中,为bookid字段建立一个名称为uniqueidx的唯一性索引。3)创建单列索引 【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示: create indexsingleidx on book(comment);这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。4)创建多列索引 【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示: create index mulitidxon book(authors(20), info(20));这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。5)创建全文索引 【例】删除表book,重新创建表book,在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示: drop table book;然后重新创建表book,SQL语句如下所示: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null)engine=MyISAM;接下来使用create index 语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示: create fulltext indexfulltextidx on book(info);这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。6)创建空间索引 【例】创建表t7,在表中的g字段上创建名称为spatialidx的空间索引。首先创建数据表t7,SQL语句如下所示: create table t7(g geometry not null)engine=MyISAM;使用create index 语句在t7表的g字段上,创建名称为spatialidx的空间索引,SQL语句如下所示: create spatial index spatialidx on t7(g);这样,即可在t7表中,为g字段建立一个名称为spatialidx的空间索引。 使用alter table语句在已经存在的表上创建索引 在已经存在的表中创建索引,除了可以使用create index语句外,还可以使用alter table语句来完成。其语法格式: alter table 表名 add [unique|fulltext|spatial] index 索引名(字段名 [(长度)] [asc|desc])在上述语法格式中,unique、fulltext和spatial都是可选参数,分别用于表示唯一性索引、全文索引和空间索引;add表示向表中添加字段。 接下来,同样以book表为例,对不同类型的索引进行说明,为了使book表不包含任 何索引,首先删除book表,SQL语句如下: drop table book;然后重新建立book表,SQL语句如下: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null);创建好数据表book后,就可以使用alter table语句在已存在的数据表中创建索引了,具体如下: 1)创建普通索引 【例】在表中的bookid字段上创建名称为index_id的普通索引,SQL语句如下: alter table book add index index_id(bookid);这样,即可在book表中,为bookid字段建立一个名称为index_id的普通索引。2)创建唯一性索引 【例】在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,SQL语句如下: alter table book add unique uniqueidx(bookid);这样,即可在book表中,为bookid字段建立一个名称为uniqueidx的唯一性索引。3)创建单列索引 【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示: alter table book add indexsingleidx(comment(50));这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。4)创建多列索引 【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示: alter table book add indexmultidx(authors(20), info(50));这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。 5)创建全文索引 【例】删除表book,重新创建表book,在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示: drop table book;然后重新创建表book,SQL语句如下所示: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null)engine=MyISAM;接下来使用alter table语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示: alter table book add fulltext indexfulltextidx(info);这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。6)创建空间索引 【例】创建表t8,在表中的space字段上创建名称为spatialidx的空间索引。首先创建数据表t8,SQL语句如下所示: create table t8(space geometry not null)engine=MyISAM;使用alter table语句在t8表的space字段上,创建名称为spatialidx的空间索引,SQL语句如下所示: alter table t8 add spatial index spatialidx(space);这样,即可在t8表中,为space字段建立一个名称为spatialidx的空间索引。 删除索引 由于索引会占用一定的磁盘空间,因此,为了避免影响数据库性能,应该及时删除不再使用的索引。删除索引的方法有两种,如下: 使用alter table删除索引 使用alter table删除索引的基本语法格式如下所示: alter table 表名 drop index 索引名 【例】删除表book中名称为fulltextidx的全文索引 alter table book drop index fulltextidx;上述SQL语句执行后,可以使用show create table语句查看表结构,来确认索引是否已经成功被删除。 show create talbe book;使用dropindex删除索引 使用dropindex删除索引的基本语法格式如下所示: drop index 索引名 on表名;【例】删除表t8中名称为spatialidx的空间索引,SQL语句如下: drop index spatialidx on t8 使用show create table 语句查看表结构 show create table t8 发现,t8表中名称为spatialidx的索引被成功删除了。 四、从多个表里选取数据记录 1.数据表间的连接 简单的连接语法: SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2.字段名 [ AND ……];SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2.字段名(+)[ AND ……];有(+)号的字段位置自动补空值 连接的分类: 等于的连接 = 不等于的连接!= BETWEEN … AND … IN 注意IN和OR不能一起用 8 J2EE @ zxw 外连接 有一个字段名(+), 没有满足的条件补空值 自连接 同一个表自己跟自己连接 例如找重复记录 2.数据表间的连接例子 删除table_name表里字段名email重复的记录: SQL>delete from table_name t1 where t1.rowid >(select min(rowid)from table_name t2 where t1.email = t2.email group by email having count(email)> 1);找到手机用户的服务区域: SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscore from topscore a,chargeoperator cc,chargeoperatorinfo c where substr(a.handphoneno,1,7)=cc.hpnohead(+)and cc.chargetype=c.chargetype(+)order by a.totalscore desc;3.数据表间的连接技巧 连接N个表, 需要N-1个连接操作 被连接的表最好建一个单字符的别名, 字段名前加上这个单字符的别名 BETWEEN..AND..比用 >= AND <= 要好 连接操作的字段名上最好要有索引 连接操作的字段最好用整数数字类型 有外连接时, 不能用OR或IN的比较操作 4.如何分析和执行SQL语句 写多表连接SQL语句时要知道它的分析执行计划的情况.Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql 产生plustrace角色 Sys用户下把此角色赋予一般用户 SQL> grant plustrace to &username;一般用户下运行@/ORACLE_HOME/rdbms/admin/utlxplan.sql 产生plan_table SQL> set time on;说明:打开时间显示 SQL> set autotrace on;说明:打开自动分析统计,并显示SQL语句的运行结果 SQL> set autotrace traceonly;说明:打开自动分析统计,不显示SQL语句的运行结果 接下来你就运行测试SQL语句,看到其分析统计结果了。一般来讲,我们的SQL语句应该避免大表的全表扫描。SQL> set autotrace off;说明:关闭自动分析统计 五、集合函数 经常和group by一起使用 1.集合函数列表 AVG(DISTINCT | ALL | N)取平均值 COUNT(DISTINCT | ALL | N | expr | *)统计数量 MAX(DISTINCT | ALL | N)取最大值 MIN(DISTINCT | ALL | N)取最小值 SUM(DISTINCT | ALL | N)取合计值 9 J2EE @ zxw STDDEV(DISTINCT | ALL | N)取偏差值,如果组里选择的内容都相同,结果为0 VARIANCE(DISTINCT | ALL | N)取平方偏差值 2.使用集合函数的语法 SELECT column, group_function FROM table WHERE condition GROUP BY group_by_expression HAVING group_condition ORDER BY column;3.使用count时的注意事项 SELECT COUNT(*)FROM table;SELECT COUNT(常量)FROM table;都是统计表中记录数量,如果没有PK后者要好一些 SELECT COUNT(all 字段名)FROM table;SELECT COUNT(字段名)FROM table;不会统计为NULL的字段的数量 SUM,AVG时都会忽略为NULL的字段 4.用group by时的限制条件 SELECT字段名不能随意, 要包含在GROUP BY的字段里 GROUP BY后ORDER BY时不能用位置符号和别名 限制GROUP BY的显示结果, 用HAVING条件 5.例子 SQL> select title,sum(salary)payroll from s_emp where title like 'VP%' group by title having sum(salary)>5000 order by sum(salary)desc;找出某表里字段重复的记录数, 并显示 SQL> select(duplicate field names)from table_name group by(list out fields)having count(*)>1;6.判断题(T/F)(1)Group functions include nulls in calculations [F](2)Using the having clause to exclude rows from a group calculation [F] 解释: Group function 都是忽略NULL值的 如果您要计算NULL值, 用NVL函数 Where语句在Group By前把结果集排除在外Having语句在Group By后把结果集排除在外 六、子查询 1.查询语句可以嵌套 例如: SELECT …… FROM(SELECT …… FROM表名1, [表名2, ……] WHERE 条件)WHERE 条件2;2.何处可用子查询? 当查询条件是不确定的条件时 DML(insert, update,delete)语句里也可用子查询 HAVING里也可用子查询 3.两个查询语句的结果可以做集合操作 例如: 并集UNION(去掉重复记录)并集UNION ALL(不去掉重复记录)10 J2EE @ zxw 差集MINUS, 交集INTERSECT 4.子查询的注意事项 先执行括号里面的SQL语句,一层层到外面 内部查询只执行一次 如果里层的结果集返回多个,不能用= ><>= <=等比较符要用IN.5.子查询的例子(1)SQL> select title,avg(salary)from s_emp group by title Having avg(salary)=(select min(avg(salary))from s_emp group by title);找到最低平均工资的职位名称和工资 5.子查询的例子(2)子查询可以用父查询里的表名 这条SQL语句是对的: SQL>select cty_name from city where st_code in(select st_code from state where st_name='TENNESSEE' and city.cnt_code=state.cnt_code);说明:父查询调用子查询只执行一次. 6.取出结果集的80 到100的SQL语句 ORACLE处理每个结果集只有一个ROWNUM字段标明它的逻辑位置, 并且只能 用ROWNUM<100, 不能用ROWNUM>80。 以下是经过分析后较好的两种ORACLE取得结果集80到100间的SQL语句(ID是唯一关键字的字段名)语句写法: SQL>select * from((select rownum as numrow, c.* from(select [field_name,...] from table_name where 条件1 order by 条件2)c)where numrow > 80 and numrow <= 100)order by 条件3;第四篇:黑马程序员C语言教程:mysql中的索引
第五篇:黑马程序员c语言教程:Oracle概念