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 ...
随机推荐
- poj 1195 Mobile phones 解题报告
题目链接:http://poj.org/problem?id=1195 题目意思:有一部 mobie phone 基站,它的面积被分成一个个小正方形(1 * 1 的大小),所有的小正方形的面积构成了一 ...
- ios 给移动的控件添加点击事件
前言: 给一个UIView做移动动画,虽然看起来frame在持续改变,但是它的frame已经是最终值了. 也就是说表面看到的动画都是假象,它的真实位置已经是固定的了.所以只有点击在他的真实frame范 ...
- iOS沙盒(sandbox)机制及获取沙盒路径
一. 每个iOS应用SDK都被限制在“沙盒”中,“沙盒”相当于一个加了仅主人可见权限的文件夹,苹果对沙盒有以下几条限制. (1)应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒. ( ...
- 「UVA524」 Prime Ring Problem 质数环
Description 输入正整数n,把整数1,2,-,n组成一个环,使得相邻两个整数之和均为素数.输出时,从整数1开始逆时针排列.同一个环恰好输出一次.n<=16. A ring is com ...
- June Challenge 2017
A Good Set 分析:水题,选奇数即可 #include "iostream" #include "cstdio" #include "cstr ...
- COCOS2DX场景切换特效
cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 百牛信息技术bainiu.ltd整理发布于博客园 场景 ...
- nodejs开发游戏服务器遇到的性能问题
问题描述: 使用nodejs开发了一个游戏服务器,为了尽可能提高服务器的性能,服务器采用多进程的架构,前面处理玩家socket连接的是多个nodejs进程,使用 child_process 模块,服务 ...
- 023--python os、sys、json、pickle、xml模块
一.os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 >>> os.getcwd() 'C:\\Python36' os.chdir(&quo ...
- 洛谷 - P2152 - SuperGCD - 高精度
https://www.luogu.org/problemnew/show/P2152 一开始不知道Java可以有gcd,手写了个辗转相除法. 发现Number类在参数传递中传的并非是引用! 最主要要 ...
- Codeforces - 909C - Python Indentation - 简单dp
http://codeforces.com/problemset/problem/909/C 好像以前做过,但是当时没做出来,看了题解也不太懂. 一开始以为只有上面的for有了循环体,这里的state ...