上集回顾

  上节学习了查询的一些高级操作,算是入门了对数据库的初级查询使用。本节在回顾并练习上节习题的基础上,学习剩下的两种查询内容。

查询,继续查询

多表查询 select * from <表1>,<表2>

  这种多表查询又叫笛卡尔查询,要小心使用,因为其结果是在各个表查询到的记录量的乘积。

MySQL投影的定义 mysql投影查询_数据库

  实际上也就是把两个表或者多个表的记录排列组合在一起。但是不同的表可能会有相同的字段名,如id字段。这时候就可以给相同的字段起别名来避免这种情况,使用投影查询的命名方式,如 select student.id sid ........ from students,classes;。因为要逐个输入表名.字段也是相当麻烦,所以可以使用表的简写:select s.id ........... from students s, classes c;

MySQL投影的定义 mysql投影查询_学习日记_02

  多表查询后面也能跟where语句来限制显示的记录,如用c.id=1 AND s.gender='M'来显示。其实我虽然理解了多表查询的显示内容和实现方法,但是不懂它有什么意义,如果不根据一些联系,只是把多个表凑在一起结合显示好像没有什么意思。等后面再思考解决这个问题。

MySQL投影的定义 mysql投影查询_IT_03


连接查询 from <表格1> inner join <表格2> on 连接关系

  连接查询对多个表进行join、运算。简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。这是一种非常有用的查询,在多表之间的交互中很有用,查找关联信息并且把关联结果生成新表,但是这里没有说后续的内容,只有查询,咱先拿下怎么查的:

先确定主表,仍然使用from <表1>的语法;
再确定需要连接的表,使用inner join <表2>的语法;
然后确定连接条件,使用on <条件...>
可选:加上where子句、order by等子句。

  举例说明:我们的两个表students和classes如下

MySQL投影的定义 mysql投影查询_mysql_04


  表students中班级没有名称,而根据表classes中的id和表students中的class_id对应可以将表students中的班级名称填充上:

MySQL投影的定义 mysql投影查询_mysql_05

另外,除了语句inner join外,还有:

right outer join:列出右表都存在的记录,没有的字段用NULL填充
left outer join列出左表都存在的记录,没有的字段用NULL填充
full outer join列出两个表都存在的记录,没有的字段用NULL填充

  举例显示根据班级id的连接查询(四班没有学生,新生在的五班没有班级名称信息):

MySQL投影的定义 mysql投影查询_数据库_06

  注意,廖大神的教程中有full outer join的用法,但是我这里使用会出错,经过查询发现目前MySQL不支持这句语法,但是可以用union把前两种进行综合输出:

MySQL投影的定义 mysql投影查询_数据库_07

MySQL投影的定义 mysql投影查询_数据库_08

  总结一下这些连接查询(最后的full用union代替):

MySQL投影的定义 mysql投影查询_MySQL投影的定义_09


学习感悟:今天终于把这些查询方式都学完了,后续还需要勤加练习,不过应该不需要专门练习,在学习后续内容的过程中自然会多多的使用。总体浏览了一下简单的教程,也是包括两大部分:查询和修改,其中修改的内容量还要少于查询。另外还要包含一些数据库的管理命令。总之,数据库没有我想象中的那么复杂和困难,使用起来也是简单方便,不过要想熟练地操作数据库,乃至于后面的自主构建数据库还有很长的路要走,加油~~