- 浏览: 286879 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
sunlin:
水文 其他erp就没这样的问题? 不能单方面拿sap说 ...
【转】揭秘SAP在华真相:天价收费与用户之灾 -
zjut_xiongfeng:
用当前日期所在月的第一天,比如2010-7-30的当前月第一天 ...
pb函数库之日期、时间函数 -
550627069:
你好!问下 在PB中显示当前日期的前一个月 应该怎么做?求教
pb函数库之日期、时间函数
左连接与右连接
左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行
并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
比如:职员表包括: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表中找,排除那些选了课的即可。
发表评论
-
ranges 语法
2011-06-23 13:17 931RANGES语句:要用与选择表相同的结构创建内表,可使 ... -
开发的误区
2011-06-22 23:28 8091.传输请求号的时候按传输序列号大小 传输绝对没问题,这是一个 ... -
ALV 颜色
2011-06-22 09:06 999关于ALV GRID的颜色 A ... -
co02权限增强
2011-06-09 11:12 1230CO02 有无撤销技术实现权限的增强 标 ... -
EXIT 出口查找程序
2011-06-03 11:23 1108SPAN { font-family: "Co ... -
ALE development
2011-05-30 09:41 9331. Introduction to ALE developm ... -
将SmartForms转换为PDF保存到本地
2011-05-25 11:03 2841REPORT ZSMARTFORMS_TO_PDF.* Va ... -
abap动态内表
2011-05-20 11:43 1193This Tutorial details about c ... -
DYNP_VALUES_UPDATE 實時更新 Selection Screen
2011-05-19 15:56 1856DYNP_VALUES_UPDATE 實時更新 Selecti ... -
Smartforms 中更改默认编辑器的两种方法
2011-04-12 19:07 1780Smartforms 中更改默认编辑器的两种方法(Tow Me ... -
Implicit enhancement points
2011-03-22 14:35 1221SAP Implicit enhancement poin ... -
如何将应用程序文档加进SAP R/3并有效利用?
2011-03-21 18:31 916如何将应用程序文档加进SAP R/3并有效利用? sap ... -
sap 长文本
2011-03-21 18:13 1708SAP长文本编辑 在 ... -
获取当前 GRID
2011-03-21 11:36 809SPAN { font-family: "Co ...
相关推荐
外连接(OUTER JOIN)是一种连接操作,用于查询多个表中的数据,但不 sadece 返回符合连接条件的数据行,而是返回左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中的所有数据行。外连接可以分为三种...
右连接与左连接相反,它返回右表的所有记录,以及与之匹配的左表记录。如果左表中没有匹配的记录,结果将显示右表记录和左表的NULL值。右连接在需要确保右表所有数据都被包含时非常有用。 SQL语法示例: ```sql ...
* 右连接:与左连接相似,只是基准表换成了右边的表。 * 全连接:简单说就是左右连接的全部表示,根据连接条件在任意一方表中出现无法匹配的情况,不满足条件的部分均用空值代替。 左连接和右连接 左连接和右连接的...
右连接与左连接相反,它返回右表的所有记录及左表中匹配的记录。如果左表没有与右表相匹配的记录,则结果集中相应的列将显示为NULL。同样地,右连接可以通过`RIGHT JOIN`或`RIGHT OUTER JOIN`来实现。 示例中的另一...
右外连接(RIGHT OUTER JOIN)则是以右表为基础进行操作,与左外连接类似,但方向相反。`SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id` 会返回所有右表 t2 的记录,以及与左表 t1 匹配的记录。在这个例子中,t2...
SQL 左连接、右连接和全连接知识点 在关系数据库管理系统中,连接操作是将两个或多个表连接起来,以便从多个表中检索数据。SQL 提供了多种连接操作,包括左连接、右连接和全连接。本篇文章将详细讲解左连接、右连接...
右连接与左连接相反,它返回所有右表(即第二个指定的表)的行以及左表中匹配的行。如果左表中没有匹配的行,则结果集中的左表列将包含NULL值。也就是说,右连接确保了右表的所有记录都将出现在结果集中。 #### ...
MySQL数据库中涉及表连接操作,主要有三种:左连接(LEFT JOIN)、右连接(RIGHT JOIN)和内连接(INNER JOIN)。理解它们的区别对于进行高效数据查询是至关重要的。 首先,左连接(LEFT JOIN)指的是从左表(table...
本文将详细介绍六种主要类型的 JOIN:左连接(LEFT JOIN)、右连接(RIGHT JOIN)、全连接(FULL JOIN)、内连接(INNER JOIN)、交叉连接(CROSS JOIN)以及自连接(SELF JOIN)。通过实例讲解每种连接的特点和应用...
**右连接**与左连接类似,但方向相反。它返回右表的所有行,并在左表中查找相应的匹配项。如果左表中不存在匹配项,则结果集中相应的列会显示为NULL。 **特点**: - 右表的所有行都会出现在结果集中。 - 左表中没有...
- 右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN):与左外连接相反,返回右表的所有行,左表中没有匹配的行同样填充NULL。 - 全外连接(FULL OUTER JOIN 或 FULL JOIN):返回两个表的所有行,无论是否存在匹配。如果...
交叉连接(CROSS JOIN)是最基础的连接类型,不带任何连接条件,它会返回两个表的笛卡尔积,即每个左表的行与右表的每一行组合,生成的结果集大小为两表行数的乘积。 举个例子,假设我们有两个表:`voteMaster`...
右连接与左连接相反,它返回右表的所有记录,即使在左表中没有匹配的记录。对于左表中没有匹配的右表记录,结果集将显示为NULL。右连接在你需要保留所有右表数据,同时获取与之关联的左表数据时很有用。以同样的员工...
右连接与左连接相反,它保留右表的所有记录。如果左表中没有匹配的记录,结果集中的相应列将填充为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 是一款强大的图形化编程语言,可以与各种数据库进行交互,实现数据的收集、处理和存储。在本文中,我们将主要介绍如何实现 LabVIEW 与 SQL Server 数据库的连接,旨在帮助初学...
,别人问我一个问题:数据库中的左连接和右连接有什么区别?如果有A,B两张表,A表有3条数据,B表有4条数据,通过左连接和右连接,查询出的数据条数少是多少条?多是多少条? 我被这个问题问住了,后来我去问了...
右连接与左连接相对应,其特点是返回所有右表(第二个表)中的记录,即使在左表(第一个表)中没有匹配项也会返回。同样地,对于左表中不存在匹配项的情况,结果集中对应的列会显示为NULL。 **示例**:同样以上述两...
右外连接与左外连接相反,返回右表的所有行,即使在左表中没有匹配的行。对于左表中没有匹配的行,结果集中的相应列将是NULL。 ```sql SELECT authors.*, publishers.* FROM authors RIGHT JOIN publishers ...