sql基础--多表连接及⼦查询⾸先,多表连接肯定是多个表之间进⾏操作,这⾥先定义三个表:
供应商表(t_supplier):
(f_sid,f_sname,f_city)
零件表(t_part):
(f_pid,f_pname,f_price)
销售表(t_sells):
(f_id,f_date,f_sid,f_pid,f_count)
⼀、多表连接查询
1、交叉连接查询(笛卡尔积连接):第⼀个表中的每条数据与第⼆个表中的每条数据记录配对
1.1传统⽅式连接:查询每个供应商可能供应零件情况
select f_sid,f_pid
from t_supplier,t_part;
----------表1有m条数据,表2有n条数据,那么笛卡尔积得到的数据总数是m*n条
1.2join连接  oracle中,可以使⽤cross与join⼀起使⽤来创建笛卡尔积
select f_sid,f_pid
from t_supplier cross join t_part;
2、为了避免出现笛卡尔积
内连接:等值连接、⾮等值连接
2.1、等值连接(等同连接、内部连接、简单连接)
公共列是两个或更多表中共有的列
select f_sid,f_sname,f_pid,f_count
from t_supplier t_su,t_sells t_se  /*添加别名*/
where t_su,f_sid=t_se.f_sid;
--注意:(1)、查询公共列,要指出具体出⾃哪个表
(2)、where⼦句中的f_sid列名称前⾯包括了对应的表名称
3、join⽅法
3.1natural join 关键字将在包括⼀个同等命名和定义的字段之间将⾃动连接
select f_sid,f_name,f_pid,f_count
from t_supplier
natural join sells;                        /*注意是natural,⽽不是natura*/
3.2join ...... using  可以根据在两个表中具有相同名称和定义的列创建连接
natural join sells using(f_sid);
3.3join  on 当using⼦句中没有包含⼀个同等命名和定义的字段时,必须添加
select t_supplier.f_sid,f_name f_pid,f_count
from t_supplier
where t_sells on t_supplier.f_sid=t_sells.f_sid;
4、⾮等值连接
4.1查询每个供应商编号,姓名,零件编号,零件名称,零件数量>=50
select t_supplier.f_sid,f_sname,t_part.f_pid,f_pname,f_count
from t_supplier,t_part,t_sells
where t_supplier.f_sid=t_sells.f_sid and t_part.f_pid=t_sells.f_pid;
--注意点:当表名是别名时,其他地⽅也要⽤别名表⽰,⽐如select语句中⽤了表的原名称⽽在where语句中⽤了别名,运⾏的时候就会报错。
4.2⾃连接:⼀个表中的数据引⽤了本表之中其他的信息
也就是说⼀个表连接他本⾝,将这个表看做是两个表来对待,之后给这⼀个表起两个不同的别名就成了名称不⼀                        样,但内容相同的两个表,也就实现了⾃连接
⾸先创建表:employees表,(em_id,em_name,mana_id)
插⼊数据若⼲
--查询员⼯表中所有的管理者信息
select distinct mna.*
from employees work,employess mana
__id;
4.3外连接    当需要在结果中包括存在于⼀个表中
--左外连接    left join
select su.f_sid,f_pid,f_id,f_count
from t_supplier su
left join t_sells se
sql left join 多表连接on su.f_sid=se.f_sid;
--右外连接  right join
select su.f_sid,f_pid,f_id,f_count
from t_supplier su
right join t_sells se
on su.f_sid=se.f_sid;
--全外连接  full join
all join t_sells se
on su.f_sid=se.f_sid;
注意:(+)是⼀个操作符,可以在where⼦句中表⽰左右外连接,(+)跟着从表
select su.f_sid,f_pid,f_id,f_count
from t_supplier su,t_sells se
where su.f_sid=se.f_sid(+);
⼆、⼦查询:      嵌套
单⾏⼦查询              单个结果
多⾏⼦查询              多个结果
相关(关联)⼦查询
不相关(不关联)⼦查询
规则:(1)⾃⾝就是⼀个完整的查询,也就是说有select from 语句
(2)不能包括order by ⼦句
(3)必须在⼀组括号中
(4)if将⼦查询在外部查询where或having,那么⼦句在⽐较运算符右边--单⾏⼦查询
--统计出所有⽐名为"screv"贵的零件
--1、查询出名为"screv"的价格
select f_price
from t_part
where f_pname="screv";
--2、查询出价格⾼于10的零件信息
select *
from f_part
where f_price >10;
--3、合起来
select *
from t_part
where f_pricr >(select f_price
from t_part
where f_pname="screv");
--多⾏⼦查询    IN运算
--在books表中查询⼀个类型最贵的图书价格
select *
from books
where bretail in(select max(bretail) from books group by bcategory);
--NOT IN  这种情况适⽤于⼦查询中返回多个值时的情况
-
-统计哪些不销售任何零件的供应商
select *
from t_supplier
where f_sid not in(select distinct f_sid
from t_sells);
多⾏⼦查询:all和any ⼦查询
--查询零售价⼤于computer类的最贵的书>all
select *
from books
where bretail>all(select bretail
from books
where bcategory='computer');
--另⼀种⽅法
select *
from books
where bretail>(select max(bretail)
from books
where bcategory='computer');
--查价格低于computer类中最便宜的书<all
select *
from books
where bretail<all(select bretail
from books
where bcategory='computer');
--另⼀种⽅法
select *
from books
where bretail<(select min(bretail) from bookswhere bcategory='computer');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。