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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容