博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库的多表查询及左右连接
阅读量:4982 次
发布时间:2019-06-12

本文共 2085 字,大约阅读时间需要 6 分钟。

1、关于多表查询的解决思路

--思考题:要求查询出每个雇员的编号,姓名,工资,部门名称,工资所在公司的工资等级--第一步确定所需要的表,以及表中字段  --emp,dept,salgrade  --emp:雇员编号,姓名,工资  --dept: 部门名称  --salgrade: 工资等级--第二步确定表的关联字段  --emp.deptno=dept.deptno  --emp.sal between salgrade.losal and salgrade.hisal--第三步:查询每个雇员的信息select e.empno,e.ename,e.sal from emp e--第四步:为查询引入部门信息,并添加消除笛卡尔积的条件select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno--第五步:为查询引入工资等级信息,并添加消除笛卡尔积德条件select e.empno,e.ename,e.sal,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal

2、左右连接

关于左右连接指的是查询判断条件的参考方向,例如:下面有如下查询:

 select * from emp e,dept d where e.deptno = d.deptno; 

部门一共有四个,但是现在只返回了三个部门的信息,缺少40部门,因为在雇员表之中没有一条记录是属于40部门的,所以现在不会显示40部门的信息,即:现在的查询以emp表为参考,那么如果说现在非要显示40部门呢?就必须改变这种参考的方向,就要使用左右连接。

因为SQL1999语法适用于多种数据库所以这里直接学习该语法,一下是属于多个语法的联合

select table1.column,table2.columnfrom table1 [cross join table2]|[natural join table2]|[join table2 using(column_name)]|[join table2 on(table1.column_name = table2.column_name)]|[left|right|full outer join table2 on(table1.column_name = table2.column_name];

接下来分块说明语法的使用

a、交叉连接(cross join):用于产生笛卡尔积(笛卡尔积本身并不是属于无用的内容,在某些情况下还是需要使用的)

   select * from emp cross join dept; 

b、自然连接(natural join):自动找到匹配的关联字段,消除掉笛卡尔积

   select * from emp natural join detp 

但是并不是所有的字段都是关联字段,设置关联字段需要通过约束指定;

c、join using子句:用户自己指定一个消除笛卡尔积的关联字段

   select * from emp join dept using(deptno); 

d、join ... on子句:用户自己指定一个可以消除笛卡尔积德关联条件

  select * from emp join dept on(emp.deptno=dept.deptno);  

e、连接方向的改变:

  左(外)连接: left outer join ...on;

  右(外)连接: right outer join ...on;

  全(外)连接: full outer join ...on;

   select * from emp right outer join dept on(emp.deptno=dept.deptno); 

注:在Oracle之外的数据库都是使用的以上的sql:1999语法操作,所以这个语法一定要会。

 

工作中使用的语句

场景1: 两个表查询A and B  其中从 B表中查询出的值做为A表的查询条件进行查询

SELECT t.name,t.* FROM A t WHERE t.id=(SELECT c.area_id FROM B c  WHERE c.id=193084); SELECT c.* FROM A c JOIN B t ON c.id=t.area_id WHERE t.`id`=193084SELECT * FROM A si LEFT JOIN B st ON si.id = st.f_si WHERE si.id IN(85656,85689,85701,85704,85644,85692,85632,85620);

 

转载于:https://www.cnblogs.com/Skyyj/p/4756302.html

你可能感兴趣的文章
CentOS 7 单用户模式修改root密码
查看>>
Linux DHCP原理
查看>>
Thread.currentThread()和this的区别——《Java多线程编程核心技术》
查看>>
mysql 5.1 Data 文件夹路径
查看>>
delegate的参数也可泛型【简单源码示例】
查看>>
Mycat SqlServer 技术栈 实现 主从分离
查看>>
为何要学编程?如何学编程?用什么语言最好?有什么好书?
查看>>
剑指Offer的学习笔记(C#篇)-- 反转链表
查看>>
Android精品资源整理2018年3月21日 星期三
查看>>
查询当前库中包含某个字段并且包含自增的表
查看>>
SSH整合报错:No result defined for action and result input
查看>>
1963-带妹子去看电影
查看>>
数据结构和算法之栈排序
查看>>
HBASE的预分区设计
查看>>
大道至简第三章读后感
查看>>
java中JDK、JRE、JVM的关系
查看>>
mybatis面试常见题
查看>>
EXCEL转html
查看>>
对象和XML之间的序列化和反序列化
查看>>
cSELECT
查看>>