mysql-多表联合查询(重点)

单表查询和多表联合查询区别

  • 单表就是查询一张表里面的数据
  • 多表就是查询多个字段,这多个字段来自两张表以上

联合查询按照年代分

  • SQL92,1992年发布的
  • SQL99,1999年发布的

联合查询按查询方法分

  • 内连接。内连接又分为等值连接和非等值连接以及自连接。
  • 外连接。左外连接以及右外连接。
  • 全连接(目前用的很少了)

笛卡尔积现象,多表查询的过程

假设现在有两张表,我们进行联合查询,如果没有任何限制条件那么就会产生下表中的现象。
在这里插入图片描述

内连接实例1

在这里插入图片描述

SELECT j.job_title ,e.salary 
FROM t_jobs j ,t_employees e
WHERE j.job_id = e.JOB_ID;
--这种是SQL92语法

内连接之等值连接。

两张表的相同字段,这就是等值连接。上面的就是一个等值连接

SQL99语法

--下面是写法1
select 字段1,字段2 
from1 
inner join2
on1.字段a =2.字段a
where 筛选条件;

--写法2
select 字段1,字段2 
from1 
join2
on1.字段a =2.字段a
where 筛选条件;

--inner 可以省略,省略就是表示内连接
--on后面跟的是条件
--写成一行就是...这样的
select 字段1,字段2 ...from1 join2 on1.字段a =2.字段a;

给个例子
在这里插入图片描述

SELECT j.job_title ,e.salary  FROM t_jobs  j JOIN t_employees e ON j.job_id = e.JOB_ID;

内连接之非等值连接

on后面使用的 <,>,<=,>=以及between … and …
在这里插入图片描述

SELECT first_name, job_title  
FROM t_jobs j 
JOIN t_employees e 
on e.salary  BETWEEN  j.min_salary AND j.max_salary;

外连接之左连接

语法结构

--写法1
select 字段1,字段2...
from1
left  outer join2
on1.条件 =2.条件;

--写法2
select 字段1,字段2...
from1
left  join2
on1.条件 =2.条件;


--左连接就是   from 表1 left join 表2    中表1是主要的表,所有表1数据都要查询出来,on后面的条件进行筛选表2中的条件。
---其中outer可以省略

外连接之右连接

语法结构

--写法1
select 字段1,字段2...
from1
right outer join2
on1.条件 =2.条件;

--写法2
select 字段1,字段2...
from1
right join2
on1.条件 =2.条件;


--左连接就是   from 表1 on join 表2     中表2是主要的表,所有表2数据都要查询出来,on后面的条件进行筛选表1中的条件。
--outer可以省略

左连接都可以换成右连接;右连接也可以换成左连接

外连接和内连接区别。

  • 外连接的结果数目一 定 >= 内连接的数目

三、四张表的语法结构。

--假设表1有10条记录,表2有50条记录,表3有400条记录,表4有1000条记录,进行连接查询,那么会执行10 * 50 * 400 * 1000 = 200000000次。
select 字段
from1
join2
on1和表2连接条件
join3
on1和表3连接条件
join4
on1和表4连接条件

子查询

select 语句中嵌套select 语句

可以出现在位置

select  ...这里可以写select子查询
from  ...这里也可以写select子查询
where ...这里也可以写select子查询

where中子查询

可以使用的案例,查询比平均工资高的人的姓名和工资
因为 where 语句后面不能有聚合函数,像后面这是错的select *** from **** where salary > avg(salary);
所以select *** from *** where salary > (select avg(salary) from *** );

from 后面有子查询

特点:可以将from 后面的子查询(select *** from ***)看成是一张临时表,
例如:select *** from 某表,(select *** from ***) where …

select 后面的子查询

略过,难懂。知道可以放在这里有子查询就行。

union合并查询结果集(效率高)

注意事项:union在进行结果结合的时候,要求两个结果集的列数相同,也就是select后面的字段个数相同,甚至要求字段类型相同。
给个例子。
查询姓名为张三或者李四的工资以及性别。

--方法1:
select salary,gender from t_user,t_salary where name = '张三' or name = '李四';

--方法2:
select salary,gender from t_user,t_salary where name in('张三','李四');

--方法三:
select salary ,gender from t_user,t_salary where name = "张三"
union
select salary ,gender from t_user,t_salary where name = "李四";

--上面三中查询结果一样,但是union的结果要快一点。
--因为多表查询过程是乘法,union是加法。
--例如上面的t_user有400条数据,t_salary有500条数据,那么方法1和方法2会执行 400 * 500 = 200000次,但是union联合查询就执行 400 + 500 = 900 次。是不是更快些。

limit查询结果集显示一部分(很重要)。

可以达到分页的效果
**在mysql中limit在order by之后执行的 **

--语法
limit a.b;
limit a为起始下标,b为显示的总行数
limit 5,6意思就是起始下标是5,显示6行数据
--起始下标最开始为0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值