- 浏览: 271958 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 862RANGES语句:要用与选择表相同的结构创建内表,可使 ... -
开发的误区
2011-06-22 23:28 7771.传输请求号的时候按传输序列号大小 传输绝对没问题,这是一个 ... -
ALV 颜色
2011-06-22 09:06 964关于ALV GRID的颜色 A ... -
co02权限增强
2011-06-09 11:12 1190CO02 有无撤销技术实现权限的增强 标 ... -
EXIT 出口查找程序
2011-06-03 11:23 1067SPAN { font-family: "Co ... -
ALE development
2011-05-30 09:41 8861. Introduction to ALE developm ... -
将SmartForms转换为PDF保存到本地
2011-05-25 11:03 2799REPORT ZSMARTFORMS_TO_PDF.* Va ... -
abap动态内表
2011-05-20 11:43 1147This Tutorial details about c ... -
DYNP_VALUES_UPDATE 實時更新 Selection Screen
2011-05-19 15:56 1757DYNP_VALUES_UPDATE 實時更新 Selecti ... -
Smartforms 中更改默认编辑器的两种方法
2011-04-12 19:07 1741Smartforms 中更改默认编辑器的两种方法(Tow Me ... -
Implicit enhancement points
2011-03-22 14:35 1176SAP Implicit enhancement poin ... -
如何将应用程序文档加进SAP R/3并有效利用?
2011-03-21 18:31 854如何将应用程序文档加进SAP R/3并有效利用? sap ... -
sap 长文本
2011-03-21 18:13 1660SAP长文本编辑 在 ... -
获取当前 GRID
2011-03-21 11:36 782SPAN { font-family: "Co ...
相关推荐
好东西爱上对方的身份的是否受到辐射的发生大幅爱谁谁地方爱对方说的打算放大身份的爽肤水爱上对方是地方大师傅爱上对方说的飞洒
oracle数据库表左连接右连接全连接的认识
数据结构中关于左连接、右连接、授权的代码操作
NULL 博文链接:https://201307125158.iteye.com/blog/2115424
数据库操作中,左连接和右连接。
,别人问我一个问题:数据库中的左连接和右连接有什么区别?如果有A,B两张表,A表有3条数据,B表有4条数据,通过左连接和右连接,查询出的数据条数少是多少条?多是多少条? 我被这个问题问住了,后来我去问了...
SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接
C3P0数据库连接池和jar包,因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化...
在关系型数据库中经常用到多表查询操作,因此连接(join)就是一种非常重要的手段。 在学习中使用两个表进行辅助了解 employee 员工表,department 部门表 employee department 1.笛卡尔积 笛卡尔积在SQL中的实现...
数据库左右连接方法详细讲解,文档内列举了实例。很清晰
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。
数据库中左连接的详细描述 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来(全连接是以多个表为基础) 左连接(左表中所有数据,右表中对应数据) 右连接(右表中所有数据,左...
我整理了一个很简单的文档,很容易就能理解什么是左连接 右连接 还有内连接
。
。
JS跑马灯.网站首页的图片左右滑动.连接数据库,从数据库中获得图片. 有,ADO.NET的连接功能.
关于左连接和右连接总结性的一句话,左连接 where只影向右表,右连接where只影响左表
这是一个用Java写的数据库连接池,可以支持大约10000左右的并发访问数据库的连接
DbVisualizer数据库连接工具,可以适合左右数据库连接的客户端,方便实用
结果表中除了匹配行外,还包括左表有的但右表中不匹配的行,对于这样的行,从右表被选择的列设置为NULL。 ● 右外连接(RIGHT OUTER JOIN): 结果表中除了匹配行外,还包括右表有的但左表中不匹配的行,对于这样的...