首页 > 其他 > 详细

DAY 4

时间:2019-08-05 11:44:25      阅读:77      评论:0      收藏:0      [点我收藏+]

SQL

SEQUENCE

  • Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方
  • Sequence是数据库系统按照一定规则自动增加的数字序列。这个序列一般作为代理主键(因为不会重复)没有其他任何意义。
  • Sequence是数据库系统的特性。比如Oracle、DB2、PostgreSQL数据库有Sequence;MySQL、SQL Server、Sybase等数据库没有Sequence。

创建SEQUENCE

CREATE?SEQUENCE 
seqTest INCREMENT?BY?1?--?每次加几个
START?WITH?1?--?从1开始计数
NOMAXvalue?--?不设置最大值
MINVALUE 1:指定序列的最小值。这个整数值可以最多28位数字。
MINVALUE必须<=START WITH的值和必须小于MAXVALUE
MaxValue 20:指定序列可生成的最大值。这个整数值可以最多28位数字。MAXVALUE必须>=START WITH、必须大于MINVALUE
CYCLE:指定循环,当递增序列达到最大值后,再从最小值开始循环。当递减序列达到最小值,从最大值开始循环
NOCYCLE?--?一直累加,不循环
CACHE?10;?--设置缓存cache个序列,这样存取的快些
NOCACHE :指定该序列值不被预分配。
如果省略CACHE和NOCACHE,数据库默认会缓存20个序列号。

ex.

CREATE SEQUENCE EMP_ID_SEQ
     MINVALUE 1
     MAXVALUE 100000
     START WITH 1
     INCREMENT BY 1
     NOCACHE
     NOCYCLE;

使用SEQUENCE

定义好sequence后,就可以用currVal,nextVal取得sequence的值。

  • CurrVal:能返回当前sequence值但不会引起序列值增加
  • NextVal:增加sequence的值,然后返回增加后sequence值
SELECT EMP_ID_SEQ.NEXTVAL from dual;

resualt
1

SELECT EMP_ID_SEQ.CURRVAL from dual;

result
1

INDEX

索引的用途

  • 索引的目的:为了加快查询的效率,提高查询速度。
  • 索引就是一个指向数据表中数据的指针。通过为数据表建立适当的索引可以减少磁盘的读取(I/O)操作,提高SQL语句对数据表的访问速度。
  • 索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表。
  • 索引一旦建立,Oracle 自动使用并维护索引。插入、删除、更新表后,自动更新索引,不会对表产生影响。
  • oracle创建主键时会自动在该列上创建索引。
  • 索引就是对某一列进行排序,因此在索引列上,重复值越少,索引的效果越明显。

索引的分类

索引主要可以分为唯一索引主索引单列索引复合索引以及聚簇索引

  • 唯一索引:在数据表中使用UNIQUE关键字可以为一个数据列定义一个唯一索引。唯一索引中每一个索引值只对应数据表中的一条记录,它保证了数据列中记录的唯一性。一般在为列创建UNIQUE约束后,数据库会为该列自动建立一个唯一索引
  • 主索引:在数据表中使用PRIMARY KEY关键字可以为一个数据列定义一个主索引。主索引就是在定义的主键列中创建的索引。主索引也保证了数据列中记录的唯一性。一般在为列创建主键约束后,数据库会为该列自动建立一个主索引
  • 单列索引:定义在数据表中一个数据列上的索引就是单列索引。一般在数据查询时,如果WHERE子句中经常用到数据表中的某一列作为查询条件,为了提高查询的效率,可以为该列创建单列索引。
  • 复合索引:索引可以定义在一个数据表的多个数据列上,像这样的索引被称为复合索引。一般在数据查询时,如果WHERE子句中经常用到数据表中的某几个列作为查询条件,为了提高查询的效率,可以为这多个列创建复合索引。
  • 聚簇索引:为了提高SQL语句对数据表的查询效率,可以为数据表创建一个聚簇索引。聚簇索引中索引项的顺序与数据表中数据记录的物理顺序保持一致。聚簇索引在每一个数据表中只能创建一个。并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。

创建索引

CREATE [UNIQUE]|[CLUSTER]INDEX索引名
ON table_name (column1, column2, . column_n)

查看索引

SQL> select
  2  b.uniqueness, a.index_name, a.table_name, a.column_name
  3 from user_ind_columns a, user_indexes b
  4  where a.index_name=b.index_name
  5  and a.table_name = 'EMP'
  6  order by a.table_name, a.index_name, a.column_position;

UNIQUENESS      NDEX_NAME TABLE_NAME COLUMN_NAME
------------------ ------------------------------------------------------------
UNIQUE             EMPNO_INDEX    EMP              EMPNO

删除索引

DROP INDEX EMPNO_INDEX;

使用INDEX需要注意的问题

  • 创建索引要额外占用磁盘空间,建立的索引太多可能导致磁盘空间不足。
  • 由于索引只能提高搜索记录中某个匹配字段的速度,因此为频繁执行插入,更新和删除操作的字段建立索引,会降低INERT和UPDATE等语句的执行速度这就就纯粹浪费磁盘空间和处理时间了;这种情况下不用建立索引
  • 因此,在建立索引时,一定要慎重选择正确的字段。

约束

  • 为了保证数据库表数据的完整性(正确性和一致性),需要使用数据库约束。完整性约束包括对表的约束和对列的约束。
  • 表约束主要包括唯一约束、主键约束、外键约束和CHECK约束
  • 列约束除了包括唯一约束、参照约束和CHECK约束之外,还有非空约束

约束类型

约束类型 说明
唯一约束(UNIQUE) 保证列的值的唯一性。但是唯一约束中可以允许在列中插入空值(即NULL值)。
主键约束(PRIMARY KEY) 使用主键约束的列中只能有唯一的值,并且不能包含空值
外键约束(FOERING KEY) 保证表的参照完整性。确保对一个表的数据操作不会对与之关联的表造成不利的影响
检查约束(CHECK) 限制列的取值范围或者取值条件。可以为一个列定义多个CHECK约束。
非空约束(NOT NULL) 只用来约束列。在向该列插入数据时不允许插入空值。

唯一约束

  • 唯一约束(UNIQUE)用来保证某一列或者一组列中没有相同的值。如果为列定义了唯一约束,则该列中不允许出现重复的值,但是允许列中存在空值(即NULL值)。
  • 唯一约束即可以定义的表级上,也可以定义在列级上。
  • 一般在为列创建唯一约束后,数据库会自动为该列建立一个唯一索引,其索引名与约束名是相同的。
CREATE TABLE EMPLOYEE (
EMAIL   VARCHAR2(20) CONSTRAINT UK_EMAIL UNIQUE,
DEPT_ID     NUMBER(8)
);

不允许插入重复值,但允许插入null

使用主键约束

  • 主键约束(PRIMARY KEY)是用来保证使用主键约束的某一列或者一组列中有唯一的值,并且不能包含空值(即NULL值)。
  • 数据表中每一列只能定义一个PRIMARY KEY。一般在为列创建主键约束后,数据库会自动为该列建立一个主索引,其索引名与约束名是相同的。
  • 在创建数据表时,如果希望将多个列组合起来作为一个数据表中的主键,可以在PRIMARY KEY关键字后使用括号,将需要定义为主键的列放到PRIMARY KEY关键字后面的括号中。
  • 括号中的多个列之间需要使用逗号分割。

使用外键约束

  • 为了避免由于操作不当而引起的关联表中数据的不一致,有必要为关联表之间定义外键约束。
  • 外键约束(FOERING KEY)主要是用来定义两个表之间的关系。外键约束保证了表的参照完整性,确保对一个表的数据操作不会对与之关联的表造成不利的影响。
CREATE TABLE table_name(column1 datatype constraint
 column2 datatype constaint
 ...CONSTRAINT <constraint name> ?
FOREIGN KEY (column1, column2, ... column_n)? REFERENCES parent_table (column1, column2, ... column_n)); 

练习1

创建EMPLOYEE和DEPARTMENT

EMPLOYEE:
 名称                            是否为空?       类型
 ----------------------------------------- -------- ----------------------------
 EMP_ID                     NOT NULL     NUMBER(6)
 FIRST_NAME           NOT NULL     VARCHAR2(20)
 LAST_NAME             NOT NULL     VARCHAR2(20)
 EMAIL                                              VARCHAR2(20)
 SALARY                                           VARCHAR2(9)
 COMMISSION_PCT                        NUMBER(4)
 HIRE_DATE               NOT NULL    DATE
 MANAGER_ID                                 NUMBER(8)
 DEPT_ID                                          NUMBER(8)
DEPARTMENT:
 名称               是否为空? 类型
 ----------------------------------------- -------- -------------
 DEPT_ID              NOT NULL   NUMBER(8)
 DEPT_NAME                           VARCHAR2(20)
 MANAGER_ID                           NUMBER
 LOC_ID                NOT NULL    NUMBER

使用检查约束

  • 检查约束(CHECK)是用来限制列的取值范围或者取值条件,使用CHECK约束可以保证数据规则的一致性。可以为一个列定义多个CHECK约束,当为列定义了CHECK约束后,该列中所对应的数据必须满足指定的约束条件。
CREATE TABLE table_name(column1 datatype constraint
 column2 datatype constaint
 ...CHECK (Constraints)); 
  • Constraints是指定义的约束条件

增加一个约束条件

ALTER TABLE table_name
ADD [CONSTRAINT constraint_name] constraint_type (column);

删除一个约束条件

ALTER TABLE table_name
DROP CONSTRAINT constraint_name; 

使约束条件有效或者无效

ALTER TABLE table_name
ENABLE CONSTRAINT constraint_name;

ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name

集合查询

在SQL的连接查询语句中,还有一种查询方式就是结合查询。集合查询主要包括三种:

  • 并操作(UNION)
  • 交操作(INTERSECT)
  • 差操作(MINUS)

UNION

  • 执行并操作使用的关键字是UNION。
  • 并操作返回的结果集是包括了两个查询语句中查询出来的所有不同的行,自动去掉结果集中的重复行, 并以第一列的结果进行升序排序
    语法规则如下:
SELECT 语句1
UNION
SELECT 语句2
  • 这里需要保证SELECT 语句1和SELECT 语句2中查询出的列数必须相同,而且对应的列的数据类型必须一致。

UNION ALL

  • UNION ALL 命令会列出所有的值,不去掉重复行,并且不对结果集进行排序
    语法规则如下:
SELECT 语句1
UNION ALL
SELECT 语句2
  • 这里需要保证SELECT 语句1和SELECT 语句2中查询出的列数必须相同,而且对应的列的数据类型必须一致。

练习1

按照要求查询员工信息
(1)职位是MANAGER,或者总收入(薪水+佣金)大于2000的职位是ANALYST员工
(2)部门编号是10或者20,并且是1987年以前雇佣
(3)按照薪水从高到低排序

INTERSECT

  • 执行交操作使用的关键字是INTERSECT。交操作返回的结果集包括了连接查询结果的公共行,并且以第一列的结果进行升序排列
  • 交操作中不会出现重复行。
    其语法格式如下:
SELECT 语句1
INTERSECT
SELECT 语句2
  • 这里需要保证SELECT 语句1和SELECT 语句2中查询出的列数必须相同,而且对应的列的数据类型必须一致

MINUS

  • 执行差操作使用的关键字是MINUS。差操作返回的记录结果集是只在第一个SELECT语句中出现存在,但不存在于第二个SELECT语句的查询结果中。并且以第一列的结果进行升序排序。
    其语法格式如下:
SELECT 语句1
MINUS
SELECT 语句2
  • 这里需要保证SELECT 语句1和SELECT 语句2中查询出的列数必须相同,而且对应的列的数据类型必须一致

练习2

请使用集合查询完成下面的SQL
1.查询50号部门的员工号、员工名、工资和部门号以及工资大于8000的所有员工的员工号、员工名、工资和部门号并去除重复记录
2.查询50号部门中工资大于6000的员工号、员工名、工资和部门号(利用INTERSECT)
3.查询50号部门中工种不是“ST_CLERK”的员工号、员工名和工种名称(利用MINUS)

PL/SQL

DECLARE
    v_empno emp.empno%TYPE :=&empno;
    V_salary emp.sal%TYPE;
    V_comment VARCHAR2(35);
BEGIN
   SELECT sal INTO v_salary FROM emp WHERE empno=v_empno;
   IF v_salary<1500 THEN
       V_comment:= ‘Fairly less’;
  ELSE
       V_comment:= ‘Lots of salary’;
   END IF;
   DBMS_OUTPUT.PUT_LINE(V_comment);
   Insert into  table1 values(…….. V_comment);
   Commit;
EXCEPTION
   When others THEN
      WriteLogFile(…..);
      DBMS_OUTPUT.PUT_LINE (‘No data’);
END;
PL/SQL块语法:
DECLARE  
/* 声明部分: 
声明PL/SQL用到的变量,类型,游
标,以及局部的存储过程和函数 */
BEGIN
/*  执行部分:  过程及SQL 语句,
即程序的主要部分  */
EXCEPTION
/* 执行异常部分: 错误处理  */
END;

DAY 4

原文:https://www.cnblogs.com/Mr-quin/p/11301862.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!