EXISTS子查询的语法:
select....from 表名 where exists(子查询);#返回ture,false
例1:exists
#检查“Logic Java”课程最近一次考试成绩
#如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数
SELECT r.studentResult,r.`studentNo`,r.`examDate` FROM result r WHERE EXISTS(SELECT s.subjectno FROM subject1 s WHERE subjectname='java'
AND r.subjectNo=s.subjectno # 关联
AND examDate=(SELECT MAX(examdate) FROM result WHERE subjectno=(SELECT subjectno FROM subject1 WHERE subjectname='java'))
AND r.`studentResult`>=80)
ORDER BY studentResult DESC
LIMIT 5;
not exists #不存在-------
例2:
检查“Logic Java”课程最近一次考试成绩
如果全部未通过考试(60分及格),认为本次考试偏难,计算的该次考试平均分加5分 #不存在六十分以上的
SELECT AVG(studentresult)+5 AS 平均分 FROM result
WHERE NOT EXISTS (
SELECT * FROM `result` WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject` WHERE `subjectName` = 'Logic Java'
) AND `examDate` = (
SELECT MAX(`examDate`) FROM `result` WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName` = 'Logic Java')
) AND `studentResult` > 60)
AND `subjectNo` = ( SELECT `subjectNo` FROM `subject`
WHERE `subjectName` = 'Logic Java')
AND `examDate` = (
SELECT MAX(`examDate`) FROM `result` WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName` = 'Logic Java') );
例3:
#如果有S2的学生,就查询参加S2学科考试的学员学号、科目编号、考试成绩,考试时间
#先判断有S2的学生,在判断下面
SELECT studentno,subjectno,studentResult,examDate FROM result WHERE EXISTS (SELECT * FROM student1 WHERE gradeid=(SELECT gradeid FROM grade1 WHERE gradename='S2'))
AND subjectno IN (SELECT subjectno FROM subject1 WHERE gradeid=(SELECT gradeid FROM grade1 WHERE gradename='S2'));
group by 实现分组:
select ......from 表名
where...
group by......
例子:
SELECT COUNT(*),studentno,AVG(studentresult) ,subject FROM result
GROUP BY studentno
ORDER BY AVG(studentresult) desc;
也可以一起分组:
SELECT `gradeId` AS 年级编号,`sex` AS 性别,COUNT(*) AS 人数------------------------------------AS可写可不写----------------------
FROM `student`
GROUP BY `gradeId`,`sex`
ORDER BY `gradeId`;
分组筛选语句:
SELECT …… FROM <表名>
WHERE ……
GROUP BY ……
HAVING…… #group by 后面跟having
where和having对比:
WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句
用来分组 WHERE 子句的输出
HAVING子句
用来从分组的结果中筛选行
内连接(INNER JOIN)-----------------字段都存在的,两表匹配的-------------
外连接分为:
左外连接 (LEFT JOIN)-----------有一个主表,一个从表,left前面的表为主表,后面的为从表------------
右外连接 (RIGHT JOIN)--------------------right后面的为主表,前面的为从表----------
内连接:
SELECT ……
FROM 表1
INNER JOIN 表2
ON ……
例子:三表连接先连后连都可以
SELECT S.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩
FROM student AS S
INNER JOIN `result` AS R ON (S.`studentNo` = R.`studentNo`)
INNER JOIN `subject` AS SU ON (SU.subjectNo=R.subjectNo);
左外连接:将inner改为left
右外连接:将inner改为right
事务:
1.事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
2.多个操作作为一个整体向系统提交,要么都执行、要么都不执行
3.事务是一个不可分割的工作逻辑单元
转账过程就是一个整体
它需要两条UPDATE语句来完成,这两条语句是一个整体
如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元
事务必须具备以下四个属性,简称ACID 属性
原子性(Atomicity):事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):有可能产生并发,彼此独立的,跟线程差不多,分级别:
脏读1、不可重复度2、幻读3
级别由低到高:
读未提交:123
不可重复读:23
可重复读:3
串行化:
持久性(Durability):事务完成后,它对数据库的修改被永久保持
例子:
BEGIN;
UPDATE result SET studentResult=100 WHERE studentno=2 ;
COMMIT;
例2:
/*批量插入参加今天“Logic Java”课程考试的十名学生成绩
如果输入的成绩大于100分,则取消操作
*/
SET autocommit=0;#---------关闭事务自动提交---------------
BEGIN;#------------------------开启新事务,或者是start transaction--------------
INSERT INTO result(studentno,subjectno,examDate,studentResult) VALUES (7,2,NOW(),89),(8,2,NOW(),98),(9,2,NOW(),67);
COMMIT;#--------提交事务-------
#插入错误数据
INSERT INTO result(studentno,subjectno,examDate,studentResult) VALUES (5,2,NOW(),101);
INSERT INTO result(studentno,subjectno,examDate,studentResult) VALUES (6,2,NOW(),102);
ROLLBACK;#--------回滚事务-----
SET autocommit=1;#-------开启自动提交-------
作业一:成绩单
/*为每个学生制作在校期间每门课程的成绩单,要求每个学生参加每门课程的最后一次考试成绩作为该生本课程的最终成绩
成绩单的数据项
学生姓名
课程所属的年级名称
课程名称
考试日期
考试成绩*/
SELECT studentname 姓名,(SELECT gradename FROM grade1 WHERE gradeid=subject1.`gradeID`) 年级名称,subjectname 课程名称,examDate 考试日期,studentResult 成绩 FROM result r1
INNER JOIN student1 ON student1.`studentNo`=r1.`studentNo`
INNER JOIN subject1 ON subject1.`subjectNo`=r1.`subjectNo`
WHERE r1.`examDate` IN(SELECT MAX(examdate) FROM result r2 WHERE r2.`subjectNo`=r1.`subjectNo`)
ORDER BY subject1.`gradeID`;
作业二: