Bootstrap

数据库学习之MYSQL的进阶教程

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;

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;