多表查询
多表关系
- 一对多
部门和员工的关系,一个部门可以对应多个员工 - 多对多
学生与课程的关系,一个学生可以选择多门课程,一门课程可以供多个学生选择。
建立中间多,至少包含两个外键,分别关联两方的主键 - 一对一
多用于单表拆分,如用户基本信息和用户受教育信息、用户家庭情况信息等,通过主键与外键和唯一关键字约束。
多表查询概述
从多个表中查询数据。笛卡尔积现象,两个表的数据相乘产生的数据冗余,需要消除。
查询格式:
SELECT * from user,user_edu where user.id = user_edu.userid;
内连接
查询A、B表交集部分数据。
隐式内连接
多个表使用,隔开SELECT 字段列表 FROM 表1,表2 WHERE 条件;
显式内连接
多个表使用join连接SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件;
外连接
分为:左外连接和右外连接
左外连接
查询左表所有数据以及两张表交集部分数据SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
右外连接
查询右表所有数据以及两张表交集部分数据SELECT 字段列表 FROM 表1 ROGHT [OUTER] JOIN 表2 ON 条件;
自连接
当前表与自身的连接查询,自身连接必须使用表别名,可以是内连接也可以是外连接
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;
联合查询
union(去重),union all(直接合并)
把多次查询的结果合并起来,形成一个新的查询结果集。
SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B;
子查询
嵌套查询,子查询。
根据子查询的结果分类:
标量子查询,查询结果为单个值(<,>,=,>=)
select * from emp where entrydate > (select entry from emp where name = 'chuck');
列子查询,查询结果为一列(IN,NOT IN ANY SOME ALL)
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部'); select * from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部'));
行子查询,查询结果为一行(= <> IN NOT IN)
select * from emp where (salary,managerid) = (select salary,managerid from emp where name ='chuck');
表子查询,查询结果为多行多列。
select * from emp where (job,salary) in (select job,salary from emp where name = 'chuck' or name = 'joan'); select e.*,d.* from (select * from emp where entrydate > '2021-01-01') e left join dept d on e.dept_id = d.id;
根据子查询位置:
- WHERE
- FROM
- SELECT
1 游客 2025-03-27 23:57 回复
555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
1 游客 2025-03-27 23:56 回复
555-1 waitfor delay '0:0:15' --
1 游客 2025-03-27 23:55 回复
555
1 游客 2025-03-27 23:54 回复
555
1 游客 2025-03-27 23:52 回复
555
1 游客 2025-03-27 23:51 回复
555
@@BIQht 游客 2025-03-27 23:50 回复
555
1-1; waitfor delay '0:0:15' -- 游客 2025-03-27 23:48 回复
555
1 游客 2025-03-27 23:47 回复
555
1 游客 2025-03-27 23:46 回复
555
1 游客 2025-03-27 23:44 回复
555
1 游客 2025-03-27 23:42 回复
555