DDL语句 常见的数据库对象

作者:gqk:


DDL:数据库定义语句:

作用于创建,修改,删除,管理数据库对象

会自动提交当前的事务

常见的数据库对象:

 --创建学生表

CREATE TABLE student
(
    stu_id NUMBER(6),
    stu_name VARCHAR2(50),
    stu_sex  CHAR(2),
    stu_hiredate DATE
);

--删除学生表 

DROP TABLE student;

--创建学生表(带列默认值)

CREATE TABLE student
(
    stu_id NUMBER(6),
    stu_name VARCHAR2(50),
    stu_sex  CHAR(2) DEFAULT '男',
    stu_hiredate DATE DEFAULT SYSDATE
);

--利用子查询创建表

CREATE TABLE new_emp2
AS
SELECT employee_id,last_name
FROM   employees;
/*修改学生表*/
--追加列
ALTER TABLE student
ADD (phone VARCHAR2(50),address VARCHAR2(100));

--修改列

ALTER TABLE student
MODIFY (address VARCHAR2(200));

--删除列

ALTER TABLE student
DROP (phone);

--重命名对象

RENAME student TO stu;

--清空表

TRUNCATE TABLE stu;

/*
         delete      truncate
事务     可回退      自动提交,不可回退
记录日志 记录        不记录
释放空间 不释放空间  释放空间
*/  

--列注释

COMMENT ON COLUMN  stu.stu_id IS '学生编号';
COMMENT ON COLUMN  stu.stu_name IS '学生姓名';

/*
五种约束:
not null 非空约束
primary key 主键约束
unique 唯一值约束
check  检查约束
foreign key 外键约束
*/

--约束可以建表的同时创建,也可以在建表之后追加创建

--创建约束实验表

CREATE TABLE newdept
AS
SELECT * FROM departments;

CREATE TABLE newemp
AS
SELECT * FROM employees;

--非空约束:限制列值不允许为空

--修改first_name列为非空

ALTER TABLE newemp
MODIFY (first_name NOT NULL);  

--取消非空约束

ALTER TABLE newemp
MODIFY (first_name NULL);

--增加约束

ALTER TABLE 表名
ADD CONSTRAINTS 自定义约束名称 约束设置;

--主键约束:限制列值不允许重复,且不能为空,一个表只能由一个主键

--设置主键约束

ALTER TABLE newemp
ADD CONSTRAINTS newemp_empid_pk PRIMARY KEY (employee_id);

--删除约束

ALTER TABLE newemp
DROP CONSTRAINTS newemp_empid_pk;


--复合主键(多列组成一个主键)

ALTER TABLE newemp
ADD CONSTRAINTS newemp_ename_pk PRIMARY KEY (first_name,last_name);

--唯一值约束:限制列值不允许重复,不限制空值,一个表中可以有多个唯一值约束
--设置唯一值约束

ALTER TABLE newemp
ADD CONSTRAINTS newemp_email_uk UNIQUE (email);

--检查约束:限制自定义条件,忽略空值
--限制工资不能少于400

ALTER TABLE newemp
ADD CONSTRAINTS newemp_sal_chk CHECK (salary>=400);

--外键约束:限制外键列值必须是引用的主表中的主键列存在的列值,不限制空值
--前置条件:引用的主表中的主键列必须已经设置主键约束 

--部门主键约束设置

ALTER TABLE newdept
ADD CONSTRAINTS newdept_deptid_pk PRIMARY KEY (department_id); 

--员工外键约束设置

ALTER TABLE newemp
ADD CONSTRAINTS newemp_deptid_fk FOREIGN KEY (department_id)
REFERENCES newdept (department_id);

--级联删除

ALTER TABLE newemp
ADD CONSTRAINTS newemp_deptid_fk FOREIGN KEY (department_id)
REFERENCES newdept (department_id)
ON DELETE CASCADE;

--级联置空

ALTER TABLE newemp
ADD CONSTRAINTS newemp_deptid_fk FOREIGN KEY (department_id)
REFERENCES newdept (department_id)
ON DELETE SET NULL;

--创建表的同时增加约束:

CREATE TABLE emp2
(
   emp_id NUMBER(6) PRIMARY KEY,
   emp_name VARCHAR2(50) NOT NULL,
   emp_email VARCHAR2(50) UNIQUE,
   emp_sal   NUMBER(8,2)  CHECK (emp_sal>=400),
   emp_deptid NUMBER(6) REFERENCES newdept (department_id)
);

CREATE TABLE emp3
(
   emp_id NUMBER(6),
   emp_name VARCHAR2(50) NOT NULL,
   emp_email VARCHAR2(50),
   emp_sal   NUMBER(8,2),
   emp_deptid NUMBER(6),
   CONSTRAINTS emp2_empid_pk PRIMARY KEY (emp_id),
   CONSTRAINTS emp2_email_uk UNIQUE (emp_email),
   CONSTRAINTS emp2_sal_chk CHECK (emp_sal>=400),
   CONSTRAINTS emp2_deptid_fk FOREIGN KEY (emp_deptid)
   REFERENCES newdept (department_id)
);

  --无效化约束(暂时使约束失效)

ALTER TABLE newemp
DISABLE CONSTRAINTS newemp_empid_pk;

  
--激活约束

ALTER TABLE newemp
ENABLE CONSTRAINTS newemp_empid_pk;

--视图:虚拟表,作用是保存查询结果,仅保存查询语句,而不保存真实数据(物化视图例外)  

 

--创建视图语法(如果查询语句中有衍生列,必须起别名)
CREATE [OR REPLACE] VIEW 视图名称
AS
查询语句

 --查询员工表中的50号部门的员工编号,姓名,工资

CREATE OR REPLACE VIEW v_emp
AS
SELECT employee_id,last_name,salary
FROM   employees
WHERE  department_id=50;

 --查询视图
SELECT * FROM v_emp; 

--创建视图v_dept:查询每个部门的编号,名称,员工人数,员工工资总和

CREATE OR REPLACE VIEW v_dept
AS
SELECT d.department_id,
       d.department_name,
       COUNT(e.employee_id) emp_count,
       SUM(e.salary) sal_sum
FROM   departments d
INNER  JOIN employees e ON d.department_id = e.department_id
GROUP  BY d.department_id,
          d.department_name;

 --查询视图
SELECT * FROM v_dept WHERE emp_count>=3;

 --创建只读视图

CREATE OR REPLACE VIEW v_emp
AS
SELECT employee_id,last_name,salary
FROM   employees
WHERE  department_id=50
WITH READ ONLY;

  --删除视图

DROP VIEW v_emp;

视图中使用DML的规定

a)        可以在简单视图中执行 DML操作

b)        当视图定义中包含以下元素之一时不能使用delete:

                                      i.             组函数

                                    ii.             GROUP BY子句

                                   iii.             DISTINCT关键字

                                   iv.             ROWNUM 伪列 DUAL伪表

c)        当视图定义中包含以下元素之一时不能使用update:

                                      i.             组函数

                                    ii.             GROUP BY子句

                                   iii.             DISTINCT关键字

                                   iv.             ROWNUM 伪列

                                    v.             列的定义为表达式

d)        当视图定义中包含以下元素之一时不能使用insert:

                                      i.             组函数

                                    ii.             GROUP BY子句

                                   iii.             DISTINCT关键字

                                   iv.             ROWNUM 伪列

                                    v.             列的定义为表达式

                                   vi.             中非空的列在视图定义中未包括

 序列 :

通常我们在创建一个表时,都会定义一列为主键,通常是数字,对于主键我们的要求就是非空且唯一,然而在实际插入数据的时候,我们如何才能保证这个数据是唯一的呢,一种方式就是通过java代码写个工具类,产生唯一的数字,另一种方式就是今天所要介绍的一个数据库对象–序列。


1.什么是序列?

答:序列是oracle提供的用于产生一系列唯一数字的数据库对象。

2.它有什么作用?

  • 自动提供有规律且唯一的值;
  • 共享对象;
  • 通常用于表的主键的值;
  • 将序列存入内存可以提高查询效率。

--创建序列

CREATE SEQUENCE stu_seq
START WITH 100  --起始值,默认是1
INCREMENT BY 10 --递增值,默认是1
NOMAXVALUE      --最大值,默认无最大值
NOCYCLE         --假如设置了最大值,到达最大值之后,是否从头开始,默认NOCYCLE
CACHE 10        --缓存数量,默认20
;

--删除序列

DROP SEQUENCE stu_seq; 

--创建序列(使用默认值)

CREATE SEQUENCE stu_seq;

在使用的之前我们需要了解两个”方法”,一个是 序列名.nextval,这个可以类别我们java中的迭代器的概念,代表指向下一个序列值,而序列名.currval,则返回当前值。我们通过伪表dual,来展示一下;

SELECT stu_seq.nextval FROM dual;
SELECT stu_seq.currval FROM dual;

  --在插入语句中使用序列

INSERT INTO stu VALUES (stu_seq.nextval,'tom','男',sysdate);

查询序列
查询时我们可以通过工具查看sequences文件夹,当然用命令应该更快点
select increment_by,start_with,max_value,min_value from USER_SEQUENCES;  

.裂缝 
在使用序列的过程中可能会出现裂缝,也就是序列不连续了,比如本来是主键值依此应该是1,2,3,4,出现裂缝的意思就是主键值是1,3,4,5。那么是什么原因导致出现裂缝的呢,主要原因如下:
1.回滚数据导致的,我们知道可以使用rollback可以对我们刚刚插入的数据进行回滚,但是我们要知道的一点就是序列不会回滚也就是这个值我们已经使用过了,尽管现在不用了,但是虚拟指针已经指向了后面的位置了,不可能回退了,所一展现给我们的也就产生了裂缝。
 2系统异常:也就是我们插入数据时候系统异常了,数据并没有插入进去, 但是序列值已经使用了,所以下次在此调用序列时就是后面一个序列了,也产生了裂缝。
多个表使用同一个序列,因为有些值在其他表显示,所以在这个表上面看就出现了裂缝。
---------------------
数据库索引:

  索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

--创建实验表
CREATE TABLE new_emp
AS
SELECT * FROM employees;

  --创建唯一性索引:

ALTER TABLE new_emp
ADD CONSTRAINTS newemp_empid_pk PRIMARY KEY (employee_id);

  
--创建普通索引

CREATE INDEX newemp_lname_idx ON new_emp (last_name);

--删除索引

DROP INDEX newemp_lname_idx;

--创建基于函数的索引

CREATE INDEX newemp_lname_idx ON new_emp (LOWER(last_name));

--创建位图索引

CREATE BITMAP INDEX newemp_jobid_idx ON new_emp (job_id);

--查询实验:

SELECT * FROM new_emp WHERE employee_id=174;
SELECT * FROM new_emp WHERE last_name='King';
SELECT * FROM new_emp WHERE LOWER(last_name)='king';
SELECT * FROM new_emp WHERE job_id='xxx';

  

索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引:
在经常需要搜索的列上,可以加快搜索的速度;
在作为 主键的列上,强制该列的唯一性和组织表中数据的排列结构;
在经常用在连接的列上,这些列主要是一些 外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
在经常使用在WHERE子句中的列上面创建 索引,加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中, 结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加 索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和 bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。

--同义词:缩短对象的名称:

SELECT * FROM user_tables;
SELECT * FROM tabs;

--授权
GRANT CREATE SYNONYM TO scott;
--创建同义词
CREATE SYNONYM e FOR employees;
--使用同义词
SELECT * FROM e;
--删除同义词
DROP SYNONYM e;
用户权限问题
--创建新用户
CREATE USER icss IDENTIFIED BY icss;

--DCL授权语句
--GRANT 权限1,权限2,…… TO 用户;

--DCL收权语句
--REVOKE 权限1,权限2,……FROM 用户;

--授予创建会话的权限给ICSS
GRANT CREATE SESSION TO icss;

--回收权限
REVOKE CREATE SESSION FROM icss;

--授予开发人员权限
GRANT CONNECT,RESOURCE TO icss;
GRANT CREATE VIEW TO icss;

--修改密码
ALTER USER icss IDENTIFIED BY abcd;

--解锁用户
ALTER USER icss ACCOUNT UNLOCK;

--授予对象访问权限
GRANT SELECT ON scott.employees TO icss;
GRANT ALL ON scott.employees TO icss;

--回收对象访问权限
REVOKE  ALL ON scott.employees FROM icss;

--删除用户
DROP USER icss CASCADE;

 

转载于:https://www.cnblogs.com/520gqk/p/9851843.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值