多表查询,子查询,及查询语句中语句执行的先后顺序和特点
对多张表进行查询操作
查询方式1:
笛卡尔积查询
select * from 表1,表2;
结果:让表1中的每一条记录和表2中每一条记录一次组合
表1 n条记录
表2 m条记录
最终查询结果:n * m 条
注意:
1.观察笛卡尔积查询的最终结果,很多数据没有实际作用
2.查询结果太多,对内存压力大
笛卡尔积查询优化(内连接)
加上条件
隐式内连接
select * from 表1,表2 where 表1.字段 = 表2.字段;
显示内连接语法
select * from 表1 inner join 表2 on 条件;
注意:内连接语法条件过滤时,使用的是 on 关键字
例1:select * from kecheng,teacher where kecheng.teacherid = teacher.tid;
例2:select * from kecheng inner join teacher on kecheng.teacherid = teacher.tid;
外链接(outer join)(谁在前面就先显示哪个表的数据)
左外连接 ---- left outer join
结果:
以左表为准,左表中的所有数据都有 + 右表中符合条件的数据(连接条件on和判断条件where)
右外连接 ---- right outer join
结果:
以右表为准,右表中的所有数据都有 + 左表中符合条件的数据
外连接和内连接的区别:
1.内连接获取的是严格符合条件的数据
2.外连接获取的是严格符合条件的数据 + 左表(left)/右表(right)中不符合条件的数据
子查询:一个查询的结果作为另外一个查询的条件(一个查询中包含另一个查询)
必须保证查询的结果为一个具体的值!!!(作为条件时)
难点:char与varchar的比较:
相同点:二者都是存储文本(字符串)的
不同点:
1.数据声明的长度范围不同
char --- 0 --- 255
varchar --- 0 --- 65535
拓展:varchar(10)
长度:在mysql 4.0 之前代表的字节数
在mysql 5.0 开始,代表字符数
2.底层存储格式不同
char(10) ---- 'AB' ---- 'AB ' (已经定义了长度了,就像数组一样,你不用也有)
varchar(10) ---- 'AB' ---- '2AB' (有算法封装了长度,你定义的长度是最大长度)
A、varchar 空间分配更灵活
B、虽然char可能浪费空间,但是效率高
char 比 varchar 效率高
3.什么时候使用 char? 什么时候使用 varchar?
具体情况具体分析
用于固定格式的数据 char
不确定格式 varchar
语句查询中的顺序:
select D_*
from 表名
where A_条件
group by B_字段
having C_条件
order by E_字段;
0、先执行from
1、执行where后的A_条件
2、执行group by的 B_字段,拆分成子表
3、执行having的C_条件,对子表进行筛选
4、执行select的D_*,将子表合成一张表
5、执行order by的E_字段,对4中的表进行排序(如果是用基础属性,就是按照符合条件的第一条的语句的基础属性在排序)
show create table 表名;
显示所有的建表信息(可用于查询约束名等然后对约束进行操作)
limit
select * from 表名 limit n, m; 用于显示数据库中从第(n+1)条数据开始的共m条语句