SQL语言基础(5)

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;

你可能感兴趣的:(SQL语言基础(5))