测试再学习一点mysql的高级查询,就足够我们使用了。
更深入的研究不是这个阶段需要掌握的,如果感兴趣的话,可以在工作之余自己再深入了解。
我们这次只介绍一些高级查询中相对基础和用的比较多的查询方法。
多表查询
多表查询不常用,因为效率很低。所以我们了解有这种用法,看到有人用的话,就要提出是否可以优化的建议。
如果想要进行多表查询,那么表与表之间必须有一定的关联性(外键),否则多表查询无意义。
多表查询的时候一定要带where用外键去关联,否则会产生冗余数据(笛卡尔积现象)
select * from company,department where company.id = company_fid
连接查询
连接查询和多表查询的使用场景是相同的,但是连接查询的性能要高于多表查询。
连接查询分为内查询和外查询
内连接
关键字:inner join ... on ...
on相当于内连接的条件关键字,和表查询的where一样的意义。
select * from department inner join company on companys.id = company_fid
外连接
分类:左连接和右连接(左外连接、右外连接)
关键字:left(right)join ... on ...
说明:左连接应用比较多,实际上左连右连,取的结果是一样的,所以我们选择其一即可。一般情况下,左连接的使用场景比较多,因为从左到右符合我们的开发和书写sql的习惯。
select * from department left join company on company.id = company_fid
左连接left join时,会以左表为基准,即会显示出左表所有的数据,右连接正好相反
下面我们再来介绍一个最后的最常用的查询方法,子查询
子查询
所谓的子查询,就是是嵌入在其他sql语句中的select语句,也称为嵌套查询。
MySQL会从最内层的查询开始,层层向外执行。
子查询可以分为三类
1 单行单列:子查询返回的结果集是一个具体值
需求:查询北京分公司的所有部门负责人。
字段介绍:
department_leader 部门领导人
department 部门表
company_fid 公司外键
company 公司表
company_name 公司名
select department_leader from department where company_fid = (select id from company where company_name = '北京分公司')
可以看到括号里的,就是子查询语句。
2单列多行:子查询返回的结果集是值的纵向列表(集合)
需求:查询除了销售部的所有员工姓名及年龄
字段介绍:
user_name 员工姓名
user_age 员工年龄
staff 员工表
staff_fid 员工表对应部门表的外键
department 部门表
department_name 部门名称
select user_name,user_age from staff where staff_fid in (select id from department where department_name != '销售部')
3)多列多行:子查询返回的结果集是一个临时表
注意:多列单行的情况,也是临时表,也就是只要是多列(多个字段)那么就可以看作成临时表
需求:查询所有员工信息,并显示员工对应的部门名称
字段介绍:
staff 员工表
department_name 部门名称
department 部门表
select * from staff left join (select id,department_name from department ) as cmd on staff.departmment_id = cmd.id
注意,其实这个查询没有必要用到子查询,但是我们为了示例演示使用。子查询的结果等于返回的一个表,所以我们再利用左连接去查对应的结果。