mysql视图和sql语句

2024-01-08 09:34:34

MySQL的视图(View)是一个虚拟表,它基于一个或多个实际表(或其他视图)的查询结果而创建。视图本身不包含实际的数据,而是根据定义视图的查询时动态生成的结果集。以下是有关MySQL视图的一些重要信息:

一.mysql视图

1.数据的虚拟表示:

视图提供了一个虚拟的数据表示方式,它并不存储实际数据,而是根据查询实时生成结果。这意味着视图是对底层表的动态引用。

2.简化复杂查询:

视图可以将复杂的查询、连接和计算封装成单个易于使用的虚拟表。通过创建视图,可以隐藏复杂性,并且可以让用户使用简单的SELECT语句访问数据。

3.安全性和权限控制:

视图可以用于控制用户对数据的访问权限。通过只向用户授予对视图的访问权限,可以隐藏底层表的细节和敏感信息,确保用户只能看到他们被授权查看的数据。

4.逻辑数据组织:

视图可以帮助组织数据逻辑,使其更容易理解和管理。它们可以根据特定的业务需求或查询模式对数据进行重组,使数据更具可读性和易用性。

5.更新限制:

某些视图是可更新的(可用于INSERT、UPDATE和DELETE操作),但并非所有视图都支持这些操作。更新视图可能受到复杂性、聚合函数或连接等因素的限制。

6.视图的创建:

在MySQL中,可以使用CREATE VIEW语句创建视图,定义视图的查询以及需要展示的列。

示例创建视图的语法:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

视图提供了一种灵活的数据访问方式,有助于简化复杂查询、增强安全性并改善数据组织。但需要注意,视图也可能增加系统开销,因为每次查询视图时,都会重新计算视图的结果集。

二.mysq语句使用案列

-- 学生表
insert into t_mysql_student values('01' , '赵雷' , '1990-01-01' , '男');
insert into t_mysql_student values('02' , '钱电' , '1990-12-21' , '男');
insert into t_mysql_student values('03' , '孙风' , '1990-12-20' , '男');
insert into t_mysql_student values('04' , '李云' , '1990-12-06' , '男');
insert into t_mysql_student values('05' , '周梅' , '1991-12-01' , '女');
insert into t_mysql_student values('06' , '吴兰' , '1992-01-01' , '女');
insert into t_mysql_student values('07' , '郑竹' , '1989-01-01' , '女');
insert into t_mysql_student values('09' , '张三' , '2017-12-20' , '女');
insert into t_mysql_student values('10' , '李四' , '2017-12-25' , '女');
insert into t_mysql_student values('11' , '李四' , '2012-06-06' , '女');
insert into t_mysql_student values('12' , '赵六' , '2013-06-13' , '女');
insert into t_mysql_student values('13' , '孙七' , '2014-06-01' , '女');

-- 教师表
insert into t_mysql_teacher values('01' , '张三');
insert into t_mysql_teacher values('02' , '李四');
insert into t_mysql_teacher values('03' , '王五');

-- 课程表
insert into t_mysql_course values('01' , '语文' , '02');
insert into t_mysql_course values('02' , '数学' , '01');
insert into t_mysql_course values('03' , '英语' , '03');

-- 成绩表
insert into t_mysql_score values('01' , '01' , 80);
insert into t_mysql_score values('01' , '02' , 90);
insert into t_mysql_score values('01' , '03' , 99);
insert into t_mysql_score values('02' , '01' , 70);
insert into t_mysql_score values('02' , '02' , 60);
insert into t_mysql_score values('02' , '03' , 80);
insert into t_mysql_score values('03' , '01' , 80);
insert into t_mysql_score values('03' , '02' , 80);
insert into t_mysql_score values('03' , '03' , 80);
insert into t_mysql_score values('04' , '01' , 50);
insert into t_mysql_score values('04' , '02' , 30);
insert into t_mysql_score values('04' , '03' , 20);
insert into t_mysql_score values('05' , '01' , 76);
insert into t_mysql_score values('05' , '02' , 87);
insert into t_mysql_score values('06' , '01' , 31);
insert into t_mysql_score values('06' , '03' , 34);
insert into t_mysql_score values('07' , '02' , 89);
insert into t_mysql_score values('07' , '03' , 98);

01)查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数
考核:内连接
涉及表:

t_mysql_course,t_mysql_score
SELECT
	s.*,
	( CASE WHEN t1.cid = '01' THEN t1.score END ) 语文,
	( CASE WHEN t2.cid = '02' THEN t2.score END ) 数学 
FROM
	t_mysql_student s,
	( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,
	( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2 
WHERE
	s.sid = t1.sid 
	AND t1.sid = t2.sid 
	AND t1.score > t2.score

02)查询同时存在" 01 “课程和” 02 "课程的情况

SELECT
	s.*,
	( CASE WHEN t1.cid = '01' THEN t1.score END ) 语文,
	( CASE WHEN t2.cid = '02' THEN t2.score END ) 数学 
FROM
	t_mysql_student s,
	( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,
	( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2 
WHERE
	s.sid = t1.sid 
	AND t1.sid = t2.sid

03)查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )

SELECT
	s.*,
	( CASE WHEN t1.cid = '01' THEN t1.score END ) 语文,
	( CASE WHEN t2.cid = '02' THEN t2.score END ) 数学 
FROM
	t_mysql_student s
	INNER JOIN ( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1 ON s.sid = t1.sid
	LEFT JOIN ( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2 ON t1.sid = t2.sid

04)查询不存在" 01 “课程但存在” 02 "课程的情况

SELECT
	s.*,
	( CASE WHEN sc.cid = '01' THEN sc.score END ) 语文,
	( CASE WHEN sc.cid = '02' THEN sc.score END ) 数学 
FROM
	t_mysql_student s,
	t_mysql_score sc 
WHERE
	s.sid = sc.sid 
	AND s.sid NOT IN ( SELECT sid FROM t_mysql_score WHERE cid = '01' ) 
	AND sc.cid = '02'

05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

SELECT
	s.sid,
	s.sname,
	round( avg( sc.score ), 2 ) 平均数 
FROM
	t_mysql_student s
	LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
	s.sid,
	s.sname 
HAVING
	平均数 >= 60
	

06)查询在t_mysql_score表存在成绩的学生信息

SELECT
	s.sid,
	s.sname 
FROM
	t_mysql_student s
	LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
	s.sid,
	s.sname

07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
考核:聚合函数,外连接

SELECT
	s.sid,
	s.sname,
	count( sc.score ) 选课总数,
	sum( sc.score ) 总成绩 
FROM
	t_mysql_student s
	LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
	s.sid,
	s.sname

08)查询「李」姓老师的数量

select count(*) from t_mysql_teacher where tname like '李%'

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_74018330/article/details/135433589
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。