sql扫盲(3)

1、创建和管理表
(1)使用子查询创建表
使用 AS subquery 选项,将创建表和插入数据结合起来
create table tableName
[(column,column …)]
AS subquery
指定的列和子查询中的列要一一对应
通过列名和默认值定义列

create table dept80
  as
  select employee_id,last_name,salary*12 annsal,hiredate
  from employees where department_id = 80;

(2)使用alter table 语句追加、修改、删除列
使用 ADD 子句追加一个新列

alter table dept80 add (job_id varchar(9));

可以修改列的数据类型, 尺寸, 和默认值

alter table dept80 modify (last_name varchar(30);

使用 DROP COLUMN 子句删除不再需要的列.

alter table dept80 drop column job_id;

修改列名

ALTER TABLE table_name rename column old_column_name 
to new_column_name

(3)改变对象的名称
执行RENAME语句改变表, 视图, 序列, 或同义词的名称

rename dept to detail_dept

(4)清空表
TRUNCATE TABLE 语句:a).删除表中所有的数据 b).释放表的存储空间

trunscate table detail_dept;

TRUNCATE语句不能回滚
可以使用 DELETE 语句删除数据

2、约束
(1)约束是表级的强制规定
有以下五种约束:NOT NULL、UNIQUE 、PRIMARY KEY、FOREIGN KEY、CHECK
(2)作用范围:列级约束只能作用在一个列上,而表约束可以作用在多个列上(当然表约束也可以作用在一个列上)。
定义方式:列约束必须跟在列的定义里后面,表约束不与列一起,而是单独定义。
非空(not null) 约束只能定义在列上
(3)定义约束
列级

column [CONSTRAINT constraint_name] constraint_type,

表级

column,...
    [constraint constraint_name] constraint_type,
    (column,...)

例如:

create table employees(
    employee_id number(6),
    first_name varchar(20),
    ...
    job_id varchar(10) not null,
    constraint emp_emp_id_pk primary key(employee_id));

(4)UNIQUE约束:唯一约束,可以定义在表级或列级,别定义的列不允许有重复值

create table employees(
    employee_id number(6),
    last_name varchar2(25) not null,
    email varchar2(25),
    salary number(8,2),
    commission_pct number(2,2),
    hire_date date not null,
...
    constraint emp_email_uk unique(email));

(5)PRIMARY KEY 约束和FOREIGN KEY 约束:可以定义在表级和列级
primary key示例:

create table departments(
    department_id number(4),
    department_name varchar2(30)
      constraint dept_name_nn not null,
    manager_id number(6),
    location_id number(4),
    constraint dept_id_pk primary key(department_id));

foreign key 示例:

create table employees(
    employee_id number(6),
    last_name varchar2(25) not null,
    email varchar2(25),
    salary number(8,2),
    commission_pct number(2,2),
    hire_date date not null,
...
    department_id number(4),
    constraint emp_dept_fk foreign key (department_id)
      references departments(department_id),
    constraint emp_email_uk unique(email));

foreign key 约束的关键字
FOREIGN KEY:在表级指定子表中的列
REFERENCES:标示在父表中的列
ON DELETE CASCADE:当父表中的列被删除时,子表中相对应的列也被删除
ON DELETE SET NULL:子表中的相应列清空
(6)CHECK约束:定义每一行必须满足的条件

...,salary number(2)
    constraint emp_salary_min
        check(salary>0),...

(7)添加约束的语法
使用 ALTER TABLE 语句:
添加或删除约束, 但是不能修改约束
有效化或无效化约束
添加 NOT NULL 约束要使用 MODIFY 语句

alter table table
    add [constraint constraint] type (column);

添加和删除约束

alter table employees
    add constraint emp_manager_fk foreign key(manager_id)
    references employees(employee_id);
alter table employees
    drop constraint emp_manager_fk;

无效化约束

alter table employees
    disable constraint emp_emp_id_pk;

激活约束

alter table employees 
    enable constraint emp_emp_id_pk;

查询约束
查询数据字典视图 USER_CONSTRAINTS

select constraint_name,constraint_type,search_condition
from user_constraints
where table_name = 'EMPLOYEES';

3、视图
(1)为什么使用视图?
a.控制数据访问 b.简化查询 c.避免重复访问相同的数据
(2)创建视图
在 CREATE VIEW 语句中嵌入子查询

create view empvu80
  as select employee_id,last_name,salary
     from employees
     where department_id = 80;  

创建视图时在子查询中给列定义别名

create view salvu50
   as select employee_id ID_NUMBER,last_name NAME,salary*12 ANN_SALARY
   from employees
   where department_id = 50;

(3)查询视图

select * from salvu50;

(4)修改视图
使用CREATE OR REPLACE VIEW 子句修改视图

create or replace view empvu80
(id_number,name,sal,department_id)
as select employee_id,first_name||''||last_name,
    salary,department_id
    from employees
    where department_id = 80;

(5)视图中使用DML的规定
a. 当视图定义中包含以下元素之一时不能使用delete:
组函数
GROUP BY 子句
DISTINCT 关键字
ROWNUM 伪列
b. 当视图定义中包含以下元素之一时不能使用update :
组函数
GROUP BY子句
DISTINCT 关键字
ROWNUM 伪列
列的定义为表达式
c. 当视图定义中包含以下元素之一时不能使用insert :
组函数
GROUP BY 子句
DISTINCT 关键字
ROWNUM 伪列
列的定义为表达式
表中非空的列在视图定义中未包括
(6)删除视图
删除视图只是删除视图的定义,并不会删除基表的数据

drop view empvu80;

(7)Top-N 分析
查询最大的几个值的 Top-N 分析:

SELECT [column_list], ROWNUM  
FROM   (SELECT [column_list] 
        FROM table
        ORDER  BY Top-N_column)
WHERE  ROWNUM <=  N;

例如:查询工资最高的三名员工:

select rownum as rank,last_name,salary 
from (select last_name,salary from employees
      order by salary desc)
where rownum <=3;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值