连接查询(内连接)

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  |
	+--------+--------+

发布了28 篇原创文章 · 获赞 0 · 访问量 439

猜你喜欢

转载自blog.csdn.net/wenshao007/article/details/104339769
今日推荐