数据库基础知识v-20220802-1

关于表的操作

创建表

创建学生表

CREATE TABLE XSB (
       XH CHAR(6) NOT NULL PRIMARY KEY,
       XM CHAR(8) NOT NULL,
       XB CHAR(2) NOT NULL,
       CSSJ DATE NOT NULL,
       ZY CHAR(12) NULL,
       ZXF NUMBER(2) NULL,
       BZ VARCHAR2(200) NULL
);

往学生表中插入两条数据

INSERT INTO xsb
    (xh, xm, xb, cssj, zy, zxf, bz)
VALUES
    (081101,
     '王林',
     '男',
     to_date('02-10-1990', 'dd-mm-yyyy'),
     '计算机',
     50,
     NULL);

INSERT INTO xsb
    (xh, xm, xb, cssj, zy, zxf, bz)
VALUES
    (081103,
     '王燕',
     '女',
     to_date('06-10-1989', 'dd-mm-yyyy'),
     '计算机',
     50,
     NULL);

修改表

查询表中所有的数据

SELECT * FROM xsb;

为表中增加数据字段:

alter table 表名称 add(字段名称 字段类型 default 默认值,字段名称 字段类型 default默认值...)
ALTER TABLE xsb ADD(tel NUMBER(11));
ALTER TABLE xsb ADD(addr VARCHAR2(10));
ALTER TABLE xsb ADD(photo VARCHAR2(20) DEFAULT'nophoto.jpg');

修改表字段

alter table 表名称 modify(字段名称 字段类型 default 默认值);
ALTER TABLE xsb MODIFY(BZ VARCHAR(20));

删除表中的字段

alter table 表名称 drop column 列名称;
ALTER TABLE xsb DROP COLUMN photo;
ALTER TABLE xsb DROP COLUMN addr;

删除表

DROP TABLE stud;

操作表数据

插入数据

单条插入数据

insert inot table_name[(column_name1[,column_name2]...)] values(express1[,express2]...)
使用列列表增加数据
insert INTO xsb (xh,xm,xb,cssj) VALUES (201812,'小白','男',to_date('2022-09-08','yyyy-mm-dd'))
不使用列列表增加数据
INSERT INTO xsb VALUES (201813,'小白','男',to_date('2022-09-08','yyyy-mm-dd'),'Java',50,'大神',1999923)

批量插入数据

insert into table_name [(column_name1[,column_name2]...)] selectSubquery
CREATE TABLE new_xsb(
       xh CHAR(6) PRIMARY KEY,
       xm CHAR(8) NOT NULL,
       xb CHAR(2)
)

INSERT INTO new_xsb
SELECT xh,xm,xb FROM xsb 

修改记录

update table_name set {column_name1=express1[,column_name2=express2...] | (column_name1[,column_name2...]) = (selectSubquery)} [WHERE condition]

更新单列数

UPDATE emp SET sal = 2460 WHERE ename = 'SCOTT'

更新多列数据

UPDATE emp SET sal = sal*1.2 WHERE job = 'SALESMAN'

删除记录

--(1)delete 语句 
delete from table_name [where condition]
--(2)truncate 语句

选择投影和连接

选择

单目运算,通过一定的的条件把自己所需要的数据检索出来

投影

单目运算,从一个表A中生成一个新的表B,而这个新的表B值只包含原来A表中的部分列

连接

等值连接

两个表的某些列值相等

自然连接

进行自然连接运算要求两个表有共同属性(列),自然连接的运算结果表是在参与操作两个表的共同属性上进行连接后,再去除重复的属性后得到的新表

数据库的查询

select {[distinct | all] columns | *}
[into table_name]
from {table | views | other select}
[where condition]
[group by condition]
[having conditions]
[order by columns]

选择列

select [distinct | all] <select_list>

其中select_list 指出了结果的形式,select_list的主要语法格式如下.

{ *  /*选择当前表或者是视图的所有的列*/ 
 |{table_name | view_name | table_alias}.* /*选择当前表或者视图的所有列*/
 |{colume_name | expression}
 [[AS] column_alias] /*选择指定的列*/
 |cplumn_alias = expression /*选择指定的列并修改标题*/
}

查询所有的列

SELECT * FROM dept;

from 后面可以指定多个数据表:

FROM table_name1,table_name2,table_name3...table_namen

ex:

SELECT * FROM dept,salgrade;/*结果就是一一对应*/

查询指定的列

select column_name1,column_name2,column_name3,cloumn_namen

用这种查询方式的好处就是可以改变列在查询结果中默认的显示顺序.

SELECT job,ename,empno FROM emp;

为列指定别名

SELECT empno AS "a",ename b,job FROM emp;

计算列值

在使用select语句的时候,对数字数据和日期数据都可以使用算数表达式.

在select语句中可以使用算数运算符(+ - * / )包括括号

在select语句中不仅可以执行单独的数学运算,还可以执行单独的日期运算以及与列名关联的运算

SELECT sal*(1+0.1),sal FROM emp;

消除结果中的重复行

SELECT DISTINCT job FROM emp;

选择行

where语句必须紧跟在from子句之后,其基本语法格式为:

where <search_condition>

其中<search_codition>为查询条件,语法格式为:

{[NOT] <precdiate> | (<searche_condition>)}
[{AND | OR}[NOT] {<predicate> | (<search_condition>)}]
}[,...n]

其中,为判定运行,结果为TRUE,FALSE或UNKOWN,经常用到的语法格式为:

{expression {= | < | <= | > | >= | <> | !=}expression/*比较运算*/
| string_expression [NOT] LIKE string_expression [ESCAPE 'escape_character']/*字符串模式匹配*/
| expression [NOT] BETWEEN expression AND expression /*指定范围*/
| expression IS [NOT] NULL/*是否空值判断*/
| expression [NOT] in (subquery | expression[,...n])/*IN 子句*/
| EXIST (subery)/*EXIST子查询*/
}

表达式比较

expression {= | < | <= |> | >= | <> | !=} expression

当两个表达式都不为空值(NULL)的时候,比较运算符返回逻辑值true(真)或false(假)

而当两个表达式一个为空值或都为空值时,比较运算符将返回UNKNOWN

SELECT empno,ename,sal FROM emp WHERE sal > 1500

模式匹配

like谓词 用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char,varchar2,date类型的数据,犯会逻辑值true或false

string_expression [NOT] like string_expression[ESCAPE'escape_character']

"%" : 代表是一个或者是多个字符
"-" : 代表一个且只能是一个字符
SELECT empno,ename,job FROM emp WHERE ename LIKE 'S%'

范围比较

IN关键字

当测试一个数据值是否匹配一组目标值时,通常指示in关键字来指定列表搜索条件

IN(target_value1,target_value2,target_value3,...)
SELECT empno,ename,job FROM emp WHERE job IN('PRESIDENT','MANAGER','ANALYST')

SELECT empno,ename,job FROM emp WHERE job NOT IN('PRESIDENT','MANAGER','ANALYST')

拓展(上边IN里边 这样写是不是有点麻烦呢?):

SELECT empno, ename, job
  FROM emp
 WHERE ename NOT IN (SELECT ename FROM emp WHERE sal <= 950)

BETWEEN关键字

需要返回的某一个数据值是否位于两个给定的值之间,可以使用范围条件进行检索(包含两头)

between ... and

not between ... and

SELECT empno, ename, sal FROM emp WHERE sal BETWEEN 2000 AND 3000;
SELECT empno, ename, sal FROM emp WHERE sal NOT BETWEEN 2000 AND 3000;

空值比较

空值(NULL) 从技术上来说就是未知的,不确定的值,但是空值与空字符串不同,因为空值是不存在的值,而空字符串是长度为0的字符串.

因为空值代表的是未知的值,所以并不是所有的空值都相等

ex:“student"表中有两个学生的年龄未知,但无法证明这另个学生的年龄相等.这样就不能用”="运算符来检测空值.所以SQL引入了一个IS NULL关键字来检测特殊值之间的等价性,并且IS NULL关键字通常在WHERE子句中使用.

SELECT empno, ename, sal, comm FROM emp WHERE comm IS NOT NULL;

SELECT empno, ename, sal, comm FROM emp WHERE comm IS NULL;

子查询

在查询条件中,可以使用另一个查询的结果作为条件的一部分

子查询也可以用在insert,update以及delete语句中

单行子查询

单行子查询是指返回一行数据的子查询语句

/*在emp表中,查询既不是最高工资,也不是最低工资的员工信息*/
SELECT empno, ename, sal
  FROM emp
 WHERE sal > (SELECT MIN(sal) FROM emp)
   AND sal < (SELECT MAX(sal) FROM emp)

**坑:**在上边的语句中,如果内层子查询语句的执行结果为空值,那么外层的where子句就始终不会满足条件,这样该查询结果一定为空值,因为空值无法参与比较运算

在执行单行子查询时,要注意子查询的返回结果必须是一行数据,否则Oracle系统会提示无法执行

子查询中也不能包含order by子句

多行子查询

多行子查询是指返回多行数据的子查询,当在where子句中使用多行子查询时,必须使用当行比较符(in,any,all).

  • 使用in运算符
SELECT empno, ename, job
  FROM emp
 WHERE deptno IN (SELECT deptno FROM dept WHERE dname <> 'SALES')
  • 使用any运算符

这个运算符我使用的不多,any运算符必须与当行操作符结合使用,并且返回行只要匹配子查询的任意一个结果

SELECT deptno, ename, sal
  FROM emp
 WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 10)
   AND deptno <> 10
--在emp中,查询工资大于^部门编号^为10的任意一个员工工资的*其他部门*的员工信息
  • 使用all运算符

这个我使用的也不多,all必须与单行运算符结合使用,并且返回行必须匹配所有子查询的查询结果

SELECT deptno, ename, sal
  FROM emp
 WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30)
SELECT deptno, ename, sal
  FROM emp
 WHERE sal > ALL (3000,3002,3009);
关联子查询

这个我感觉就非常的重要了,sql里边大部分都是查询

关于查询,一定要清楚一个问题每个select语句就是一个表

在单行子查询和多行子查询中,内查询和外查询是分开执行的,也就是说内查询的执行与外查询的执行是没有关系的,外查询仅仅是使用内查询的最终结果.

在一些特殊的子查询中,内查询的执行需要借助于外查询,而外查询的执行又离不开内查询的执行,这是,内查询和外查询是相互关联的,这种子查询就被称为关联子查询

SELECT empno, ename, sal,job
  FROM emp f
 WHERE sal > (SELECT AVG(sal) FROM emp WHERE job = f.job)
 ORDER BY job

在上边的子查询中,内查询使用关联子查询计算每个职位的平均工资.而关联子查询必须要知道职位的名称,为此外查询就是用f.job字段值为内层查询提供职位名称,以便于计算出某个职位的平均工资.

如果外查询正在检索的数据行的工资高于平均工资,则该行的员工信息就会显示出来,否则不显示

在关联子查询的过程中,必须便利数据表中的每条记录,因此如果被遍历的数据表中有大量的数据记录,则关联子查询的执行速度就会比较缓慢.

连接

表别名

 SELECT e.empno 员工编号,e.ename 员工名称,d.dname 部门
 FROM emp e,dept d
 WHERE e.deptno = d.deptno
 AND e.job = 'MANAGER'

内连接

内连接就是用join指定用于连接的两个表,使用on指定连接表的连接条件.

select columns_list 
FROM table_name1 [inner] join table_name2
ON join_condition
SELECT e.empno, e.ename, d.dname
  FROM emp e
 INNER JOIN dept d
    ON e.deptno = d.deptno

多表查询中使用内连接,查询结果中质只包含了符合查询条件和连接条件的行.内连接消除了与另一个表中任何行不匹配的行

外连接

外连接扩展了内连接的结果集,除了返回所有的匹配的行外,还会返回一部分或全部不匹配的行.

  • 左外连接:left outer join / left join
  • 右外连接:right outer join/ right join
  • 完全外连接: full 欧特朗join/ full join

与内连接不同的是,外连接不只列出与连接条件匹配的行,还能够列出左表(左外连接时),右表(右外连接时)或两个表(完全外连接时)中所有复合搜索条件的数据行

左外连接
SELECT e.empno, e.ename, e.job, e.deptno, d.deptno, d.dname
  FROM emp e
  LEFT JOIN dept d
    ON e.deptno = d.deptno

结果:

    EMPNO   ENAME   JOB         DEPTNO DEPTNO 	DNAME
1	7934	MILLER	CLERK		10		10		ACCOUNTING
2	7839	KING	PRESIDENT	10		10		ACCOUNTING
3	7782	CLARK	MANAGER		10		10		ACCOUNTING
4	7902	FORD	ANALYST		20		20		RESEARCH
5	7876	ADAMS	CLERK		20		20		RESEARCH
6	7788	SCOTT	ANALYST		20		20		RESEARCH
7	7566	JONES	MANAGER		20		20		RESEARCH
8	7369	SMITH	CLERK		20		20		RESEARCH
9	7900	JAMES	CLERK		30		30		SALES
10	7844	TURNER	SALESMAN	30		30		SALES
11	7698	BLAKE	MANAGER		30		30		SALES
12	7654	MARTIN	SALESMAN	30		30		SALES
13	7521	WARD	SALESMAN	30		30		SALES
14	7499	ALLEN	SALESMAN	30		30		SALES
15	9527	EAST	SALESMAN		

从上面的查询结果中可以看到,虽然新插入的数据行deptno的列值为null,但是该行记录出现在了查询结果集中,这说明左外连接的查询结果会包含左表中不满足"连接条件"的数据行

右外连接
SELECT e.empno, e.ename, e.job, e.deptno, d.deptno, d.dname
  FROM emp e
 RIGHT JOIN dept d
    ON e.deptno = d.deptno
  EMPNO   ENAME   JOB         DEPTNO DEPTNO 	DNAME
1	7934	MILLER	CLERK		10		10		ACCOUNTING
2	7839	KING	PRESIDENT	10		10		ACCOUNTING
3	7782	CLARK	MANAGER		10		10		ACCOUNTING
4	7902	FORD	ANALYST		20		20		RESEARCH
5	7876	ADAMS	CLERK		20		20		RESEARCH
6	7788	SCOTT	ANALYST		20		20		RESEARCH
7	7566	JONES	MANAGER		20		20		RESEARCH
8	7369	SMITH	CLERK		20		20		RESEARCH
9	7900	JAMES	CLERK		30		30		SALES
10	7844	TURNER	SALESMAN	30		30		SALES
11	7698	BLAKE	MANAGER		30		30		SALES
12	7654	MARTIN	SALESMAN	30		30		SALES
13	7521	WARD	SALESMAN	30		30		SALES
14	7499	ALLEN	SALESMAN	30		30		SALES
15										40 		OPERATIONS

从上面的查询结果中可以看到,虽然部门编号为40的部门现在在emp表中还没有员工记录,但他却出现在了查询结果中,这说明右外连接的查询结果中会包含由表中不满足"连接条件"的数据行

外连接的简化写法:

外连接的连接运算符" (+) ",该运算符可以放在等号的左面也可以放在等号的右面,但一定要放在缺少相应信息的那一面

SELECT e.empno, e.ename, e.job, e.deptno, d.deptno, d.dname
  FROM emp e,dept d
WHERE  e.deptno = d.deptno(+)

这个结果就是和左外连接的结果一致了.

使用(+)运算符时的注意事项:

  1. 当使用(+)运算符执行外连接时,如果在where子句中包含多个条件,则必须在所有条件中都包含(+)操作符
  2. (+) 操作符只适用于列,而不能用在表达式上
  3. (+) 操作符不能与onin操作符一起使用
完全外连接

再执行完全外连接的时候,Oracle会执行一个完整的左外连接和右外连接查询,然后将查询结果合并,并消除重复的记录行.

SELECT e.empno, e.ename, e.job, d.deptno, d.dname
  FROM emp e
  FULL JOIN dept d
    ON e.deptno = d.deptno

结果:

 	EMPNO   ENAME   JOB         DEPTNO DEPTNO 	DNAME
1	9527	EAST	SALESMAN				
2	7369	SMITH	CLERK		20		20		RESEARCH
3	7499	ALLEN	SALESMAN	30		30		SALES
4	7521	WARD	SALESMAN	30		30		SALES
5	7566	JONES	MANAGER		20		20		RESEARCH
6	7654	MARTIN	SALESMAN	30		30		SALES
7	7698	BLAKE	MANAGER		30		30		SALES
8	7782	CLARK	MANAGER		10		10		ACCOUNTING
9	7788	SCOTT	ANALYST		20		20		RESEARCH
10	7839	KING	PRESIDENT	10		10		ACCOUNTING
11	7844	TURNER	SALESMAN	30		30		SALES
12	7876	ADAMS	CLERK		20		20		RESEARCH
13	7900	JAMES	CLERK		30		30		SALES
14	7902	FORD	ANALYST		20		20		RESEARCH
15	7934	MILLER	CLERK		10		10		ACCOUNTING
16					               	    40		OPERATIONS

自然连接

自然连接和内连接的功能相似,是指在检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行自动连接.

在自然连接中,用户不需要明确指定进行连接的列,这个任务由Oracle系统自动完成,自然连接使用"NATURAL JOIN"关键字

SELECT * FROM emp NATURAL JOIN dept WHERE sal > 2000

由于自然连接强制要求表之间必须具有相同的列的名称,这样容易在设计表时出现不可预知的错误,所以在实际应用系统开发中很少用到自然连接.但这毕竟是一种多表关联查询数据的方式,在某些特定的情况下还是有一定的使用价值.

**注意:**在使用自然连接的时候不能为列指定限定词(即表名或表的别名),否则Oracle系统会出现"ORA-25155:NATURAL连接中使用的列不能有限定词" 的错误提示

自连接

在应用系统的开发中,用户可能会有"自引用式"的外键. "自引用式"外键是指标中的一个列可以是该表主键的一个外键

自连接主要用在自参考表上显示上下级关系或者层次关系. 自参照表是指在同一张表不同列之间具有参照关系或主从关系的表

例如:emp表中包含empno和mgr,两者之间就具有参照关系. 就是谁是谁的管理者

为了显示雇员及管理者之间的对应关系,可以使用自连接.因为自连接是在同一张表之间的连接查询,所以必须定义表的别名

SELECT em1.ename 员工, em2.ename 管理者
  FROM emp em1
  LEFT JOIN emp em2 --左边的表把员工全部列出来
    ON em2.empno = em1.mgr --emp2表中的管理员(就相当于员工编号empno)编号,等于emp1中的管理员编号
 ORDER BY em1.mgr
SELECT em1.ename, em2.ename
  FROM emp em1
 RIGHT JOIN emp em2
    ON em2.MGR = em1.empno --right join 是往上边拼接的 把em2中的mgr与em1中的empno相等的.拼接到右表的后边
交叉连接

交叉连接实际上就是不需要然和连接条件的连接,他使用cross join关键字来实现,其语法格式入下.

select colums_list from table_name1 cross join table_name2

交叉连接的结果是一个笛卡尔积,这种查询结果是非常冗余的,但是可以通过where子句来过滤有用的记录信息

SELECT * FROM dept CROSS JOIN emp;

统计

**我感觉挺重要的:**为了简化表空间的管理并提高系统性能,Oracle建议将不同类型的数据对象存放到不同的表空间中,因此,在创建数据库之后,数据库管理员还应该根据具体应用的情况,建立不同类型的表空间. 例如:建立专门用于存放表数据的表空间,建立专门用于存放索引或簇数据的表空间

聚合函数

AVG(x[DISTINCT | ALL])  计算选择列表项的平均值,列表项目可以使一个列或多个列的表达式
COUNT(x[DISTINCT | ALL])返回查询结果中的记录数,列表项目可以使一个列或多个列的表达式
MAX(x[DISTINCT | ALL]) 返回选择列表项目中的最大数,列表项目可以使一个列或多个列的表达式
MIN(x[DISTINCT | ALL]) 返回选择列表项中的最小数,列表项目可以使一个列或多个列的表达式
SUM(x[DISTINCT | ALL]) 返回选择列表项目的数值总和,列表项目可以使一个列或多个列的表达式
VARIANCE(x[DISTINCT | ALL]) 返回选择列表系项目的统计方差,列表项目可以使一个列或多个列的表达式
STDDEV(x[DISTINCT | ALL]) 返回选择列表项目的标准偏差,列表项目可以使一个列或多个列的表达式

GROUP BY函数

这个语句博大精深啊

SELECT job, AVG(sal), SUM(sal), MAX(sal), COUNT(job) FROM emp GROUP BY job

在使用group by语句的注意事项:

  1. 在select子句的后面只可以有两类的表达式: 统计函数进行分组的列名
  2. 在select子句中的列名必须是进行分组的列,除此之外添加其他列名都是错误的,但是,group by子句后面的列名可以不出现在select子句中
  3. 在默认情况下,将按照GROUP BY子句指定的分组列升序排序,如果需要重新排序,可以使用order by子句指定新的排序顺序

HAVING子句

这个也比较精深

having子句通常与group by子句一起使用,在完成对分组结果统计之后,可以使用having子句对分组结果做进一步的筛选.如果不适用group by子句,having子句的功能与where子句一样

having子句和where子句的相似之处是定义搜索条件,唯一不同的是having子句中可以包含聚合函数

如果:

  • 在select语句中使用了group by子句,那么having子句将应用于group by子句创建的那些组
  • 如果指定了where子句,而没有指定group by子句,那么having子句将应用于where子句的输出,并且整个输出被看做是一个组
  • 在select语句中既没有指定where子句,也没有指定group by子句,那么having子句将应用于from子句的输出,并将其看作一个组

加深理解:

对having子句的作用的理解有一个办法,就是记住select语句中的子句处理顺序.在select语句中,首先由from子句找到数据表,where子句则接受from子句输出的数据,而having子句则接受来自group by,where,from子句的输出

SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000

排序

select columns_list
from table_name
[where conditional_expression]
[group by columns_list]
order by {order_by_expression[asc | desc]}[,...n]
SELECT deptno,empno,ename FROM emp ORDER BY deptno,empno

数据库视图

视图的概念

视图是一个虚拟的表,他由存储的查询构成,可以将它的输出看作一个表. 视图同真的表一样,也可以包含一系列带有名称的列和行数据

但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息

视图建立在关系表上,也可以在其他视图上,或者同时建立在两者之上.视图看上去非常像数据库中的表,甚至可以在视图中进行insert,update和delete的操作

通过视图修改数据的时候,实际上就是在修改基本表中的数据,与之相对应,改变基本表中的数据也会反映到由该表组成的视图当中.

创建视图

使用语句创建视图

创建视图前必须要拥有相应的权限

grant create view to scott;
create [or replace] view <view_name>[alias[,alias]...]
as <subquery>
[with check option] [constraint constraint_name]
[with read only]

解释:

  • alias: 用于指定视图的别名
  • subquery: 用于指定视图对应的子查询语句
  • with check option: 该子句用于指定在视图上定义的check约束
  • with read only: 该子句用于定义只读视图

在创建视图时,如果不提供视图的列别名,Oracle会自动使用子查询的列名或列别名;如果视图子查询包含函数或者是表达式,则必须定义列别名

CREATE OR REPLACE VIEW emp_view AS
SELECT empno,ename,job,sal,deptno
FROM emp
WHERE deptno = 20
CREATE OR REPLACE VIEW emp_view_complex AS--这里必须就得给别名
SELECT deptno ,MAX(sal) max_sal,MIN(sal) min_sal,AVG(sal) avg_sal
FROM emp
GROUP BY deptno

查询视图

SELECT * FROM emp_view
SELECT * FROM emp_view_complex

更新视图

不是所有的视图都可以被更新,只有对满足可更新条件的视图,才能进行更新.

  1. 可更新视图

    可更新的视图需要满足以下条件.

    没有使用连接函数,聚合函数和组函数

    创建视图的select语句找找那个没有聚合函数且没有group by ,onnect by,start with子句以及distinct关键字

    创建视图的select语句中不包括从基表列通过计算得到的列

    创建视图没有包含只读属性

    上边创建的第二个视图,就不能去更新

    INSERT INTO emp_view VALUES(9528,'东方','Manager','2000',20);
    SELECT * FROM emp_view
    UPDATE emp_view SET ename = '西方' WHERE empno = 9528
    DELETE FROM emp_view WHERE empno = 9528
    

    系统在执行create view 语句创建视图时,只是将视图的定义信息存入数据字典,并不会执行其中的select语句.对试图进行查询是,系统才会根据视图的定义从基本表中获取数据.

    由于select是使用最广泛,最灵活的语句,通过他可以构造一些复杂的查询,从而构造一个复杂的视图

  2. 修改数据

使用update语句可以通过视图修改基本表的数据

SELECT * FROM emp
UPDATE emp_view SET sal = 3000 WHERE empno = 7566

修改视图的定义

使用sql命令修改视图

CREATE OR REPLACE VIEW emp_view_union AS
SELECT d.dname,d.loc,e.empno,e.ename
FROM emp e,dept d
WHERE e.deptno = d.deptno AND d.deptno = 30;

SELECT * FROM EMP_VIEW_UNION

在上面的代码中,起着至关重要的作用的关键字是replace

删除视图

DROP VIEW emp_view
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值