目录
一、子查询
1、语法:
2、以下例子均以图中两个表为基础
例子1:查询yun1班级大于85分的学生记录
例子2:将yun2班的学生记录放在一个单独的表中,叫yun2
例子3:教务处误把yun3班叫张丽的学生的成绩搞错了,应该为77分
例子4: yun1班的张丽同学准备退学,在students表中删除其信息
3、子查询,别名as
二、MySQL视图
1、作用场景:
2、功能:
3、视图和表的区别和联系
3.1 区别:
3.2 联系:
4、例子
例子1:教务处想找出成绩大于90的学生展示在视图v_A中
例子2:多表创建视图-把yun2班学生的名字,成绩,班级单独构成一个视图
例子3:修改原表数据,查看视图的变化
例子4:修改视图数据,查看原表记录;
三、连接查询(内、左、右连接)
1、连接查询
1.1 内连接
①语法:
②例子:查出yun2班级的学生(内连接)
1.2 左连接
①语法
②例子:查出yun2班级的学生(左连接)
1.3 右连接
一、子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
子语句可以与主语句所查询的表相同,也可以是不同表
1、语法:
IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用
语法:
<表达式> [NOT] IN <子查询>
- 当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。 若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需 求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的
- 子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。
2、以下例子均以图中两个表为基础
例子1:查询yun1班级大于85分的学生记录
select * from students where class_id in (select class_id from classes where class_name='yun1') and score>85;
例子2:将yun2班的学生记录放在一个单独的表中,叫yun2
insert into yun2 select * from students where class_id in (select class_id from classes where class_name='yun';
例子3:教务处误把yun3班叫张丽的学生的成绩搞错了,应该为77分
update students set score=77 where stu_name='张丽' and class_id in (select class_id from classes where class_name='yun3');
例子4: yun1班的张丽同学准备退学,在students表中删除其信息
delete from students where stu_name='张丽' and class_id in (select class_id from classes where class_name='yun1');
3、子查询,别名as
将结果集做为一张表进行查询的时候,我们也需要用到别名,示例:
需求:从students表中的stu_num和student_name字段的内容做为"内容" 输出stu_num的部分
mysql> select stu_num from (select stu_name,stu_num from students);
此时会报错,原因为:
select * from 表名 此为标准格式,而以上的查询语句,"表名"的位置其实是一个完整结果集,mysql并不能直接识别,而此时给与结果集设置一个别名,以”select a.id from a“的方式查询将此结果集视为一张"表",就可以正常查询数据了,如下:
select a.stu_num from (select stu_num,stu_name from students) a;
二、MySQL视图
- 数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射
1、作用场景:
针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)
作用范围:
select * from students; #展示的部分是students表
select * from view_name; #展示的一张或多张表
2、功能:
- 简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
- 本质而言视图是一种select(结果集的呈现)
注意:视图适合于多表连接浏览时使用!不适合增、删、改
而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率!
3、视图和表的区别和联系
3.1 区别:
①、视图是已经编译好的sql语句。而表不是
②、视图没有实际的物理记录。而表有。
③、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
④、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
⑤、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
⑥、视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)
3.2 联系:
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
4、例子
例子1:教务处想找出成绩大于90的学生展示在视图v_A中
#创建视图(单表)
create view v_A as select * from students where score > 90;
#查看表状态
show table status\G
从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。
例子2:多表创建视图-把yun2班学生的名字,成绩,班级单独构成一个视图
create view v_yun2 (name,score,class)as select y.stu_name,y.score,c.class_name from yun2 as y,classes as c where y.class_id=c.class_id;
例子3:修改原表数据,查看视图的变化
例子4:修改视图数据,查看原表记录;
注意:修改表不能修改以函数、复合函数方式计算出来的字段
三、连接查询(内、左、右连接)
1、连接查询
MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接
1.1 内连接
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
①语法:
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
②例子:查出yun2班级的学生(内连接)
select * from yun2 inner join classes on yun2.class_id=classes.class_id;
1.2 左连接
左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
①语法
SELECT column_name(s)FROM table1 LETF (OUTER) JOIN table2 ON table1.column_name = table2.column_name;
②例子:查出yun2班级的学生(左连接)
左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL。
1.3 右连接
右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配