插播小知识
!.我们在写group by分组时候,select后面写的字段只能是排序的字段
SQL查询语句
限定输出 limit
在前面的几篇博客中小可爱应该发现了有些代码我是加了limit 10等一些代码,这样可以防止太多数据输出出来,
理论上,重复SQL查询语句,查询的结果(包括数据的顺序)都是一样的,所以才可以使用 limit 限制数据条数,实现分页功能。一般limit更多用于数据的初步查询或者最值的查询。
select * from dept_emp_latest_date limit 10;
select * from dept_emp_latest_date limit 0,10;
可以看出这两个的效果是一样的 ( limit 开始的位置, 读取几条数据),limit 10 就是limit 0,10的简写, 如果我们想从第几条数据开始读取也可以写出了
还有一个效果,在排序后取第一个就可以找到最大值或者最小值
-- 取最大年龄的数据 select * from table_name order by age desc limit 1; -- 取最小年龄的数据 select * from table_name order by age limit 1;
同理升序也是一样的
连接查询 join
当需要通过关联,在不同的表中获取不同的字段时,就需要连接查询。
在前面我们也讲了union的连接,union的连接是要字段数相同,并且拼接出来的表的字段数是不改变的,相当于是增加了多条数据,而join的拼接的表恰恰相反,就是会增加字段,给每一条数据再加数据
简单的说就是union就是纵向拼接,join就是横向拼接
select * from table1 (inner|left|right) join table2 on table1.column = table2.column
我来简单的讲解一下,我们可以理解一下,select 字段名 from 表名 而 table1 join table2 no table1.column =table2.column 相当于一个表,只是我们没有给他们命名而已,
相当于where,是在join里面的条件
内连接简单的说就是连接两个表相同的部分,不相同的部分就不要了,下面还有一张抽象一点的图
这个简单明了
代码如下:
select * from (select * from dept_emp limit 10) as a join (select * from employees limit 10) as b on a.`emp_no`= b.`emp_no`;
结果:
还有一个点就是当a表的同一个值有多个,b表的这个值也有多个就会像多对多的形式
一般我们使用join连接的时候一般会这样写
select a.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date` from (select * from dept_emp limit 10) as a join (select * from employees limit 10) as b on a.`emp_no`= b.`emp_no`;
这样可以简单明了的知道哪个字段来自哪个表,后面排除可以很快
小知识:
1.有相同字段要用表名作区分
2.在内连接可以取任意一张表的关联字段
进行三张表连接
select a.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date`, c.`dept_no`, c.`dept_name` from (select * from dept_emp limit 10) as a join (select * from employees limit 10) as b on a.`emp_no`= b.`emp_no` join departments as c on a.`dept_no`= c.`dept_no`;
右连接
right join:以右表为主表,在保证右表数据的前提下,关联左表数据,没有数据的位置用null补充。即 使左表中没有匹配,也从右表返回所有的数据
select a.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date` from (select * from dept_emp limit 10) as a right join (select * from employees limit 20) as b on a.`emp_no`= b.`emp_no`;
这次我的右连接写法是有误的,应该把a.`emp_no`,换成b.`emp_no`,
但为了让大家更好的和下面作对比
左连接
left join:以左表为主表,在保证左表数据的前提下,关联右表数据,没有数据的位置用null补充。即使 右表中没有匹配,也从左表返回所有的数据
select a.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date` from (select * from dept_emp limit 20) as a left join (select * from employees limit 10) as b on a.`emp_no`= b.`emp_no`;
从上面左右连接的截图看到如果我们以哪个表为主体就写哪个的字段,不要乱写,会造成数据的无法区分,
可能有一些小可爱也会有一些小错误,会把一些条件写在where里面就会造成意想不到的结果
select b.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date` from (select * from dept_emp limit 10) as a right join (select * from employees limit 20) as b on a.`emp_no`= b.`emp_no` where a.`emp_no` > 10005;
可以看出差别很大,所以我们使用join 连接的时候写条件一般都是要写在on那里
外连接
outer join:将两张表关联,没有数据的位置用null补充。只要其中一个表中存在匹配,则返回数据
外连接在一些数据库并不兼容,但是我们可以利用别的方法来获取和外连接一样的效果
外连接就是相同部分加两表不同部分
select a.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date` from (select * from dept_emp limit 20) as a left join (select * from employees limit 10) as b on a.`emp_no`= b.`emp_no` union select b.`emp_no`, a.`dept_no`, a.`from_date`, a.`to_date`, b.`birth_date`, b.`first_name`, b.`last_name`, b.`gender`, b.`hire_date` from (select * from dept_emp limit 10) as a right join (select * from employees limit 20) as b on a.`emp_no`= b.`emp_no`;
总结:
这里主要介绍了MySQL数据库的join的连接,有不懂的可以来私聊