MySQL--多表查询

表与表之间的关系:
一对一:例如t_person表和t_card表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表。设计从表可以有两种方案:
在t_card表中添加外键列(相对t_user表),并且给外键添加唯一约束;
给t_card表的主键添加外键约束(相对t_user表),即t_card表的主键也是外键。
要描述一对一关系,可以在任意的一方添加外键。
一对多(多对一):最为常见的就是一对多!一对多和多对一,这是从哪个角度去看得出来的。t_user和t_section的关系,从t_user来看就是一对多,而从t_section的角度来看就是多对一
描述一对多或多对一关系时,一般都是在多的一方加外键。
多对多:例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系。例如再创建一张表t_stu_tea表,给出两个外键,一个相对t_stu表的外键,另一个相对t_teacher表的外键。
注意:无论是什么样的关系,最终都是外键的设置。

多表查询:
1、    内连接
a)    cross join 交叉连接(了解)  会产生迪卡尔积
b)    natural join 相等连接(了解)
c)    join using   join 表名 on 条件   可以指定字段来消除迪卡尔积。
显示内连接
join on格式:select * from 表1 join 表2 on 条件。
select * from 表1 inner join 表2 on 条件
隐式内连接
Select * from表1,表2 where 条件;
内连接只能获取有关联的数据。
2、外连接:
OUTER JOIN ON
左外连接 LEFT OUTER JOIN ON  [左表全部查出]    右外连接 RIGHT OUTER JOIN  ON [右表全部查出]
全外连接(MySQL不支持)FULL JOIN               自然连接  NATURAL JOIN
3、子查询:
一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询可以出现在任何位置:select、from、where。。。
1).    单行单列子查询
就是一个值  = > < >= <= !=
查找出与小刘一个部门的人
SELECT * FROM emp WHERE dept_id=(SELECT dept_id FROM emp WHERE NAME='小刘') AND NAME!='小刘';
2).    单列多行子查询
就是多个值 可以使用in all  any
查询出与3部门工次一样的员工信息
SELECT * FROM emp WHERE salary IN(SELECT salary FROM emp WHERE dept_id=3) AND dept_id!=3;
>any:大于子查询中的最小值。
>all:  大于子查询中的最大值。
<any:小于子查询中的最大值。
<all:  小于子查询中的最小值。
>=any:大于等于子查询中的最小值。
>=all:大于等于子查询中的最大值。
<=any:小于等于子查询中最大值。
<=all:小于等于子查询中最小值。
!=any或<>any:不等于子查询中的任意值。
!=all或<>all:不等于子查询中的所有值。
=any:等于子查询中任意值。
=all:等于子查询中所有值(无意义)。
3).    多行多列子查询(单行多列)
可以将它们做为一张表处理。
显示出id<3的所有部门的员工信息,并显示出部门名称
SELECT * FROM emp ,(SELECT * FROM dept WHERE id<3) mydept WHERE emp.dept_id=mydept.id;

猜你喜欢

转载自jackpot1234.iteye.com/blog/2326064