MySQL学习(一)—— 基本操作

1.1 简介

MySQL是一种关联数据库管理系统关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

1.2 安装

在ubuntu下:

apt-get install mysql-server mysql-client libmysqlclient-dev

要记得密码,会用得着

1.3 mysql数据类型

(1)整形

在这里插入图片描述

(2)浮点型

在这里插入图片描述
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。

(3)定点数

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位

(4)字符串

在这里插入图片描述

  • char和varchar:
    1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。

    2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。

    3.char类型的字符串检索速度要比varchar类型的快。

  • varchar和text:
    1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节

    2.text类型不能有默认值。

    3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用

(5)二进制数据

  • BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写。
  • BLOB存储的数据只能整体读出。
  • TEXT可以指定字符集,BLOB不用指定字符集。

(6)日期时间类型

在这里插入图片描述
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

(7)数据类型的属性

在这里插入图片描述

1.4 mysql的基本操作

(1)登录MySQL

mysql -u root -p

登录上去了:
在这里插入图片描述

(2)查看所有数据库

show databases;

结果如下(默认只有红线的这四个):
在这里插入图片描述

(3)使用数据库

use mysql

如果想要切换到 sys 数据库,直接use sys就行:
在这里插入图片描述

(4)查看所有表

show tables;

在 mysql 下查看所有的表:
在这里插入图片描述
在这里插入图片描述

(5)查看所有用户

select user from user;

从 user 这张表里查看用户(默认只有前四个):
在这里插入图片描述

(6)创建用户

create user "test01"@"localhost" identified by "123456";

创建一个用户名为 test01localhost表示只有本机用户才能使用, 密码是:123456

创建成功如下图所示:
在这里插入图片描述

(7)修改密码

set password for "test01"@"localhost" = PASSWORD("888888");

将 test01 这个用户的密码改为:888888

结果如下:
在这里插入图片描述

(8)授权操作

grant select on *.* to "test01"@"localhost"; 

对 test01 授予在所有数据库的所有表具有查询权限

结果如下:
在这里插入图片描述

(9)退出 mysql

exit

结果如下:
在这里插入图片描述

(10)再次登录自己创建的用户

mysql -u test01 -p

登录刚刚创建的用户 test01 , 输入密码,结果如下所示:
在这里插入图片描述
登录上之后,进入 mysql 数据库,可以 尝试 create 权限,发现不能创建,因为我们刚刚只赋予了该用户 select权限:
在这里插入图片描述
因此该用户啊具有 select的权限:
在这里插入图片描述

(11)给test01加上create权限

首先退出myql,利用 root 用户登录:
在这里插入图片描述
然后给 test01 用户授予 creater 的权限:
在这里插入图片描述
然后退出 mysql ,再用 test01 这个用户登录
在这里插入图片描述

利用命令:create database test01_database;,创建一个database:
在这里插入图片描述
可以看到,此时 test01 这个用户具有了 create 的权限了。

(12)创建数据库

create database test01_database;

(13)创建表

create table int_test (
tiny_int tinyint,
small_int smallint,
mudium_int mediumint,
common_int int,
big_int bigint
);

在这里插入图片描述

(14)显示表结构

describe int_test;

在这里插入图片描述

(15)插入数据

insert into int_test values(1,1,1,1,1);
insert into int_test values(200,1,1,1,1);  // 会超出范围,插入失败
insert into int_test values(1,1,1,'a',1); // 插入不正确的类型数据

在这里插入图片描述

(16)创建学生表

create table student (
name varchar(10) not null,
age tinyint unsigned not null,
sex char(6)
);

在这里插入图片描述
在这里插入图片描述

(17)修改表

把表的名字改为:stu

alter table student rename stu;

删除表中的字段,这里把 sex 这个字段给删了

alter table student drop sex;

在这里插入图片描述
增加一个字段,这里把刚刚删除的sex又增加回来了:

alter table student add sex char(6);

在这里插入图片描述
增加 id 这一选项,其中unsigned表示不能为负;not null 表示不能为空;primary key 表示不能重复;auto_increment 表示id是递增的;first 表示把 id 放在最前面

alter table student add id int unsigned not null primary key auto_increment first;

在这里插入图片描述
student这个表添加生日 birth 这个选项,date表示日期类型,after name 表示放在name的后面

alter table student add birth date after name;

在这里插入图片描述
给student添加 tel 这个选项,其中 default '-'表示默认 - 填充:

alter table student add tel char(11) default '-';

在这里插入图片描述

(18)插入数据

全部的项目都插入数据:

insert into student (id, name, birth, age, sex, tel) values (1000, "jack", "1998-4-24", 25, "man", "123456789");

在这里插入图片描述
只插入一部分数据,其中 id 由于设置了递增,所以会自动在前一个数据上加一

insert into student (name, birth, age, sex, tel) value("tom", "1990-9-9", 30, "man", "111111111");

在这里插入图片描述
也可以同时插入多条数据:

insert into student values(1002, "rose", "1997-1-15", 22, "female", "22222222222"), (1003, "frank", "2000-7-14", 15, "male", "33333333333");

在这里插入图片描述
由于 tel 设置了 default ‘-’ ,所以插入时不写这个,他会自动采用默认值:

insert into student (id, name, birth, age, sex) values(1004, "aa", "1996-10-21", 24, "male");

在这里插入图片描述
这里一开始是不支持中文的(可以看下面(20)修改字符集进行解决):

insert into student values(1005, "张三", "1992-11-11", 30, "male", "44444444444");

在这里插入图片描述

(19)查询数据

* 号查询表中所有数据:

select * from student;

在这里插入图片描述
只查名字:

select name from student;

在这里插入图片描述
只查询 id > 1002 的人的名字:

select name from student where id > 1002;

在这里插入图片描述
只查询 id 在1001 至 1004 之间的人的名字:

select name from student where id between 1001 and 1004;

在这里插入图片描述

(20)修改字符集(字符编码格式)

指定 utf8 的编码格式:

alter table student convert to character set utf8;

现在就可以用中文了
在这里插入图片描述

(21)修改数据

将 name 为 aa 这个人的电话改成 00000000000:

update student set tel = "00000000000" where name = "aa";

在这里插入图片描述

(22)删除记录

删除 id 为 1000 的这个人:

delete from student where id = 1000;

在这里插入图片描述

(23)删除表

drop table sutdent;

在这里插入图片描述

(24)删除数据库

drop database test01_database;

在这里插入图片描述

1.5 事务操作

(1)创建表

create table account (
id int unsigned not null primary key,
name varchar(20),
money int
)charset utf8;

在这里插入图片描述

(2)插入数据

insert into account values(10001, "张三", 2000), (10002, "李四", 5000), (10003, "王五", 1000);

在这里插入图片描述

(3)李四给王五转500(但是出问题了)

李四少500

update account set money = money - 500 where id = 10002;

在这里插入图片描述
但是中途一下子停电了,再次登录 MySql 数据出错,李四的钱少了,但是王五的前没有增加(事务操作就是来解决这个问题):
在这里插入图片描述

(4)开启事务

start transaction;

在这里插入图片描述

(5)李四给王五转500,并且中途停电了

update account set money = money - 500 where id = 10002;

在这里插入图片描述
李四确实少了500,退出MySQL(停电了)重新再登录,发现李四的钱并没有少,依旧是4500:(看到的结果经过事务日志,我们看到的结果都是缓存内的)
在这里插入图片描述

(6)王五增加500

update account set money = money + 500 where id = 10003;

在这里插入图片描述
如果退出MySQL,再次登录,发现李四,王五的钱依旧没有改变:
在这里插入图片描述

(7)提交

这样才能真正的在事务中改变值

commit;

完整的程序应该是:

start transaction;
update account set money = money - 500 where id = 10002;
update account set money = money + 500 where id = 10003;
commit;

在这里插入图片描述

我的理解就是:在 start transaction 之后的代码执行完后,真实数据库里面的数据并没有被改变,只有当执行了 commit 语句之后,数据库里面的数据才能真正的改变。

1.6 回滚操作

背景:如果我们一次执行100条语句,我们前面80条都是正确的,后面的语句有错误,我们可以通过回滚返回到第80条语句执行完之后的状态,而不是去到最初所有程序都没有执行的状态。

(1)开启事务

start transaction;

(2)张三转出500

update account set money = money - 500 where id = 10001;

(3)设置回滚点

savepoint sp1;

(4)李四转出500

update account set money = money - 500 where id = 10002;

(5)设置回滚点

savepoint sp2;

(6)王五增加1000

update account set money = money + 300 where id = 10003;

在这里插入图片描述
但是这里我给 王五 转钱的时候发现转错了,可以直接回滚到sp2,重新给 王五 转钱:
在这里插入图片描述

(7)回滚到 sp2,重新转钱

rollback to sp2;

在这里插入图片描述
重新给王五转1000

update account set money = money + 1000 where id = 10003;

在这里插入图片描述

(8)最后提交

commit;

在这里插入图片描述
退出MySQL再重新登录,发现数据确实正确更改了:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值