SQL中的笛卡儿积问题和多表连接操作
(使用scott用户)
SELECT * FROM scott.dept;--4
SELECT * FROM scott.emp;--14
/**
笛卡尔积
内连接(等值连接)
外连接(非等值连接)
自连接
*/
--笛卡尔积
--当查询数据时没有使用连接条件,会查出所有关联数据
--4*14=56
SELECT * FROM scott.dept,scott.emp;
--注意:多表连接查询一定要带关联条件,否则就会出现笛卡尔积
--总结:多表连接第一步就是找关联条件 
--emp.deptno = dept.deptno
--student.clazz_id = clazz.id
--多表连接的关联条件时N-1
--内连接(等值连接)
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno
AND scott.emp.empno = '7369';
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno;
--使用别名简化开发
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno
AND e.empno = '7369';
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno;
--筛选查询的列
--查询e表所有列 和 d表dname列,d表loc列
SELECT e.*, d.dname,d.loc
FROM scott.emp e,scott.dept d
WHERE d.deptno = e.deptno;
--内连接(等值连接) 标准sql的写法
SELECT *
FROM scott.dept d INNER JOIN scott.emp e
ON d.deptno = e.deptno;
--相同的结果 from where语句
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno;
--外连接(非等值连接)
SELECT * FROM scott.dept;--4
SELECT * FROM scott.emp;--14
--查询所有部门和员工信息
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno;
--因为部门40没有员工,当使用等值连接时,部门40的信息没有显示
--左外连接:+号在右边,左边的数据要全部显示,如果右边没有和左边表数据匹配的,则补null
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno(+);
--右外连接:+号在左边,右边的数据要全部显示,如果左边没有和右边数据匹配的,则补null
SELECT *
FROM scott.dept d,scott.emp e
WHERE e.deptno(+) = d.deptno;
--注意:+号的外连接写法只有Oracle支持
--标准sql语句
--左外连接
SELECT *
FROM scott.dept d LEFT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;
--右外连接
SELECT *
FROM scott.emp e RIGHT OUTER JOIN scott.dept d
ON d.deptno = e.deptno;
SELECT *
FROM scott.dept d RIGHT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;
--全外连接
--左边的表和右边的表数据都要全部显示,如果没有对应的,则补null
SELECT *
FROM scott.dept d FULL OUTER JOIN scott.emp e
ON d.deptno = e.deptno;
SELECT *
FROM scott.dept d LEFT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;
--自连接(重要,面试经常出现)
/**
在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,
经理自身也有自己的经理。下面我们需要将每一个员工自己的名字和经理的名字都找出来。
这时候我们该怎么做呢?
*/
SELECT * FROM scott.emp;
--empno ename mgr   mgrname 
--7369  SMITH 7902  FORD
--empno ename mgr   mgrname 
--7902  FORD  7566  JONES
--多表连接
--最快备份一张表数据的方法,注意,该方法只是备份数据,不复制约束
CREATE TABLE tb_emp AS SELECT * FROM scott.emp;
SELECT * FROM tb_emp;
SELECT * FROM scott.emp;
--e的员工编号 e的员工姓名 e的经理编号 t的员工姓名
SELECT e.empno,e.ename,e.mgr,t.ename
FROM scott.emp e,scott.tb_emp t
WHERE e.mgr = t.empno
AND e.empno = '7369';
--自连接
SELECT e.empno,e.ename,e.mgr,t.ename
FROM scott.emp e,scott.emp t
WHERE e.mgr = t.empno
AND e.empno = '7369';
/**
自连接(self join)是SQL语句中经常要用到的连接方式,
使用自连接可以将自身表的一个镜像当作另一个表来对待,
即将一张表看成多张表来做连接,从而能够得到一些特殊的数据。
关键之处在于为同一个表指定两个不同的别名。
这样就能通过在一张表内寻找到相互关联的数据再找到有继承关系的数据。
*/
SQL中的笛卡儿积问题和多表连接操作的更多相关文章
- SQL中对于两个不同的表中的属性取差集except运算
		SQL中对两个集合取差集运算,使用except关键字,语法格式如下: SELECT column_name(s) FROM table_name1 EXCEPT SELECT column_name( ... 
- SQL中哪些情况会引起全表扫描
		1.模糊查询效率很低:原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的关 ... 
- SQL中如何修改数据库名、表名、列名?
		文章目录 1.SQL中如何修改数据库的名字? 2.SQL中如何修改表的名字? 3.SQL中如何修改列的名字? 4.SQL中如何修改列的数据类型?(未完成,待续) 1.SQL中如何修改数据库名? 语法 ... 
- SQL 经典回顾:JOIN 表连接操作不完全指南
		 2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ... 
- 数据库常用SQL语句(二):多表连接查询
		前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询. 在实现连接查询时,首先是 ... 
- SQL从零到迅速精通【表连接查询】
		看了这些表连接,个人感觉'左外连接'.'右外连接'和'全外连接'应用好就可以了. 1.外连接 (1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录. 在student ... 
- Sql中判断“数据库"、"表"、"临时表"、"存储过程"和列”是否存在
		--判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME = ''库名'') PRINT ''exists ... 
- 解析SQL中的包含的列和表
		using System; using System.IO; using System.Collections.Generic; namespace SQLProcess { class Progra ... 
- 在SQL中查看文件组中有哪些表
		SELECT o.[name], o.[type], i.[name], i.[index_id], f.[name] FROM sys.indexes i INNER JOIN sys.filegr ... 
随机推荐
- java如何判断字符串是否为空(小知识)
			方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字符串长度, 效率高, 是我知道的最好一个方 ... 
- javascript 树形菜单
			1. [代码][JavaScript]代码 var ME={ini:{i:true,d:{},d1:{},h:0,h1:0,h2:0},html:function(da,f){var s='& ... 
- Pycharm中如何安装python库
			1首先打开pycharm工具,选择File中的Setting选项,如下图所示 2在打开的setting界面中我们点击python的解释器,你会看到很多导入的第三方库,如下图所示,点击最右边的加号 3在 ... 
- 在canvas标签和style中定义width和height
			在canvas标签中定义width.height跟在style中定义width.height是不同的.canvas标签的width和height是画布实际宽度和高度,就是在这个上面绘制图形.style ... 
- 聊聊Spring的核心组件
			Spring的核心是IOC容器,它本质上是一个bean关系集合.而要实现它也是有beans,context,core三个模块完成的. beans包主要是负责bean的定义,创建和解析工作,里面用到了简 ... 
- JAVA 布局控制
			在Java里该方法是安一个组件到一个窗体中去,它不同我们使用过的其它GUI系统.首先,它是全代码的:没有控制安放组件的“资源”.其次,该方法的组件被安放到一个被“布局管理器”控制的窗体中,由“布局管理 ... 
- Windows下如何生成数字证书
			1.Makecert.exe<证书创建工具>使用说明:http://msdn.microsoft.com/zh-cn/library/bfsktky3.aspx 2.SignTool.ex ... 
- 第六篇 .NET高级技术之拆箱装箱
			拆箱.装箱 值类型赋值给Object类型变量的时候,会发生装箱:包装成Object.ValueType不也是继承自Object吗(CLR内部处理): Object类型变量赋值给值类型赋值的时候会发生拆 ... 
- Chemistry in Berland CodeForces - 846E
			题目 题意: 有n种化学物质,第i种物质现有bi千克,需要ai千克.有n-1种,编号为2-n的转换方式,每种都为(x,k),第i行是编号为i+1的转换方式,编号为i的转换方式(xi,ki)表示ki千克 ... 
- 递推DP HDOJ 5092 Seam Carving
			题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include < ... 
