一、笛卡尔积
第一张表m行,第二张表n行,两表m*n行
mysql>select emp.*,dept.* from emp,dept;
二、等值连接
mysql>select emp.*,dept.* from emp,dept where emp.deptno=dept.deptno;
练习1:
1 select emp.ename,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;
2 select emp.ename,dept.loc,emp.comm from emp,dept where
emp.deptno=dept.deptno and dept.loc='CHICAGO' and emp.comm is not null;
3 select emp.ename,dept.loc from emp,dept where emp.deptno=dept.deptno
and emp.ename like '%A%';
三、多余两个表的连接
select c.name,o.itemid from customer c,order o,item i where
c.custid=o.custid and o.ordid=i.ordid;
四、非等值连接
create table salgrade(
grade varchar(50) primary key,
losal int,
hisal int
);
insert into salgrade values('A',1000,2000);
insert into salgrade values('B',2001,3000);
select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal
between s.losal and s.hisal;
练习2:
select emp.empno,emp.ename,emp.sal,grade.salgrade,dept.loc from
emp,dept,grade where emp.deptno=dept.deptno and
emp.sal between grade.losal and grade.hisal order by grade.salgrade;
五、自身连接
select worker.ename 'wname',manager.ename 'lname' from emp worker,
emp manager where worker.mgr=manager.empno;
想一个问题:看看怎么办?
我想在emp表里查看每个人的empno,ename,以及他的管理者的empno,ename?要用自连接。
select e1.empno,e1.ename,e2.empno,e2.ename from emp e1,emp e2 where e1.empno=e2.mrg;
练习3:
select e.empno,m.ename,m.empno from emp e,emp m,dept where
dept.deptno=e.deptno and e.empno=m.mgr and dept.loc in ('NEW YORK',
'CHICAGO');
-----------------------------------------------
训练题目:(等值连接)
1.写一个查询,显示所有员工姓名,部门编号,部门名称。
select emp.ename,dept.deptno,dept.dname from dept,emp
where dept.deptno=emp.deptno;
2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select emp.ename,dept.loc,emp.comm from dept,emp
where dept.deptno=emp.deptno and comm is not null
3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
-----------------------------------------------
六、ANSI SQL:
1笛卡尔积连接
select emp.*,dept.* from emp cross join dept;
2自然连接(简单情况的等值连接的写法,它要求两表只有一个相联字段,而且这个相连字段的数据类型相同)
select emp.*,dept.* from emp natural join dept;
3using(复杂情况的等值连接的写法,它不要求两表只有一个相联字段,而且这个相连字段的数据类型相同)
如果有若干个列名称相同但数据类型不同,自然连接子句可以用USING子句来替换,以指定产生等值连接的列。
如果有多于一个列都匹配的情况,使用USING子句只能指定其中的一列。
USING子句中的用到的列不能使用表名和别名作为前缀。
select emp.*,dept.* from emp join dept using(deptno);
4on子句(复杂情况的等值连接的简单写法)
select emp.*,dept.* from emp join dept on(emp.deptno=dept.deptno);
5左外连接
select emp.*,dept.* from dept left outer join emp on(emp.deptno=dept.deptno);
6右外连接
select emp.*,dept.* from emp left outer join dept on(emp.deptno=dept.deptno);
本文深入讲解了SQL中的各种连接查询技巧,包括笛卡尔积、等值连接、非等值连接、自身连接及ANSI SQL标准下的连接方式。通过实例演示如何在多个表中进行数据检索,适用于初学者和需要复习SQL连接技术的开发者。
534

被折叠的 条评论
为什么被折叠?



