初识MySQL之综合复习篇(干货)

在日常开发和数据查询当中,我们需要等值连接或者左右连接多个表进行相关的字段查询

当然我们在MySQL语法知识点里面我们需要对它的整个框架要有一个比较熟悉的掌握程度,这样才能在比较的熟悉的操作我们的数据

建表

# 根据E-R图创建表
DROP TABLE IF EXISTS wxw_data;
CREATE TABLE wxw_data (
	SN CHAR(20) PRIMARY KEY,
	NAME VARCHAR(50) NOT NULL,
	PRICE DOUBLE,
	EDITOR varchar(50)
);

DROP TABLE IF EXISTS wxw_CANKAO;
CREATE TABLE wxw_CANKAO (
  JIAOCAI_SN CHAR(20),
	COURSE_CODE char(8),
	type varchar(50),
	PRIMARY KEY (JIAOCAI_SN,COURSE_CODE),
	CONSTRAINT fk_jiaocai_sn FOREIGN KEY (JIAOCAI_SN) REFERENCES wxw_data(SN),
	CONSTRAINT fk_course_code FOREIGN KEY (COURSE_CODE) REFERENCES tb_course(CODE)
);

USE XSXK;
INSERT INTO wxw_data VALUES ('978-7-115-48910-4','MySQL数据库技术与应用',42.00,'张素青');
INSERT INTO wxw_data SELECT '978-7-115-48910-5','MySQL数据库技术与应用',42.00,'张素青';

# 插入自己的信息
INSERT INTO tb_student SELECT '2019888888','tanguangyu','男','2010-10-10','15902333748',
 ID from tb_major_class where COLLEGE='数理与大数据学院' and grade=2019 and class=1 and
 major='大数据';
SELECT * FROM tb_student where ID='2019888888';

INSERT INTO tb_student SELECT '2018888888','tanguangyu','男','2010-10-10','15902333748',
 ID from tb_major_class where COLLEGE='数理与大数据学院' and grade=2018 and class=1 and 
 major='大数据';
 
SELECT * FROM tb_student where ID='2018888888';

USE XSXK;
DELETE FROM tb_student where ID='2018888888';

删除该条件下的一行数据

UPDATE tb_student SET GENDER='女' WHERE ID='2019888888';
--定位到ID为这个的行,然后把性别改为女即可,基本的操作及时

update 表名 set 需要改变的字段='新字段属性' where 条件定位

SELECT * FROM tb_student where ID='2019888888';

# 查询每个老师带了哪些课程班
select CODE 班号, TEACHER_ID 教师编号 from tb_course_class;
# 1, 返回的字段有哪些
SELECT t.NAME 教师姓名, cc.CODE 班号
# 2, 要返回的字段从哪些表(临时的表、视图、表连接、子查询结果集)中得到
FROM tb_teacher t, tb_course_class cc
# 3, 判断要返回的字段从哪些行取得
WHERE t.ID = cc.TEACHER_ID;


# 查询每个老师带了多少课程班
# 1, 返回的字段有哪些
SELECT t.NAME 教师姓名, COUNT(cc.CODE) 班级数量 
# 2, 要返回的字段从哪些表(临时的表、视图、表连接、子查询结果集)中得到
FROM tb_teacher t, tb_course_class cc
# 3, 判断要返回的字段从哪些行取得
WHERE t.ID = cc.TEACHER_ID
# 4, 按什么条件分组聚合
GROUP BY t.NAME;

# 查询每个老师带了多少课程班,按数量多少排序
# 1, 返回的字段有哪些
SELECT t.NAME 教师姓名, COUNT(cc.CODE) 班级数量 
# 2, 要返回的字段从哪些表(临时的表、视图、表连接、子查询结果集)中得到
FROM tb_teacher t, tb_course_class cc
# 3, 判断要返回的字段从哪些行取得
WHERE t.ID = cc.TEACHER_ID
# 4, 按什么条件分组聚合
GROUP BY t.NAME
# 5, 排序默认正序从小到大
ORDER BY 班级数量 DESC;

# 查询每个老师带了多少课程班,按数量多少排序, 筛选大于5个班的老师
# 1, 返回的字段有哪些
SELECT t.NAME 教师姓名, COUNT(cc.CODE) 班级数量 
# 2, 要返回的字段从哪些表(临时的表、视图、表连接、子查询结果集)中得到
FROM tb_teacher t, tb_course_class cc
# 3, 判断要返回的字段从哪些行取得
WHERE t.ID = cc.TEACHER_ID
# 4, 按什么条件分组聚合
GROUP BY t.NAME
# 5, 对查询结果集再次筛选
HAVING 班级数量>5;

# 查询每个老师带了多少课程班,按数量多少排序, 筛选大于5个班的老师
# 1, 返回的字段有哪些
SELECT t.NAME 教师姓名, COUNT(cc.CODE) 班级数量 
# 2, 要返回的字段从哪些表(临时的表、视图、表连接、子查询结果集)中得到
FROM tb_teacher t, tb_course_class cc
# 3, 判断要返回的字段从哪些行取得
WHERE t.ID = cc.TEACHER_ID
# 4, 按什么条件分组聚合
GROUP BY t.NAME
# 5, 对查询结果集再次筛选
HAVING 班级数量>5
ORDER BY 班级数量
LIMIT 1;


# 子查询
# where子句中的子查询
# 查询某门课程是那个学院开设的
SELECT DISTINCT COLLEGE
FROM tb_major_class
WHERE ID IN 
	(SELECT MAJOR_CLASS FROM tb_student WHERE ID IN
		(SELECT STUDENT_ID FROM tb_electives WHERE COURSE_CLASS_CODE IN 
			(SELECT CODE FROM tb_course_class WHERE COURSE_CODE IN
				(
				SELECT CODE FROM tb_course WHERE NAME='Web程序设计基础'
				)
			)
		)
	);

# 表连接(内连接)
# 查询某门课程是那个学院开设的
SELECT DISTINCT mc.COLLEGE
FROM tb_major_class mc, tb_student s, tb_electives e, tb_course_class cc, tb_course c
WHERE 
	mc.ID = s.MAJOR_CLASS and
	s.ID = e.STUDENT_ID and
	e.COURSE_CLASS_CODE = cc.CODE and
	cc.COURSE_CODE = c.CODE and
	c.NAME like 'Web%';
	
# 查询某门课程是那个学院开设的
SELECT DISTINCT c.NAME 课程,mc.COLLEGE 学院
FROM tb_major_class mc, tb_student s, tb_electives e, tb_course_class cc, tb_course c
WHERE 
	mc.ID = s.MAJOR_CLASS and
	s.ID = e.STUDENT_ID and
	e.COURSE_CLASS_CODE = cc.CODE and
	cc.COURSE_CODE = c.CODE;

# SELECT 生成一个结果集(二维表)
SELECT 1,2;
SELECT 'abc';
SELECT CURRENT_TIME();

# FROM 扫描一个二维表结构(实体表、临时表、查询结果集)
SELECT tb_course.NAME, CODE
FROM tb_course;

# FROM 表连接(新的临时表)
-- 交叉连接(笛卡尔积) A CROSS JOIN B => 列数=A+B 行数=A*B
SELECT * from tb_course,tb_teacher;
SELECT * FROM tb_course CROSS JOIN tb_teacher;
# 内连接
SELECT * from tb_course as c,tb_course_class as cc WHERE c.CODE=cc.COURSE_CODE;

# 查询课程班级的课程名称
# 查课程班级对应的课程编号
SELECT COURSE_CODE,CODE FROM tb_course_class WHERE CODE='3SL1113A.09';
# 查课程名称
SELECT * FROM tb_course WHERE CODE = (SELECT COURSE_CODE FROM tb_course_class WHERE CODE='3SL1113A.09');

SELECT a.*,b.NAME FROM 
		(SELECT COURSE_CODE,CODE FROM tb_course_class WHERE CODE='3SL1113A.09') as a
	 , 
		tb_course b
WHERE a.COURSE_CODE=b.CODE;

SELECT a.*,b.NAME FROM 
		(SELECT Teacher_id,CODE FROM tb_course_class WHERE CODE='3SL1113A.09') as a
	 INNER JOIN
		tb_teacher b
   ON a.teacher_id=b.ID;  -- join 条件
	 
	 
SELECT cc.CODE,cc.COURSE_CODE,t.NAME FROM 
    tb_teacher t INNER JOIN tb_course_class cc ON t.ID=cc.teacher_id
WHERE cc.CODE='3SL1113A.09';

SELECT cc.CODE,c.NAME,t.NAME from 
	tb_course c, tb_teacher t, tb_course_Class cc
WHERE c.CODE=cc.COURSE_CODE and t.ID=cc.Teacher_id;

SELECT cc.CODE 班级编号,c.NAME 课程名称,t.NAME 授课老师 from 
   tb_course_class cc 
	 JOIN tb_course c ON cc.COURSE_CODE=c.CODE 
	 JOIN tb_teacher t ON cc.teacher_id=t.ID
where cc.CODE='3SL1113A.09';
	 
# 外连接 (左连接,右连接)



# WHERE 条件判断 => 是否SELECT
SELECT 'a' FROM tb_course WHERE 1=1;
# 查询2学分的课程信息
SELECT * FROM tb_course WHERE CREDIT=2;
# 查询不及格的学生成绩
SELECT * FROM tb_electives WHERE SCORE < 60;
# LIKE (不是喜欢,是像)  % 通配符,匹配任意0个或多个字符
SELECT * FROM tb_course WHERE NAME like '%程序设计';
# 查询和‘我’同姓的学生信息
SELECT * FROM tb_student WHERE NAME like '谭%飞';
# IN  ==> OR OR OR 
SELECT * FROM tb_student WHERE NAME='谭飞' OR NAME='谭华' OR NAME='谭贝';
SELECT * FROM tb_student WHERE NAME IN ('谭飞','谭华','谭贝');

# 子查询
# 查询3SL1037A.01班分数最高的学生的ID
# 1.先要知道最高分
SELECT MAX(SCORE) FROM tb_electives WHERE COURSE_CLASS_CODE='3SL1037A.01';
# 2.再知道谁是最高分
SELECT * FROM tb_electives WHERE SCORE=100 AND COURSE_CLASS_CODE='3SL1037A.01';
SELECT * FROM tb_electives WHERE COURSE_CLASS_CODE='3SL1037A.02' ORDER BY SCORE ASC LIMIT 1;

UPDATE tb_electives SET SCORE=100 WHERE COURSE_CLASS_CODE='3SL1037A.01' and SCORE=99;



SELECT * FROM tb_electives 
WHERE 
		SCORE IN (SELECT MIN(SCORE) FROM tb_electives WHERE COURSE_CLASS_CODE like '3SL1037A.0%') 
		AND 
		COURSE_CLASS_CODE like '3SL1037A.0%';


# 查询最低分
SELECT MIN(SCORE) FROM tb_electives ;
# 分班查询最低分
SELECT MIN(SCORE),COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE;

# 分班查询最低分的学生
SELECT MIN(SCORE),COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE;

select t.STUDENT_ID,t.COURSE_CLASS_CODE,t.SCORE 
from 
	tb_electives t 
		INNER JOIN 
	(SELECT MIN(SCORE) minscore,COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE) ms 
		ON t.COURSE_CLASS_CODE=ms.COURSE_CLASS_CODE and t.SCORE=ms.minscore ;

		
select t.STUDENT_ID,t.COURSE_CLASS_CODE,t.SCORE,s.NAME 
from 
	tb_electives t 
	INNER JOIN 
	(SELECT MIN(SCORE) minscore,COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE) ms 
		ON t.COURSE_CLASS_CODE=ms.COURSE_CLASS_CODE and t.SCORE=ms.minscore 
	LEFT JOIN tb_student s 
		ON t.STUDENT_ID=s.ID;

select t.STUDENT_ID,t.COURSE_CLASS_CODE,t.SCORE,s.NAME 学生姓名,c.NAME 课程名
from 
	tb_electives t 
	INNER JOIN 
	(SELECT MIN(SCORE) minscore,COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE) ms 
		ON t.COURSE_CLASS_CODE=ms.COURSE_CLASS_CODE and t.SCORE=ms.minscore 
	LEFT JOIN tb_student s 
		ON t.STUDENT_ID=s.ID
	LEFT JOIN tb_course c
	 ON instr(t.COURSE_CLASS_CODE,c.CODE);
	
select t.STUDENT_ID,t.COURSE_CLASS_CODE,t.SCORE,s.NAME 学生姓名,c.NAME 课程名,cc.TEACHER_ID
from 
	tb_electives t 
	INNER JOIN 
	(SELECT MIN(SCORE) minscore,COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE) ms 
		ON t.COURSE_CLASS_CODE=ms.COURSE_CLASS_CODE and t.SCORE=ms.minscore 
	LEFT JOIN tb_student s 
		ON t.STUDENT_ID=s.ID
	LEFT JOIN tb_course c
	 ON instr(t.COURSE_CLASS_CODE,c.CODE)
  LEFT JOIN tb_course_class cc 
	 ON t.COURSE_CLASS_CODE=cc.CODE;


select t.STUDENT_ID,t.COURSE_CLASS_CODE,t.SCORE,s.NAME 学生姓名,c.NAME 课程名,te.NAME 教师姓名,te.TITLE 教师职称
from 
	tb_electives t 
	INNER JOIN 
	(SELECT MIN(SCORE) minscore,COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE) ms 
		ON t.COURSE_CLASS_CODE=ms.COURSE_CLASS_CODE and t.SCORE=ms.minscore 
	LEFT JOIN tb_student s 
		ON t.STUDENT_ID=s.ID
	LEFT JOIN tb_course c
	 ON instr(t.COURSE_CLASS_CODE,c.CODE)
  LEFT JOIN tb_course_class cc 
	 ON t.COURSE_CLASS_CODE=cc.CODE
  LEFT JOIN tb_teacher te 
	 ON cc.TEACHER_ID=te.ID;
	 
select 
  mc.COLLEGE 学院,
  concat(mc.MAJOR,mc.GRADE,'-',mc.CLASS) as 专业班级,
  t.STUDENT_ID 学生学号,
	s.NAME 学生姓名,
	t.COURSE_CLASS_CODE 课程班编号,
	c.NAME 课程名称,
	t.SCORE 分数,
	te.NAME 教师姓名,
	te.TITLE 教师职称
from 
	tb_electives t 
	INNER JOIN 
	(SELECT MIN(SCORE) minscore,COURSE_CLASS_CODE FROM tb_electives GROUP BY COURSE_CLASS_CODE) ms 
		ON t.COURSE_CLASS_CODE=ms.COURSE_CLASS_CODE and t.SCORE=ms.minscore 
	LEFT JOIN tb_student s 
		ON t.STUDENT_ID=s.ID
	LEFT JOIN tb_course c
	 ON instr(t.COURSE_CLASS_CODE,c.CODE)
  LEFT JOIN tb_course_class cc 
	 ON t.COURSE_CLASS_CODE=cc.CODE
  LEFT JOIN tb_teacher te 
	 ON cc.TEACHER_ID=te.ID
  LEFT JOIN tb_major_class mc 
	 ON mc.ID=s.MAJOR_CLASS;
	 
 
# 查询‘我’所在专业班级的信息
# 专业班在哪儿找: tb_major_class
# 已知条件:我=》 数理学院,大数据专业,2019级, 3班
SELECT * 
FROM tb_major_class 
WHERE COLLEGE='数理与大数据学院' 
				AND 
			MAJOR='大数据' 
				AND 
			GRADE=2019 
				AND 
			CLASS=3;

# 我的专业班级编号为43
# 统计我这个班有多少人
# 统计数量COUNT()
# 人-学生人数,学生在哪里找: tb_student
SELECT COUNT(*) AS 学生人数, MAJOR_CLASS AS 班级编号
FROM tb_student
WHERE MAJOR_CLASS=43;

# 分组统计每个班的学生人数
SELECT COUNT(*) AS 学生人数, MAJOR_CLASS AS 班级编号
FROM tb_student
GROUP BY MAJOR_CLASS;

# 分组统计每个班的学生人数, 按学生人数从多到少排序
# major class 专业班人数
SELECT COUNT(*) AS 学生人数, MAJOR_CLASS AS 班级编号
FROM tb_student
GROUP BY MAJOR_CLASS
ORDER BY 学生人数 DESC;

# course class 课程班人数
# 课程班学生在哪里找: tb_electives
SELECT COUNT(*) as 学生人数, COURSE_CLASS_CODE as 课程班编号
FROM tb_electives
GROUP BY COURSE_CLASS_CODE;




每文一语

学习不仅是借鉴,还要学会转移和利用,最后内化为自己的知识点

猜你喜欢

转载自blog.csdn.net/weixin_47723732/article/details/111676277