我是靠谱客的博主 唠叨唇膏,最近开发中收集的这篇文章主要介绍跟我一起学习MySQL技术内幕(第五版):(第二章学习日记6),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2.8使用链接实现多表检索
2.8.1内连接
2.8.2对被链接的列引用进行限定
2.8.3左连接和右连接

因为第二天要早起 所以拖到了第二天忙完了才回来写。我的错。

select 的基本语法

select select_list
from table_list
where row_constraint
group by grouping_columns
order by sorting_columns
having group_constraint
limit  countl;

在这里边除了第一句,都是可选的,包括第二句 from MySQL也允许不存在

select sqrt(pow(3,2)+pow(4,2));

我们在第一章基本接触了以上的几个子句。having好像还没有介绍过。这里举个例子来说明:

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

having即由sum或其它集合函数运算结果的输出进行限制
sum这里对一个顾客的orderprice进行汇总,having在这里就相当于一个针对于函数的where语句。函数条件查询的时候,SQL需要使用having而不是where。
通常情况下,having子句被放置在SQL命令的结尾处。

这一节的主要内容是编写连接查询

1.内连接

select t1.*,t2.*from t1 inner join t2
where t1.i1=t2.i2; 

inner join即把一个表里的行与另一个表里的行进行匹配。然后产生结果。
通过增加where子句,实现表之间基于某些列值的匹配,这样整个操作只会选取t1,t2,表中
i1,i2列值相等的行。

其中inner join 可以等价替换为 join 或cross join
也可以替换为逗号运算符,但是有时候会因为优先级的问题而出错,所以作者不建议使用。

除此之外

select .... from ..inner join....on t1.i1=t2.i2;
select .... from ..inner join....using(same_column_name)

第一句即用on代替where
第二句使用的条件是两个表中需要连接的两个列必须同名!

2.被连接的表里列引用的限定
第一点:当连接的两个表中的列有相同列名的时候,要指定表名。

select a,t1.b,t2.b,c  from............

第二点:自连接操作时除了指定表明外,还要为这个表再次赋别名。

select mytable.column1,m.column2 from mytable inner join mytable as m

where mytable.column1>m.column2;

这两条语句把mytable表与自身连接起来,然后又为它的一个实例分配了一个别名,从而消除了在引用时的歧义问题。

3.左连接和右连接

left join 即把左表里在右表里未匹配上的显示出来
right join 即把右表里在左表里未匹配上的显示出来

输出结果时,未匹配上的行对应未匹配结果,对应值将为null,所以我们需要确认被匹配的表列的约束为not null,这样就会避免已经匹配上了,但是匹配的值为null的情况,使操作者误以为这一行并没有匹配上。

where table_name.column_name is null;

在连接后加上这个条件 就会只显示没有进行匹配的对应行。
而这种查询命令的多数目的就是为了知道谁没有匹配上,所以匹配上的显示出来这里按需求可有可无。

书的接下来就是把连接运用到了sampdb数据库上:
我敲代码练练手:

select 
  student.name,student.student_id,
  grade_event.data,grade_event.event_id,grade_event.category
from 
  student inner join grade_event
  left join score  on student.student_id=score.student_id
                  and grade_event.event_id=score.evvent_id
where score.score is null
order by   student.student_id,grade_event.event_id; 

书上最后一段有一个非常重要的注意事项:select使用的是student. student_id而不是score表,在这里score表作为被左连接的表,left join返回的所有列都是null值,如果继续使用score.student_id返回的列将全部是null,即错误,所以select选择是student表。

最后

以上就是唠叨唇膏为你收集整理的跟我一起学习MySQL技术内幕(第五版):(第二章学习日记6)的全部内容,希望文章能够帮你解决跟我一起学习MySQL技术内幕(第五版):(第二章学习日记6)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部