Oracle学习笔记
MLDN_oracle课堂笔记(全)_pdf阅读笔记.txt
=======================================
(原创__野草哥)---------------------------------------
二、数据库
//===============================================================
--------Oracle安装信息--------
Enterprise Manager Database Control URL - (orcl) :http://PC-201208120001:1158/em数据库配置文件已经安
装到 F:\oracle\product\10.2.0,同时其他选定的安装组件也已经安装到 F:\oracle\product\10.2.0\db_1。
iSQL*Plus URL 为:http://PC-201208120001:5560/isqlplus
iSQL*Plus DBA URL 为:http://PC-201208120001:5560/isqlplus/dba
用户 密码
SYS sys
SYSTEM system
scott scott
SYSMAN sys
DASNMP sys
--------------------------------
--------------------------------
连接:
driver = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@localhost:1521:orcl
dbUser = scott
dbPassword = scott
--------------------------------
Oracle中提供的三个主要用户及其默认密码
超级管理员:sys/chang_on_install
普通管理员:system/manager
普通 用户:scott/tiger ,此用户在使用的时候需要先进行解锁
----
oms用户: sysman/oem_temp
高级队列管理员:aqadm /aqadm SYSDBA或NORMAL
复制管理员: Dbsnmp/dbsnmp SYSDBA或NORMAL
--------------------------------
SET LINESIZE 300 设置行显示长度
SET PAGESIZE 30 设置页显示行数
--------------------------------
用户解锁:进入管理员帐户然后,alert scott account unlock;
--------------------------------
conn sys/sys as sysdba 以系统管理员身份连接到sys(超级)用户
--------------------------------
使用SYS用户的时候如果要查询一个表,则需要指明表所在的用户(数据库)。
select * from scott.emp;
否则就conn连接到那个表所在的用户/数据库去
--------------------------------
show user; 显示当前连接用户
--------------------------------
使用命令/ ed 文件名 /可以对查询语句进行编辑(调用记事本编辑,如果不填文件名,则默认调用afiedt.buf来编
辑),
使用命令/ @文件名 /命令进行调用(运行)。也可以直接调用已经存在的。如果使用ed创建的文件和
sqlplus.exe在同一目录下,使用@调用可以不加路径。调用其他地方存在的文件则需要加上完整的路径
使用命令/ save 文件名/可以保存sql语句到文件
--------------------------------
//===============================================================
DML: Data Manipulation Language insert、update、delete
DDL: Data Definition Language create、alter、drop、truncate
DCL: Data Control Language
------------基本操作------------
select * from all_tables;
select * from user_tables;
去除重复项 distinct
---
控制查询后显示格式: ||字符串连接
select '编号是:'||empno||'的雇员,姓名是:'||ename||',工作是:'||job from emp
---
oracle的日期格式:15-09月-98
---
条件范围选择 between...and... 包含临界
---
模糊查询 like '%'可以匹配任意长度,'_'可以匹配一个长度
模糊查询工资的时候是也是单个字符的开始匹配
使用escape标识符来查找特殊字符,比如% 和_ 等
select*from emp where ename like'%*_%'escape'*' 表示*号后面的符号不当做特殊字符处理,此
处'_'就是普通的下划线,不作为匹配一个长度的特殊字符
---
Oracle中数据区分大小写,但SQL语句不区分
> >= = <= < != <>
对结果排序 order by ASC 升序(默认) DESC 降序
--------------------------------
//===============================================================
---------单行函数---------------
1、 -- 单行注释
/* */ 多行注释
2、 字符函数
大小写转换 UPPER() LOWER()
eg: SELECT UPPER('smith') FROM DUAL
将单词第一个字母大写 INITCAP()
字符串连接 CONCAT eg:SELECT CONCAT('A','B') FROM DUAL
没有|| 好用
字符串截取 substr('abcde', 2, 3) 截取结果bcd
据说Oracle中substr()函数的截取从0或者1开始都行,比较智能
substr('lijunhua',-4,2) nh
substr('lijunhua',6) hua
字符串长度 length('sdf')
内容替换 replace('12343','3','x') 把'3' 替换为'x'、
指定字符串第一次出现的位置 instr('sdfsasd',"fs") 3
左侧填充 Lpad('sdfsdf',10,'*') ****sdfsdf
右侧填充 Rpad('sdf',10,'*') sdfsdf****
去掉首位空格 Trim(' Mr Smith ') Mr Smith
3、 数值函数
四舍五入 ROUND(789.456, 2) 789.46
ROUND(789.234, -2) 800
截断操作 TRUNC(264.2362, 2) 264.23
TRUNC(264.2362, -2) 200
取余/取模 MOD(10,3) 1
4、 日期函数
SELECT SYSDATE FROM DUAL; SYSDATE 表示当前日期
30-8月 -11
MONTHS_BETWEEN() 两个参数,求出给定日期范围的月数(第一个-第二个)
ADD_MONTHS() 在指定的日期上加上指定的月数,求出之后的日期
NEXT_DAY(SYSDATE,'星期一') 从第一参数计算,下一个第二参数日子是哪一个日期
LAST_DAY() 求出当前日期月的最后一天
5、 转换函数
日期-/+数字=日期
日期-日期=数字
TO_char() 转换成字符串
日期拆分 TO_CHAR(SYSDATE,'yyyy')
TO_CHAR(SYSDATE,'mm')
TO_CHAR(SYSDATE,'dd')
日期显示格式 TO_CHAR(SYSDATE,'yyyy-mm-dd')
2011-08-29
TO_CHAR(SYSDATE,'fmyyyy-mm-dd')
2011-8-29 去掉前导0
转换成数字
TO_CHAR(sal,'99,999') 1,600
TO_CHAR(sal,'$99,999') $1,600
TO_CHAR(sal,'L99,999') ¥1,600
$美元 L本地金额符号
TO_NUMBER() 将字符转换为数字
TO_NUMBER('123')+TO_NUMBER('123') 246
TO_DATE() 转换成日期
可以将字符串变为DATE型的数据
SELECT TO_DATE('2011-08-29','yyyy-mm-dd') FROM DUAL
29-8月 -11
SELECT TO_CHAR(TO_DATE('2011-08-29','fmyyyy-mm-dd')) FROM DUAL
2011-8-29
6、 通用函数NVL(comm,0) 如果comm为null 则转换为0
NULLIF()函数 如果表达式exp1与exp2的值相等则返回null,否则返回exp1的值
NVL2(a,b,c)函数 如果a为空就返回c,a不为空返回b
select empno,ename,sal,comm,nvl2(comm,sal+comm,sal) total from emp;
COALESCE()函数 一次考查各参数表达式,遇到非null即停止并返回该值
select empno,ename,sal,comm,coalesce(sal+comm,sal,0) 总收入 from emp;
CASE表达式
select empno,ename,sal,
case deptno
when 10 then '财务部'
when 20 then '研发部'
when 30 then '销售部'
else '未知部门'
end 部分
from emp;
DECODE函数类似于if ... else if ... else 和CASE表达式类似,实现多路分支结构
DECODE(col/expression,search1,result1[search2,result2,...][,default])
返回与col相等的searchi对应的resulti,如果都不满足,则发挥default
单行函数嵌套
select empno,lpad(initcap(trim(ename)),10,'') name,job,sal from emp;
//===============================================================
----------
注意:
1 如果程序中存在group by,并指定了分组条件,这样可以将分组条件一起查询出来
2 在使用分组函数的时候,不能出现分组函数和分组条件之外的字段(只能出现分组函数和分组条件)
3分组函数不能和单行函数混用
4不允许在where子句中使用分组函数
----------
-----------左右连接-------------
......
------------组函数--------------
count() 求出全部的记录数
max() 求出一组中的最大值
min()
avg() 求出平均值
sum() 求和
------------分组统计------------
分组函数只能在分组中使用,不允许出现在where语句之中;对分组的每一组进行条件限制使用having()子句
----------
having子句的用法
having子句对group by子句所确定的组进行控制,having子句条件中只允许涉及常量,聚组函数 或group
by子句中的列。
----------
select {distinct} *|列1 别名1|列2...
from 表名1 别名1,表名2...
{where 条件(s)}
{group by 分组条件 {having 分组条件} } having子句是对单个组的条件限制
{order by 排序字段 asc|desc, 排序字段 asc|desc}
----------
只要一列上存在重复的内容才有可能考虑分组
----------
分组函数可以嵌套使用,但是在嵌套使用的时候不能再出现分组条件的查询语句
select deptno,max(avg(sal)) from emp group by deptno;
此句错误,不能再出现select 后的deptno 。
------------子查询--------------
单列子查询 一列的一个内容
单行子查询 多个列
多行子查询 多条记录(子查询是分组查询)
in 和 =any 的功能完全一样
>any 比里面的最小值要大
<any 比里面的最大值要小
>all 比里面最大的值要大
<all 比里面最小的值要小
----------------------------------------------------
对于 in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用 in,反之如果外
层的主查询记录较少,子查询中的表大,又有索引时使用 exists。
其实我们区分 in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是
exists,那么以外层表为驱动表,先被访问,如果是 IN,那么先执行子查询,所以我们会 以驱动表的快
速返回为目标,那么就会考虑到索引及结果集的关系了,另外 IN 是不对NULL 进行处理
----------------------------------------------------
//===============================================================
-----------更新操作-------------
1、表的复制
create table myemp as select * from emp;
create table myemp as select * from emp where 1<>1;
2、表的更新
update emp set sal=6666 where empno=7899;
update emp set sal=6666,comm=1212 where empno in (7788,6789);
3、表的删除
delete from emp; 直接删除表
delete from emp where empno=7789;
delete from emp where sal in(5000,3500)
-----------事务处理-------------
事务提交,在oracle中对于每一个连接到数据库的窗口(sqlplus)连接之后都会与数据库连接建立一个session
,一个session对数据库所做的修改不会立即反映到数据库的真实数据之上,是允许回滚的,当一个session提交所
有的操作后,数据库才真正的作出修改。
commit 提交事务
rollback 回滚事务
----------创建和管理表----------
创建表:
create table 表名称(...)
create table 表名称 as(子查询) 当子查询没有行的时候,新表只有结构
修改表:(列为空才能修改)
alter table 表名 add (新列名 类型 DEFAULT 默认值, ...) 添加数据
alter table 表名 modify(列名 类型 DEFAULT 默认值, ...) 修改字段
alter table 表名 drop column (列名) 删除列
rename 表名 to 表名 修改表名
删除表空间
drop tablespace tablespacename[including contents[and datafiles]]
删除用户
drop user XXXX cascade;
注意:
删除表中全部数据时,须使用truncate table 表名 (截断表),直接删除表中全部数据; 因为用drop
table 表名,delete * from 表名 时,tablespace 表空间该表占用空间并未释放,反复几次drop,delete 操作后
,该tablespace 上百M的空间就被耗光了
------------约束----------------
主键约束:primary key
非空约束:not null
唯一约束:unique
检查约束:check
age number(3) not null check(age between 0 and 150),
sex varchar2(2) default '男' check(sex in ('男','女','中')),
constraint 约束名 check()
主外键约束:foreign key
constraint 约束名 foreign key(pid) references person(pid)
第一个pid为当前表(子表)的外键 第二个pid为关联表(父表)的主键
子表中的外键在父表中必须是主键
删除时先删除子表,再删除父表
强制删除父表: drop table 表名 cascade constraint;
在主外键关联中使用级联删除:删除数据时子表中存在此项的关联而无法删除,可以使用级联删除操作,
自动删除掉其对应的子表记录
constraint 约束名 foreign key(pid) references person(pid) on delete cascade
--------------------
约束类型的命名统一:
primary key: 主键字段_pk
unique: 字段_uk
check: 字段_ck
foreign key: 父字段_子字段_fk
--------------------
修改约束:
alter table 表名 add constraint 约束名 约束类型(字段);
eg: alter table person add constraint person_pid_pk primary key(pid)
person_pid_pk 为此约束的名称
或者在表内部添加约束
age number(3) not null check(age between 0 and 150),
sex varchar2(2) default '男' check(sex in ('男','女','中')),
constraint 约束名 check(sex in('男','女','中'))
删除约束:alter table 表名 drop constraint 约束名;
添加/删除主键(设置/取消主键)
Alter table tabname add primary key(列名)
Alter table tabname drop primary key(列名)
--------------------------------
ROWNUM表示行号,是一个列(伪列),此列可以在每张表中出现
select ROWNUM,empno,ename,job,sal,hiredate from emp where ROWNUM<=5;
ROWNUM EMPNO ENAME JOB SAL HIREDATE
1 7366 SMITH CLERK 800 17-12月-80
2 ...
3 ...
4 ...
5 ...
--------------------------------
集合操作
UNION(联合) 将多个查询的结果组合到一个查询结果之中,没有重复内容
UNION ALL ...,包含重复值
intersect(交叉,相交) 返回多个查询结果中相同的部分
minus(减去) 返回两个查询结果的差集
--------------------------------
//===============================================================
-------------视图---------------
建立一个视图:
create view 视图名 as 子查询 with check option;
创建一个视图
create or replace view 视图名 as 子查询 with check option;
创建或者替换一个视图
with check option 表示不能更新视图的创建条件
with read only 表示创建的视图只读
视图中不应该包含真实数据的
-------------序列---------------
创建序列
create sequence 序列名
[increment by n] ---n代表每次增长的幅度(increment增加)
[start with n] ---n代表增长的起始位置,默认值为1
[{maxvalue n|nomaxvalue}] ---n代表最大值
[{minvalue n|nominvalue}] ---n代表最小值
[{cycle|nocycle}] ---cycle 是否循环,如果不循环则到达最大值时就不在增长
[{cache n|nocache}]; ---cache 隐藏
---------同义词(了解)-------------
create sysnonym 同义词名称 for 用户名.表名称
create synonym emp for scott.emp;
drop synonym 同义词名称;
drop synonym emp;
(此种只适合oracle)
-----------用户管理-------------
角色:
create role 角色名;
grant create session to 角色名;
drop role 角色名;
注意:有些系统权限无法直接赋予角色,角色不属于某个用户,是共用的
创建一个用户
create user 用户名 identified by 密码;
create table 与create any table的区别 前者给自己建表,后者给自己与别人建表
-------------
赋予/回收权限(4个系统权限)
grant/revoke create session to/from 用户名; (无此权限不能登陆)
grant/revoke create table to/from 用户名;
grant/revoke unlimited tablespace to/from 用户名;
grant create session to public;
查询当前用户的系统权限:
select * from user_sys_privs;
对象权限
grant/revoke select on 表名 to/from 用户名;
grant/revoke all on 表名 to/from 用户名;
查询当前用户拥有的对象权限
select * from user_tab_privs;
对象权限可以控制到列
grant update(列名) on 表名 to 用户名;
系统权限的传递
grant create table to 用户名 with admin option;
对象权限的传递
grant select on 表名 to 用户名 with grant option;
oracle中的两个权限角色,可直接赋予用户----connect和resource
grant connect,resource to 用户名;
------------
改密操作
alter user 用户名 identified by 密码;
让密码失效
alter user 用户名 password expire; (expire 终止)
锁住/解锁用户
alter user 用户名 account lock/unlock;
表的访问权限赋予/回收(属于对象权限)
grant/revoke select,delete on scott.emp to/from 用户名;
--------------------------------
一些常用命令
select table_name from user_tables 查看当前用户自建的表名
select*from tab 查看该用户下的所有对象
disconnect 断开连接
--------------------------------
//===============================================================
//稍后补上试验SQL语句:
--------------------------------
//试验用的SQL语句如下(我会补上所有我使用过的SQL,前面SQL的是基于Oracle的scott账户里面的默认四张表):
//----
select * from emp where hiredate between '1-1月-81' and '31-12月-81';
select * from emp where hiredate >= '1-1月-81' and hiredate<='31-12月-81';
select * from emp where ename='SMITH';
select * from emp where empno not in (7369, 7499, 7521) and ename in ('SMITH','ALLEN','KING');
select * from emp where hiredate LIKE '%2%';
select * from emp where sal LIKE '%5%';
select * from emp where sal in 1600;
select * from emp where ename > 'SMITH';
select * from emp order by sal asc, job asc, hiredate asc;
select upper('smith') from dual;
select * from all_tables;
select * from user_tables;
select * from Tab;
--字符函数
select * from emp where ename=upper('Smith');
select lower('hELLOWORLD') from dual;
select initcap('hELLOWORLD') from dual;
select initcap(concat(substr('1hELL32',2,4),replace('OWORLr','r','D to'))) from dual;
select ename 姓名, substr(ename,-3,3) 尾三字符 from emp;
select ename 姓名, instr(ename, 'S') 位置 from emp;
select ename 姓名, lpad(ename, 10, '*+') 位置 from emp;
select ename 姓名, Rpad(ename, 10, '_') 位置 from emp;
select ename 姓名, trim(' SSH'), ' ljh' from emp;
--分页
select * from (
select e.*, rownum rn from(
select * from emp order by sal desc
) e where rownum <21
) where rn >10;
select ename from emp where
empno in (select empno from (
select e.*, rownum rn from(
select * from emp order by sal desc
) e where rownum <21
) where rn >10)
and empno not in
(select empno from (
select e.*, rownum rn from(
select * from emp order by sal desc
) e where rownum <11
) where rn >0);
--数值函数
select round(789.654) from dual;
select round(789.654, 2) from dual;
select round(789.654, -2) from dual;
select trunc(789.648) from dual;
select trunc(789.648, -2) from dual;
select trunc(789.648, 2) from dual; --trunc()函数也鞥截取日期 例如:
select trunc(sysdate), sysdate from dual;
select mod(10, 3) from dual;
--日期函数
select sysdate from dual;
select trunc(sysdate), sysdate from dual;
select * from emp where to_char(hiredate, 'yyyy-MM-dd')='1981-09-28';
select * from emp where to_date('1981-09-28', 'yyyy-MM-dd')=hiredate;
select empno, ename, (sysdate-hiredate) from emp;
select empno, ename, round(sysdate-hiredate) from emp;
select empno, ename, round((sysdate-hiredate)/7) from emp;
select empno, ename, months_between(sysdate, hiredate) from emp;
select add_months(sysdate, 4) from dual;
select next_day(sysdate, '星期一') from dual;
select last_day(sysdate) from dual;
select sysdate+1*30 from dual;
select sysdate-(sysdate-5) from dual; --结果是5
--转换函数
select empno,ename,to_char(hiredate,'yyyy'), to_char(hiredate,'mm'), to_char(hiredate,'dd'), to_char(hiredate,'hh24'), to_char(hiredate,'mi'), to_char(hiredate,'ss') from emp;
select empno,ename,to_char(hiredate,'fm yyyy-mm-dd hh24miss') from emp; --fm 去掉日期中的前导0
select empno,ename,to_char(hiredate,'fm yyyy-mm-dd') from emp;
select
sysdate,
Days,
A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
from
(
select
trunc(sysdate) Days,
sysdate - trunc(sysdate) A
from dual
);
select sysdate-trunc(sysdate) hms from dual; --时分秒那一段代表的天数,是个小数,乘以24即得天数...
--获取时分秒 --毫秒数没取到
select
hms,
trunc(hms*24) 小时,
trunc(hms*24*60 - trunc(hms*24)*60) 分钟,
trunc(hms*24*60*60 - trunc(hms*24*60)*60) 秒,
trunc(hms*24*60*60*10 - trunc(hms*24*60*60)*10) 毫秒
from(
select sysdate-trunc(sysdate) hms from dual
);
select to_char(sal, 'L99,999') from emp;
select to_number('134')+'134' from dual;
select '134'||134 from dual;
select to_date('2012-09-11', 'yyyy-mm-dd') from dual;
--通用函数
-- nvl(arg, a) 吐过arg为null则用a替代
select empno, ename, (sal+nvl(comm,0))*12 from emp;
select comm, nvl(comm,0) from emp;
-- nullif(exp1, exp2)表达式相等则返回null,否则返回表达式一的值
select nullif(1+2, 1+2), nullif(3+1, 3) from dual;
-- nvl2(a, b, c) 如果a为null,返回c,否则返回b
select nvl2(comm, 0, 1) 是否有奖金 from emp;
-- coalesce(exp1, exp2, exp3, ...) 依次考查各个表达式,遇到非null则停止并返回该表达式的值
select coalesce(sal+comm, sal, 0) 年薪 from emp;
-- case表达式
select empno, ename, sal,
case deptno
when 10 then '财务部' when 20 then '研发部'
when 30 then '销售部' else '未知部门'
end 部门
from emp;
-- decode() 函数 类似于if...else if...else 和case表达式也类似
select decode( to_number(4+1), 1, '内容1', '2', 222, '3', 23, 'abcd_default') from dual;
select empno 编号, ename 姓名, hiredate 雇期,
decode(job, 'CLERK', '业务员', 'SALESMAN', '销售人员', '未知职位') 职位
from emp;
select empno, lpad(initcap(trim(ename)),8,' ') name, job, sal from emp;
----------
--语法练习
----------
select * from emp where deptno=30;
select empno 编号, ename 姓名, deptno 部门号 from emp where job = upper('CLERK');
select * from emp where comm > sal*0.6;
-- and 优先级高于 or
select * from emp
where
deptno=10 and job=upper('manager') or
deptno=20 and job='CLERK' or
job not in ('MANAGER','CLERK') AND SAL>2000;
select distinct job from emp where comm is not null;
select * from emp where comm is null or comm<100;
select * from emp where empno not in
(select empno from emp where comm>=100);
select * from emp where last_day(hiredate)-2 = hiredate;
select * from emp where months_between(sysdate,hiredate)/12 > 30;
select ename from emp where length(ename)=5;
select ename from emp where ename not like '%R%'
select ename, substr(ename,0,3), substr(ename,1,3), substr(ename,2,3) from emp;
select replace(ename, 'A', 'a') from emp order by ename;
select ename, hiredate from emp order by hiredate;
select * from emp order by job desc, sal;
select ename, to_char(hiredate, 'yyyy') year, to_char(hiredate, 'mm') month
from emp order by month, year;
select ename, round(sal/30) from emp;
select * from emp where to_char(hiredate,'mm')=2;
select ename 姓名, round(sysdate-hiredate) 入职天数 from emp;
select ename from emp where ename like '%A%';
select ename, trunc(months_between(sysdate,hiredate)/12) year,
trunc(mod(months_between(sysdate,hiredate),12)) mon,
trunc(mod(sysdate-hiredate, 30)) day
from emp;
---------------多表查询----------------
--===================================--
select * from emp, dept where emp.deptno=dept.deptno;
select e.ename, e.job, m.ename, d.dname from dept d, emp e, emp m where e.mgr=m.empno and e.deptno=d.deptno;
select e.ename, e.sal, d.dname, s.grade from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal between s.losal and s.hisal;
select e.ename 雇员姓名, e.sal 雇员工资, d.dname 雇员部门,
decode(s.grade , 1, '第五等工资', 2, '第四等工资',
3, '第三等工资', 4, '第二等工资', 5, '第一等工资'
) 雇员工资等级,
m.ename 领导, m.sal 领导工资, ms.grade 领导工资等级
from emp e,dept d,salgrade s, emp m, salgrade ms
where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.mgr=m.empno
and m.sal between ms.losal and ms.hisal;
-- 左、右连接
select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno order by e.empno;
select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno(+) order by e.empno;
select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno(+)=d.deptno;
select e.empno, e.ename, d.deptno, d.dname, d.loc from dept d left join emp e on(e.deptno=d.deptno);
select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where d.deptno=e.deptno(+);
select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e right join dept d on(d.deptno=e.deptno);
select e.empno, e.ename, m.empno, m.ename from emp e, emp m where e.mgr=m.empno(+);
--二者结果一样
select * from emp e cross join dept d;
select * from emp, dept;
--二者结果一样
select * from emp e natural join dept d;
select * from emp e join dept d using(deptno);
--二者结果一样
select * from emp, dept where emp.deptno=dept.deptno;
select * from emp e join dept d on(e.deptno=d.deptno);
select * from dept d left join emp e on(e.deptno=d.deptno);
select * from emp e right join dept d on (e.deptno=d.deptno);
select * from emp e right outer join dept d on (e.deptno=d.deptno);
select * from emp e full outer join dept d on (e.deptno=d.deptno);
/*组函数*/
--select count(*), sum(sal) from emp;