MySQL数据库---函数概览

本文详细介绍了MySQL中的字符串、数学、日期时间、控制函数应用,以及子查询的使用技巧,包括索引优化、视图的创建、修改和删除,以及如何结合SQL语句进行数据操作。

九.MySQL的函数应用(了解)

Ⅰ.字符串函数

1.length()   统计一个字符串的字节长度

2.char_length()   统计一个字符串的长

3.mid()    进行字符串的截取操作

格式:mid(字符串,截取开始的位置,截取的字符个数)

Ⅱ.数学函数

1.round()   四舍五入

round(数据,保留的小数位)     保留指定的小数位

round(数据)     保留整数位

2.least(值1,值2,值3...)    求最小值

3.greatest(值1,值2,值3...)   求最大值   

Ⅲ.日期时间函数

1.now()   获取日期时间

2.current_date()   获取日期

3.current_time()   获取时间

4.to_days()   统计总天数

5.dayofyear()  统计该年已过的天数

6.week()   查看该年的周数

Ⅳ.控制函数

1.if()函数

格式一:if(布尔表达式,参数1,参数2)   成立,看参数1,否则看参数2

格式二:if(null,参数1,参数2)    如果第一个位置为空,直接看参数2

2.ifnull(参数1,参数2)   如果参数1有值,直接返回;如果参数1是null,返回参数2

-- 1.length()   统计一个字符串的字节长度

--  MySQL,一个汉字3占多少个字节?一个字母1占多少个字节?

-- 统计系别的名称长度(字节)

select  sdept,length(sdept)  '字节长度'   from  student;

-- 统计学生姓名字节长度

select  姓名,length(姓名)  '字节长度'   from   学生信息;

-- 2.char_length()   统计一个字符串的长度

select  *   from  student;

-- 统计系别的名称长度

select  sdept,char_length(sdept)  '系别长度'  from  student

-- 从学生信息表中对籍贯的数据进行截取:从第二字符开始截取,截取长度为3

select  籍贯,mid(籍贯,2,3)  '截取后的数据'   from  学生信息;

-- 1.round()   四舍五入

-- round(数据,保留的小数位)     保留指定的小数位

-- round(数据)     保留整数位

-- 从sc表中查看学生的平均成绩,结果保留两位小数   79.9091

select  round(avg(grade),2)  '平均成绩'   from  sc;

-- 从sc表中查看选了c02这门课学生的平均成绩,结果保留整数部分

select  round(avg(grade))  '平均成绩'   from  sc  where   cno='c02';

--  把3.1415926,保留两位小数进行查询

select  round(3.1415926,2);

select round(3.1415926);

-- 2.least(值1,值2,值3...)    求最小值

select  least(45,98,21,36,10,49)  '最小值';

-- 3.greatest(值1,值2,值3...)   求最大值   

select  greatest(70,95,13,78,345,71)  '最大值';

-- 对45.8793 保留3位小数

-- 求45,34,45,43,322 中的最大值,最小值

-- 1.now()   获取日期时间

select  now()  '当前日期时间';

-- 2.current_date()   获取日期

select current_date()  '当前日期';

-- 3.current_time()   获取时间

select  current_time()  '当前时间';

-- 4.to_days()   统计总天数

-- 截止到今天,来统计天数的总值

select  to_days(now()) '总天数';

-- 5.dayofyear()  统计该年已过的天数

-- 截止到今天,已经过的天数

select  dayofyear(now())  '已过的天数';

-- 6.week()   查看该年的周数

-- 截止到今天,该周是属于该年的第几周

select week(now())  '当前周数';

-- 格式一:if(布尔表达式,参数1,参数2)   成立,看参数1,否则看参数2

select  if(5>6,'test','testing')  '结果';

select  if(5<6,'test','testing')  '结果';

-- 格式二:if(null,参数1,参数2)    如果第一个位置为空,直接看参数2

select  if(null,'T','F')  '结果';

-- 2.ifnull(参数1,参数2)   如果参数1有值,直接返回;如果参数1是null,返回参数2

select  ifnull('test','testing')  '结果';

select  ifnull(null,'testing')  '结果';

十.子查询的使用(重点)

1.子查询:指的是查询语句,嵌套查询语句---->一般是放在where子句中,表示条件

2.子查询的应用使用场景:

2.1查询过程中,虽然给了条件,但是条件的结果并不明确,这个时候就需要借助于查询语句,把条件的结果查出来,参与操作。

例:从sc表中查看计算机系学生的选课记录.

解析:select  选课记录*   from   sc   where  计算机系学生(需要查询);

2.2如果聚合函数当条件,是不能直接放在where子句中,那么就可以借助于查询语句,把聚合函数的结果查询出来,参与操作。

例:从sc表中查看所修课程的成绩大于平均成绩的学生信息

解析:select  *  from  sc  where  grade>(select  avg(grade)  from  sc);

3.子查询语法格式:

格式一:  in 来匹配子查询的结果值    嵌套子查询

select  列名  from  表名  where   列名   in(select  列名   from  表名   where  条件...);

注意1:条件要什么,子查询就查什么

格式二:= 来匹配子查询的结果值   相关子查询(单值子查询)

select  列名  from  表名  where  列名  =(select  列名   from  表名   where  条件...);

注意2:如果是用=匹配子查询,那么就要求子查询的结果只能有一个值;如果不确定子查询结果的个数,推荐使用in;子查询都是用小括号来包裹的。

select  列名  from  表名  where   列名   in(select  列名   from  表名   where  列名  in  (select  列名   from  表名   where 条件...));

延伸一种写法:

select  列名   from  表名  where  列名  比较运算符(select  列名  from  表名  where  条件....);

-- 例:从sc表中查看计算机系学生的选课记录.

select  *

from  sc

where  sno  in(select  sno  from student  where  sdept='计算机系');   --  要求:学生--->计算机系

-- 查询出计算机系的学生

select  sno  from student  where  sdept='计算机系'

-- 例:从sc表中查看修了VB课程的学生选课情况

select  *

from  sc  

where  cno =(select  cno  from  course  where cname='VB');  -- 学生修了VB课程

-- 查看VB课程的课程号

select  cno  from  course  where cname='VB';

-- 例.查询修了‘c02’课程且成绩高于此课程的平均成绩的学生的学号和成绩。

select  sno,grade

from  sc

where  cno='c02'   and   grade>(select  avg(grade)  from  sc  where  cno='c02');

-- 此课程c02的平均成绩  79.6667

select  avg(grade)  from  sc  where  cno='c02';  

-- 查看籍贯是beijing的学生所在的班级名称

select  班级名称

from  班级信息

where  班级编号  in(select  班级编号   from   学生信息   where   籍贯='beijing');

--  查看籍贯是beijing的学生所在的班级编号---名称

select  班级编号   from   学生信息   where   籍贯='beijing';

-- 查询修了c02这门课的学生的姓名,性别,专业

select sname,ssex,sdept

from  student

where  sno  in(select  sno  from  sc  where  cno='c02');

-- 可以从sc表中根据课程号查询出对应选修学生学号

select  sno  from  sc  where  cno='c02';

-- 案例:查询和'ff'在同一个班的学生的信息(学号,姓名,性别,籍贯,班级名称,年级)。

select 学号,姓名,性别,籍贯,班级名称,年级

from  学生信息 s,班级信息 c

where  s.班级编号=c.班级编号  and  s.班级编号=(select  班级编号  from  学生信息   where  姓名='ff');

-- 查看ff这个学生所在的班级编号

select  班级编号  from  学生信息   where  姓名='ff';

-- 查看修了数据库基础课程的学生的姓名,所在的系别

-- 分析:数据库基础cname---->cno--->sc表中查询学生sno--->在student表查询姓名,系别

select sname,sdept  from  student  where  sno  in(

select  sno  from  sc  where  cno  in(select  cno  from  course  where cname='数据库基础'));

十一.除了select语句中可以使用子查询,在insert,update,delete语句中也可以嵌套子查询语句

1.insert语句和select语句做结合

思想:把select查询出来的数据,结合insert插入到指定的表中

格式:insert  into   表名    select查询语句;

-- 创建一个表stu(学号,姓名,年龄,专业)

create  table  stu(

学号  varchar(10),

姓名  varchar(10),

年龄  int,

专业  varchar(10)

);

--  向stu表中插入数据(只保存计算机系和信息系的学生记录)

insert  into  stu  select  sno,sname,sage,sdept  from  student  where  sdept  in('计算机系','信息系');

select  *  from  stu;

-- 创建一个学生表(学号,姓名,性别,课程号,成绩)

create  table  学生表(

学号   varchar(10),

姓名   varchar(10),

性别   varchar(10),

课程号  varchar(10),

成绩  int

);

--  向学生表中插入数据(修了c02,c04,且成绩大于等于60)

insert into  学生表   select  student.sno,sname,ssex,cno,grade   from   student,sc  where  student.sno=sc.sno  and  cno in('c02','c04')  and  grade>=60;

select  *   from  学生表;

2.update语句和select语句结合

格式:update  表名  set  列名=值  where  条件;

select查询语句还是放在where子句中表示条件

-- 将计算机系学生的选课成绩添加10分

update  sc

set  grade=grade+10

where  sno  in(select  sno  from  student  where  sdept='计算机系');

3.delete语句和select语句结合

格式:delete   from  表名  where  条件;

select查询语句还是放在where子句中表示条件

--  从sc表中删除计算机系学生的选课记录

delete  from  sc where  sno  in(select  sno  from  student  where  sdept='计算机系');

-- 把修了VB课程学生的成绩减去10分

update  sc   set  grade=grade-10  where  cno  in(select  cno  from course  where cname='VB');

-- 删除信息系男生的选课记录

delete  from  sc  where  sno  in(select sno  from  student  where sdept='信息系'  and  ssex='男');

=========================================================

一.视图概述

1.视图基于某个查询结果的虚。(根据实际存在的表,经过查询之后,创建出来的一个虚表,被称为视图)

2.视图如同真实的表一样,对视图进行增删改(insert,update,delete)操作,原表数据会受影响,同样的道理,对原表进行增删改操作,视图也会受影响。

3.视图的作用:方便用户对数据进行操作

二.创建视图

格式:create   view   视图的名字   as    select查询语句;

-- 创建一个视图view_student,包含计算机系和数学系学生的信息

create  view  view_student  as   select  *   from   student  where  sdept  in('计算机系','数学系');

-- 查询view_student视图中的内容

select *  from  view_student;

-- 创建一个视图view_sc,包含修了c02课程的学生学号,姓名,年龄,课程号,成绩

create  view  view_sc  as  select  student.sno,sname,sage,cno,grade  from student,sc  where  student.sno=sc.sno  and  cno='c02';

select  *   from  view_sc;

三.修改视图

1.修改视图的结构

alter  view  视图的名字   as    select查询语句;

2.修改视图中的数据

格式:参考修改表数据的语法格式,把表名改成视图名

update  视图名字   set  列名=值   where  条件;

-- 修改view_student视图结构(学号,姓名,专业)

alter  view  view_student  as   select  sno,sname,sdept   from  student  where  sdept in ('计算机系','数学系');

-- 把视图view_student中,9512101学生的专业改为软件测试

update  view_student   set  sdept='软件测试'   where  sno='9512101';

select  *  from  student;

-- 在view_student,把9512102学生姓名改成刘晨晨

update  view_student  set sname='刘晨晨'  where  sno='9512102';

-- 查询view_student视图中的内容

select *  from  view_student;

四.删除视图

1.删除视图中的数据

格式:参考删除表数据的语法格式,把表名改成视图名

delete  from  视图的名字   where   条件;

2.insert语句向视图中插入数据

格式:参考表插入数据的格式

insert  into  视图名字  values(值1,值2...);

3.删除整个视图

格式:drop   view    视图名字;

-- 创建一个视图view_student,包含计算机系和数学系学生的信息

create  view  view_student  as   select  *   from   student  where  sdept  in('计算机系','数学系');

-- 创建一个视图view_sc,包含修了c02课程的学生学号,姓名,年龄,课程号,成绩

create  view  view_sc  as  select  student.sno,sname,sage,cno,grade  from student,sc  where  student.sno=sc.sno  and  cno='c02';

select  *   from  view_sc;

-- 修改view_student视图结构(学号,姓名,专业)

alter  view  view_student  as   select  sno,sname,sdept   from  student  where  sdept in ('计算机系','数学系');

-- 把视图view_student中,9512101学生的专业改为软件测试

update  view_student   set  sdept='软件测试'   where  sno='9512101';

select  *  from  student;

-- 在view_student,把9512102学生姓名改成刘晨晨

update  view_student  set sname='刘晨晨'  where  sno='9512102';

-- 查询view_student视图中的内容

select *  from  view_student;

-- 向view_student表中插入两条数据

insert into  view_student  values('9512106','张三','计算机系'),('9512107','李四','计算机系');

--  从view_student视图中,删除张三学生记录

delete  from  view_student  where  sname='张三';

-- 删除view_student视图

drop  view  view_student;

三.视图

视图---->对实表进行查询得到的一张虚表

今日内容:

一.索引概述

1.索引的定义:索引是针对表中的列来进行设置的,能够快速的查询数据。

例:表(书)     索引(目录)    定位的操作

一个表中索引的设置,不会受到个数限制。

2.索引的作用(优点)---->查询

2.1加快数据的检索(查询)---->最根本的作用

2.2保证数据的唯一性

2.3实现表与表之间的参照完整性

2.4利用索引设置,可以减少分组和排序的时间

二.索引的优缺点

a.索引的缺点:

1.创建索引需要消耗数据空间,并花费一定的时间

2.查询的速度是快了,但是索引会减慢增删改的操作

3.索引的创建也是需要消耗系统性能

4.索引的优势一定在于表中数据越多,查询的速度提升就越明显,对于小表来说,索引可能不会产生优化的效果

b.优先考虑建立索引的列:

1.建立有主键或者外键约束的列

2.查询中频繁使用的列

3.连接过程中频繁使用的列(表连接,子查询)

4.分组和排序用到的列

三.创建索引

1.普通索引的创建:

格式:create   index    索引的名字  on  表名(列名);

2.唯一索引的创建

格式:create  unique   index   索引的名字   on   表名(列名);

四.删除索引

格式:drop   index   索引的名字   on  表名;

-- 给student表中sno的列创建一个普通的索引index_sno

create  index  index_sno  on  student(sno);

select  sno  from student;  -- 0.063s   0.060s

-- 给course表的cno列设置唯一索引 index_cno

create  unique  index  index_cno   on  course(cno);

-- 删除course表中的唯一索引

drop  index  index_cno  on  course;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值