跟我一起学习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表。

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告