多表查询
笛卡尔积:取 A,B集合所有组合情况
内连接查询:
内连接查询语法:
隐式内连接:查询学生和对应学习的信息
如果想要只显示想要的字段:查询student表的name age ,School表的name :
select student.name,school.name,student.age from student,school where student.schid=school.id;
也可以给表起别名:
select t1.name,t2.name,t1.age from student t1,school t2 where t1.schid=t2.id;
显式内连接
select * from student inner join school on student.schid=school.id;
显示内连接的inner 可以省略不写 如果有多个表跟条件,就多join几次
外连接查询
外连接查询语法:
outer可以省略
左外连接
查询学生表所有数据和对应的学校信息
select * from student left join dept on student.schid=school.id;
右外连接
查询学校表所有数据和对应的学生信息
select * from student right join dept on student.schid=school.id;
左外连接:相当于查询左表所有数据和交集部分数据
右外连接:相当于查询右表所有数据和交集部分数据
子查询
单行单列:
查询年龄大于小明的学生信息 ,我们需要先查询小明的年龄 再查询符合条件的学生:
select * from student where age>(select age from student where name ='小明');
多行单列:
查询体育部和文艺部所有的学生信息
先查询到部门对应id 然后根据部门id查询信息
select * from student where dep_id in (select did from dept where dname = '体育部' or dname='文艺部 );
多行多列:
查询入学日期为‘2022-11-11’之后的学生信息及学校信息
首先查询满足日期的学生 然后跟学校信息做个内连接查询
select * from (select * from student where join_date>‘2022-11-11’) t1,school where t1.schid=school.id;
练习:查询出部门编号,部门名称,部门人数
先查询学生表按部门分组并统计各个组的人数 得到部门id 跟对应的人数,然后跟部门表进行一个内连接
select dept.id,dept.dname,t1.count from dept,(select dept id,count(*)from student group by dept_id ) t1 where dept.id=t1.dept_id;
事务
事务简介:
数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元
事务的四大特征
原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) :多个事务之间,操作的可见性
持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
在写语句执行的时候默认是自动提交的