MySQL基础随堂笔记1
数据类型
整数类型:bit,bool,tinyint,smallint,mediumint,int,bigint
浮点类型:float,double,decimal
字符串类型:char,varchar,tinytext,mediumint,text,longtext
日期类型:date,dataTime,timeStamp,time,year
数据类型的选择建议:
1、越小通常越好
2、简单就好(比如: 整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符 比整型比较更加复杂)
3、尽量避险使用NULL
4、浮点类型统一使用decimal
5、记录时间类型选择使用int类型
权限管理
创建用户: create user 用户名[@主机名] [identified by '密码'];
说明:
1、主机名默认值为%,表示这个用户可以从任何主机连接mysql
2、服务器密码可以省略,表示无密码登录
3、不指定主机名时,表示用户可以从任何主机上链接mysql数据库
修改密码:
1、通过管理员修改密码
SET PASSWORD FOR '用户名'@'主机' = PASSWORD('密码');
2、通过修改mysql.user表修改密码(表修改密码需要刷新权限)
update user set authentication_string = password('321') where user = 'test1'and host='%';
flush privileges;
给用户授权:
GRANT 权限,[,权限...] ON 数据库.表 TO 'jeffrey'@'localhost';
权限:
all: 所有权限
数据操作权限
select:查询数据
insert:插入数据
update:更新数据
delete:删除数据
create:创建数据库/表
drop:删除数据库/表
alter:修改表结构(如添加/删除列)
数据库管理权限
GRANT OPTION?:授权用户将自身权限转授他人
REFERENCES:操作外键约束
CREATE TEMPORARY TABLES:创建临时表
INDEX:管理索引
特殊权限
PROCESS?:查看当前执行的进程
LOCK TABLES?:锁定表结构
示例:
说明:给test1授权可以操作所有库所有权限,相当于dba
grant all on *.* to 'test1'@‘%’;
说明:test1可以对seata库中所有的表执行select
grant select on seata.* to 'test1'@'%';
说明:test1可以对seata库中所有的表执行select、update
grant select,update on seata.* to 'test1'@'%';
说明:test1用户只能查询mysql.user表的user,host字段
grant select(user,host) on mysql.user to 'test1'@'localhost';
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权 限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。用户授权后通过 flush privileges 来刷新权限
查看用户有哪些权限:
show grants 查看当前用户得权限
show grants for '用户名'[@'主机'] 查看其他用户得权限
撤销用户得权限:
revoke 权限列表 ON database.table FROM '用户名'[@'主机'];
DDL操作汇总
DDL:Data Define Language数据定义语言,主要用来对数据库、表进行一些管理操作。如: 建库、删库、建表、修改表、删除表、对列的增删改等等。
库管理:
查看库:show databases;
选择库:use 数据库名:
创建库:create database [if not exists] 库名;
删除库: drop database [if not exists] 库名;
表管理:
create table 表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表的一些设置];
注意:
1、在同一张表中,字段名不能相同
2、宽度和约束条件为可选参数,字段名和类型是必须的
3、最后一个字段后不能加逗号
4、类型是用来限制字段必须以何种数据类型来存储记录
5、类型其实也是对字段的约束(约束字段下的记录必须为XX类型)
6、类型后写的约束条件是在类型之外的 额外添加的约束
约束说明:
not null: 标识该字段不能为空
default value: 默认值
primary key: 主键约束,可以唯一的标识记录,插入重复的会报错
foreign key:外键约束 语法:foreign key(当前表的列名) references 引用的外键表(外键表中 字段名称) (被插入得表中对于外键列必须在引用得外键表中存在)
unique key:唯一约束. 和主键约束不同的是,唯一约束中可以有NULL,而主键中不能有NULL
auto_increment:标识该字段的值自动增长(整数类型,而且为主键)
删除表: drop table [if exists] 表名
修改表名: alter table 表名 rename [to] 新表名;
给表添加注释: ALTER TABLE 表名 COMMENT = '注释';
复制表结构: create table 表名 like 被复制的表名;
复制表结构+数据: create table 表名 [as] select 字段,... from 被复制的表 [where 条件];
表中列得管理:
添加列: alter table 表名 add column 列名 类型 [列约束] [FIRST | AFTER 其他列 ];
修改列: alter table 表名 modify column 列名 新类型 [约束];
或者
alter table 表名 change column 列名 新列名 新类型 [约束];
删除列: alter table 表名 drop column 列名;
DML操作汇总
插入操作:
形式1:insert into 表名[(字段,字段)] values (值,值);
说明:
1、值和字段需要一一对应
2、如果是字符型或日期类型,值需要用单引号引起来;如果是数值类型,不需要用单 引号
3、字段和值的个数必须一致,位置对应
4、字段如果不能为空,则必须插入值
5、可以为空的字段可以不用插入值,但需要注意:字段和值都不写;或字段写上,值 用null代替
6、表名后面的字段可以省略不写,此时表示所有字段,顺序和表中字段顺序一致。
形式2:insert into 表名 set 字段 = 值,字段 = 值;
批量插入:
形式1:insert into 表名 [(字段,字段)] values (值,值),(值,值),(值,值);
形式2:insert into 表 [(字段,字段)] 数据来源select语句;
数据更新: update 表名 [[as] 别名] set [别名.]字段 = 值,[别名.]字段 = 值 [where条件];
删除数据: delete [别名] from 表名 [[as] 别名] [where条件];
多表删除: delete [别名1],[别名2] from 表1 [[as] 别名1],表2 [[as] 别名2] [where条件];
示例1:删除test1表中的记录,条件是这些记录的字段a在test.c2中存在的记录
delete t1 from test1 t1,test2 t2 where t1.a=t2.c2;
示例2:同时对2个表进行删除,条件是test.a=test.c2的记录
delete t2,t1 from test1 t1,test2 t2 where t1.a=t2.c2;
truncate删除: truncate 表名;
drop,truncate,delete的区别:
1、drop删除表,删除数据和定义,释放空间,简单来说就是把整张表删除。以后要新增数 据是不可能的了。除非重新建立一张表
2、truncate(清空表的数据),删除内容,释放空间 但是不删除表的定义。他只是清空表数 据而已
3、delete(删除表中的数据),delete语句表示删除数据中的行。delete执行删除过程中每删 除一行,并且会将删除该行的操作记录作为事务日志保存起来,以便经行回滚操作
4、truncate和不带where条件的delete一样,只删除数据,不删除表的定义
5、truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。对于foreign key 约束的表不能用 truncate 删除,而是应该用不带where条件的delete。应为truncate table 记录在日志中,不能激活触发器
6、delete 语句是数据库操作语言(dml) 这个操作会放到 rollback segement 中,事务提交之 后才生效;如果有相应的 trigger,执行的时候将被触发。
7、truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到rollback segment 中,不能回滚,操作不触发 trigger。
8、如果有自增列,truncate清空表,自增列会初始化。而delete需要分情况:(如果数据 库被重启了,自增列值也会被初始化,数据库未被重启,则不变)
9、小心使用drop和truncate。删除前确认表结构和数据是否无用。否则错删,只能提桶跑 路了
10、删除速度 一般 drop > truncate > delete