(前言)这次学习比较重要的知识点是学习如何使用子查询(真实开发中比较少用,因为使用起来效率不高,但现阶段还是得做个了结),分页查询比较重要的是学习如何使用以及其中有一个公式比较重要需要理解,联合查询用的比较少,也比较简单,就只有两种区别比较好区分,最后一个就是DML语法,主要就是学习如何使用数据库进行一波增删改查;
一:子查询
子查询顾名思义就是在一个SELECT查询语句中在嵌套第二个查询语句,或者更多,在使用时需要用一个()来将子查询的语句包裹起来,才能使用;一共有四种子查询的情况;
1:跟在where后面的子查询;
例:查询工资最高的员工信息。(一般进行这种查询语句我们得先知道整张表中最高的工资是多少,然后通过条件查询就能得到最高工资的员工个人信息,但是我们在这里使用一个跟在where后面的子查询就能一步到位)
SELECT * FROM emplyees WHERE salary = ( SELECT max(salary) FROM emplyees);
2:跟在having后面的子查询;(和where的区别在于having是在分组后才能使用,而where是在分组前使用的语句)
例:查询最低工资大于部门6的最低工资的部门id。(这边的思路是先进行一波查询查询部门6的最低工资,然后在使用一个分组查询,在having那里拼接上条件,将部门6的最低工资查询语句放进去然后就能得到一波结果)
SELECT department_id,min(salary) FROM emplyees GROUP BY department_id
HAVING min(salary) > ( SELECT min(salary) FROM emplyees WHERE department_id = 6);
3:直接跟在SELECT后面的子查询;
例:查询所有员工姓名,工资以及所有员工平均工资。(这边必须要使用一个子查询,因为在这里我们使用了一个分组函数,需要注意的是在使用了分组函数以后整张表都会变成一组数据,所以这边如果不使用子查询的话就会导致查询员工姓名和工资时只会出现一条数据)
SELECT t1.emplyee_name,t1.salary,( SELECT avg(salary) FROM emplyees) avg_salaryFROM emplyees t1;
4:跟在FROM后面的子查询;(这样的好处就是可以直接将子查询所得到的信息直接当作一张新的表格来使用);
例:查询每个部门的平均工资等级。
SELECT * FROM (
SELECT AVG(salary) avg_salary_dpt,department_id
FROM emplyees
GROUP BY department_id
) t1 LEFT JOIN job_grades t2
ON t1.avg_salary_dpt BETWEEN t2.lowest_sal AND t2.higest_sal;
5:跟在exists后面的子查询;(这是一个很有意思的函数,使用这个子查询的话如果信息为真他就会返回1,如果进行子查询的语句为假的话那么就会返回一个0);
SELECT EXISTS(SELECT * FROM emplyees WHERE emplyee_id = -1); -- 0
SELECT EXISTS(SELECT * FROM emplyees); -- 1
二:分页查询
分页查询的作用是在于查询一个信息时会跳出来很多信息,那我不想一次性获取全部信息的话,就可以使用一个分页查询,那么当我想要一页获取多少信息时就能够获取到多少信息,分页查询比较重要的点在于有一个公式得记清楚,还有就是索引最开始是从0开始计算的;
select [查询列表]
from 表
[连接类型join 表2 on 连接条件]
[where 筛选条件]
[group by 筛选条件]
[having 分组后筛选]
[order by 排序]
limit offset,size
公式是:offest = (pageNum-1) * pageSize -----其中offest是从第几条信息开始查询,pageNum的意思是页码,pageSize的意思是每页包含的数据数量;
三:联合查询;(就是可以将多条语句的结果合并成一个结果);
有两种方式一种是不去重一种是去重,还有就是联合查询有要求要查询的信息数量必须一致,否则不行;
-- student表和teacher表没有外键关联,使用联合查询将两个结果集合并
SELECT name FROM student
UNION
SELECT tname FROM teacher;
-- UNION会有去重效果,使用UNION ALL可以保留重复的部分
SELECT name FROM student
UNION ALL
SELECT tname FROM teacher;
四:DML语法;(主要就是数据库的添加,修改和删除);
1:添加信息(有三种不同的方式)
-- 方式一
insert into 表名(列名1,列名2,…) values (值1,值2,…);
-- 方式二
insert into 表名 set 列名1 = 值1,列名2 = 值2,…
insert into emplyees (emplyee_name, sex) values ("张三", "男");
-- 或者
insert into emplyees set emplyee_name = "张三", sex = "男";
-- 表名后面的列名可以省略,默认是所有列名,填写的值需要把所有的列补全
insert into emplyees values (null, "张三", null, "男", null, null, null, null, null, null, null);
并且方式一支持子查询和批量信息插入
insert into emplyees (emplyee_name, sex) values ("张三", "男"),("李四", "女"),("王五","男");
2:修改信息
UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,… [WHERE 筛选条件] -- 不加where会把整张表的数据改掉
(修改多表的操做方法)
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列 = 值
where 筛选条件
案例:修改员工emplyee_id为1的员工信息,以及该员工对应的部门名称。
UPDATE emplyees t1
LEFT JOIN departments t2
ON t1.department_id = t2.department_id
SET t2.department_name = '后勤部'
WHERE t1.emplyee_id = 1;
3:删除信息
DELETE FROM 表名 WHERE 筛选条件 -- 不加where默认删除整张表的数据
删除多表的记录
DELETE 表1的别名,表2的别名
FROM 表1 别名
inner|left|right join 表2 别名
ON 连接条件
WHERE 筛选条件
-
案例:删除员工id为1001的员工信息,以及该员工对应的部门信息。
DELETE t1,t2 FROM emplyees t1 LEFT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.emplyee_id = 1;
-
truncate
清空数据,只能删除全表的数据,比delete效率高一点点。
truncate table 表名;