多表查询不能使用 SELECT * from emp, dept; 会产生笛卡尔积。
笛卡尔积,有A,B两个集合,A中有5条信息,B中有4条信息,那么查询结果就是5*4=20条
一、内连接查询
-- 隐式内连接SELECT 字段列表 FROM 表1,表2,… WHERE 条件;例:select emp.name,emp.age,dept.dep_name from emp,dept where emp.dep_id = dept.id;可以给表起别名将上面的语句转换成下面这种。select t1.name,t1.age,t2.dep_name from emp t1,dept t2 where t1.dep_id = t2.id;
-- 显示内连接SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;如:select emp.name,dept.dep_name from emp inner join dept on emp.dep_id = dept.id;可以给表起别名将上面的语句转换成下面这种。select t1.name,t2.dep_name from emp t1 inner join dept t2 on t1.dep_id = t2.id;
二、外连接查询
(1)左外连接:相当于查询A表所有数据和交集部分数据左外连接:SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;select * from emp left join dept on emp.dep_id = dept.id;
(2)右外连接:相当于查询B表所有数据和交集部分数据右外连接:SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;select * from emp right join dept on emp.dep_id = dept.id;
三、子查询
(1)子查询概念查询中嵌套查询,称嵌套查询为子查询;(2)子查询根据查询结果不同,作用不同:①单行单列:作为条件值,使用 '=' '!=' '>' '<'等进行条件判断SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);查询年龄大于周八的select * from emp where age>(select age from emp where name = '周八');
②多行单列:作为条件值,使用in关键字进行条件判断SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);查询研发和销售的所有员工信息select * from emp where dep_id in (select id from dept where dep_name = '研发部' or dep_name = '销售部' );
③多行多列:作为虚拟表SELECT 字段列表 FROM (子查询) WHERE 条件;-- 查询入职日期是‘1998-08-01’之后的员工信息和部门信息把(SELECT * from emp WHERE join_date>'1998-08-01')这个多行多列表作为虚拟表查询放到from后面SELECT * FROM (SELECT * from emp WHERE join_date>'1998-08-01') t1,dept WHERE t1.dep_id = dept.id;
EntiyFramework一大特点就是Code first,但难免有时候因特殊原因需要Update model from database。此次使用该功能时遇到两个问题,且记之。 [问题一] Error 3027: No mapping specified for the following EntitySet/AssociationSet - XXXXXXX. [起因] 在…