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语句中经常要用到的连接方式,
使用自连接可以将自身表的一个镜像当作另一个表来对待,
即将一张表看成多张表来做连接,从而能够得到一些特殊的数据。
关键之处在于为同一个表指定两个不同的别名。
这样就能通过在一张表内寻找到相互关联的数据再找到有继承关系的数据。
*/

原文地址:https://www.cnblogs.com/hellohowlow/p/8270262.html

时间: 2024-11-13 06:43:31

SQL中的笛卡儿积问题和多表连接操作的相关文章

SQL中对于两个不同的表中的属性取差集except运算

SQL中对两个集合取差集运算,使用except关键字,语法格式如下: SELECT column_name(s) FROM table_name1 EXCEPT SELECT column_name(s) FROM table_name2 输出为在前一个集合中存在,而不存在于第二个集合的元组. 如果,选取两个元组,并且元组名称不同会出现什么结果呢? 使用之前使用过的示例,构建代码如下: create table employee (empname char(6), numchildren int

Python中使用SQLAlchemy连接Mysql数据库2(多表连接操作)

http://blog.csdn.net/u011573853/article/details/51355113 在上面我们已经说了单表的一些操作,现在我们说一下多表的连接 >>> from sqlalchemy import distinct >>> from sqlalchemy.orm import aliased >>> Astu = aliased(Stu,'Astu') >>> Acla = aliased(Cla,'Ac

SQL从零到迅速精通【表连接查询】

看了这些表连接,个人感觉'左外连接'.'右外连接'和'全外连接'应用好就可以了. 1.外连接 (1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录. 在student表和stu-detail表中,查询所有ID相同的学生号和居住城市,语句如下. USE test SELECT student.s_id,stu_detail.addr FROM student LEFT OUTER JOIN stu_detail ON student.s_id=stu_detail

在SQL中查看文件组中有哪些表

SELECT o.[name], o.[type], i.[name], i.[index_id], f.[name] FROM sys.indexes i INNER JOIN sys.filegroups f ON i.data_space_id = f.data_space_id INNER JOIN sys.all_objects o ON i.[object_id] = o.[object_id] WHERE f.name = 'primary'

sql语句去除重复记录(多表连接的查询)

--处理表重复记录(查询和删除) /****************************************************************************************************************************************************** 1.Num.Name相同的重复值记录,没有大小关系只保留一条 2.Name相同,ID有大小关系时,保留大或小其中一个记录 ********************

MapReduce表连接操作之Reduce端join

一:背景 Reduce端连接比Map端连接更为普遍,因为输入的数据不需要特定的结构,但是效率比较低,因为所有数据都必须经过Shuffle过程. 二:技术实现 基本思路 (1):Map端读取所有的文件,并在输出的内容里加上标示,代表数据是从哪个文件里来的. (2):在reduce处理函数中,按照标识对数据进行处理. (3):然后根据Key去join来求出结果直接输出. 数据准备 准备好下面两张表: (1):tb_a(以下简称表A) [java] view plain copy id  name 1

sql中的笛卡尔积

sql中的笛卡尔积 我们对数据库表进行操作时,经常会对多张表进行关联,多表连接查询大家肯定不会陌生,但是一不小心很容易出来庞大冗余的数据. 笛卡尔积数学概念 笛卡尔积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员. 笛卡尔积又叫笛卡尔乘积,是一个叫笛卡尔的人提出来的. 简单的说就是两个集合相乘的结果. 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡

sql中的一些小技巧

在sql中经常要用到字符串的连接操作: 在oracle和mysql中都有contact()函数,只有,sqlserver没有,不过,这三个数据库都支持:+ 来连接字符串! 在mysql中,有个不全补零的函数: select LPAD('2',3,'0'); 在sql server中,我们完全可以使用print 来打印一个数据 print 3+3; 任何一个数据库,最好的,也是最牛逼的教材,就是它的文档,读完文档,整个世界就清晰了

SQL Server三种表连接原理

http://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop J