单表查询和多表联合查询区别
- 单表就是查询一张表里面的数据
- 多表就是查询多个字段,这多个字段来自两张表以上
联合查询按照年代分
- 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
from 表1
inner join 表2
on 表1.字段a = 表2.字段a
where 筛选条件;
--写法2
select 字段1,字段2
from 表1
join 表2
on 表1.字段a = 表2.字段a
where 筛选条件;
--inner 可以省略,省略就是表示内连接
--on后面跟的是条件
--写成一行就是...这样的
select 字段1,字段2 ...from 表1 join 表2 on 表1.字段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...
from 表1
left outer join 表2
on 表1.条件 = 表2.条件;
--写法2
select 字段1,字段2...
from 表1
left join 表2
on 表1.条件 = 表2.条件;
--左连接就是 from 表1 left join 表2 中表1是主要的表,所有表1数据都要查询出来,on后面的条件进行筛选表2中的条件。
---其中outer可以省略
外连接之右连接
语法结构
--写法1
select 字段1,字段2...
from 表1
right outer join 表2
on 表1.条件 = 表2.条件;
--写法2
select 字段1,字段2...
from 表1
right join 表2
on 表1.条件 = 表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 字段
from 表1
join 表2
on 表1和表2连接条件
join 表3
on 表1和表3连接条件
join 表4
on 表1和表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