`
zjut_xiongfeng
  • 浏览: 286879 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据库左连接与右连接

阅读更多

左连接与右连接
左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行
并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
比如:职员表包括:name,jobid。有如下数据 mike 01 jack 02 rose 03 职务表包括jobid,jobname。有01 engineer02 secretry。现在显示name,jobname两列。如果通过jobid的内部连接做,结果为:mike engineer ,jack secretry .若用左连接(左边表的数据必显示)结果为 mike engineer ,jack secretry,rose.右连接则必显示右边表对应的数据

有兩個表
table1
user_id user_name user_pss
1 aaa a
2 bbb b
3 ccc c
table2
user_id user_power
1 111000
2 000111

使用sql語句查詢
正常狀態:
select table1.user_id,
table1.user_name,
table2.user_power
from table1,table2
where table1.user_id = table2.user_id
但是這樣檢索到的數據只有兩條:
user_id user_name user_power
1 aaa 000111
2 bbb 111000
因為第三條數據在table2中沒有關聯.

這時使用左連接查詢﹕
select table1.user_id,table1.user_name,table2.user_power
from table1,table2
where table1.user_id (+)= table2.user_id
就可以得到如下的結果
user_id user_name user_power
1 aaa 000111
2 bbb 111000
3 ccc (null)
說明﹐左或右連接查詢實際上是指定以哪個表的數據為准﹐而默認(不指定左或右連接)是以兩個表中都存在關鍵列的數據的為准。


内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来
左连接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来
右连接是只要右边表中有记录,数据就能检索出来


左连接就是以左边的表记录为主,右连接就是以右边的表记录为主
具体的sql你可以在做个有左右连接的数据窗口,然后导出去看一下
但我记得好像不同的数据库sql是不一样的,你自己试试吧

 

比如在如下语句:
select * from testdata!customer;
left outer join testdata!orders;
on customer.cust_id=orders.cust_id
如果是左连接该命令将返回join左侧表(customer)中的所有记录以及右侧表中匹配的记录;右连接则反之,返回orders中所有记录和customer的匹配记录;完全连接返回两个表中的所有记录。

 

*=左联接
=*右联接

 

sql语句左外连接和右外连接的区别
mysql> select * from customers;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 21 |
| 3 | Mike | 24 |
| 4 | Jack | 30 |
| 5 | Linda | 25 |
| 6 | Tom | NULL |
+----+-------+------+

mysql> select * from orders;
+----+----------------+-------+-------------+
| id | order_number | price | customer_id |
+----+----------------+-------+-------------+
| 1 | Tom_Order001 | 100 | 1 |
| 2 | Tom_Order002 | 200 | 1 |
| 3 | Tom_Order003 | 300 | 1 |
| 4 | Mike_Order001 | 100 | 3 |
| 5 | Jack_Order001 | 200 | 4 |
| 6 | Linda_Order001 | 100 | 5 |
| 7 | UnknownOrder | 200 | NULL |
+----+----------------+-------+-------------+


左外连接:
如果用左外连接的话,指查询出来的是在右表中没有对应左表中的记录以及符合条件(c.id=o.customer_id)的数据,比如:
customers为左表,orders为右表
select c.id,o.customer_id,c.name,o.id order_id,order_number from customers c left outer join orders o on c.id=o.customer_id;
这样的结果显示的是在左表中的某些用户在orders表中没有对应的订单

mysql> select c.id,o.customer_id,c.name,o.id order_id,order_number from customers c left outer join orders o on c.id=o.customer_id;
+----+-------------+-------+----------+----------------+
| id | customer_id | name | order_id | order_number |
+----+-------------+-------+----------+----------------+
| 1 | 1 | tom | 1 | Tom_Order001 |
| 1 | 1 | tom | 2 | Tom_Order002 |
| 1 | 1 | tom | 3 | Tom_Order003 |
| 3 | 3 | Mike | 4 | Mike_Order001 |
| 4 | 4 | Jack | 5 | Jack_Order001 |
| 5 | 5 | Linda | 6 | Linda_Order001 |
| 6 | NULL | Tom | NULL | NULL |
+----+-------------+-------+----------+----------------+
7 rows in set (0.00 sec)

右外连接:
正好和左外连接相反,查询出来的结果是在左表中没有对应的项和以及符合条件(c.id=o.customer_id)的数据

mysql> select c.id,o.customer_id,c.name,o.id order_id,order_number from customers c right outer join orders o on c.id=o.customer_id;
+------+-------------+-------+----------+----------------+
| id | customer_id | name | order_id | order_number |
+------+-------------+-------+----------+----------------+
| 1 | 1 | tom | 1 | Tom_Order001 |
| 1 | 1 | tom | 2 | Tom_Order002 |
| 1 | 1 | tom | 3 | Tom_Order003 |
| 3 | 3 | Mike | 4 | Mike_Order001 |
| 4 | 4 | Jack | 5 | Jack_Order001 |
| 5 | 5 | Linda | 6 | Linda_Order001 |
| NULL | NULL | NULL | 7 | UnknownOrder |
+------+-------------+-------+----------+----------------+
7 rows in set (0.00 sec)

=============================================================================

mysql> select name,age,sum(price) from customers c left join orders o on c.id=o.customer_id group by c.id;
+-------+------+------------+
| name | age | sum(price) |
+-------+------+------------+
| tom | 21 | 600 |
| Mike | 24 | 100 |
| Jack | 30 | 200 |
| Linda | 25 | 100 |
| Tom | NULL | NULL |
+-------+------+------------+
5 rows in set (0.00 sec)


左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行
并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
比如:职员表包括:name,jobid。有如下数据 mike 01 jack 02 rose 03 职务表包括jobid,jobname。有01 engineer02 secretry。现在显示name,jobname两列。如果通过jobid的内部连接做,结果为:mike engineer ,jack secretry .若用左连接(左边表的数据必显示)结果为 mike engineer ,jack secretry,rose.右连接则必显示右边表对应的数据

有兩個表
table1
user_id user_name user_pss
1 aaa a
2 bbb b
3 ccc c

table2
user_id user_power
1 111000
2 000111

使用sql語句查詢
正常狀態:
select table1.user_id,
table1.user_name,
table2.user_power
from table1,table2
where table1.user_id = table2.user_id
但是這樣檢索到的數據只有兩條:
user_id user_name user_power
1 aaa 000111
2 bbb 111000
因為第三條數據在table2中沒有關聯.

這時使用左連接查詢﹕
select table1.user_id,table1.user_name,table2.user_power
from table1,table2
where table1.user_id (+)= table2.user_id
就可以得到如下的結果
user_id user_name user_power
1 aaa 000111
2 bbb 111000
3 ccc (null)
說明﹐左或右連接查詢實際上是指定以哪個表的數據為准﹐而默認(不指定左或右連接)是以兩個表中都存在關鍵列的數據的為准。


内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来
左连接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来
右连接是只要右边表中有记录,数据就能检索出来


左连接就是以左边的表记录为主,右连接就是以右边的表记录为主
具体的sql你可以在做个有左右连接的数据窗口,然后导出去看一下
但我记得好像不同的数据库sql是不一样的,你自己试试吧

 

比如在如下语句:
select * from testdata!customer;
left outer join testdata!orders;
on customer.cust_id=orders.cust_id
如果是左连接该命令将返回join左侧表(customer)中的所有记录以及右侧表中匹配的记录;右连接则反之,返回orders中所有记录和customer的匹配记录;完全连接返回两个表中的所有记录。

 

*=左联接
=*右联接

-------------------------------------------------------------------------------------------------------------------
我们介绍了表连接,更确切的说是inner joins內连接。內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。

为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。


party(Code,Name,Leader)
Code: 政党代码
Name: 政党名称
Leader: 政党领袖

 

msp(Name,Party,Constituency)
Name: 议员名
Party: 议员所在政党代码
Constituency: 选区


在介绍左连接、右连接和全连接前,有一个数据库中重要的概念要介绍一下,即空值(NULL)。有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。

空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使用=,<>这些判断符。必需有专用的短语:IS NULL 来选出有空值字段的记录,同理,可用 IS NOT NULL 选出不包含空值的记录。

例如:下面的语句选出了没有领导者的政党。(不要奇怪,苏格兰议会中确实存在这样的政党)


SELECT code, name FROM party
WHERE leader IS NULL


又如:一个议员被开除出党,看看他是谁。(即该议员的政党为空值)


SELECT name FROM msp
WHERE party IS NULL


好了,让我们言归正传,看看什么叫左连接、右连接和全连接。A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

而full join(全连接)顾名思义,左右表中所有记录都会选出来。讲到这里,有人可能要问,到底什么叫:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

我们来看一个实例:


SELECT msp.name, party.name
FROM msp JOIN party ON party=code


这个是我们上一节所学的Join(注意:也叫inner join),这个语句的本意是列出所有议员的名字和他所属政党。

很遗憾,我们发现该查询的结果少了两个议员:Canavan MSP, Dennis。为什么,因为这两个议员不属于任何政党,即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了?这是因为空值在作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配,即FROM msp JOIN party ON party=code 没有把该记录连接起来,而是过滤出去了。在该短语中,msp在Join的左边,所有称为左表。party在Join的右边,所有称为右表。

现在再看看这句话,“包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录”,意思应该很明白了吧。执行下面这个语句,那两个没有政党的议员就漏不了了。


SELECT msp.name, party.name
FROM msp LEFT JOIN party ON party=code


关于右连接,看看这个查询就明白了:


SELECT msp.name, party.name
FROM msp RIGHT JOIN party ON msp.party=party.code


这个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员。 那么既要包含没有议员的政党,又要包含没有政党的议员该怎么办呢,对了,全连接(full join)。


SELECT msp.name, party.name
FROM msp FULL JOIN party ON msp.party=party.code

1.在查询结果中显示列名:

  a.用as关键字:select name as '姓名' from students order by age

  b.直接表示:select name '姓名' from students order by age

  2.精确查找:

  a.用in限定范围:select * from students where native in ('湖南', '四川')

  b.between...and:select * from students where age between 20 and 30

  c.“=”:select * from students where name = '李山'

  d.like:select * from students where name like '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第二个字为李,则应为'_李%'或'_李'或'_李_'。)

  e.[]匹配检查符:select * from courses where cno like '[AC]%' (表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like '[A-C]%')

  3.对于时间类型变量的处理

  a.smalldatetime:直接按照字符串处理的方式进行处理,例如:
select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'

  4.集函数

  a.count()求和,如:select count(*) from students (求学生总人数)

  b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’

  c.max(列)和min(列),求最大与最小

  5.分组group

  常用于统计时,如分组查总数:
select gender,count(sno)
from students
group by gender
(查看男女学生各有多少)

  注意:从哪种角度分组就从哪列"group by"

  对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"

select grade, mno, gender, count(*)
from students
group by grade, mno, gender

  通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:

select sno,count(*) from grades
where mark<60
group by sno
having count(*)>1

  6.UNION联合

  合并查询结果,如:

SELECT * FROM students
WHERE name like ‘张%’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘李%’

  7.多表查询

  a.内连接

select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用别名)
b.外连接
b1.左连接
select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno

  左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。

  左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。

  b2.右连接

  与左连接类似

  b3.全连接

select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno

  两边表中的内容全部显示

  c.自身连接

select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno

  采用别名解决问题。

  d.交叉连接

select lastname+firstname from lastname CROSS JOIN firstanme

  相当于做笛卡儿积

  8.嵌套查询

  a.用关键字IN,如查询李山的同乡:

select * from students
where native in (select native from students where name=’ 李山’)

  b.使用关键字EXIST,比如,下面两句是等价的:

select * from students
where sno in (select sno from grades where cno=’B2’)

select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)

  9.关于排序order

  a.对于排序order,有两种方法:asc升序和desc降序

  b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:

select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)>85
order by 3

  10.其他

  a.对于有空格的识别名称,应该用"[]"括住。

  b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL

  c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑运算“&&”

  d.注意在做否定意义的查询是小心进入陷阱:

  如,没有选修‘B2’课程的学生 :

select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno <> ’B2’

  上面的查询方式是错误的,正确方式见下方:

select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno='B2')

  11.关于有难度多重嵌套查询的解决思想:

  如,选修了全部课程的学生:

select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))

  最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排除那些选了课的即可。

分享到:
评论

相关推荐

    数据库:左连接、右连接、全连接

    外连接(OUTER JOIN)是一种连接操作,用于查询多个表中的数据,但不 sadece 返回符合连接条件的数据行,而是返回左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中的所有数据行。外连接可以分为三种...

    oracle数据库 左连接 右连接 自连接 。。

    右连接与左连接相反,它返回右表的所有记录,以及与之匹配的左表记录。如果左表中没有匹配的记录,结果将显示右表记录和左表的NULL值。右连接在需要确保右表所有数据都被包含时非常有用。 SQL语法示例: ```sql ...

    oracle数据库表左连接右连接全连接的认识

    * 右连接:与左连接相似,只是基准表换成了右边的表。 * 全连接:简单说就是左右连接的全部表示,根据连接条件在任意一方表中出现无法匹配的情况,不满足条件的部分均用空值代替。 左连接和右连接 左连接和右连接的...

    数据结构左右连接

    右连接与左连接相反,它返回右表的所有记录及左表中匹配的记录。如果左表没有与右表相匹配的记录,则结果集中相应的列将显示为NULL。同样地,右连接可以通过`RIGHT JOIN`或`RIGHT OUTER JOIN`来实现。 示例中的另一...

    左外连接右外连接,内连接区别

    右外连接(RIGHT OUTER JOIN)则是以右表为基础进行操作,与左外连接类似,但方向相反。`SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id` 会返回所有右表 t2 的记录,以及与左表 t1 匹配的记录。在这个例子中,t2...

    SQL之左连接、右连接和全连接.doc

    SQL 左连接、右连接和全连接知识点 在关系数据库管理系统中,连接操作是将两个或多个表连接起来,以便从多个表中检索数据。SQL 提供了多种连接操作,包括左连接、右连接和全连接。本篇文章将详细讲解左连接、右连接...

    左连接和右连接

    右连接与左连接相反,它返回所有右表(即第二个指定的表)的行以及左表中匹配的行。如果左表中没有匹配的行,则结果集中的左表列将包含NULL值。也就是说,右连接确保了右表的所有记录都将出现在结果集中。 #### ...

    MYSQL数据库中关于左连接右连接和内连接的区别.doc

    MySQL数据库中涉及表连接操作,主要有三种:左连接(LEFT JOIN)、右连接(RIGHT JOIN)和内连接(INNER JOIN)。理解它们的区别对于进行高效数据查询是至关重要的。 首先,左连接(LEFT JOIN)指的是从左表(table...

    SQL 连接 JOIN 例解左连接,右连接,全连接,内连接,交叉连接,自连接

    本文将详细介绍六种主要类型的 JOIN:左连接(LEFT JOIN)、右连接(RIGHT JOIN)、全连接(FULL JOIN)、内连接(INNER JOIN)、交叉连接(CROSS JOIN)以及自连接(SELF JOIN)。通过实例讲解每种连接的特点和应用...

    数据库左右链接

    **右连接**与左连接类似,但方向相反。它返回右表的所有行,并在左表中查找相应的匹配项。如果左表中不存在匹配项,则结果集中相应的列会显示为NULL。 **特点**: - 右表的所有行都会出现在结果集中。 - 左表中没有...

    数据库表连接(内外、左右连接).docx

    - 右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN):与左外连接相反,返回右表的所有行,左表中没有匹配的行同样填充NULL。 - 全外连接(FULL OUTER JOIN 或 FULL JOIN):返回两个表的所有行,无论是否存在匹配。如果...

    数据库表连接(内外、左右连接).pdf

    交叉连接(CROSS JOIN)是最基础的连接类型,不带任何连接条件,它会返回两个表的笛卡尔积,即每个左表的行与右表的每一行组合,生成的结果集大小为两表行数的乘积。 举个例子,假设我们有两个表:`voteMaster`...

    Oracle 左连接、右连接

    右连接与左连接相反,它返回右表的所有记录,即使在左表中没有匹配的记录。对于左表中没有匹配的右表记录,结果集将显示为NULL。右连接在你需要保留所有右表数据,同时获取与之关联的左表数据时很有用。以同样的员工...

    SQL关于内连接,外连接(左右连接)等的总结

    右连接与左连接相反,它保留右表的所有记录。如果左表中没有匹配的记录,结果集中的相应列将填充为NULL。对于上述的员工和部门的例子,如果我们关心的是包含所有部门,即使没有员工在该部门,可以使用右连接。 ```...

    数据库内外连接举例

    例如,如果我们有`a`表和`b`表,`a.id`与`b.parent_id`有对应关系,左连接的SQL语句可能如下: ```sql SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.parent_id; ``` 右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN...

    数据库 左连接 右连接 全连接用法小结

    本文主要讨论了四种类型的连接:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN),这些都是SQL-92标准定义的FROM子句连接语法的一部分。 1. **内连接**: 内连接返回满足...

    LabVIEW与SQL数据库的连接

    LabVIEW 与 SQL 数据库的连接 LabVIEW 是一款强大的图形化编程语言,可以与各种数据库进行交互,实现数据的收集、处理和存储。在本文中,我们将主要介绍如何实现 LabVIEW 与 SQL Server 数据库的连接,旨在帮助初学...

    数据库中的左连接和右连接的区别

    ,别人问我一个问题:数据库中的左连接和右连接有什么区别?如果有A,B两张表,A表有3条数据,B表有4条数据,通过左连接和右连接,查询出的数据条数少是多少条?多是多少条?  我被这个问题问住了,后来我去问了...

    关于数据库连接的问题

    右连接与左连接相对应,其特点是返回所有右表(第二个表)中的记录,即使在左表(第一个表)中没有匹配项也会返回。同样地,对于左表中不存在匹配项的情况,结果集中对应的列会显示为NULL。 **示例**:同样以上述两...

    SQL_左外连接_右外连接_全连接_内连接

    右外连接与左外连接相反,返回右表的所有行,即使在左表中没有匹配的行。对于左表中没有匹配的行,结果集中的相应列将是NULL。 ```sql SELECT authors.*, publishers.* FROM authors RIGHT JOIN publishers ...

Global site tag (gtag.js) - Google Analytics