多表关系分类
一对一:任意一方添加外键,关联另外一方的主键,并且设置外键唯一unique
一对多(多对一) :在多的一方建立外键,指向一的一方的主键
多对多:将两张表的主键提取出来建立一张中间表
直接查询:会产生无效的笛卡尔积
select * from table1,table2;
加入where条件解决无效笛卡尔积问题
select * from table1,table2 where table1.id=table2.id;
连接查询
内连接:两张表交集部分数据
隐式内连接
select 字段列表 from table1,table2 where 条件;
显式内连接
select 字段列表 from table1 inner join table2 on 连接条件;
左外连接:左表全部数据,两张表交集部分数据
select 字段列表 from table1 left join table2 on table1.id=table2.id;
右外连接:右表全部数据,两张表交集部分数据
select 字段列表 from table1 right join table2 on table1.id=table2.id;
自连接:与表自身连接,必须使用别名
select * from table 别名1 join table 别名2 on 别名1.id=别名2.id;
联合查询
将多次查询的结果合并起来,形成一个新的结果集。
多张
select 字段列表 from t1 where column=(select column from t2);
表的列数必须保保持一致。
union:将所有数据合并,去除重复
union al: 将所有数据直接合并,不去除重复
select 字段列表 from table1
union (all)
select 字段列表 from table2;
子查询(嵌套查询)
sql语句中嵌套select语句,成为子查询(嵌套查询)
select * from t1 where column=(select column from t2);
子查询出现的位置:
where之后
from之后
select之后
根据查询结果分为:
标量子查询:子查询结果为单个值
常用操作符:= ,<= ,>= , > ,< ,<>
列子查询:子查询结果为一列
常用的操作符: IN 、 NOT IN 、 ANY 、 SOME 、 ALL
select * from emp where dept_id in
(select id from dept where name = '销售部' or name = '市场部');
行子查询:子查询结果为一行
常用的操作符: = 、 <> 、 IN 、 NOT IN
select * from emp where (salary,managerid) =
(select salary, managerid from emp where name = '张无忌');
表子查询:子查询结果为多行多列
常用的操作符: IN
select * from emp where (job,salary) in
( select job, salary from emp where name = '鹿杖客' or name = '宋远桥' );