sql多表查询之一:Where 和 On的秘密

原文 sql多表查询之一:Where 和 On的秘密

对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术。什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某几个字段进行互联管理的时候,这就不得不说说sql多表查询中Where 和 On的秘密。

 

在了解sql多表查询中Where 和 On的秘密之前,让我们先来温习一下连接基础吧


按列a把两表连接,请问各种连接方式的结果的结果?

语法呢?

左    select * from @a Aa left join @b Bb on Aa.a=Bb.a

右    select * from @a Aa right join @b Bb on Aa.a=Bb.a

内    select * from @a Aa join @b Bb on Aa.a=Bb.a

完全       select * from @a Aa full join @b Bb on Aa.a=Bb.a

迪卡尔    select * from @a,@b

是不是很简单呢,接下来我们来看sql多表查询中Where 和 On的秘密:)

 

大家想想,依据下表

下面语句出来的结果是什么?

 

select * from @a _a left join @b _b on _a.id=_b.id where _b.name=1

select * from @a _a left join @b _b on _a.id=_b.id and _b.name=1

先想想,再看结果吧^_*

sql多表查询中Where 和 On的秘密在SQLserver 中的执行顺序是: 先join后where

所以,当条件写在where里,结果如下:

条件写在on里,结果如下:

Where 和 On是不是很有趣,你也试试吧!

 

下一个

请说出下面语句各返回多少记录

select * from @a a left join @b b on a.id=b.id where a.id=1

select * from @a a left join @b b on a.id=b.id and b.id=1

select * from @a a left join @b b on a.id=b.id and a.id=1

select * from @a a left join @b b on a.id=1

先想想,再看答案:P

—        select * from @a a left join @b b on a.id=b.id where a.id=1

 

—        原因是先执行连接条件,再执行where部分,所以只有1条记录

 

—        select * from @a a left join @b b on a.id=b.id and b.id=1

 

—        原因是满足a.id=b.id and a.id=1 条件的只有一条,但left join是对没有附和条件的加null处理,所以最后结果是3条

 

—        select * from @a a left join @b b on a.id=b.id and a.id=1

 

—        原因是满足a.id=b.id and a.id=1 条件的只有一条,但left join是对没有附和条件的加null处理,所以最后结果是3条

 

—        select * from @a a left join @b b on a.id=1

 

—        原因是在做完迪卡尔后,满足a.id=1 条件的有3条,但left join是对没有附和条件的加null处理,所以最后结果是5条

时间: 2024-12-26 23:15:50

sql多表查询之一:Where 和 On的秘密的相关文章

sql多表查询语句该怎样写

问题描述 sql多表查询语句该怎样写 有两个表,表1中字段有姓名,编号,地址 表2中字段有省,地址.例如表1数据如下(张三,001,济南)(李四,002,青岛)(王五,003,威海)(王伟,004,石家庄)(李玲,005,唐山)(王宇,006,秦皇岛)表2数据如下(山东省,济南)(山东省,青岛)(山东省,威海)(河北省,石家庄)(河北省,唐山)(河北省,秦皇岛)如果搜索河北省的用户信息请问该怎样写sql语句 解决方案 select * from t1 where 地址 in (select 地址

mysql-Hibernate 原生sql多表查询在Linux服务器上查询不到数据

问题描述 Hibernate 原生sql多表查询在Linux服务器上查询不到数据 String sql = "SELECT Area.* FROM area AS Area,district AS d WHERE Area.districtid=d.districtid AND Area.areaname= '" + areaname + "' AND d.districtname='" + cityname + "'"; @SuppressWa

sql多表查询图形化界面查询返回结果与程序端hibernate查询结果不符。

问题描述 sql多表查询图形化界面查询返回结果与程序端hibernate查询结果不符. 我使用多表查询,其中一个表与令一个表字段名相同,在hibernate界面后一个与前一个字段名相同的字段输出结果也与前一个字段名相同.前问在不改字段名的情况下有什么办法解决?(以下d.name与p.name输出结果一样,显然d.name输出结果是错的) select p.id,p.name,p.post_coefficient,d.name ,postType,a.areaName,p.postHour,p.s

mysql SQL 多表查询最优问题

问题描述 mysql SQL 多表查询最优问题 有表 t(t_year,col), t1(t1_year,t1_month,col_1), t2(t2_year,t2_month,col_t2), t3(t3_year,t3_month,col_t3), 和目标表 T(T_year,T_month,col,col_1,col_2,col_3), 将t, t1, t2, t3的数据整合到 T 中,什么样的SQL最优? 解决方案 多个表join,然后设置on的条件判断年,月,日相等条件. 解决方案二

SQL多表查询详解

本教程为大家介绍SQL中的多表查询,下面我们来看看具体实例吧. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) 一.外连接 外连接可分为:左连接.右连接.完全外连接. 1.左连接 left join 或 left outer join SQL语句:select * from student left join course on student.ID

sql 多表查询的语句集合

今天我们来讲一下关于如何多表查询的sql语句,先是最常见也是最突然的效绿也不怎么样的多表查询方法一 select * from A join B ON A.uid=B.uid join C ON C.uid=A.uid where uid=1 二.四个表查询 select * form A,B,C,D where A.uid=B.uid and B.uid=C.uid and C.uid=D.uid where uid=1 三.用别名查询 select * from table1 as a,ta

sql多表查询语句与方法

下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: Select * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city   又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state) : Select a.*,p.pub_id,p.pub_name,p.country FROM authors AS a INNER JOIN publi

【数据库】sql连表查询

SQL总结 连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两个或多个 SELECT 语句的结果集. UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. 当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行.两种情况下,派生表的每一行不是来自 TABLE1 就是来自

SQL多表查询

  情况一: 我们现在两个表,一个学生Student表,一个性别Gender表.Student : id name gender .Gender :: key value   有如下值: Student : 001 xy 1 002 xyy 1 003 小红 0   Gender 0 女 1 男 2 其他   那么我们先看一个表 Student,我要查找性别为男的学生 select  id,name,gender from Student where gender = '1';   那我们多表查