##mysql中常见的关键字及其用法
1、select * from tablename;
2、select function() 执行打印函数结果
3、use 切换数据库
4、select distinct(elem) from tablename 不重复显示元素elem
5、desc tablename 显示表结构
6、mysql 中 “+” 的作用,进行数学运算
7、select concat(elem1,elem2,elem3,..) from tablename 链接concat中的字符
8、select ifnull(elem,result) from tablename ifnul(elem,result) 表示如果elem为null,则返回result
9、select elem from tablename where 条件 查询出符合条件的
条件运算符:> , < , = , <> , >= , <=
逻辑运算符:and(&&) , or(||) , not(!)
模糊查询:like, between and, in, is null
like -->> select * from tablename where elem like "%s%"
like 中的通配符 % 任意多的字符;_任意一个字符,不可以匹配null;
like中防止转义 : like "_\_" ,like "%\%" 通配符前加"\"后代表"\"或"%"
like "_$_%" escape "$" 通过escape指定防止转义的符号
between and -->> select * from tablename where elem between 100 and 200 查询elem的值在100到200之间的数字包含100和200(大于等于左边小于等于右边)
in -->> select * from tablename where elem in (item1,item2,item3) 查询出elem中在item1,item2,item3中的数据
in 中的数据必须统一 ,不支持通配符
is null -->> elem = null这是错误的表达方式,=或<> 不能判读null 使用is null 或is not null
安全等于 <=>; 安全等于可以判读null
10、order by column -->> select * from tablename [where 条件] [order by column|express [asc|desc]] desc为降序,asc为升序,默认为asc(express为一个表达式:a + b +c ;亦可以是表达式的别名)
多个字段排序order by column1 [asc|desc],column2[asc|desc]
order by 子句中可以支持单个字段,多个字段、表达式、函数、别名
order by 字句一般是放在查询语句的最后,除limit字句
使用gbk编码排序
SELECT distinct(province_name) FROM bw_store order by convert(province_name using gbk) asc
自定义排序
ORDER BY FIELD(`id`, 5, 3, 7, 1)
11、show variables like "%char%"
##mysql中常用的function
语法:select function(*args,**kwargs)
函数分为单行函数和分组函数
单行函数:
字符函数:length(str)、concat(str1,str2)、upper()|lower():返回大小写
substring()|substr():截取字符串 -->> select substr("dfghjkl",7,3),7为索引位置,3为字符长度
instr() -->> select instr("qwert","q") 返回子字符串第一回出现的位置,索引是从1开始的。如果找不到返回0
trim() -->> select trim(" zhupenghui ") 返回去除前后空格的字符串
select trim('a' from "aaaaaaaazhuaapengaahuiaaaaaaa") ->> 'zhuaapengaahui'
lpad() -->> select lpad("zhu",10,"*") 总长度为10,填充字符为"*"
rpad() -->> 右填充
replace() -- select replace("eeaabbccddee",'ee','ff') 将"ee"全部替换为"ff"
数学函数
round 四舍五入 select round(4.6) -->> 5
round(1.5656, 2) 四舍五入,保留小数点后两位
ceil 向上取整 select ceil(1.2) -->> 返回大于等于该参数的最小整数
floor 向下取整 ,与ceil相反
truncate 截断 select truncate(2.44,1) 截断保留一个小数
mod 取余 a-a//b*b
日期函数
now() 返回当前系统日期+时间
curdate() 返回当前系统的日期,不包含时间
curtime() 返回当前系统的时间,不包含日期
select year(now()) 返回年 (select year("2018-2-4"))
select month(now()) 返回年 (select year("2018-2-4"))
select monthname(now()) 返回月份的英文名
str_to_date("9-33-2008","%m-%d-%Y)
date_format(now(),"%y年%m月%d日") 日期转换为字符
时间格式化说明
%Y 四位的年份
%y 两位的年份
%m 月份 (01,02,...,12)
%c 月份 (1,2,...,12)
%d 日 (01,02,...)
%H 小时(24小时制)
%h 小时(12小时制)
%i 分钟(00,01,02,...)
%s 秒(00,01,02,...)
其他函数
select database()
select version()
流程控制函数
if(条件,条件满足返回值,条件不满足返回值)
select if(10>5,"大","小")
case 要判断的字段或表达式
when 常量 then 要显示的值或语句
...
else 要显示的值或语句
end
select salary,department_id,
case department_id
when 30 then salary*1
when 50 then salary*2
else salary
end as 新工资
from employees
### 如果department_id = 30 工资为1倍,如果department_id = 50 工资为2倍
case
when 条件1 then 显示的值1或语句1
when 条件2 then 显示的值2或语句2
...
else 显示的其他值或语句
end
##此语句相当于if elif else
分组函数 - 聚合函数:
sum()
min()
max()
avg() -- >> 平均值
count() -->> 计数
count(*) 统计行数
MYISAM 储存引擎,count(*) 的效率最高
INNODB 存储引擎,count(*) 和count(1)的效率差不多,比count(字段)要快
和分组函数一同查询的字段要求是group by后的字段
##分组查询
select 分组函数,列(要求出现在group by的后面)
from 表
[where 筛选条件]
group by 分组的列表
[having 筛选条件] -->>> 分组后的筛选
Oder by 字句
select max(salary) ,job_id
from employees
group by job_id;
多个分组
select name, boyName from beauty, boys; 产生笛卡尔乘积现象
分类:sql199 标准
等值链接
女生名对应的男生名
1、select beauty_name, boy_name from boys, beauty
where beauty.id = boys.id
2、select
beauty_name, boy_name from boys b
inner join beauty
on beauty.boys_id = b.id
非等值链接
select salary, grade_level from employees e ,job_grades g
where salary between g.lowest and g.highest
select
salary, grade_level
from
employees e
inner join
job_grades g
on salary between g.lowest and g.highest
自连接
select
e.employee_id,e.last_name, m.employee,m.last_name
from employees e, employees m
where e.manage_id = m.employee_id
2\
select
e.employee_id, e.last_name, m.employee_id, m.last_name
from employees e
inner join employees m
on e.manager_id = m.employee_id
链接语法
select 查询表
from 表1 [as] 别名 [链接类型]
join 表2 [as] 别名
on 链接条件
where 筛选条件 (链接后的条件筛选)
内连接:链接类型 :inner
外链接
左连接 :left [outer]
select
*
from
beauty
left join
boys
on
beauty.boy_id = boys.id
where
bo.id is null
求补集:属于A但是不属于B
select select_list
from A
left join B
on A.key = B.key
where B.key is null
求补集:属于B但是不属于A
select select_list
from B
left join A
on A.key = B.key
where A.key is null
右链接:right [outer]
全外链接 full [outer]
select select_list
from A
full join B
on A.key = B.kye
交叉链接 cross
##子查询
查询在其他语句中的select语句中,称为子查询或内查询
外部的查询为主查询
分类:
按查询出现的位置
1、select后面
仅仅支持量子查询
2、from后面
支持表子查询
3、where 或 having后面
标量子查询
列子查询
行子查询
4、exists后面(相关子查询
表子查询
按结果集的行列数不同
1、标量子查询(结果只有一行一列)
2、列子查询(一列多行)
3、行子查询(多行多列)
select *
from employees
where
(employee_id , salary) = (
select min(employee_id), max(salary)
from employees)
##放在where后面
select d.* ,(
select count(*)
from employess e
where e.departments_id = d.department_id
)
from departments d;
##放在select后面
select avg(salary), department_id,
from employees
group by department_id
left outer join
4、表子查询(一般为多行多列)
a in (10,20,) a在any后的列表中返回True
a > any(1,2,3) <=> a> min((1,2,3))
a > all(1,2,3) <=> a> max((1,2,3))
select *
from beauty
left join boys
on beauty.boy_id = boys.id
where beauty.id > 3
select department_id from employees
where last_name = ""
select distinct department_id
from department
where location_id = 1700
##分页查询
select 查询表
form 表
[join type] join 表2
on 链接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序字段 [asc,desc]
limit offset,size ##offset 显示要显示的起始索引(从零开始mysql中其他地方的索引从1开始 )size 是显示的个数
##联合查询
union 将多条查询语句合并成一个结果
特点:
要求多条查询语句的查询列数是一致的
要求多条查询语句的查询的每一列的类型和顺序是一致的
使用union 会自动去重
使用union all不会去重
DML语言
数据操作语言
insert 插入
语法:
插入单条 insert into 表名 (列名,...)values (value1,...)
insert into 表名 set 列名=值,列名=值,...
insert into 表名 (列名,...) select value1,value2,...
多行插入 insert into 表名 (列名,...) values (value1,value2,...),
(value1,value2,...)
update 更新
语法:
修改单板的记录
update table_name
set column1= value1,column2 = value2, ...
where 筛选条件;
修改多表
update table as new_table
inner|left|right join table2 as new_table2
on 链接条件
set column1 = value1,...
where 筛选条件
delete 删除
delete from table1 where 筛选条件
truncate table 表名 ##删除表
##DDL
1、库的管理
创建、修改、删除
创建库:
create database 库名; create database if not exists 库名
库的修改:
rename database 库名 to 新库名 ##重命名
alter database 库名 character set utf-8
库的删除:
drop database 库名
2、表的管理
创建、修改、删除
创建:create
修改:alter
删除:drop
表的管理
表的创建
create table 表名(
列名 列的类型 [长度 约束],
列名 列的类型 [长度 约束],
列名 列的类型 [长度 约束],
列名 列的类型 [长度 约束],
) charset utf-8;
表的修改 alter table 表名 add|drop|modify|change column 列名 列类型
修改列名
alter table 表名 change column 列名 [新列明 数据类型];
修改列的类型和约束
alter table 表名 modify column 列名 数据类型;
添加列名
alter table 表名 add column 列名 数据类型;
删除列
alter table 表名 drop column [if exists] 列名;
修改表名
alter table 表名 rename to 新表名
表的删除
drop table [if exists] 表名
##创建的数据类型
数值型
整型:Tinyint(1字节)、Smallint(2字节)、Mediumint(3字节)、Int/integer(4字节)、Bigint(8字节)
如何设置有符号和无符号
t1 int unsigned
零填存
t3 int(11) zerofill
小数:
浮点数:float 4 、double 8;写法float/double(M,D) M整数部位加小数部位 D为小数部位
定点数:decimal,默认M为10,D为0
**选择原则:所选择的类型越简单越好,能保存数值的类型越小越好
字符型
较短的文本:char 、varchar
char(M) M为0~255之间的数值,char固定字符,省略默认M等于1
varchar(M) M为0~65535之间的数值,可变字符,M步不可省略
enum("a","b","c"),enum 可以控制插入的值只能是enum中其中的一个不区分大小写,保存枚举
set("a","b","c"),控输入的值为"a","b","c"或"a","b","c"之间的组合,保存集合
binary 和 varbinary 用于保存较短的二进制
较长的文本:text、blob(较长的二进制数据)
日期型
date 只保存日期 4字节 时间范围 1000-01-01 ~ 9999-12-31
time 只保存时间 3字节 -838:59:59 ~ 838:59:59
year 只保存年 1字节 1901 ~ 2155
datetime 保存时间和日期 8个字节 1000-01-01 00:00:00 ~ 9999- 12- 31 23:59:59
timestamp 4字节 最大为2038年,随时区变化 保存日期加时间
##常见约束
not null :非空,必填
default 默认 设置默认值
primary key 主键,保证数据唯一性,且非空
unique 保证数据的唯一性,但是可以为空
check 检查约束【mysql中不支持,只是做了与其他数据库数据做兼容】
foreign key 外键 用余限定两个表的关系
index 索引 主键、外键、unique都自带索引
列级约束:都支持,但是外键和check无效果
create table students(
id int primary key auot_increment,
student_name varchar(20) not null,
gender char(1) check(gender="man" or gender="woman"),
seat int unique,
age int default 18,
major_id int references major(id)
);
create table major(
id int primary key,
major_name varchar(20)
);
表级约束
语法:
constraint [约束名] 约束类型 (字段)
create table students(
id int auot_increment,
student_name varchar(20) not null,
gender char(1),
seat int,
age int default 18,
major_id int,
constraint pk primary key(id),
constraint uq unique(seat),
constraint ck check(gender="man" or gender="woman")
constraint fk foreign key (major_id) references major(id)
);
create table major(
id int primary key,
major_name varchar(20)
);
约束通用写法:
create table if not exists stuinfo(
id int primary key,
stuname varchar(20) not null,
age int default 18,
seat int unique,
majorid int,
constraint fk_stuinfo_majorid foreign key (majorid) references major(id)
);
主键和唯一
唯一 是否为空 个数
主键 Y Y 1
唯一 Y N n
外键
主表的关联键必须是一个主键
插入数据时,必须先插入主表数据再插入从表
删除数据时先删除从表再删除主表
修改表的约束
alter table stuinfo modify column stuname varchar(20) not null
添加外键
alter table add foreign key (majorid) references major(id)
删除主键:
alter table stuinfo drop primary key
删除唯一键
alter table sruinfo drop index column
删除外键:
alter table stuinfo drop foreign key
##标识列
1、auto_increment
##TCL 事务控制语言
事务:由单独单元的一个或多个sql语句组成,在这个单元中,每一个mysql语句是相互依赖的,整个单独单元作为一个
不可分割的整体,如果单元中的某条sql语句一且执行失败,整个单元将会回滚,所有受影响的数据将会返回到事
务开始以前的状态,如果单元中的所有sql语句均执行成功,则事务被顺利执行。
查看数据库引擎:show engines
常见的数据库引擎有,Innodb、myisam、memory,其中只有innodb支持事务
事务的ACID
1、原子性,事务是一个不可分割的工作单位,事务中的操作要么都发生要么不发生
2、一致性,事务必须使数据库从一个一致性状态变换为另一个一致性状态
3、隔离性,一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰
4、持久性,事务提交后是不可返回的
事务的创建
隐式事务:事务没有明显的开启和结束标记
比如insert update delete
查看是否自动提交
show variable like "autocommit%" ## ON 表示自动提交
set autocommit = 0; 设置为不自动提交
显示事务,事务具有明显的开启和结束标记
前提必须先设置自动提交功能未禁用
实例:
set autocommit = 0;(只针对当前事务有效) -->> 开启事务
start transaction;##可选的
select insert update delete
commit:提交事务
rollback;事务回滚
savepoint;设置保存点
delete from column where id = "**"
savepoint a
delete from column where id ="***"
rollback to a
##会将第一条删除
如果没用采用必要的隔离机制,回导致的并发问题
事务的并发问题
1、脏读:对于两个事务T1,T2,T1读取了已经被T2更新的但是还没有被提交的字段,之后如T2回滚,T1读取的内容就是临时且无效的
2、不可重复读:对于两个事务T1,T2,T1读取一个字段,然后T2更新了该字段,之后 ,T1再次读取同一字段,值就不同了
3、幻读:对于两个事务T1,T2,T1从一个表中读取一个字段,然后T2在该表中插入一些新的行,之后,如果T1再是读取同一表,就会多出几行
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
所有的级别
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 是 是 是
不可重复读(read-committed) 否 是 是
可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否
解决以上问题就涉及事务隔离级别
Oracle支持两种事务隔离级别:read commited、serializable,默认的为read commited
mysql支持四种事务隔离级别,默认的事务隔离级别为repeatable read
还有
查看数据库隔离级别:select @@tx_isolation(8.0以前)|SELECT @@transaction_isolation;(8.0级8.0以后)
修改事务隔离级别:
set session transaction isolation level read uncommitted| read committed |repeatable read |serializable
索引:
查看索引
show index from table_name
##视图,支持mysql5.1及5.1以上的版本
视图,可理解为一张虚拟表,视图是临时表
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。
当对通过视图看到的数据进行修改时,相应的基本表中的数据也要发生变化;同时,若基本表的数据发生变化,那么这种变化也自动地反映到视图中。
create view v1
as
select column1 ,column2
from table1
inner join table2
on table.id = table2.table1_name.id
##创建视图
create view 视图名
as
查询语句
##视图的修改
1、
create or replace view 视图名
as
查询语句
2、
alter view 视图名
as
查询语句
#删除视图
drop view 视图名,视图名,...;
#查看视图
select * from 视图名;
##视图中数据插入
与表的插入一致 insert into view values
##修改
update view set column1 = "**" where id = "**"
##删除
delete from view where id ="**"
注意:
对视图进行增删改会影响原表中的数据,视图不占用物理数据存储空间(只保存sql逻辑)
##存在以下情况视图不可以更新
1、包含以下关键字的sql语句:聚合函数(group by)、去重(distinct)、having、union、union all
2、常量视图
3、select中包含子查询
4、from 一个不能更新的视图
5、where子句的子查询引用了from子句的表
##delete 和 truncate在事务使用时的区别
1、truncate 不支持回滚
2、delete 删除后auto_increment的起始数字不会变为0,truncate会置为0
实例:
update beauty b
inner join boys bo
on b.boyfriend_id = bo.id
set b.phone = "114"
where bo.boyname = "jacks"
create table Book(
bid int primary key,
bname varchar(32) not null unique,
price float default 10,
btype int,
foreign key (btype) references to BookType(id)
)
create view myview
as
select b.name,t.type
from Book b
inner join
type t
on b.btype = t.id
where price >= 100
set autocommit = 0;
insert into Book(bid,bname,price,btype) values(1,"人性的弱点")
commit
##变量
系统变量
全局变量
查看系统变量
show global variables
回话变量
show session variables
作用域,仅仅针对当前会话(链接)有效
加条件
show variables like "%char%"
查看指定的某个系统值
select @@global | session .系统变量
系统变量赋值
1、set global | session 变量名 = 值
2、set @@global | session.变量名 = 值
自定义变量
使用步骤:声明、赋值、使用
用户变量
作用于:针对于当前会话有效
1、声明并初始化
set @用户变量名 = 值
set @ 用户变量名 := 值
select @ 用户变量名 := 值
2、赋值(更新用户变量)
方式一
set @用户变量名 = 值
set @ 用户变量名 := 值
select @ 用户变量名 := 值
方式二:
select 字段 into @变量名
from 表
将字段值赋值给用户变量
3、查看
select @用户变量
局部变量
作用域:仅仅在定义它的begin end中有效
1、声明
declare 变量名 类型
declare 变量名 类型 default 值
2、赋值
方式一:
set 局部变量名 = 值
set 局部变量名 := 值
select @局部变量名 := 值
方式二:
select 字段 into 局部变量名
from 表;
3、查看
select 局部变量名
##存储过程和函数
类似方法
存储过程:一组预先编译好的sql语句的集合
创建:
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句)
end
注意:
1、参数列表包括三部分
参数模式 参数名 参数类型
举例:
in stuname varchar(20)
参数模式:
IN 该参数可以作为传入参数
OUT 该参数可以作为返回值
INOUT 该参数既可以作为传入参数又可以作为返回参数
2、如果存储过程体只有一句语句,begin end可以省略
存储过程体中的每一条sql语句的结尾要求必须加分号
存储过程的结尾可以使用 delimiter 重新设定
delimiter 结束标记 delimiter $
调用:
call 存储过程名(形式参数)$
实例:
##无参数
delimiter $
create procedure myp1()
begin
insert into admin (username,password)
values ("rose",1234456),("rose1",1234456)
end $
call myp1()$
##in
delimiter $
create procedure myp2(in beautyname varchar(20))
begin
select bo.*
from boys bo
right join beauty b
on bo.id = b.boyfriend_id
where b.name = beautyname;
end $
call myp2("rose")$
delimiter $
create procedure myp2(in username varchar(20),in password varchar(20))
begin
declare result varchar(20) default "";
select count(*) into result
from admin
where admin.username = username
and admin.password = password
select if(result,"登录成功","登录失败")
end $
call myp2("rose")$
##out
delimiter $
create procedure myp5 (in beautyname varchar(20),out boyname varchar(20))
begin
select bo.boyname
from boys bo
inner join beauty b on bo.id = b.boyfriend_id
where b.name = beautyname
end $
delimiter $
create procedure myp6 (in beautyname varchar(20),out boyname varchar(20),out userCP int)
begin
select bo.boy,bo.userCP into boyname,userCP
from boys bo
inner join beauty b on bo.id = b.boyfriend_id
where b.name = beautyname;
end $
##inout
delimiter $
create procedure myp7(inout a int ,inout b int)
begin
set a= a*2;
set b = b*2;
end $
删除存储过程
drop procedure 存储过程名
##函数
函数,有且只有一个返回值
##创建
语法:
create func 函数名(参数) return 返回类型
begin
函数体
end
注意:
参数列表包含两部分
参数名 参数类型
函数体:肯定会有返回值(return),如果没有回保错
使用 delimiter 设置语句的结束标记
##调用
select 函数名(参数列表)
create function myf1() return int
begin
declare c int default 0;
select count(*) into c
from employees;
return c;
end$
create funtion myfun2(empname varchar(20), return double)
begin
set @sal = 0;
select salary into @sal
from employees
where last_name = empname;
return @sal;
end$
##查看函数
show create function 函数名
##删除函数
drop function 函数名
其他补充
set names gbk; ## 设置当前session的客户端显示编码
##流程控制结构
1、顺序结构
2、分支结构
if函数
select if(表达式1,表达式2,表达式3)如果表达式1成立,则返回表达式2的值否则返回表达式3的值
if 条件1 then 语句1;##(只能放入begin end中)
elseif 条件2 then 语句2;
...
else 语句n
end if
case 等值判断或区间字段(语句只能放在begin end中)
1、select *
case 变量|表达式|字段
when 要判断的case后的值 then 返回值1|(语句1;)
when 要判断的case后的值 then 返回值2|(语句2;)
...
else 要返回的值n|(语句n;)
end case
2、select *
case
when 要判断的条件 then 返回值1|(语句1;)
when 要判断的条件 then 返回值2(语句2;)
...
else 要返回的值n|(语句2;)
end case
3、循环结构
while、loop、repeat
循环控制
iterate 类似continue
leave 类似于break
语法:
【标签:】while 循环条件 do
循环体
end while【标签】
【标签:】loop
循环体
end loop【标签】##实现简单的死循环
repeat
【标签:】repeat
循环体
until 循环结束条件
end repeat【标签】##实现简单的死循环
实例:
delimiter $
create procedure pro_while(in insertcount int)
begin
declare i int default 1;
A:while i <= insertcount do
if i > 20
then leave A
end if;
insert into tablename(column1,column2,...)
values ("admin"+i,password,...);
set i = i+1
end while A;
end$
##经典实例
drop table if exists stringcontent;
create table stringcontent(
id int primary key auto_increment,
content varchar(20)
)charset = utf8
create procedure test_randstr_insert(in insertcount int)
begin
declare i int default 1;
declare startindex int default 1;
declare len int default 1;
declare str varchar(20) default "dfghjklrubnmghjksdbnmghjkl";
while i <= insertcount do
set startindex = floor(rand()*26+1);
set len = floor(rand()*20+1);
insert into stringcontent(content) values (substr(str,startindex,len));
set i = i+1;
end while;
end
mysql查看存储过程函数
查询数据库中的存储过程和函数
select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE' //存储过程
select `name` from mysql.proc where db = 'xx' and `type` = 'FUNCTION' //函数
show procedure status; //存储过程
show function status; //函数
查看存储过程或函数的创建代码
show create procedure proc_name;
show create function func_name;
查看视图
SELECT * from information_schema.VIEWS //视图
SELECT * from information_schema.TABLES //表
查看触发器
SHOW TRIGGERS [FROM db_name] [LIKE expr]
SELECT * FROM triggers T WHERE trigger_name=”mytrigger” \G
Mysql创建、删除用户
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):
1.新建用户
登录MYSQL:
@>mysql -u root -p
@>密码
创建用户:
mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));
这样就创建了一个名为:test 密码为:1234 的用户。
注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。
然后登录一下:
mysql>exit;
@>mysql -u test -p
@>输入密码
mysql>登录成功
2.为用户授权
授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
登录MYSQL(有ROOT权限),这里以ROOT身份登录:
@>mysql -u root -p
@>密码
首先为用户创建一个数据库(testDB):
mysql>create database testDB;
授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):
mysql>grant all privileges on testDB.* to test@localhost identified by '1234';
mysql>flush privileges;//刷新系统权限表
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on testDB.* to test@localhost identified by '1234';
mysql>flush privileges; //刷新系统权限表
授权test用户拥有所有数据库的某些权限:
mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";
//test用户对所有数据库都有select,delete,update,create,drop 权限。
//@"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)
//对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。
3.删除用户
@>mysql -u root -p
@>密码
mysql>Delete FROM user Where User='test' and Host='localhost';
mysql>flush privileges;
mysql>drop database testDB; //删除用户的数据库
删除账户及权限:>drop user 用户名@'%';
>drop user 用户名@ localhost;
4.修改指定用户密码
@>mysql -u root -p
@>密码
mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost";
mysql>flush privileges;
本文较为详细的介绍了mysql的基本使用语法,希望能帮助大家复习