MYSQL内置函数
字符串函数
concat拼接字符串
concat(参数1,参数2,参数3,参数n)
参数可以把数字,也可以是字符串
把所有的参数连接成一个完整的字符串
把12,34,'ab'拼接一个字符串'1234ab'
select concat (12,34,'ab')
length返回字符串字符的个数
一个utf8的汉字,length返回3
计算字符串'abc'的长度
select lenth('abc');
计算字符串'我和你'的长度
select length('我和你');
计算字符串abcw的长度
select length('abc我')
mysql内置函数可以在where条件后面使用
查询表中名字长度等于9(三个utf8格式的汉字)的学生信息
select * from students where lenght(name) = 9;
left从字符串左侧截取指定数量的字符
left(字符串,n)
n带表从字符串左侧截取n个字符
截取字符串‘我和你abc’的左端3个字符
select left('我和你abc',3); 结果为:我和你
截取字符串'我和你abc'的左端4个字符
select left('我和你abc,4') 结果为:我和你a
截取字符串'abc我和你'的左端4个字符
select left('abc我和你',4) 结果为:abc我
right从字符串右截取指定数量的字符
right(字符串,n)
n带表从字符串右侧截取n个字符
截取字符串‘我和你abc’的右端3个字符
select right('我和你abc',3); 结果为:abc
截取字符串'我和你abc'的右端4个字符
select right('我和你abc',4) 结果为:我abc
substring从字符串指定位置截取指定数量字符
substring(字符串,起始位置,n)
起始位置从1开始
n代表截取的数量
截取字符串'我和你abc'从第2个字符开始的3个字符
select substring('我和你abc',2,3) 结果为:和你a
内置函数可以用在select显示的字段名中
截取students表汇总所有学生的姓
select left(name,1) from students;
select substring(name,1,1) from students;
练习
查询students表的card字段,截取出生年月日,显示李白生日
select card,substring(card,7,8) from students where name = '李白';
查询students表的所有学生信息,按生日从小到大排序
(生日是年份越大年龄越小,所以采用神农升序,这里用到的排序order by 要与分组group by区分一下)
select * from students order by substring(card,7,8) ;
ltrim去除字符串左侧空格
ltrim(带空格的字符串)
去除字符串' abcd'左侧空格
select ltrim(' abcd',4) ;
rtrim去除字符串右侧空格
rtrim(带空格的字符串)
去除'abcd '右侧空格
select rtrim('abcd ');
trim去除字符串两侧空格
trim(带空格的字符串)
select trim(' abcd ');
数学函数
round(数字,d)
d代表要保留的小数位,省略d默认为0
1.653四舍五入,保留整数位
select round(1.653); 结果为:1
1.653四舍五入,保留2位小数
select round(1.653,2) 结果为:1.65
查询students表中学生的平均年龄,并四舍五入,保留两位小数
select round(avg(age),2) from students;
rand()随机数
rand()
每次运行产生一个从0到1之间的浮点数,
经常用rand对一张表进行随机排序
order by rand()
select rand(); 产生一个从0到1的浮点数
从学生表中随机抽出一名学生
(order by 配合rand()使用就会随机进行排序)
select * from students order by rand() limit 1;
日期时间函数
current_date返回系统日期
current_date()
select current_date();
current_time返回系统时间
current_time()
select current_time;
now返回系统日期和时间
now()
select now();
create table a (id int,indate datetim)
插入记录时间
insert into (1,'2021-08-08 08:08:08') 插入写死的时间
插入系统当前时间
insert into (2,now()) 插入当前实时的时间
存储过程
创建存储过程prcedure,也翻译为存储程序,是一条或多条就是SQL语句的集合
语法:
create prcedure 存储过程名称(参数列表)
begin
sql语句
end
创建存储过程stu(),查询students表所有学生信息
create procedure stu()
begin
select * from students;
end
调用存储过程stu
call stu();
在实际的黑窗口写sql语句时 ; 代表sql语句的结束,这时需要用到转义符,而在Navicat工具中,则无需使用
第一步:设置分隔符(navicat中不需要) delimiter//
第二步:创建存储过程 create procedure stu()
begin
select * from studnets;
end
第三步:还原分隔符(navicat中不需要) //
delimiter;
删除存储过程stu,删除的时候不用写名字后面的();
dorp procedure stu;
drop procedure if exist stu;
视图
视图就是对select语句的封装
视图可以理解为一张只读的表,针对视图只能用slsect,不能用delete和update
创建视图
语法:
create view 视图名称 as select 语句;
视图是对一个查询结果
创建一个视图,查询所有男生信息
create view stu_nan as
select * from students where sex = '男';
使用视图 (实际使用过程中,把视图作为一张表来使用)、
语法:
select * from 视图名;
select * from stu_nan inner join scores on stu_nan.studentNo = scores.studentNo;
删除视图
drop view 视图名称
删除视图stu_nan
drop view stu_nan;
drop view if exists stu_nan;
事务
begin ----开始事务
rollback ----回滚事务,放弃对表的修改
commit -----提交事务,对表的修改生效
如果没有写begin代表没有事务,没有事务的表操作都是实时生效的
如果只写了begin,没有rollback,也没有commit,系统退出,结果是rollback
事务是多条更改数据操作的SQL语句的集合
一个集合数据有一致性,要么都失败,要么都成功
事务广泛的运营于订单系统,银行系统等多种场景
事务的场景:
例如:A用户和B用户是银行的储户,现在A要个B转账500元,那么需要做以下几件事:
1.检查A账号余额>=500;
2.A账户扣除500;
3.B账户增加500;
正常流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件,A扣钱和B加钱,要么同时成功,要么同时失败,事务的需求就在于此。
什么是事务?
所谓事务,它是一个操作序列,这些操作要可都执行,要么都不执行,它是一个不可割的工作单位。
例如:银行转账的工作,从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。
事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。
事务完整流程
开启事务
begin 开启事务后执行修改update或删除delete记录语句,变更会写到缓存中,而不会立即生效。
回滚事务
rollback 放弃修改
提交事务
commit 将修改的数据写入实际的表中
回滚事务的操作
例题:
开启事务:
删除students表中studentNo为001的记录,
同时删除scores表中studentNo为001的记录,
回滚事务,两个表同时放弃
//开始事务
begin;
delect from students where studentNo = '001';
delect form scores where studentNo = '001';
//回滚事务,放弃更改
rollback;
如果开始一个事务,执行了begin之后,没有rollback也没commit,中间系统出问题了,默认会执行rollback
提交事务
例题:
开启事务,删除students表中studenNo为001的记录,提交事务,使两张表的删除同时生效
//开始事务
begin;
delect from students where studentNo = '001';
delect form scroes where studentNo= '001';
//提交事务(事务,一旦提交,两个事务操作同时生效)
commit;
索引
思考:
看一本书,怎么快速知道要查看的内容在多少页?
给书建立一个目录
通过目录的索引,快速找到内容对应的页。
当表数据量很大时,查找数据会变得很慢
可以给表建立一个类似书籍中的目录,从而加快数据查询效率,这在数据库中交索引(index);
index
给表建立索引,目的是加快select查询速度
如果一个表记录很少,几十条,或者几百条,可以不用索引,查询速度不会受影响
表的记录特别多,如果没有索引,select语句效率会非常低
创建索引语法
create index 索引名称 on 表名(字段名称(长度)); 如果给字段创建索引,字段为字符串需要加上字段长度,如不为字符串可以省略
为表students的age字段创建索引,名为age_index
create index age_index on students(age);
为表students的name字段创建索引,名为name_index
create index name_index on students(name(10));
调用索引
where条件后面的字段,数据库系统会自动查找是否有索引(age字段已配置索引,当进行条件查询age字段时会自动调用索引)
这里会自动调用age_index
select * from students where age = 30;
这里会自动调用name_index
select * from students where name ='李白';
不会调用任何索引,因为sex没有建立索引
select * from students where sex ='男';
查看索引
show index from 表名
对于主键,系统会自动创建索引
查看students是否创建索引
select index from students;
删除索引
dorp index 索引名称 on 表名
删除索引age_index
dorp index age_index on students;
dorp index name_index on students;
索引的优缺点:
优点:
索引大大提高了select语句的查询速度;
缺点:
降低update、delete和insert语句的执行速度。虽然索引提高了查询的速度,同时却降低更新表的速度,例如对表进行insert、update、和delete操作。因为更新表,不仅要保存数据,还要保存索引文件;
在实际应用中,执行select语句的次数远远大于执行insert、update、和delete语句的次数,甚至可以占到89%~90%,所以为表建立索引是必要的。
在大量数据插入时,可以删除索引,再批量插入数据,最后再添加索引,这样就可以提高数据插入的效率。
基于命令行的mysql
mysql -h mysql服务器的地址 -u 用户名 -p
-h 如果是使用本地的mysql -h可以省略
mysql登录之后常用命令
显示系统所有数据库
show databases;
要使用哪个库
use 库名;
显示当前库下所有的数据表
show tables;
设置客户端字符集为gbk
set name gbk;
查询students表
select * from students;
在命令行中每条SQL语句用;结尾
可以通过desc 表名 查看已个表的字段结构
desc students
查看students每个字段的定义
创建数据库
create database 数据库名 default charset 字符集;
建立一个数据库,并设置字符集为utf8
create database mytest default charset utf8;
删除数据库
dorp database mytest;
dorp database if exits mytest;
用root身份登录mysql
grant all on 数据库名.表名 to 用户名@'登录主机'identified by '密码' with grant option;
grant all on:代表为用户赋权
数据库名:可以是*,代表所有数据库
表名:可以是*,代表所有的表 如:数据库.表名 写为*.* 代表可以对所有数据库和所有表进行操作
to 用户名:制定要创建用户的名称
@'登录主机':@'localhost':代表智能在本机登录,@'%':代表可以远程
例题:
建立一个用户,可以操作所有数据库和表,用户名为test,该用户可以本地登录,密码123456,该用户可以为其他用户分配权限
grant all on *.* test @'localhost'ldentified by '123456' with grant option;
建立一个用户,可以操作所有数据库和表,用户名为test,该用户可以远程登录,密码123456,该用户可以为其他用户分配权限
grant all on *.* test @'%'Identified by '123456' with grant option;
修改用户权限
修改本地用户,用户名为test,密码为111111
grant all on *.* test @'localhost'ldentified by '111111' with grant option;
修改远程用户,用户名为test,密码为111111
grant all on *.* test @'%'ldentified by '111111' with grant option;
删除用户
删除用户test
第一步:用root身份登录mysql mysql -u root -p
第二步:选择mysql数据库 use mysql
第三步:回收用户test权限 revoke all on *.* from test@'localhost';
revoke all on *.* from test @'%';
第四步:删除用户test delete from user where user = 'test';
第五步:刷新权限 flush privileges;