多表关系
一对多:一个表A的每个数据指向另一个表B的多个数据,由B建立外键关联A的主键
多对多: 例如学生与选课的关系,建立第三张表外键关联A与B的主键
一对一: 一个表A的每个数据指向另一个表B的一个数据,任一表建立外键即可
多表查询
直接查询:
select * from emp , dept; 会出现m×n条数据
隐式内连接:
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;
显式内连接:
select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
左外连接 :
select e.*, d.name from emp e left join dept d on e.dept_id = d.id;
书上说是A,B表的交集,我觉得更好的理解是根据查询条件抽取AxB中的一部分,内外区别在于对查询条件中null值的处理,内连接查询中null被忽略,外连接查询中null值的行仍然被保留下来。
自连接 :
即A,B表相同,但用的时候要起个别名不然会报错
联合查询 :
SELECT 字段列表 FROM 表A …
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;
要求两次查询的列数量相同
子查询 :
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。子查询的位置为select或from或where之后
一些操作符:
IN 在指定的集合范围之内,多选一
NOT IN 不在指定的集合范围之内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同,使用SOME的地方都可以使用ANY
ALL 子查询返回列表的所有值都必须满足
select * from emp where
dept_id = (select id from dept where name = ‘销售部’);
select * from emp where
salary > all (select salary from emp where dept_id =(select id from dept where name = ‘财务部’));
select * from emp where
(salary,managerid) = (select salary, managerid from emp where name = ‘张无忌’);
select * from emp where
(job,salary) in ( select job, salary from emp where name =’鹿杖客’ or name = ‘宋远桥’ );
标量子查询 :子查询的值为一个元素
列子查询 :子查询的值为一列元素
行子查询:子查询的值为一个行元素
表子查询:子查询的值为一个表