(使用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. vue 中的组件通信

    vue中组件通信,一般分为三种情况,父与子,子与父,子子之间. 一.父与子通信 父组件将值传给子组件,一般通过props,设置默认的类型.调用的时候通过 xx=" ", 或者:XX ...

  2. HDU3746 Cyclic Nacklace —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    M ...

  3. MySQL的IFNULL简单使用说明

    MySQL IFNULL函数简介 MySQL IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数. 否则,IFNULL函数返回第二个参数. 两个参数可以是文 ...

  4. jstl标签: c:Foreach详解

    为循环控制,它可以将集合(Collection)中的成员循序浏览一遍.运作方式为当条件符合时,就会持续重复执行的本体内容. 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍.运作方 ...

  5. 子元素margin带动父元素拖动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Ntrip通讯协议1.0

    Ntrip通讯协议1.0 1 什么是Ntrip? CORS(Continuously Operating Reference Stations)就是网络基准站,通过网络收发GPS差分数据.用户访问CO ...

  7. Android Studio下载安装

    官方下载地址:https://developer.android.google.cn/studio#downloads 因为安卓自带的模拟器会比较慢一些,这里勾选去掉,我们使用夜神模拟器. 这里根据自 ...

  8. 生产环境下搭建mongodb复制集高可用环境(python)

    环境描述:有三台ubuntu服务器,,每台服务器上已经有mongodb实例.创建3个mongo2.4的新实例,分别作为三个复制集节点,同时保证了当前单节点环境的稳定 3台服务器都已经有单个mongo实 ...

  9. 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置

    原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...

  10. nable to load bean: type:com.opensymphony.xwork2.util.ValueStackFactory

    严重: Exception starting filter struts2 Unable to load bean: type:com.opensymphony.xwork2.util.ValueSt ...