视图
视图:在数据库中,表存放的是数据,而视图存放的是SQL查询语句。使用视图时,会运行视图里的SQL查询语句,创建出一张临时表,用以辅助复杂查询。
视图的好处:
1、某个SQL查询语句需要频繁使用时,保存成视图以便提高效率;
2、视图中的数据可以根据原表数据的更新而变化;
3、视图不需要保存数据,可以节省数据库的空间。
注意事项:
1、避免在视图的基础上再创建视图,如此多重视图会降低SQL的性能和效率;
2、不能往视图里插入数据,不然会报错。
如何创建视图:
create view 视图名称(<视图列名1>,<视图列名2>······)
as
<select查询语句>;
-- 创建视图
create view 按性别汇总(性别,人数)
as
select 性别,count(*)
from student
group by 性别;
子查询
子查询:在select查询语句中,嵌套了另一个select查询语句,即在from子句或where子句中直接写定义视图的SQL查询语句,以满足外层select查询语句的需求。
-- 括号内的select查询语句为定义视图的SQL查询语句,即子查询
select 性别,人数
from (select 性别,count(*) as 人数
from student
group by 性别
)as 按性别汇总;
子查询亦可以放在where子句中,结合in、any、all一起使用,从而构建复杂的查询条件,
使用方法如下:
in(子查询)
any(子查询)
all(子查询)
PS:where子句不能使用汇总函数。
-- 第一步:查找出每门课程的最低成绩有哪些值
select 课程号,min(成绩)
from score
group by 课程号;
-- 第二步:在成绩表里查找出这些值对应的学号
select 学号,成绩
from score
where 成绩 in (80,60,80);
-- 最终SQL
select 学号,成绩
from score
where 成绩 in (
select min(成绩)
from score
group by 课程号
);
any、some、all的子查询必须与一个比较运算符搭配使用,any(子查询)与some(子查询)功能用法相同;
select 列名1
from 表名1
where 列名1 > any(子查询)
select 学号,成绩
from score
where 成绩 > any(
select 成绩
from score
where 课程号 = '0002'
);
select 学号,成绩
from score
where 成绩 > all(
select 成绩
from score
where 课程号 = '0002'
);
注意事项:
1、子查询all(b)表示的是临时表,不能参与四则运算;
2、禁止子查询层层嵌套,如此会导致SQL查询语句变得很难看懂,运算量也比较大;
3、养成编写“as 子查询名称”的习惯,方便后期的SQL查询语句维护。
标量子查询
标量子查询:如果返回的是单一值,可以使用标量子查询,且可以直接使用到比较运算符当中,标量子查询不能返回多行结果。
select 学号,成绩
from score
where 成绩 > (
select avg(成绩)
from score
);
select 学号,成绩
from score
where 成绩 between
(select avg(成绩)
from score
where 成绩 <= 60) and
(select avg(成绩)
from score
where 成绩 >= 80);
标量子查询还可以在select子句中使用;
select 学号,成绩,(select avg(成绩) from score) as 平均成绩
from score;
关联子查询
当需要在每个组里进行比较时,此时可以用关联子查询;
关联条件起到关键作用,且一定要写在子查询里;
基于关联条件来运行子查询,返回同一课程号的平均成绩,再与成绩表中对应课程号的成绩逐行进行比较,满足外层的运行条件则返回输出,不满足则进行下一行的比较。
由于S2仅在子查询里有效,即S1看不到S2的存在,但S2能够看到S1的存在,所以确保了成绩只能与子查询当中同一课程号的平均成绩作比较,即在每个组里进行比较。(S1、S2分别子查询内外的表别名)
select 学号,课程号,成绩
from score as s1
where 成绩 > (select avg(成绩)
from score as s2
where s1.课程号=s2.课程号
group by 课程号
);
在什么情况下,使用视图或子查询更合适呢?
如果某个SQL查询语句在工作流过程中,需要频繁使用,创建视图保存使用;如果只是一次性的偶尔使用,以子查询的方式使用即可。
如何用SQL解决业务问题
如何看懂SQL报错信息?
排除法:先单独运行子查询的SQL查询语句是否有问题,没问题的话,再排查外层SQL查询语句的问题,检查标点符号是否为英文格式······
各种函数
算术函数:
对数据进行四舍五入:round(数值,保留小数的位数)
绝对值:abs(数值)
求余数:mod(被除数,除数)
字符串函数:
字符串长度:length(字符串)
大写转换为小写:(字符串)
小写转换为大写:(字符串)
字符串拼接:(字符串1,字符串2)
字符串替换:(字符串,被替换的字符串,用什么字符串替换)
字符串截取:(字符串,截取的起始位置,截取长度)
日期函数:
当前日期:current_date
当前时间:current_time
当前日期和时间:current_timestamp
获取日期的年份月份日期:year(日期)、month(日期)、day(日期)
日期对应星期几:dayname(日期)
总结