多表查询
有时候往往不会在一张表存储所有信息,而是需要分表存储。那么查询的时候就需要多表查询数据。
表关系
一对一关系
一张表A的一条记录只能对应一张表B中的一条记录,另一张表B中的一条记录也只能对于表A中的一条记录。
一对多关系
一张表A中的一条记录可以对应另一张表B的多条记录,另一张表B中的一条记录只能对于表A中的一条记录。
多对多关系
一张表A中的一条记录可以对应另一张表B的多条记录,另一张表B的一条记录也可以对应表A中的多条记录。
当表关系为多对多时,通常需要一个第三方表(关系表)来记录存在多对多关系的表的外键。
INNER JOIN
关联表查询:
mysql
SELECT * FROM stu AS s INNER JOIN class AS c ON s.id = c.id可以关联多个表,但是这些表之间要存在关联关系
mysql
SELECT c.id,count(*) FROM stu AS s INNER JOIN class AS c ON s.`class_id` = c.id INNER JOIN `article` AS a ON s.id = a.`stu_id` GROUP BY c.idOUTER JOIN
外链接。
LEFT JOIN
LEFT JOIN可以理解为查询出来的数据一定会包含左侧表的所有数据。
mysql
SELECT * FROM stu AS s LEFT JOIN stu_info AS si ON s.id = si.`stu_id` where si.qq IS NULLRIGHT JOIN
RIGHT JOIN可以理解为查询出来的数据一定会包含右侧表的所有数据。
mysql
SELECT c.cname FROM stu AS s RIGHT JOIN class AS c ON s.`class_id` = c.id WHERE s.id IS NULLSELF JOIN
自链接。
SELF JOIN为自连接即表与自身进行关联。虽然自连接的两张表都是同一张表,但也把它按两张表对待,这样理解就会容易些。
mysql
SELECT * FROM stu AS s1 INNER JOIN stu AS s2 ON s1.`class_id` = s2.`class_id` WHERE s1.sname = "Eddie" AND s2.sname != "Eddie";