sql与oracle的外连接
❶ sql 连接oracle的几种方式
1、相等连接
通过两个表具有相同意义的列,可以建立相等连接条件。
只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。
例 查询员工信息以及对应的员工所在的部门信息;
SELECT * FROM EMP,DEPT;
SELECT * FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
REM 显示工资超过2000的员工信息以及对应的员工的部门名称。
2、
外连接
对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。除了显示匹配相等连接条件的信息之外,还显示无法匹配相等连接条件的某个表的信息。
外连接采用(+)来识别。
A) 左条件(+) = 右条件;
代表除了显示匹配相等连接条件的信息之外,还显示右条件所在的表中无法匹配相等连接条件的信息。
此时也称为"右外连接".另一种表示方法是:
SELECT ... FROM 表1 RIGHT OUTER JOIN 表2 ON 连接条件
B) 左条件 = 右条件(+);
代表除了显示匹配相等连接条件的信息之外,还显示左条件所在的表中无法匹配相等连接条件的信息。
此时也称为"左外连接".
SELECT ... FROM 表1 LEFT OUTER JOIN 表2 ON 连接条件
例 显示员工信息以及所对应的部门信息
--无法显示没有部门的员工信息
--无法显示没有员工的部门信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
--直接做相等连接:
SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
REM 显示员工信息以及所对应的部门信息,显示没有员工的部门信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;
SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
REM 显示员工信息以及所对应的部门信息,显示没有部门的员工信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);
SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
3、不等连接
两个表中的相关的两列进行不等连接,比较符号一般为>,<,...,BETWEEN.. AND..
REM SALGRADE
--DESC SALGRADE;
--SELECT * FROM SALGRADE;
REM 显示员工的编号,姓名,工资,以及工资所对应的级别。
SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMP
WHERE EMP.SAL BETWEEN LOSAL AND HISAL;
REM 显示雇员的编号,姓名,工资,工资级别,所在部门的名称;
SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADE
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.SAL BETWEEN LOSAL AND HISAL;
4、自连接
自连接是数据库中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。下面介绍一下自连接的方法:
将原表复制一份作为另一个表,两表做笛卡儿相等连接。
例:显示雇员的编号,名称,以及该雇员的经理名称
SELECT WORKER.ENAME,WORKER.MGR,MANAGER.EMPNO,MANAGER.ENAME FROM EMP WORKER,EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO;
❷ 如何使用PL/SQL 11.0连接远程Oracle12c服务器
ORACLE客户端连服务器注意事项
1. 通SQL*NET协议ORACLE客户端连服务器般需要配置sqlnet.oratnsnames.ora,init.ora
默认目录$ORACLE_HOME/network/admin 目录
设置环境变量TNS_ADMIN指向想用sqlnet.oratnsnames.ora目录
例:
TNS_ADMIN=/home/oracle/config/9.0.1;export TNS_ADMIN
sqlnet.ora文件决定找数据库服务器别名式
默认参数
参数SQLNET.AUTHENTICATION_SERVICES= (NONE,NTS)表明用户连接Oracle服务器使用哪种验证式NONE表示Oracle身份验证NTS表示操 作系统身份验证两种式并用
ORA_DBA组域用户本用户需要Oracle用户名密码登录Oracle且该组用户登录数据库都具SYSDBA权限(实 例建立类似组ORA_SID_DBA其SID指实例名)同理:ORA_OPER组员具SYSOPER角色权限
登录式 sqlplus / as sysdba
或者sqlplus nolog,SQL>connect / as sysdba
NAMES.DEFAULT_DOMAIN = WORLD
NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)
表明解析客户端连接所用主机字符串式
TNSNAMES表示采用TNSNAMES.ORA文件解析;
ONAMES表示使用自名称服务器(Oracle Name Server)解析目前Oracle建议使用轻量目录访问协议LDAP取代ONAMES;
HOSTNAME表示使用host文件DNSNIS等解析;
ORACLE客户端服务器默认域名需要用#号注释第行
#NAMES.DEFAULT_DOMAIN = WORLD
使起作用
NAMES.DIRECTORY_PATH指定找服务器别名顺序 (本tnsnames.ora文件, 命名服务器, 主机名式)
服务器sqlnet.ora设置检查客户端否alive间间隔
sqlnet.expire_time = 10
init.oraRemote_Login_Passwordfile身份验证影响
三选值:
NONE:默认值指示Oracle系统使用密码文件通操作系统进行身份验证特权用户拥SYSORASYSOPER权限EXCLUSIVE:
1.表示数据库实例使用密码文件
2.允许SYSORASYSOPER权限赋值给SYS外其用户
SHARED:
1.表示数据库实例使用密码文件
2.允许SYSORASYSOPER权限赋值给SYS外其用户
所要操作系统身份登录Remote_Login_Passwordfile应该设置NONE
登录用户ORA_DBA组ORA_OPER组员登录数据库需要Oracle创建前操作系统用户相同用户名前用户域用 户则名称:domainname\yourname,本计算机用户则名称:computername\yourname
创建:
create "domainname\yourname" identified externally;
操作系统修改HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0面添加AUTH_PREFIX_DOMAIN值设FALSE,创建Oracle用户忽略 掉域名
种式init.ora参数影响数据库何匹配windows用户Oracle用户os_authent_prefix = ""
缺省空Oracle8i前该参数使用OPS$作用户名前缀.(Oracle用户名度限制30字符)
tnsnames.ora文件写数据库服务器别名详细内容几种写:
# 般写
APPDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = appdb)
)
)
# 明确标明用dedicated式连接数据库
APPD=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.35)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=appdb)
(SERVER=DEDICATED)))
# listener端口做均衡负载式连接数据库
APPS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1856))
)
(CONNECT_DATA =
(SERVICE_NAME = appdb)
)
)
# 注意:数据库服务器用MTS客户端程序需要用database link明确指明客户端用dedicated直连式,
# 遇跟布式环境关ORACLE BUG
# 般情况数据库服务器用直接连接些除非实数据库连接数接近1000
2. /etc/hosts (UNIX)
或者windows\hosts(WIN98) winnt\system32\drivers\etc\hosts (WIN2000)
客户端需要写入数据库服务器IP址主机名应关系
127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.45 tomcat tomcat
202.84.10.193 bj_db bj_db
些候我配置第步tnsping 数据库服务器别名显示功
sqlplus username/password@servicename通,jdbc thin link 通候,
定要忘客户端做步原能DNS服务器没设置服务器IP址主机名应关系
同私IPInternet公IP私IP写前面公IP写面
编辑前留备份增加行用复制粘贴避免编辑hosts空格或者tab字符错误
3. UNIXORACLE数据库环境OS客户端需要配置面两环境变量
ORACLE_SID=appdb;export ORACLE_SID
TWO_TASK=appdb;export TWO_TASK
指定默认目标数据库
享:
1
喜欢
0
赠金笔
阅读(2478)┊ 评论 (0)┊ 收藏(0) ┊禁止转载 ┊ 喜欢▼ ┊打印┊举报
已投稿:
排行榜
前篇:Delphi IdHTTP1载文件防止假死
篇:我博客今6岁246我领取元博主徽章北京科兰
❸ 濡备綍阃氲繃PLSQL杩炴帴oracle鏁版嵁搴
阃氲繃Oracle Net Configuration Assistant锛坥racle缃戠粶閰岖疆锷╂坠锛夛纴閰岖疆链鍦扮绣缁沧湇锷″悕锛屼粠钥屽疄鐜拌繛鎺oracle鏁版嵁搴
鎸塛indows寰芥爣阌锛岃繘鍏ュ紑濮嬬晫闱锛屾垒鍒癗et Configuration Assistant锛屽崟鍑昏繍琛屼箣
杩涘叆 Oracle Net Configuration Assistant閰岖疆钖戝硷纴鍕鹃 链鍦扮绣缁沧湇锷″悕閰岖疆锛屽崟鍑讳笅涓姝ワ绂 鍦ㄧ绣缁沧湇锷″悕閰岖疆涓锛屽嬀阃 娣诲姞锛屽崟鍑讳笅涓姝
杈揿叆链嶅姟钖嶏细dbname锛坥racle鏁版嵁搴撶殑链嶅姟钖嶉氩父鏄鍏ㄥ眬鏁版嵁搴揿悕锛屽嵆杈揿叆鍒涘缓镄勬暟鎹搴揿悕绉帮级
❹ SQL中的左外连接和+号的用法
SQL中的左外连接和+号的用法
Oracle 左连接、右连接、全外连接、(+)号作用
Oracle 外连接
(1)左外连接 (左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
外连接(Outer Join)
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种: 左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
在做实验之前,我们先将dave表和bl里加一些不同的数据。 以方便测试。
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 怀宁
SQL> select * from dave;
ID NAME
---------- ----------
8 安庆
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外连接(Left outer join/ left join)
left join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL.
示例:
SQL> select * from dave a left join bl b on a.id = b.id;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此处B表为null,因为没有匹配到
8 安庆 -- 此处B表为null,因为没有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安庆
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。
SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用关键字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安庆
2.2 右外连接(right outer join/ right join)
和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。 Dave表不足的地方用NULL填充.
示例:
SQL> select * from dave a right join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null 填充
已选择7行。
SQL> select * from dave a right outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null 填充
已选择7行。
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。
SQL> Select * from dave a,bl b where a.id(+)=b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁
2.3 全外连接(full outer join/ full join)
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。
示例:
SQL> select * from dave a full join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 怀宁
已选择9行。
SQL> select * from dave a full outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
最初由 ghc_x 发布
[B]有两个表T1和T2,两个表除了主键索引外均无其他索引,这两个表由T1.F1(主键),T2.F2(主键)进行左连接,SQL语句有两种写法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
当查看1的执行计划时发现T1为全表扫描,T2为索引扫描。
当查看2的执行计划时发现两个表均为全表扫描。
有人知道这是为什么吗? [/B]
我一直以来也是认为这两种写法是一样的,没想到楼主特意去看了它们的执行计划,而且发现了它们的不同,这使得我比较惊讶。
按照书上的讲法,这两种写法是没有什么区别的,后一种写法只不过是前一种写法的新版本。
为什么两者的执行计划会不一样呢?
我仔细看了一下两者的执行计划,发现了为什么后一种要两个表都全表 扫描,而前一个表有一个索引扫描。
原来前者选择的优化器是RULE,而后者选择的优化器是CBO的ALL ROWS。
不过,似乎要后者的效率高。
1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
这样再看下执行计划吧