Join连接

本文详细介绍了关系数据库中的连接查询,包括内连接、外连接、交叉连接等不同类型的连接方式及其应用场景。通过具体的SQL语句示例展示了如何进行表的创建、数据的插入以及各种连接查询的操作。

连接查询,是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

创建表,插入数据

create table students (
 SID varchar(4) not null primary key,
 NAME varchar(30),
 AGE int,
 CLASSID varchar(3)
);

create table classes (
   CLASSID varchar(3) not null primary key,
   CLASSNAME varchar(20)
);

insert into students(   
select 'S001','Student1','1','C01' from dual union all  
select 'S002','Student2','2','C02' from dual union all  
select 'S003','Student3','3','C04' from dual);

insert into classes(  
select 'C01','Class No.1'from dual union all  
select 'C02','Class No.2' from dual union all  
select 'C03','Class No.3' from dual);

Students :                                                                           Classes:

     

1. 自连接 join, inner join 

  --自连接 :只返回两张表连接列的匹配项。
  --以下三种查询结果一样。
  select * from students s, classes c where s.classid=c.classid; 
  select * from students s inner join classes c on s.classid=c.classid;
  select * from students s join classes c on s.classid=c.classid;

2. 笛卡尔积 cross join 

  --笛卡儿乘积连接 :即不加任何条件,达到 M*N 的结果集。
  --以下两种查询结果一样。
  select * from students,classes;
  select * from students s cross join classes c;

3. 左外连接 left join 

  --左连接 :列出左边表全部的,及右边表符合条件的,不符合条件的以空值代替。
  --在(+)计算时,哪个表带(+)则需要条件符合,另一个则显示全部的。即(+)放左即右连接,放右即左连接。
  --以下结果集相同。
  select * from students s left join classes c on s.classid=c.classid;
  select * from students s,classes c where s.classid=c.classid(+);

注:(+)是oracle中的一种特殊用法,(+)表示外连接,并且总是放在非主表的一方,哪个表带(+)则需要符合where条件,否则显示空值。

4. 右外连接 right join 

  --右外连接:与左连接正好相反,列出右边表全部的,及左边表符合条件的,不符合条件的用空值替代。
  --(+)一样,它的位置与连接相反。
  select * from students s right join classes c on s.classid=c.classid;
  select * from students s,classes c where s.classid(+)=c.classid;

5. 全连接 full join 

  --全连接 :产生M+N的结果集,列出两表全部的,不符合条件的,以空值代替。
  select * from students s full join classes c on s.classid=c.classid;


### JOIN连接查询的使用方法 JOIN 连接查询用于将多个表中的行根据某些条件组合在一起。为了连接 n 个表在一起,最少需要 n - 1 个连接条件。例如,为了连接 4 个表,最少需要 3 个连接条件。在写一个连接表的 select 语句时,在列名前面用表名或者表的别名可以使语义清楚,并且加快了数据库访问[^1]。 ### JOIN连接查询的示例 #### 内连接(等值连接) 内连接只返回满足连接条件的数据。可以使用 `ON` 子句或 `USING` 语句。 ```sql -- 使用ON子句 SELECT e.last_name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id; -- 使用USING语句 SELECT e.last_name, department_name FROM employees e INNER JOIN departments d USING(department_id); ``` #### 左外连接 两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行。 ```sql SELECT deptno, dname, empno, ename, job FROM dept LEFT JOIN emp USING(deptno); ``` #### 右外连接 两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行。 ```sql SELECT deptno, dname, empno, ename, job FROM dept RIGHT JOIN emp USING(deptno); ``` #### 满外连接 两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的所有行。 ```sql SELECT deptno, dname, empno, ename, job FROM dept FULL JOIN emp USING(deptno); ``` ### 与Oracle单行子查询返回多个行问题的关联 当使用子查询作为条件时,可能会出现单行子查询返回多个行的错误。而 JOIN 连接查询可以避免这种问题。例如,原本使用子查询的语句: ```sql SELECT emp.ename, emp.sal FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'research'); ``` 如果子查询 `SELECT deptno FROM dept WHERE dname = 'research'` 返回多个 `deptno`,就会报错。可以将其转换为 JOIN 连接查询: ```sql SELECT emp.ename, emp.sal FROM emp JOIN dept ON emp.deptno = dept.deptno WHERE dept.dname = 'research'; ``` 这样就避免了单行子查询返回多个行的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值