MySQL学习笔记——〇一
这里不讲MySQL的原理和连接的方法了,就讲一下如何对数据库进行操作。
创建用户
创建用户的方法:我们可以用下面的代码进行用户的创建
create user 'username'@'ip' identified by 'password';
在上面的代码中,表示创建了用户名为username的用户,用户登录ip限制为ip,密码为password。
ip内可以用百分号来表示区间:
192.168.0.% ip区段为192.168.0.0-255
或者直接用%来表示所有的ip地址。
权限管理
常用权限
在创建完用户以后需要对该用户进行权限管理,先看看有哪些权限是常用的
select 仅查权限 select,insert 查和插入权限 ... usage 无访问权限 alter 使用alter table alter routine 使用alter procedure和drop procedure create 使用create table create routine 使用create procedure create temporary tables 使用create temporary tables create user 使用create user、drop user、rename user和revoke all privileges create view 使用create view delete 使用delete drop 使用drop table execute 使用call和存储过程 file 使用select into outfile 和 load data infile grant option 使用grant 和 revoke index 使用index insert 使用insert lock tables 使用lock table process 使用show full processlist select 使用select show databases 使用show databases show view 使用show view update 使用update reload 使用flush shutdown 使用mysqladmin shutdown(关闭MySQL) super 使用change master、kill、logs、purge、master和set global。还允许mysqladmi调试登陆 replication client 服务器位置的访问 replication slave 由复制从属使用
授权
我们可以将上面的权限赋给新创建的用户
grant privileges on dagabasename.tablename to 'username'@'host'
上面的语句就是把某项权限授权给指定地址的指定用户
移除权限
我们还可以把已授的权撤回
revoke privileges on dagabasename.tablename from 'username'@'host'
就是把授权的两个关键字grant和to改成revoke和from
删除用户
删除用户的方法
drop user 'username'@'host'
修改用户
rename user 'username'@'host1' to 'newname'@'host2'
修改密码
set passowrd for 'username'@'host' = pwd
在这里我们把数据库类比成一个Excel文件,在这个文件里存了各个数据,那么, 都有哪些操作呢?
MySQL文件和Excel的文件我们可以这样来说明
database —— 工作簿xlsx文件
table —— Sheet
文件操作(database)
创建文件
create database dbname;
Sheet操作(table)
创建表
create table tablename(
列1 数据类型,
列2 数据类型
)
删除表
drop table tablename
查看表属性
desc tablename;
查看表创建代码
show create table tablename
show create table tablename \G
下面一条语句中的\G是在终端显示异常(宽度和table宽度不匹配)的时候使内容竖着显示。
清除表内容
清除表内容有两种方法
delete from tablename;
truncate table name;
两种方法都可以清楚table里的内容,最大的区别就是如果表初始化的时候如果使用了自增的选项,用delete清除后添加数据是接着原有的序号继续添加的,而用truncate是彻底清除,添加数据是从头开始添加。
内容操作(增删改查)
插入数据(insert)
insert it tablename(列名1,列名2) values(值1,值2)
查看数据(select)
select 列名 from tablename
改数据(update)
update tablename set 列名=值
update tablename set 列名=值 where condition
删除数据
delete from tablename where condition;
主键Primary Key
“主键(PRIMARY KEY)”的完整称呼是“主键约束”。MySQL 主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。
主键可以在创建表的时候声明
create table t1(ID int primary key, name char(10));
也可以在表创建以后将某一列设置为主键(设置的时候该列的数据不能有重复的)
alter table tableneme add primary key(列名);
要注意一点:一个表里只能有一列主键,但主键不一定必须是一列数据(也可以是多列一起构成一个主键),那么该怎么定义呢?比方我们有个table,里面把id1和id2设置为主键,代码如下
create table t1(id1 int not NUll, id2 int not Null, name char(5), primary key(id1,id2));
就是用primary key来设置两个列,这个方式不太常用,知道有这么个用法就可以了。
总之,就是一个表只能有一个主键,而主键可以有多列组成。
自增auto_increment
一般我们对主键是设置一个自增的
create table t1(di not null primary key auto_increment, name char(10));
自增步长
MySQL的步长设置是基于会话的(一次会话可以简单的理解为一次登录)
set session auto_increment_increment=2
set session auto_increment_offset = 10 设置起始值
但是同一个表在不同的登录端是可以设置成不同的步长的(同时启动两个终端都可以实现),相当于内存中的一个全局变量。
查看当前会话中自增步长
show session variables like 'auto_inc%');
全局级别自增设置
set global session auto_increment_increment=2 set global session auto_increment_offset = 10 设置起始值
而在sqlserver的自增步长是基于表级别的,就是说我们把他的步长定了以后不管在什么时候使用的步长是一致的。
auto_increment也是表格的一个重要的属性,每次添加新的数据以后,这个值都会发生改变,变成下一次要使用的数值。
但是如果在向表内添加了5组数据后,删除了三个,只剩下id为1和2两组数据,这时候我们再重新填数的时候新的id就成了6,这时候就修改表格的auto_increment属性
alter table tablename auto_increment=3;
那么再添加数据的时候,自增的数就是从指定的3开始。
基于上面的方法我们用下面的代码添加一个新的数据库文件并且使用这个库文件
create database db1; use db1; createt table t1(id int,name char(10))
这时候我们插入一个新的数据,但是把值设置成中文
insert into t1(id,name) values(1,'张三')
敲回车,看看是不是报错了
Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1
因为我们在创建database或者table的时候没有对编码进行定义,怎么解决呢?
create database dbname default charset utf8
或者在创建表的时候定义好
create table tablename default charset utf8
这时候就要简单的引出来一个新的概念——事务,比方我们有个操作:一个database里两个table是两个人的账户,有这样的一个操作:转账,把table1里的账户扣掉多少加到table2里,这就是一个事务。如果这个操作是有一定耗时的,但是在操作的时候死机或掉电了,那么是不是重启服务的时候就会出现数据的异常,这样就引出来事务的第几个特性:
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:再失误开始和结束以后,数据库的完整性没有被破坏,也就是说写入的资料必须完全符合所有的预设规则,包含资料的准确性、串联性以及后续数据库可以自发的完成预定的工作
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
数据库引擎是用于存储、处理和保存数据的核心服务,不同的引擎的特点是不同的。MySQL的常用引擎有两种:InnoDB和MyIsam,其他的还有什么BlackHole和Memory啥的,这里主要简单的点一下前两种
InnoDB具体特点度娘上一查就有,但最大的一点就是事务型引擎,支持事务
MyIsam是不支持事务的,但是支持全局索引,实现快速的索引。
指定引擎
create table tablename(列名) engine=InnoDB;
在创建表的时候我们都定义了列的数据类型,下面看看常用的数据类型有哪些
数字类型
整形数据
整形数据分为int,tinnyint和bigint不同的类型表示的数据范围不同
浮点数据
浮点类型的数据大致分两种,下面的m值数据总长度,而n指的是小数位数。
一种是float(m,n)和double(m,n),这种的精度是比较差的。
另一种是decimal(m,n)。底层存储方式有些类似字符串所以精度要高于上一种。
时间
下面是常用的几种事件类型的数据关键字和其对应的格式
DATE——YYYY-MM-DD
TIME——HH:MM:SS
DATETIME——YYYY-MM-DD HH:MM:SS
TIMESTAP YYYYMMDD HHMMSS
字符串
字符串的格式有两种:char(m)和varchar(m),一种是固定长度,一种是可变长度(最大值都为255)。可变长度的比较节省空间,而定常度的比较减少索引的时间。
而较大的数据有几种格式分别如下,不一样的长度
text,2**16-1
mediumtext 2**24-1
longtext 2**32-1
而其实超过一定长度的数据已经不适合放在数据库内了,一般较大的文件(比方上传个图像、音频什么的)都是把文件上传在服务器内,而数据库里只保存文件路径URL。
枚举型数据
常用的枚举型数据也大概分两种
ENUM
ENMU用来指定唯一的选项,比方说性别、尺寸什么的,举个例子,表格里寸放了某种衣服的货号(id),尺寸(size),和数量(num),尺寸就是从XL到XS,就这几种选项
create table t1(id int, sie ENMU('XL','L','M','S','XS'), num int)
这样我们在以后插入数据的时候就只能选择上面的几种尺寸了。如果输入的数据不对就会报错。
SET
SET实现了多选项的枚举,举个例子,一盒笔,里面可能有红的,或是蓝的或黑的,我们要统计数量所以,第一列是ID,第二列是数量Num,第三列是都有颜色
create table(ID int, Num int, Cor SET('red','blue','black')
外键的概念
最后我们来看看外键的使用
假设我们有db下两个表,t1如下
但是有个问题,如果部门那一列如果字数太多,并且人数非常多的话,这个数据库是比较冗余的,一般我们就会另外建立一个表2
那么,我们把这两个表关联起来做一个约束,也就是说t1里的departmen列的数据t只能是t2里的ID列的数据,在t1里只用存储t2里的ID就可以了,然后这么做有两点好处:
1.大大的降低了存储的开支
2.减少了脏数据出现的概率,如果没有关联的话,用户一旦输入了一个失效的数据(没有的部门),是无法提示的,这个方式起码保证t1输入的是t2内已经存在的数据。
那么t2的ID就是t1的外键(表的外键是另一表的主键, 外键可以有重复的, 可以是空值)。
外键的使用
还是用上面那个例子,我们把他用代码来描述一遍
create table userinfo( ID int auto_increment primary key, name varchar(32), department_id int. constraint fk_user_depar foreign key('department_id',) references departmentinfo('id') )engine=innodb default charset=utf8 create table departmentinfo(id int auto_increment primary key, department_name varchar(32) )engine=innodb default charset=utf8
注意几点:
1.我们在定义外键的时候constraint fk_user_depar foreign key('department_id',) references departmentinfo('id'),第一个键用了个括号,是因为如果被约束的主键是一个大于1 的列的话,是可以用两个列来约束的
constraint fk_t1_t2 foreign key (id1,id2) references t1(t1id1,t1id2);
2.我们声明外键的时候,fk_t1_t2这个名字是不能重复的,我们在起名的时候可以直接用表和表来命名(t1_t2)这样的。