- 一,字段下的数据操作
- delete from 表名—— 删除表(一条一条删除数据,自增序列不变)
#delete from 表名 where 条件—-删除满足筛选条件的数据
#truncate table 表名—-删除表(直接drop删除整个表,然后重新创建,自增序列重置),数据量大的时候,truncate效率更高 - 二,数据查询
- 三,like模糊查询
- 查询课程表中课时为100,110,130时的所有数据 IN 包含在或者or
SELECT FROMsubjects WHERE s.classHour=100 OR s.classHour=110 OR s.classHour=130;
SELECT FROMsubjects WHERE s.classHourIN (100,110,130);
#查询成绩表中成绩为100或者90的记录
SELECT * FROM result r WHERE r.studentResultIN (100,90); - 四,多表联合查询
- 五,自连接查询
- 自连接查询—-把一张表看成两张表 运用的等值连接
- 六,综合练习
- 七,分页查询,子查询
- 八,综合练习题
- 九.事务.索引.备份和恢复
- 十.创建索引.添加.查看.删除索引
- 十一.备份和恢复
- 十二.练习
- 十三、练习
- 十四、视图
一,字段下的数据操作
1.插入数据
insert into
insert into 表名(字段名) values(字段对应的值)
2,修改数据
update
update 表名 set 新字段名=[ ] where [条件]
3.删除数据
delete from
delete from 表名 where [ 删除条件 ]
truncate table 表名//清空表名
4.面试题:delete 和 truncate 清空数据的不同??
delete from 表名—— 删除表(一条一条删除数据,自增序列不变)
#delete from 表名 where 条件—-删除满足筛选条件的数据
#truncate table 表名—-删除表(直接drop删除整个表,然后重新创建,自增序列重置),数据量大的时候,truncate效率更高
5.结合练习
#创建数据库名字为bdqn,使用该数据库CREATE DATABASE bdqn;USE bdqn;#创建表,表名student1,字段id自增长,name varchar(20)DROP TABLE student1;CREATE TABLE student1(id INT(18) NOT NULL PRIMARY KEY COMMENT'学号',`name` VARCHAR(20) NOT NULL COMMENT'姓名')AUTO_INCREMENT=1 COMMENT'学生表';#添加字段 age 类型为int#alter table student1 drop age;ALTER TABLE student1 ADD age INT(18) COMMENT'年龄';#修改表字段name 修改为stuName 类型为varchar(50)ALTER TABLE student1 CHANGE `name` stuName VARCHAR(50);#修改表名为studentALTER TABLE student1 RENAME student;#添加数据(张三,18)(李四,20)(王五,45)INSERT INTO student(id,stuName,age)VALUES(1,'张三',18),(2,'李四',20),(3,'王五',45);#修改数据,将张三修改为16岁UPDATE student SET age=16 WHERE stuName='张三';#删除张三这条数据DELETE FROM student WHERE stuName='张三';#修改数据,将李四和王五的年龄修改为30岁UPDATE student SET age=30 WHERE stuName='李四' OR stuName='王五';#添加数据(小明,25)INSERT INTO student(id,stuName,age)VALUES(4,'小明',25);#删除王五和小明两条数据DELETE FROM student WHERE stuName='王五' OR stuName='小明';#清空student表数据(truncate)删除TRUNCATE TABLE student;#删除student表DROP TABLE student;#删除数据库bdqnDROP DATABASE bdqn;
#插入数据 insert intoINSERT INTO grade(gradeID,gradeName) VALUES(1,'大一');#插入多条数据INSERT INTO grade(gradeID,gradeName)VALUES(2,'大二'),(3,'大三'),(4,'大四');#向student表添加数据INSERT INTO student(studentNo,studentName,sex,gradeID,phone,address,email,identityCard,loginPwd)VALUES(1011,'郭靖','男',1,'13500000001','北京海淀区中关村大街1号','guojing@bdqn.cn','450323198612111000','123456'),(1012,'李文才','男',2,'13500000002','河南洛阳','liwencai@bdqn.cn','450323198112311000','1234567'),(1013,'李梅','女',3,'13500000015','上海卢湾区','limei@bdqn.cn','450323198612311000','12345678');#向subject表添加数据INSERT INTO `subject`(subjectNo,subjectName,classHour,gradeID) VALUES(1,'高等数学-1',120,1),(2,'高等数学-2',110,2),(3,'高等数学-3',100,3),(4,'高等数学-4',130,4);#修改数据---学号1013的邮箱改为student1013@bdqn.cnUPDATE student SET email='student1013@bdqn.cn' WHERE studentNo=1013;UPDATE student SET email='student1013@bdqn.cn',loginPwd='000000' WHERE studentNo=1013;#update student set studentNo=1012 where studentNo=1013;1012被占用,报错,改成1014是可以的#subject表中课时>110且学号=1的,课时减少10UPDATE `subject` SET classHour=classHour-10 WHERE classHour>110 AND gradeID=1;#删除数据,选中DELETE FROM grade,删除表中所有数据;gradeID=1,表示删除年级编号为1的一整行DELETE FROM grade WHERE gradeID=1;TRUNCATE TABLE grade;#面试题:delete和truncate在清空表数据有什么不同??#delete from 表名---- 删除表(一条一条删除数据,自增序列不变)#delete from 表名 where 条件---删除满足筛选条件的数据#truncate table 表名---删除表(直接drop删除整个表,然后重新创建,自增序列重置),数据量大的时候,truncate效率更高
二,数据查询
1.select关键字
2,查询所有数据
3,查询指定字段的所有数据
select studentNo,studentName,phone from 表名;
4起别名
select stu.studentNo from 表名 as stu;——给表起别名
select stu.studentNo as ‘学号’ from 表名 as stu;——给字段起别名
5,计算后起别名
SELECT s.studentNo+1 AS ‘学号加一’ FROM student s;
6,#查询成绩表中的课程编号
SELECT r.subjectNo FROM result AS r;
7,#去重—-DISTINCT
SELECT DISTINCT r.subjectNo FROM result AS r;
8,#返回数据库版本号—后面不加表名
9,#简单计算—-后面不加表名
10,#课程升级—所有课程的学时均需加10,可省略as
SELECT su.subjectName ‘课程名称’,su.classHour+10 ‘新课时’ FROM subject su;
11#查询成绩表中80-90的成绩记录
SELECT FROM result r WHERE r.studentResult>=80 AND r.studentResult<=90;
SELECT FROM result r WHERE r.studentResult BETWEEN 80 AND 90;
12#查询学生表出生日期为null的数据
IS NULL,不为null,IS NOT NULL
SELECT FROM student s WHERE s.birthdy IS NULL;
SELECT FROM student s WHERE s.birthdy IS NOT NULL;
三,like模糊查询
1,查询学生表学生姓李的记录
(%是0-多个字符,返回两个人;_是单个字符,返回一个人)
SELECT * FROM student s WHERE s.studentName LIKE ‘李%’
2,#学生表姓李的并且名字是2个字的记录
SELECT * FROM student s WHERE s.studentName LIKE ‘李_’;
3,#学生表姓李的并且名字是3个字的记录
SELECT * FROM student s WHERE s.studentName LIKE ‘李__’;
4,#查询学生表地址有区关键字
SELECT * FROM student s WHERE s.address LIKE ‘%区%’;
5,OR和IN
查询课程表中课时为100,110,130时的所有数据 IN 包含在或者or
SELECT FROM subject s WHERE s.classHour=100 OR s.classHour=110 OR s.classHour=130;
SELECT FROM subject s WHERE s.classHour IN (100,110,130);
#查询成绩表中成绩为100或者90的记录
SELECT * FROM result r WHERE r.studentResult IN (100,90);
四,多表联合查询
#内连接 inner joinSELECT su.`subjectName`,g.`gradeName` FROM `subject` su INNER JOIN grade g ON su.`gradeID`=g.`gradeID`;#查询学生表的姓名和年级的名称SELECT stu.`studentName`,g.`gradeName` FROM student stu INNER JOIN grade g ON stu.`gradeID`=g.`gradeID`;UPDATE student SET gradeID =2 WHERE studentName='李梅';#内连接--等值连接SELECT stu.`studentName`,g.`gradeName` FROM student stu,grade g WHERE stu.`gradeID`=g.`gradeID`;#非等值连接 笛卡尔积(两个结果的乘积)SELECT stu.`studentName`,g.`gradeName` FROM student stu,grade g;#左外连接#查询姓名和成绩SELECT s.`studentName`,r.`studentResult` FROM student s LEFT JOIN result r ON s.`studentNo`=r.`studentNo`;#显示大聪明SELECT s.`studentName`,r.`studentResult` FROM student s INNER JOIN result r ON s.`studentNo`=r.`studentNo`;#不显示大聪明#面试题:对比inner join 和 left join的区别????INSERT INTO student (studentNo,studentName,sex,gradeID,loginPwd) VALUES(1014,'大聪明','男',4,'');#总结:内连接表示2个表所有的匹配项的返回结果#左外连接表示左表全部数据匹配上右表的 数据SELECT s.`studentName`,r.`studentResult` FROM student s RIGHT JOIN result r ON s.`studentNo`=r.`studentNo`;
面试题:
多表联合查询中内连接和外连接的区别?
首先,内连接包括等值连接和inner join ON;外连接包括左外连接和右外连接;
其次,内连是匹配所有项,左外连接是左表全部匹配右项,右外连接是右表全部匹配左项.
五,自连接查询
自连接查询—-把一张表看成两张表 运用的等值连接
DROP TABLE category;CREATE TABLE category(categoryId INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,pid INT(10) NOT NULL,categoryName VARCHAR(32) NOT NULL)COMMENT '分类表';INSERT INTO category VALUES(2,1,"美术设计"),(3,1,"软件开发"),(4,3,"数据库基础"),(5,2,"Photoshop基础"),(6,2,"色彩搭配学"),(7,3,"PHP基础"),(8,3,"一起学JAVA");#自连接查询---把一张表看成两张表 运用的等值连接SELECT c1.`categoryName` '一级分类',c2.`categoryName` '二级分类' FROM category c1 , category c2 WHERE c1.`categoryId`=c2.`pid`;CREATE TABLE region(regionId INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,pid INT(10) NOT NULL,regionName VARCHAR(30) NOT NULL,PRIMARY KEY (regionId))COMMENT'省市表';INSERT INTO region VALUES(3,1,"辽宁省"),(4,1,"吉林省"),(5,3,"沈阳市"),(6,3,"大连市"),(7,4,"长春市"),(8,5,"和平区"),(9,6,"四平区");SELECT r1.`regionName`'一级',r2.`regionName`'二级' FROM region r1, region r2 WHERE r1.`regionId`=r2.`pid`;
六,综合练习
DISTINCT——-去重
#查询学生成绩大于80分的学生姓名SELECT DISTINCT s.`studentName` FROM result r ,student s WHERE r.`studentNo`=s.`studentNo` AND r.`studentResult`>90;SELECT DISTINCT s.`studentName` FROM student s JOIN result r ON s.`studentNo`=r.`studentNo` WHERE r.`studentResult`>90;#查询姓李的学生的考试成绩(学生姓名、课程名称、成绩)SELECT s.`studentName`,su.`subjectName`,r.`studentResult` FROM student s,`subject` su,result r WHERE r.`subjectNo`=su.`subjectNo` AND r.`studentNo`=s.`studentNo` AND s.`studentName` LIKE '李%';#查询大二年级的学生成绩(学生姓名、学生成绩)SELECT s.`studentName`,r.`studentResult` FROM student s,grade g,result r WHERE s.`studentNo`=r.`studentNo` AND s.`gradeID`=g.`gradeID` AND g.`gradeName`='大二';#查询高等数学-1的考试成绩(学生姓名、学生成绩)SELECT s.`studentName`,r.`studentResult` FROM student s,result r ,`subject` su WHERE s.`studentNo`=r.`studentNo` AND su.`subjectNo`=r.`subjectNo` AND su.`subjectName`= '高等数学-1';
七,分页查询,子查询
order by默认升序ASC排序,降序要用DESC
limit 分页查询,limit 2代表查询前两条,limit 1,2代表从第二个开始到第四条
#子查询
SELECT *
FROM student s JOIN result r
ON s.studentNo=r.studentNo
WHERE r.subjectNo=(
SELECT su.subjectNo FROM subject su
WHERE su.subjectName=’高等数学-2’
)
AND r.studentResult>=80;
count()返回总条数,sum()和,max()最大值,min()最小值,avg()平均值
group by分组
having筛选条件,搭配group分组使用
SELECT COUNT(1) FROM student s
WHERE s.gradeID=(
SELECT g.gradeID FROM grade g WHERE g.gradeName=’大一’
);
#查询高等数学-1的考试成绩,由高到低进行排序#order by默认ASC升序排序;DESC降序排序SELECT * FROM student s,result r ,`subject` suWHERE s.`studentNo`=r.`studentNo` AND su.`subjectNo`=r.`subjectNo`AND su.`subjectName`= '高等数学-2' ORDER BY r.`studentResult` DESC;#limit分页查询 后面一个x,返回表的前x条数据SELECT * FROM result LIMIT 1;SELECT * FROM result LIMIT 2;#limit分页查询 后面一个x一个y,从表第x后(不包含第x条)的y条数据SELECT * FROM result LIMIT 2,3;#查询高等数学-2的学生成绩,由高到低排序并分页查询前两条记录SELECT s.`studentNo`,s.`studentName`,su.`subjectName`,r.`studentResult`FROM student s,result r,`subject` suWHERE s.`studentNo`=r.`studentNo` AND su.`subjectNo`=r.`subjectNo`AND su.`subjectName`='高等数学-2' ORDER BY r.`studentResult` DESC LIMIT 2;#查询高等数学-2的学生成绩,由高到低排序并分页查询2-3条记录SELECT s.`studentNo`,s.`studentName`,su.`subjectName`,r.`studentResult`FROM student s,result r,`subject` suWHERE s.`studentNo`=r.`studentNo` AND su.`subjectNo`=r.`subjectNo`AND su.`subjectName`='高等数学-2' ORDER BY r.`studentResult` DESC LIMIT 1,2;SELECT s.`studentNo`,s.`studentName`,su.`subjectName`,r.`studentResult`FROM student s,`subject` su,result rWHERE s.`studentNo`=r.`studentNo` AND su.`subjectNo`=r.`subjectNo`AND su.`subjectName`='高等数学-3' AND r.`studentResult`>=60 LIMIT 2;#查询课程为高等数学-2,且分数不小于80分的学生的学号和姓名#子查询SELECT *FROM student s JOIN result rON s.`studentNo`=r.`studentNo`WHERE r.`subjectNo`=(SELECT su.`subjectNo` FROM `subject` suWHERE su.`subjectName`='高等数学-2')AND r.`studentResult`>=80;#count 用来统计返回结果的总条数SELECT COUNT(*) FROM result;#考试成绩>70分的有多少人SELECT COUNT(*) AS '大于70分的人数'FROM result r WHERE r.`studentResult`>70;#count(1)和count(*)的区别?#一般情况效率count(1)>count(*)#查询李梅的总分是多少?SELECT SUM(r.`studentResult`) FROM result r WHERE r.`studentNo`=(SELECT s.`studentNo` FROM student s WHERE s.`studentName`='李梅');#查询李梅的平均分是多少?SELECT AVG(r.`studentResult`) FROM result r WHERE r.`studentNo`=(SELECT s.`studentNo` FROM student s WHERE s.`studentName`='李梅');#查询李梅的最大分和最小分是多少?SELECT MAX(r.`studentResult`) FROM result r WHERE r.`studentNo`=(SELECT s.`studentNo` FROM student s WHERE s.`studentName`='李梅');SELECT MIN(r.`studentResult`) FROM result r WHERE r.`studentNo`=(SELECT s.`studentNo` FROM student s WHERE s.`studentName`='李梅');#按照课程进行分组,查询每个课程的平均分,最高分和最低分#对于低于80分平均分的不予显示SELECT su.`subjectName`'课程名称',AVG(r.`studentResult`)'平均分' ,MAX(r.`studentResult`)'最高分',MIN(r.`studentResult`)'最低分'FROM result r,`subject` su WHERE r.`subjectNo`=su.`subjectNo`GROUP BY r.`subjectNo`HAVING AVG(r.`studentResult`)>=80;#查询每个学生的总分SELECT s.`studentName`'姓名',SUM(r.`studentResult`)'总分'FROM result r,student s WHERE s.`studentNo`=r.`studentNo`GROUP BY s.`studentNo`;#从高到低排序SELECT s.`studentName`'姓名',SUM(r.`studentResult`)'总分'FROM result r,student s WHERE s.`studentNo`=r.`studentNo`GROUP BY s.`studentNo`ORDER BY SUM(r.`studentResult`) DESC;
八,综合练习题
※难点:嵌套查询和子查询
# 查询《高等数学-1》的所有考试结果(学号、姓名、课程名、成绩),并按成绩由高到低排列SELECT s.`studentNo`,s.`studentName`,su.`subjectName`,r.`studentResult` FROM student s,result r,`subject` su WHERE s.`studentNo`=r.`studentNo` AND r.`subjectNo`=su.`subjectNo`AND su.`subjectName`='高等数学-1' ORDER BY r.`studentResult` DESC;# 查询《高等数学-2》的考试结果的第二名(学号、姓名、课程名、成绩)SELECT s.`studentNo`,s.`studentName`,su.`subjectName`,r.`studentResult` FROM student s,result r,`subject` su WHERE s.`studentNo`=r.`studentNo` AND r.`subjectNo`=su.`subjectNo`AND su.`subjectName`='高等数学-2' ORDER BY r.`studentResult` DESC LIMIT 1,1;#查询课程为《高等数学-2》成绩前2名分数大于60的学生信息(学号,姓名,课程名,分数)SELECT s.`studentNo`,s.`studentName`,su.`subjectName`,r.`studentResult` FROM student s,result r,`subject` su WHERE s.`studentNo`=r.`studentNo` AND r.`subjectNo`=su.`subjectNo`AND su.`subjectName`='高等数学-2' AND r.`studentResult`>60 ORDER BY r.`studentResult` DESC LIMIT 2 ;#查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名SELECT s.`studentNo`,s.`studentName` FROM student s,result r,`subject` su WHERE s.`studentNo`=r.`studentNo` AND r.`subjectNo`=su.`subjectNo`AND su.`subjectName`='高等数学-2' AND r.`studentResult`>=80;#查询《高等数学-3》的前2名学生成绩信息(学号、姓名、成绩)SELECT s.`studentNo`,s.`studentName`,r.`studentResult` FROM student s,result r,`subject` su WHERE s.`studentNo`=r.`studentNo` AND r.`subjectNo`=su.`subjectNo`AND su.`subjectName`='高等数学-3' ORDER BY r.`studentResult` DESC LIMIT 2 ;#按照不同的课程,分别算出其平均分、最高分和最低分,#对于低于60分平均分的不予显示#显示的结果(课程名、最高分、最低分、平均分)SELECT su.`subjectName`'课程名',MAX(r.`studentResult`)'最高分',MIN(r.`studentResult`)'最低分',AVG(r.`studentResult`)'平均分'FROM `subject` su,result r WHERE su.`subjectNo`=r.`subjectNo` GROUP BY su.`subjectNo`HAVING AVG(r.`studentResult`)>=60;#查询大一年级的总人数#1SELECT COUNT(1) FROM grade g,student s WHERE g.`gradeID`=s.`gradeID` AND g.`gradeName` LIKE '%大一%';#子查询方法SELECT COUNT(1) FROM student sWHERE s.`gradeID`=(SELECT g.`gradeID` FROM grade g WHERE g.`gradeName`='大一');#查询每个年级的最高分、最低分、平均分#(年级、最高分、最低分、平均分)SELECT g.`gradeName`'年级',MAX(r.`studentResult`)'最高分',MIN(r.`studentResult`)'最低分',AVG(r.`studentResult`)'平均分'FROM result r,grade g,student s WHERE s.`studentNo`=r.`studentNo`AND s.`gradeID`=g.`gradeID`GROUP BY s.`gradeID`;#查询每个年级的总分按照由高到低进行排名#(年级、总分)SELECT g.`gradeName` '年级',SUM(r.`studentResult`)'总分'FROM result r,grade g,student s WHERE s.`studentNo`=r.`studentNo`AND s.`gradeID`=g.`gradeID`GROUP BY s.`gradeID` ORDER BY SUM(r.`studentResult`) DESC;#查询学生平均成绩大于70分的学生姓名SELECT s.`studentName`'姓名'FROM student s,result r WHERE s.`studentNo`=r.`studentNo`GROUP BY s.`studentNo`HAVING AVG(r.`studentResult`)>70;#查询总分最高的男生和女生的姓名和总分数#嵌套查询SELECT na'姓名',su '总分',s '性别'FROM(SELECT s.`studentName` na , SUM(r.`studentResult`) su ,s.`sex` sFROM student s,result rWHERE s.`studentNo` = r.`studentNo`GROUP BY s.`studentNo`ORDER BY SUM(r.`studentResult`) DESC)stu GROUP BY stu.s;
九.事务.索引.备份和恢复
1.面试题:
2.
#关闭事务的自动提交
SET autocommit=0;
#开启事务处理
START TRANSACTION;
UPDATE student SET loginPwd =’000’ WHERE studentNo=1014;
SELECT * FROM student;
#事务提交
COMMIT;
#事务的回滚
ROLLBACK;
#开启事务的自动提交
SET autocommit=1;
3.理解:当前窗口上修改表的信息后,提交事务前,另一窗口可对比查询修改后的结果,另一窗口的信息并未修改,在当前窗口点击commit(同步)后,另一窗口信息才被修改;rollback,是提交前可让当前窗口信息回归原始状态
4.
当前窗口CREATE DATABASE shop;DROP TABLE account;CREATE TABLE account(id INT(11) NOT NULL PRIMARY KEY ,`name` VARCHAR(32) NOT NULL,cash DECIMAL(9,2) NOT NULL)AUTO_INCREMENT=1 COMMENT '银行信息';INSERT INTO account (id,`name`,cash) VALUES(1,'A',2000.00),(2,'B',10000.00);COMMIT;下一窗口USE shop;SELECT * FROM account;#模拟转账过程----ACID特性体现START TRANSACTION;UPDATE account SET cash=cash-500 WHERE `name`='A';UPDATE account SET cash=cash+500 WHERE `name`='B';COMMIT;※※理解中的另一窗口,需要再次打开mysql
十.创建索引.添加.查看.删除索引
#创建索引#在学生表的手机号添加唯一索引#唯一索引之后,手机号不能出现重复,否则报错ALTER TABLE student ADD UNIQUE (phone);UPDATE student SET Phone ='13500000001'WHERE studentName='大聪明';#添加普通索引ALTER TABLE student ADD INDEX(email);#查看索引SHOW INDEX FROM student;#删除索引ALTER TABLE student DROP INDEX phone;
索引准则:
1.索引不是越多越好
2.不要对经常变动的数据加索引
3.小数据量的表建议不要加索引
4.索引一般应加在查找条件/分组/排序的字段中
十一.备份和恢复
#中高级开发,mysql执行计划EXPLAINSELECT * FROM student s WHERE s.`studentName`='李梅';ALTER TABLE student ADD INDEX (studentName);#备份和恢复#备份,找到表,右键,导出--转储---勾选最后的结构---找到存储路径起个名字---导出#恢复,在文件里复制过来,选择运行,表即可恢复DROP TABLE category;
十二.练习
1.两个表子查询
2.多个表子查询
3.表链接和子查询共有
#查询姓名为三个字的学员编号、姓名、年级名SELECT s.`studentNo`,s.`studentName`,g.`gradeName` FROM student s,grade g WHERE s.`gradeID`=g.`gradeID` AND s.`studentName`LIKE '___';#查找李梅所有考试的成绩(科目名称、考试成绩)SELECT su.`subjectName`,r.`studentResult` FROM student s,`subject` su,result r WHERE s.`studentNo`=r.`studentNo` AND su.`subjectNo`=r.`subjectNo` AND s.`studentName`='李梅';#使用表连接方式查询所有大一年级学员学号、姓名及年级名SELECT s.`studentNo`,s.`studentName`,g.`gradeName` FROM student s,grade g WHERE s.`gradeID`=g.`gradeID` AND g.`gradeName`='大一';#使用子查询方式查询所有大一年级学员学号、姓名、年级IDSELECT s.`studentNo`,s.`studentName`FROM student sWHERE s.`gradeID`=(SELECT g.`gradeID` FROM grade g WHERE g.`gradeName`='大一');#使用表连接方式查询“高等数学-2”课程大于80分的学生姓名SELECT s.`studentName` FROM student s,`subject` su,result r WHERE s.`studentNo`=r.`studentNo` AND r.`subjectNo`=su.`subjectNo` AND r.`studentResult`>80 AND su.`subjectName`='高等数学-2';#使用子查询方式查询“高等数学-2”课程大于80分的学生SELECT s.`studentName`FROM student sWHERE s.`studentNo`=(SELECT r.`studentNo` FROM result rWHERE r.`subjectNo`=(SELECT su.`subjectNo` FROM `subject` su WHERE su.`subjectName`='高等数学-2' AND r.`studentResult`>80));#使用子查询方式+表连接方式混合查询“高等数学-2”课程大于80分的学生SELECT s.`studentName`FROM student s JOIN result rON s.`studentNo`=r.`studentNo`WHERE r.`subjectNo`=(SELECT su.`subjectNo` FROM `subject` su WHERE su.`subjectName`='高等数学-2' AND r.`studentResult`>80);
十三、练习
1、查询重名的学生—in
查询student表中重名的学生(全部学生信息)
#in 包含在
2、不同课程的成绩比较
查询课程001的成绩比课程002的成绩高的所有学生的学号和姓名
3、平均分大于60分
4、选课数
5、查询姓“张”的老师的个数
6、没学过某老师的课程的人
7、同时学过两个课程的学生
8、学过所有课程的人
查询学过所有课程的所有同学的学号、姓名
#1.查询student表中重名的学生(全部学生信息)#in 包含在SELECT * FROM student s1 WHERE s1.`Sname` IN(SELECT s.`Sname` FROM student s GROUP BY s.`Sname` HAVING COUNT(1)>1);SELECT s1.* FROM student s1,student s2 WHERE s1.`Sname`=s2.`Sname` AND s1.`Sid`!=s2.`Sid`;#2.查询课程001的成绩比课程002的成绩高的所有学生的学号和姓名SELECT a.si1,s.`Sname` FROM((SELECT sc1.`score` s1,sc1.`Sid` si1 FROM sc sc1 WHERE sc1.`Cid`='001') a,(SELECT sc2.`score` s2,sc2.`Sid` si2 FROM sc sc2 WHERE sc2.`Cid`='002') b)JOIN student s ON s.`Sid`=a.si1 WHERE a.s1>b.s2 AND a.si1=b.si2;#3.查询平均成绩大于60分的同学的学号和平均成绩SELECT s.`Sid`,AVG(sc1.`score`)FROM student s,sc sc1WHERE s.`Sid`=sc1.`Sid`GROUP BY s.`Sid`HAVING AVG(sc1.`score`)>60;#4.查询所有同学的学号、姓名、选课数、总成绩SELECT stu.sid,stu.sname,COUNT(cid),SUM(s.`score`)FROM student stu JOIN sc s ON stu.`Sid` = s.`Sid`GROUP BY stu.`Sid`;#5.查询姓“张”的老师的个数SELECT COUNT(1) FROM teacher t WHERE t.`Tname` LIKE '张%';#6.查询没学过“张三”老师课的同学的学号、姓名SELECT DISTINCT s.`Sid`,s.`Sname` FROM student s,teacher t,sc sc1,course c WHERE s.`Sid`=sc1.`Sid` AND sc1.`Cid`=c.`Cid` AND c.`Tid`=t.`Tid` AND t.`Tname`!='张三';#子查询方法SELECT * FROM student s WHERE s.`Sid` IN(SELECT DISTINCT sc.sid FROM sc WHERE sc.`Cid` NOT IN (SELECT c.`Cid` FROM course c WHERE c.`Tid` = (SELECT t.`Tid` FROM teacher t WHERE t.`Tname` = '张三')));#7.查询同时学过课程001和课程002的同学的学号、姓名#select s.`Sid`,s.`Sname` from student s,sc sc1,course c where s.`Sid`=sc1.`Sid` and c.`Cid`=sc1.`Cid` and c.`Cid`='001'and c.`Cid`='002';SELECT a.si1,s.`Sname` FROM((SELECT sc1.`score` s1,sc1.`Sid` si1 FROM sc sc1 WHERE sc1.`Cid`='001') a,(SELECT sc2.`score` s2,sc2.`Sid` si2 FROM sc sc2 WHERE sc2.`Cid`='002') b)JOIN student s ON s.`Sid`=a.si1 WHERE a.si1=b.si2;#8.查询学过所有课程的所有同学的学号、姓名SELECT * FROM student s WHERE s.`Sid` IN(SELECT sc.`Sid`FROM sc GROUP BY sc.`Sid`HAVING COUNT(1) = (SELECT COUNT(1)FROM course));
十四、视图
也为虚拟表
#创建视图CREATE VIEW stu_res ASSELECT s.*,r.`subjectNO`,r.`examDate`,r.`studentresult`FROM student s,result r WHERE s.studentNo=r.studentNo;#使用视图--和使用表一样SELECT * FROM stu_res;#删除视图DROP VIEW stu_res;
