(使用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中的笛卡儿积问题和多表连接操作的更多相关文章

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

    SQL中对两个集合取差集运算,使用except关键字,语法格式如下: SELECT column_name(s) FROM table_name1 EXCEPT SELECT column_name( ...

  2. SQL中哪些情况会引起全表扫描

    1.模糊查询效率很低:原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的关 ...

  3. SQL中如何修改数据库名、表名、列名?

    文章目录 1.SQL中如何修改数据库的名字? 2.SQL中如何修改表的名字? 3.SQL中如何修改列的名字? 4.SQL中如何修改列的数据类型?(未完成,待续) 1.SQL中如何修改数据库名? 语法 ...

  4. SQL 经典回顾:JOIN 表连接操作不完全指南

    ​   2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...

  5. 数据库常用SQL语句(二):多表连接查询

    前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询. 在实现连接查询时,首先是 ...

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

    看了这些表连接,个人感觉'左外连接'.'右外连接'和'全外连接'应用好就可以了. 1.外连接 (1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录. 在student ...

  7. Sql中判断“数据库"、"表"、"临时表"、"存储过程"和列”是否存在

    --判断数据库是否存在   IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME = ''库名'')      PRINT ''exists ...

  8. 解析SQL中的包含的列和表

    using System; using System.IO; using System.Collections.Generic; namespace SQLProcess { class Progra ...

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

    SELECT o.[name], o.[type], i.[name], i.[index_id], f.[name] FROM sys.indexes i INNER JOIN sys.filegr ...

随机推荐

  1. linux子系统的初始化_subsys_initcall()

    http://my.oschina.net/u/572632/blog/305492#OSC_h1_3

  2. HDU2609 How many —— 最小表示法

    题目链接:https://vjudge.net/problem/HDU-2609 How many Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  3. sed替换变量

    今天在写脚本时用到了sed,我用sed替换xml文件中的变量.一般在sed 中替换都用单引号,如下边 sed -i ‘s/10/1000/g’ test.xml但是如果需要把1000改成变量,如sed ...

  4. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

    目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,N ...

  5. BestCoder5 1001 Poor Hanamichi(hdu 4956) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956(它放在题库后面的格式有一点点问题啦,所以就把它粘下来,方便读者观看) 题目意思:给出一个范围 [ ...

  6. windows下编译调试nginx

    typora-copy-images-to: image windows下编译调试nginx linux使用gdb跟踪代码效率不高,在通过跟踪代码进行源码分析,与定位复杂逻辑问题时,如果有一个简单易用 ...

  7. python自动化运维-编写rsync+sersync安装脚本实现文件实时同步

    rsync+sersync组合可以实时监听目录的变化,实现实时同步数据. 具体安装教程可查看:http://www.osyunwei.com/archives/7447.html. 安装着实有些复杂, ...

  8. 使用AES128加密字符串

    import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.apache.c ...

  9. Table View Programming Guide for iOS---(五)---Creating and Configuring a Table View

    Creating and Configuring a Table View Your app must present a table view to users before it can mana ...

  10. Codeforces645B【树状数组求逆序数】

    题意: 给你1-n的序列,然后有k次机会的操作,每一次你可以选择两个数交换. 求一个最大的逆序数. 思路: 感觉就是最后一个和第一个交换,然后往中间逼近,到最终的序列,用树状数组求一下逆序数. #in ...