python进阶(十一、mysql:连表查询、子查询)

3.mysql数据库
3.11 连表查询
1)建表


2)插入数据


3)数据查询

3.11.1. 交叉连接(基本不用):
不使用任何匹配条件。生成笛卡尔积

可以使用where条件查询(后面学了内、外连接,就用on条件了)

因为字段名dep_id在连表中是惟一的,可以省略前面的表名

连表查询并排序

3.11.2. 内连接:inner join...on...
内连接只显示满足on条件的数据
select * from 表1 inner join 表2 on 条件;

使用as重命名表,在条件判断时使用

内连接形成了一张新表,后面可以继续使用where、order by等语法进行筛选、排序等

3.11.3. 外连接
3.11.3.1. 左外连接:left join...on...
select * from 表1 left join 表2 on 条件;
左外连接会将不满足on条件的左表数据,同时显示出来。

3.11.3.2. 右外连接:right join...on...
select * from 表1 right join 表2 on 条件;
右外连接会将不满足on条件的右表数据,同时显示出来。

3.11.3.3. 全外连接:union(了解)
全外连接,会将不满足on条件的左表数据和右表数据,同时显示出来。
mysql不支持全外连接(full join),但可以使用union将左外连接表和右外连接表联合起来。

练习:
1)找到技术部的所有人的姓名

2)找到人力资源部年龄大于40岁的人的姓名

3)找出年龄大于25岁的员工及员工所在部门

4)以内连接的方式查询department和employee表,并以升序的方式显示

5)显示各个部门的人数

没有人的运行部,在上面的结果中没有体现。使用左外连接可以统计没有人员的部门

上面的结果,按人数从高到低排序

所谓连表:就是把两张大表连在一起创建1张大表,从from开始到on条件结束就是形成新表。形成新标之后,就可以使用where、group by、order by、having进行约束、分组、排序、过滤,和单表查询一样。

3.12 子查询
3.12.1. 带in关键字的子查询
1)查询平均年龄在25岁以上的部门名
连表查询:

子查询:
(1)先在employee表中查出平均年龄在25岁以上的部门id

(2)在department表中查出dep_id对应的部门名

(3)将两个语句嵌套,用第一条语句代替第二条语句的201,202

2)查看技术部员工姓名
(1)先查在department表中查技术部id

(2)在员工表中查出部门id是技术部id的人名

(3)使用子查询

此处子查询只有一个查询结果可以使用“=”判断

3)查看不足1人的部门名
方法一:
(1)先在employee表中查出有人的dep_id

(2)在department表中查出部门名,部门名不在有人的部门id列表中

(3)使用子查询

方法二:
(1)先在employee表中查出所有人的dep_id,并去重

(2)在department表中查出部门名,部门名不在所有人的部门id列表中

(3)使用子查询

3.12.2. 带比较运算符的子查询
比较运算符:=、!=、>、>=、<、<=、<>
1)查询大于所有人平均年龄的员工名与年龄

2)查询大于部门内平均年龄的员工名、年龄
(1)查出各个部门的平均年龄

(2)将查询结果与employee表进行连表

(3)加where判断

3.12.3. 带EXISTS关键字的子查询(了解)
EXISTS关字键字表示存在。
在使用EXISTS关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。True或False。
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询


注意:
如果一个问题既可以使用连表查询,也可以使用子查询。推荐使用连表查询,连表查询的效率更高。

原文地址:https://www.cnblogs.com/bdzxh/p/14088975.html