1.什么是连接查询?
实际开发中,大部分情况下都不是从单表中查询数据,一般都是多张表联合起来查询取出最终结果。
实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。
2.连接查询的分类?
根据语法出现的年代来划分的,包括:
SQL92
SQL99(比较新的语法)
根据表的连接方式来划分,包括:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全练级(这个用的少)
2.3、在表的连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)
案例:找出每一个员工部门名称,要求显示员工和部门名称
EMP表
select ename,deptno from emp;
+--------+--------+
| ename | deptno |
+--------+--------+
| SMITH | 20 |
| ALLEN | 30 |
| WARD | 30 |
| JONES | 20 |
| MARTIN | 30 |
| BLAKE | 30 |
| CLARK | 10 |
| SCOTT | 20 |
| KING | 10 |
| TURNER | 30 |
| ADAMS | 20 |
| JAMES | 30 |
| FORD | 20 |
| MILLER | 10 |
+--------+--------+
DEPT表
select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
select ename,dname from emp,dept;
因为后续没有调节限制,这样结果会得到56条,每个ename都会分别和四条dname结合。这称为笛卡尔乘积现象
笛卡尔积现象主要是让我们知道两个表联合查询的时候,是表中的一项和另外表中的匹配粘连。
关于表的别名:
select e.ename,d.dname from emp e,dept d;
第一:执行效率高
如果不加别名,对'ename'系统会去emo和dept两张表里去寻找,降低了程序执行的效率
第二:可读性好
2.4怎么避免笛卡尔积现象?当然是加条件进行过滤
思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
不会,次数还是56次,只不过显示的是有效记录。
案例:找出每一个员工部门名称,要求显示员工和部门名称
select
e.ename,d.ename
from
emp e,dept d
where //加上过滤条件,就会显示想要显示的
e.deptno = d.deptno;
以上是92语法,不用!!! 主要是了解
2.5 内连接 中的 等值连接
最大的特点是条件是等量关系。
案例:查询每个员工的部门名称,要求显示员工名和部门名
SQL99:
select
e.name,d.name
from
emp e
join
dept d
on
e.deptno = d.deptno; //连接的条件是相等,故为等值连接
语法:
...
A
join
B
on
连接条件
where
...
SQL99语法结构更清晰一些:表的连接调节和后来的where条件分离了。
带inner可以明确知道是等值连接,inner可以省略
select
e.name,d.name
from
emp e
inner join
dept d
on
e.deptno = d.deptno; //连接的条件是相等,故为等值连接
语法:
6.内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关
案例:找出每个员工的工资等级,要求显示员工名,工资,工资等级
第一步:先看每个员工的薪资
+--------+---------+
| ename | sal |
+--------+---------+
| SMITH | 800.00 |
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
第二步找到工资的等级
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
工资等级是分区间的,比如1等级为工资:700-1200
则联系起来
select
e.name ,e.sal,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
+--------+---------+-------+
| ename | sal | grade |
+--------+---------+-------+
| SMITH | 800.00 | 1 |
| ALLEN | 1600.00 | 3 |
| WARD | 1250.00 | 2 |
| JONES | 2975.00 | 4 |
| MARTIN | 1250.00 | 2 |
| BLAKE | 2850.00 | 4 |
| CLARK | 2450.00 | 4 |
| SCOTT | 3000.00 | 4 |
| KING | 5000.00 | 5 |
| TURNER | 1500.00 | 3 |
| ADAMS | 1100.00 | 1 |
| JAMES | 950.00 | 1 |
| FORD | 3000.00 | 4 |
| MILLER | 1300.00 | 2 |
+--------+---------+-------+
7.自连接:最大特点:一张表看作两张表。自己连接自己
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
mysql> select ename,empno,mgr from emp;
emp a 员工表
+--------+-------+------+
| ename | empno | mgr |
+--------+-------+------+
| SMITH | 7369 | 7902 |
| ALLEN | 7499 | 7698 |
| WARD | 7521 | 7698 |
| JONES | 7566 | 7839 |
| MARTIN | 7654 | 7698 |
| BLAKE | 7698 | 7839 |
| CLARK | 7782 | 7839 |
| SCOTT | 7788 | 7566 |
| KING | 7839 | NULL |
| TURNER | 7844 | 7698 |
| ADAMS | 7876 | 7788 |
| JAMES | 7900 | 7698 |
| FORD | 7902 | 7566 |
| MILLER | 7934 | 7782 |
+--------+-------+------+
emp b 领导表(领导也是员工)
+--------+-------+
| ename | empno |
+--------+-------
| JONES | 7566 |
| BLAKE | 7698 |
| CLARK | 7782 |
| KING | 7839 |
FORD | 7902 |
+--------+-------+------+
员工的领导编号 = 领导的员工编号
select
e.name '员工名',b.ename '领导名' //从这里可以看出为啥要给表起别名
from
emp a
inner join
emp b
on
a.mgr = b.empno;
+--------+--------+
| 员工名 | 领导名 |
+--------+--------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+--------+