MYSQL
接上篇教程,该部分属于mysql的拓展知识。基本语法是在上篇:https://blog.csdn.net/qq_38606894/article/details/117284221
五、数学函数
字符串函数
char_length():统计字符串长度
length():统计一个汉字或一个字母分别占几个字节(字节长度)
select sname,char_length(sname) '字符长度' from student;
select sname,length(sname) '字节长度' from student;
mid(原始字符串,截取开始的位置,截取的长度):用于做字符串的截取
select sname,mid(sname,2,2) '截取内容' from student;
数学函数
round(数据,保留的小数位):四舍五入
round(数据):四舍五入,保留整数
select round(34.2566,2);
select round(34.2566);
select round(avg(grade),2) from sc;
least(值1,值2…):从具体的值中找到最小值
greastest(值1,值2…):从具体的值中找到最大值
日期时间函数
now():获取时期和时间
current_date():获取日期
current_time():获取时间
select now();
select current_date();
select current_time();
to_days():给定日期,转换成已经过去的总天数
dayofyear():该年已过的天数
week():获取当前日期在该年的第几周
select to_days(now());
select dayofyear(now());
select week(now());
控制函数
if(布尔表达式,参数1,参数2):成立的话返回参数1,不成立返回参数2
if(null,参数1,参数2):直接输出参数2
-- 成立了所以返回参数1:yes
select if(4>2,'yes','no');
-- 直接输出no
select if(null,'yes','no');
ifnull(参数1,参数2):参数1有值,输出参数1,否则,输出参数2
六、多表查询
有时候用户需要的数据来源于多张表,这就需要多个表的关联数据,这样的查询操作就叫做表连接。
多表连接的分类:内连接,外连接
做题思路:
1.根据题意来确定表
2.确定表与表之间关联的列–共有的列
3.确定要查询的列
4.确定题上其他的额外条件
内连接
内连接特征:只有两个表中都匹配到的数据才会做显示(eg.表1的sno有101103,而表2的sno只有101102,所以只会显示出101和102匹配的数据才会显示)
1.通过where关键字来进行表与表之间的内连接的查询操作
格式:
select 表名1.列名1,表名1.列名2,表名2.列名1…
from 表名1,表名2;
where 表名1.列名=表名2.列名;
独立连接的列要求:列名可以不一致,但是数据类型和保存的值得一致
2.通过inner join on来进行表与表之间的连接
格式:
select 表名1.列名1,表名2.列名1
from 表名1 inner join 表名2
on 表名1.列名=表名2.列名;
问:多表查询中什么时候可以省略列前面的表名?
答:如果查询的列,在各个表中只出现一次,可以直接写列名,如果查询的列出现多次,则需要表名.列名
优化操作:多表查询中可以给表名起个别名
实践题目:
不建议在on后面写其他条件,推荐on之后只写连接条件,其他条件放在where后
拓展格式:
select 表名.列名
from 表名1 inner join 表名2
on 表名1.列名=表名2.列名
where 其他额外条件;
inner join on的连接方式又划分成:等值连接,非等值连接
等值连接:条件中只有等号运算符
非等值连接:条件中除了等号之外,还有其他的比较运算符(<,>,>=等)
多表查询操作(表>2张)
1.where进行连接:
select 表名.列名
from 表名1,表名2,表名3,表名4…
where 表名1.列名=表名2.列名 and 表名2.列名=表名3.列名 and 表名3.列名= 表名4.列名…
2.on进行连接:
select 表名.列名
from 表名1 inner join 表名2
on 表名1.列名=表名2.列名 inner join 表名3
on表名2.列名=表名3.列名 inner join 表名4
on表名3.列名=表名4.列名…
SELECT
o.order_no,
l.id,
s.after_sale_no
FROM
o_order o,
o_after_sale s,
o_order_log l
WHERE
o.order_no = s.order_no
AND o.id = l.order_id;
SELECT
p.`name`,
a.account_flag,
g.goods_id
FROM
base_protocol p
INNER JOIN base_protocol_attr a ON p.id = a.protocol_id
INNER JOIN base_protocol_goods g ON p.id = g.protocol_id;
外连接
外连接的特征:至少会返回一个表的所有内容
分类:
左外部连接(左连接):对连接条件中左边的表不加限制,返回左表所有内容
右外部连接(右连接):对连接条件中右边的表不加限制,返回右表所有的内容
区分左表和右表:先写的是左表,后写的是右边。
左外部连接:如果右边的表在左表没有找到对应的值,则右表对应值显示为空
格式:
select 表名.列名
from 表名1 left [outer] join 表名2
on 表名1.列名=表名.列名;
-- 查询出所有学生的学号,姓名,课程编号,成绩
select s.学号,姓名,课程编号,成绩
from 学生信息 s left outer join 成绩 c
on s.学号=c.学号
右外部连接:如果左边的表在右表没有找到对应的值,则左表对应值显示为空
格式:
select 表名.列名
from 表名1 right [outer] join 表名2
on 表名1.列名=表名2.列名;
七、子查询
子查询:一个查询语句中还可以包含另一个查询语句。
子查询语句出现的位置:在where子句中,用来表示条件。需要用小括号括起来。
格式一:嵌套子查询:子查询还可以包含另外的子查询
select 列名|* from 表名 where 列名 in (select查询语句);
扩展格式:-- 能嵌套255个查询
select 列名|* from 表名 where 列名 in(select 列名|* from 表名 where 列名 in(select 列名|* from 表名 where 列名 in));
格式二:相关子查询,也叫单值子查询
select 列名|* from 表名 where 列名 =(select查询语句);
问:什么时候用子查询?即子查询的使用场景。
答:1.题上虽然给了条件,但是条件的结果没有明说。
2.针对where后面不能直接写聚合函数,就可以通过子查询把聚合函数的结果查询出来。
子查询分类
1.嵌套子查询
注意:条件要什么,子查询就查什么
-- 查询计算机系的学生选修了哪些课程
select distinct cno
from sc
where sno in(select sno from student where sdept='计算机系');
2.相关子查询(单值子查询)
-- 查询和‘ff’在同一个班的学生的信息,学号,姓名,性别,班级名称,年级
select 学号,姓名,性别,班级名称,年级
from 学生信息 s,班级信息 c
where s.班级编号=c.班级编号 and s.班级编号=(select 班级编号 from 学生信息 where 姓名='ff');
注意:子查询推荐使用 in 关键字连接,因为多数情况无法确定子查询的值一定是单值。
insert语句和select语句的结合
作用:把查询出来的结果,插入到某一张表中。
格式:
insert into 表名 select查询语句;
-- 创建一张表(学号,姓名,专业)
create table 学生表(
学号 varchar(10),
姓名 varchar(10),
专业 varchar(10),
);
-- 向学生表中插入数据,把student表中性别是男的学员插入该表
insert into 学生表 select sno,sname,sdept from student where ssex='男';
update语句和select语句的结合
格式:
update 表名
set 列名=值
where 条件(子查询);
-- 将计算机系全体的学生的成绩加五分
update sc
set grade=grade+5
where sno in(select sno from student where sdept='计算机系');
-- 以下是select语句
select sno from student where sdept='计算机系'
delete语句和select语句的结合
格式:
delete from 表名 where 条件(子查询);
-- 删除计算机系学生的选课记录
delete from sc where sno in(select sno from student where dept='计算机系');
select sno from student where dept='计算机系'
八、视图
视图:基于某个查询结果的虚表,作用是方便用户对数据的操作
虚表:根据在数据库中世纪存在的一张实表,经过查询之后得到的一张表
权限的影响:实际工作的时候可能没有对实表数据的相应操作权限
注:对于视图进行增删改的操作,原表的数据也会受到影响
创建视图
create view 视图名字 as select语句
对于表的增删改查操作,放在视图中同样成立,把之前写表名的地方改成视图名字即可。
-- 创建一个视图view_student
create view view_student as select * from student;
-- 查看视图的内容
select * from view_student;
-- 创建一个视图view_sc,包含选修课c02这门课的学生
create view view_sc as select * from sc where cno='c02';
select * from view_sc;
-- 创建视图view_s,包含男生的学号,姓名,系别
create view view_s as select sno,sname,sdept from student where ssex='男';
修改视图
alter view 视图名字 as select语句;
-- 修改
alter view view_student as select sno,sname,ssex from student;
插入数据
格式:insert into 视图名字 values(值1,值2…)
-- 向view_student表中插入一条数据
insert into view_wtudent values('2021052601','xiexie','男');
修改视图中的数据
这里update的三种格式对于视图操作同样适用。
update 视图名字 set 列名=值 where 条件;
-- 修改姓名是xiexie的学员,把学号改成21101
update view_student set sno=21101 where sname='xiexie';
删除视图中的数据
delete语句中的两种格式都适用于视图的数据删除
delete from 视图名字 where 条件;
-- 删除姓名是xiexie的学员
delete from view_student where sname='xiexie';
删除视图
删除一个视图:drop view 视图的名字;
删除多个视图:drop view 视图1,视图2,视图3…;
-- 删除view_student
drop view view_student;
九、索引
索引的定义
mysql的索引是对数据库表中的一个或多个列来进行设定的。有助于更快的获取表中信息,帮助进行数据的定位。
-
索引的作用(优点)
-
1.能加快查询速度
-
2.保证数据的唯一性
-
3.实现表与表之间的参照完整性–外键约束
-
4.在使用group by、order by子句进行查询时,利用索引可以减少排序和分组的时间。
-
索引的缺点
-
问:索引是否必须?
-
答:1.创建索引需要占用数据空间并需花费一定的时间;2.建立索引会减慢数据增删改速度。
优先考虑建立索引的列
1.建立有主键和外键的列
2.频繁查询的列
3.连接中频繁使用的列
4.分组或排序使用到的列
索引的类型
普通索引:工作中最常使用的类型
唯一性索引
全文索引
单列索引
多列索引
空间索引
设计索引
索引的使用是数据量越大优势越明显,对小表建立索引可能并无优化效果。
创建索引
创建普通索引:create index 索引的名字 on 表名(列名);
创建唯一索引:create unique index 索引的名字 on 表名(列名);
-- 把student表中的sno列添加一个索引
create index index_sno on student(sno);
-- 把course表中的cno列添加一个唯一索引
create index index_cno on course(cno);
删除索引
drop index 索引名字 on 表名;
-- 删除唯一索引
drop index index_cno on course;