EXISTS子查询:
select...from 表名 where exists(子查询);
子查询有返回结果: EXISTS子查询结果为TRUE。
子查询无返回结果: EXISTS子查询结果为FALSE,外层查询不执行。
#检查“Logic Java”课程最近一次考试成绩。如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数。
SELECT ... FROM 表名
WHERE ...
GROUP BY ...
WHERE子句:用来筛选 FROM 子句中指定的操作所产生的行。
GROUP BY子句:用来分组 WHERE 子句的输出。
HAVING子句:用来从分组的结果中筛选行。
内连接(INNER JOIN):找两个或多个表匹配的。
右外连接(RIGHT JOIN):以右边的表作为主表。
事务的特性
事务必须具备以下四个属性,简称ACID 属性
原子性(Atomicity):事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行。
一致性(Consistency):当事务完成时,数据必须处于一致状态。
隔离性(Isolation):并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务。
持久性(Durability):事务完成后,它对数据库的修改被永久保持。
开始事务:BEGIN;或START TRANSACTION;
提交事务:COMMIT;
回滚(撤销)事务:ROLLBACK;
关闭/开启自动提交状态:SET autocommit=0|1;
值为0:关闭自动提交。值为1:开启自动提交。
#批量插入参加今天“Logic Java”课程考试的十名学生成绩。如果输入的成绩大于100分,则取消操作。
select...from 表名 where exists(子查询);
子查询有返回结果: EXISTS子查询结果为TRUE。
子查询无返回结果: EXISTS子查询结果为FALSE,外层查询不执行。
#检查“Logic Java”课程最近一次考试成绩。如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数。
select r.studentno,r.studentresult from result r
where subjectno=(select subjectno from subject where subjectname='java')
and examdate=(select max(examDate) from result where subjectno=(select subjectno from subject where subjectname='java'))
and studentresult>=80
order by studentresult desc
limit 5;
select r.studentno,r.studentresult from result r
where exists(select subjectno from subject where subjectname='java' and r.subjectNo=st.subjectNo)
and examdate(select max(examDate) from result where subjectno=(select subjectno from subject where subjectname='java'))
and studentresult>=80
order by studentresult desc
limit 5;
#如果有S2的学生,就查询参加S2学科考试的学员学号、科目编号、考试成绩,考试时间。
selsct studentno,subjectno,studentresult,examdate from result r
where exists(select * from student where gradeid=(select gradeid from grade where gradename='s2'))
and subjectNo in(select subjcetNo from subject where gradeId=(
select gradeId from grade where gradeName='s2'));
分组查询用法:
SELECT ... FROM 表名
WHERE ...
GROUP BY ...
#分别统计每个年级男、女生人数
SELECT `gradeId` AS 年级编号,`sex` AS 性别,COUNT(*) AS 人数
FROM `student`
GROUP BY `gradeId`,`sex`
ORDER BY `gradeId`;
WHERE与HAVING对比
WHERE子句:用来筛选 FROM 子句中指定的操作所产生的行。
GROUP BY子句:用来分组 WHERE 子句的输出。
HAVING子句:用来从分组的结果中筛选行。
内连接(INNER JOIN):找两个或多个表匹配的。
#查询学生编号,科目名称,学生成绩。
select studentno,subjectname,studentresult from result
inner join subject
on result.subjectNo=subject.subjectNo;
左外连接(LEFT JOIN):以左边的表作为主表。
右外连接(RIGHT JOIN):以右边的表作为主表。
事务的特性
事务必须具备以下四个属性,简称ACID 属性
原子性(Atomicity):事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行。
一致性(Consistency):当事务完成时,数据必须处于一致状态。
隔离性(Isolation):并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务。
持久性(Durability):事务完成后,它对数据库的修改被永久保持。
开始事务:BEGIN;或START TRANSACTION;
提交事务:COMMIT;
回滚(撤销)事务:ROLLBACK;
关闭/开启自动提交状态:SET autocommit=0|1;
值为0:关闭自动提交。值为1:开启自动提交。
#批量插入参加今天“Logic Java”课程考试的十名学生成绩。如果输入的成绩大于100分,则取消操作。
#关闭事务自动提交
SET autocommit = 0;
#开启新事务
START TRANSACTION;
#插入数据
INSERT INTO result(StudentNo,SubjectNo,ExamDate,StudentResult)
VALUES(10001,1,NOW(),90);
INSERT INTO result(StudentNo,SubjectNo,ExamDate,StudentResult)
VALUES(10002,1,NOW(),70);
INSERT INTO Result(StudentNo,SubjectNo,ExamDate,StudentResult)
VALUES(10003,1,NOW(),67);
#提交事务
COMMIT;
#插入错误数据
INSERT INTO Result(StudentNo,SubjectNo,ExamDate,StudentResult)
VALUES(10004,1,NOW(),101);
INSERT INTO Result(StudentNo,SubjectNo,ExamDate,StudentResult)
VALUES(10005,1,NOW(),102);
#回滚事务
ROLLBACK;
#开启自动提交
SET autocommit = 1;