子查询
嵌套查询,查询条件里面嵌套了小的查询
select 字段
from 表名
where 查询条件(select 字段 from 表名 where 查询条件)
例:
查询1班叫张三的学员的java语言的成绩
java语言在课程表(kcb)里,学号,姓名在学生表(xsb)里,成绩在成绩表(cjb)里
select cj
from cjb
where xh = (select xh from xsb where bj= '1班' and xm = '张三')
and kch = (select kch from kcb where kcm = 'java语言')
关联查询
笛卡尔积运算:
select * from xsb,cjb;
select * from xsb cross join cjb;
当xsb有11行8列,cjb有12行3列
联合的表有(11*12)行,(8+3)列
通过相同的字段做过滤
select 字段 from 表1,表2 where 表1.相同字段=表2.相同字段
例:
select * from xsb,cjb where xsb.xh=cjb.xh
注:
做笛卡尔积运算,将多张表连接成一张更大的表,但会产生许多没有意义的数据,可通过多张表中相同的字段来过滤垃圾数据
只要跟了两张表,即表明要做笛卡尔积运算,产生的额垃圾数据,需要通过关联条件来消除,,如关联条件外还有其他条件,用and联接。
内联接:
只返回满足关联条件的数据
左外联接:
left join
除返回满足关联条件的结果外,还将左边的表完整的展示出来,右边的表不满足关联条件的字段补空值(null)
select *
from xsb left join cjb
on (xsb.xh = cjb.xh)
将xsb完全展示出来
右外联接:
right join
除返回满足关联条件的结果外,还将右边的表完整的展示出来,左边的表不满足关联条件的字段补空值(null)
select *
from xsb right join cjb
on (xsb.xh = cjb.xh)
将cjb完全展示出来
全外联接:
full join (mysql不支持,可用union集合操作来实现)
除返回满足关联条件的结果外,还将两边的表完整的展示出来,两边的表不满足关联条件的字段补空值(null)
select *
from xsb left join cjb
on (xsb.xh = cjb.xh)
union
select *
from xsb right join cjb
on (xsb.xh = cjb.xh);
将左外联接和右外联接做集合运算
三表关联实例:
select 字段
from 表1,表2,表3
where表1.相同字段1 = 表2.相同字段1
and 表2.相同字段2= 表3.相同字段2
例:
select * from xsb,cjb,kcb
where xsb.xh = cjb.xh
and cjb.kch = kcb.kch
事务
一组DML操作,只允许同时成功或者同时失败
事务的代码实现:
开启事务:start transaction
事务提交:commit
事务回滚:rollback
例:a给b转账500
start transaction;
update 表名 set money = money-500 where name='a';
update 表名 set money = money +500 where name= 'b';
--rollback
commit;
注:
mysql默认事务都是自动提交的,即执行mysql语句之后马上commit,如不想自动提交,可使用start transaction来显示开始事务