关于表的操作
创建表
创建学生表
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(+)
这个结果就是和左外连接的结果一致了.
使用(+)
运算符时的注意事项:
- 当使用
(+)
运算符执行外连接时,如果在where
子句中包含多个条件,则必须在所有条件中都包含(+)
操作符 (+)
操作符只适用于列,而不能用在表达式上(+)
操作符不能与on
和in
操作符一起使用
完全外连接
再执行完全外连接的时候,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语句的注意事项:
- 在select子句的后面只可以有两类的表达式: 统计函数和进行分组的列名
- 在select子句中的列名必须是进行分组的列,除此之外添加其他列名都是错误的,但是,group by子句后面的列名可以不出现在select子句中
- 在默认情况下,将按照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
更新视图
不是所有的视图都可以被更新,只有对满足可更新条件的视图,才能进行更新.
-
可更新视图
可更新的视图需要满足以下条件.
没有使用连接函数,聚合函数和组函数
创建视图的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是使用最广泛,最灵活的语句,通过他可以构造一些复杂的查询,从而构造一个复杂的视图
-
修改数据
使用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