# MySQL

# 登录

  • 本地登录
  • 远程登录

# 本地登录

mysql -u root -p

# 远程登录

mysql -u root -h 'IPaddress' -p

# MySQL用户操作

用于修改用户对数据库访问的权限等

# 创建用户

create user 'userName'@'IPaddress' identified by 'password'

create user 'login'@'%' identified by '123';
# 创建一个可以从任意地方登陆的用户, 密码为123

create user 'login'@'localhost' identified by '123';
# 创建一个只能在本地登录的用户, 密码为123

create user 'login'@'123.60.138.52' identified by '123';
# 创建一个只能在IP地址为"123.60.138.52"登录的用户,密码为123

# 修改用户数据

alter user 'userName'@'IPaddress' identified by 'password'

alter user 'login'@'%' identified by '234';
# 修改用户('login'@'%')的密码,新密码为234

# 删除用户

drop user 'userName'@'IPaddress'

# 查询用户权限

show grants for 'userName'@'IPaddress';

# 授予用户权限

grant [ 权限 ] on [ tableName ] to 'userName'@'IPaddress';

# 撤销用户权限

revoke [ 权限 ] on [ tableName ] from 'userName'@'IPaddress';

# 权限类型

all - 全部权限 select - 查询权限 insert - 插入权限 update - 修改权限 delete - 删除权限 alter - 修改数据库,表等权限 drop - 删除数据库,表等权限 create - 创建数据库,表等权限

# 其他操作

# use

use [ databaseName ] 访问数据库

# show

show databases show tables 展示全部数据库,数据库中所有的表单,当前数据库

# desc

desc [ tableName ] 显示表单中的内容

# DDL数据定义语句{#DDL}

# create{#create}

用于创建数据库,表等等

  • create database [ databaseName ] // 创建数据库
  • create table [ tableName ] ( 属性 ) // 创建表
create database 'tmp';
# 创建一个数据库,名为'tmp'

create table player (
    id int auto_increment primary key,
    attr1 varchar(100) default "无",
    attr2 varchar(100) comment "备用"
)
# 创建一个表,名为player
约束 解释
not null 非空
unique 唯一
primary key 唯一标识(非空,唯一)
default 默认值为____
check 检查
foreign key 外键

# alter {#alter}

一般用于修改表单的内容 alter table [ tableName ] [ action ]

action 用途
modify column [ fieldName ] [ type ] 修改某个字段的类型
rename column [ oldName ] to [ newName ] 修改字段名字
change column [ oldName ] [ newName ] [ type ] 上面两个的结合
add column [ fieldName ] [ type ] 添加一个字段
add [ constraintName ] [ (fieldName) ] 为字段添加约束
drop column [ fieldName ] 删除某个字段

# drop {#drop}

删除数据库,表单等

  • drop database [ databaseName ]
  • drop table [ tableName ]

# DML数据操作语句{#DML}

# select查询 {#select}

select [ fieldName ] or * from [ tableName ]

select name from player
# 查询 name 的数据

# insert插入 {#insert}

insert into [ tableName ] [ (属性) ] values [ (数据1), (数据2) ]

insert into player (id,name) values (1,"10");
# 插入一条数据id = 1 name = "10"
insert into player (id,name) values (1,"10"),(2,"11");
# 插入两条数据id = 1 name = "10" 和 id = 2 name = "11"

# delete删除 {#delete}

delete from [ tableName ] where "匹配条件"

delete from player where level = 1
# 将所有level = 1 的数据删除

# update更新 {#update}

update [ tableName ] set [ 属性名1 ] = [ value1 ], [ 属性名2 ] = [ value2 ] where [ 匹配条件 ]

updata player set level = 1 where name = "李四"
# 将属性 name = "李四" 的全部 level 改为 1

# 有关DML语句的拓展 {#DML_MORE}

# where

where "匹配条件"

where level = 1 and level < 5;
# 1 < level < 5

where level in (1,2,3);
# level == 1 , 2, 3其中一个

where level between 1 and 10;
# level 在 [1,10]之内

where level regexp '正则表达式'
# 通过正则表达式查找

# order by

order by [ 属性1 ] [ desc ], [ 属性2 ] [ desc ] 通过(属性)排序

select * from student (order by name asc;) or (order by name;)
# 通过名字升序排列

select * from student order by name desc, id
# 通过名字降序排列,并通过id升序排列

# group by

group by [ 属性 ] 通过(属性)分组

select name from student group by name;
# 通过名字分组

# having

having "判断条件" 对分组后的结果进行筛选

select name avg(id) from student group by name having avg(id) < 2;
# 对分组后的结果筛选出avg(id) < 2的

# limit

限制输出数量

select * from student limit 2;
# 只输出前2个

select * from student limit 1,10;
# 从1开始输出10个

# distinct

去重

select distinct name from student;
# 通过名字查找,但去除重复部分, 相同名字只出现一次

# union

将两个查询结果合并, 并集

select name from student union select id from student;
# 将两个表的筛选结果合并,但是后者的select并没有其作用,并且将结果去重

select name from student union all select id from student;
# 将两个表的筛选结果合并,但是后者的select并没有起作用,结果不去重

# intersect

求交集

select name from student intersect select id from student;
# 求解两个表筛选结果的交集,但是后者的select并没有起作用

# except

求差集,后者减前者

select name from student except select id from student;
# 分别对两个表筛查,并且求解两个结果集的差集

# left join(right join) ... on

将两个表合并成一个

select * from table1
left join table2
on "条件"

# cross join ... on

交叉连接(笛卡尔积) 每个数据会一一比较

select * from table1
cross join table2
on datadiff(table1.date,table2.date) = 1
# 将日期为前一天加一的拿出来

# inner join

内连接,求交集

select * from player
inner join student
on player.id = student.id;
# 将 student内连接到player中,通过id进行连接

# 内置函数

current_date() 当前日期 current_time() 当前时间 current_timestamp() 当前时间戳 now() 当前日期时间 date_add(date,interval,d_value_type) 让时间增加 date_sub(date,interval,d_value_type) 让时间减少 datediff(date1,date2) 两个日期的时间差

# 导入导出数据

load data infile ' [path] '
into table [ tableName ]
fields terminated by ','
lines terminated by '\n';
# 从 [ path ]中导入数据到 [ tableName ]
# 各个数据间隔为 ','
# 行尾为 '\n';
select * from [ tableName ]
into outfile ' [path] '
fields terminated by ','
lines terminated by '\n';
# 从 [ tableName ]中导出数据到 [ path ]
# 各个数据间隔为 ','
# 行尾为 '\n';