MySQL基础

一、mysql配置

1.简介

用于管理文件的一个软件

  • 服务端软件

    • SOCKET 服务端

    • 本地文件处理

    • 解析指令【SQL语句】

  • 客户端软件(各种各样)

    • SOCKET 客户端
    • 发送指令
    • 解析指令【SQL语句】

2.用户管理

默认用户为root

2.1管理用户

2.1.1 创建用户

create user "username"@'ip'identified by 'passwd';

ip可使用通用匹配符,即可用%表示

例如:

create user "username"@'10.0.0.1'identified by 'passwd'; #只限该IP登陆用户

create user "username"@'10.0.0.%'identified by 'passwd'; #只限该IP段登陆用户

create user "username"@'%'identified by 'passwd'; #任意IP登陆用户

2.1.2 删除用户

drop user '用户名'@'ip';

2.1.3 修改用户

rename user '用户名'@'ip' to '新的用户名'@'ip'

2.1.4 修改密码

set password for '用户名'@'IP地址'= Password('新密码')

用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)

2.2 授权管理

2.2.1 用户授权

语法:grant 权限条件 on 可访问对象数据库或数据表 to 用户 @ 允许登陆的条件

grant select ,insert,update on db1.t1 to 'username'@'%' #给允许任意登陆的用户username赋予查询、插入、修改数据库db1里的t1表

grant all privileges on to 'username'@'%' #给允许任意登陆的用户username赋予所有权限

2.2.2 查看授权

语法:show grant for '用户名'@'允许登陆条件'

show grant for 'chancey'@'%' #查看chancey的权限

2.2.3 删除权限

语法:revoke grant on '可访问对象数据库或数据表' from '用户名'@'允许登陆的条件'

revoke grant on 'db1.t1' from 'chancey'@'%'

2.3 生效设置

flush privileges

二、基本操作

1. 数据库

show databases; #查看所有数据库
create database dbname engine=innodb default charset=utf8; #创建数据库,指定引擎和编码
drop database dbname; #删除数据库
use dbname; #选中数据库,只有选中之后才能进行库里面的所有操作

在mysql中,引擎只有innodb支持事物回滚,myisam速度更快,但不支持事物回滚

2. 数据表

2.1 查看表

show tables; #查看所有表

show create table demo \G; #查看该表如何创建

desc demo; #查看表结构

2.2 创建表

create table 表名(
   列名  类型  约束 是否可以为空,
   列名  类型  约束 是否可以为空
)ENGINE=innodb default CHARSET=utf8; #指定数据表编码及其引擎
2.2.1 数据类型

数值

整数
int #所有整数
tinyint #表示范围,可为负数
bigint #相对tinyint范围大些

浮点数
float #浮点数
double #小数,精度不足
decimal #浮点型,按照字符串存储,但是精准
num decimal(10,5) #10表示总位数,5为小数点后边的位数

字符串

char #固定长度
varchar #自动长度
text #文本

时间

date #日期(YYYY-MM-DD)
time #时间(HH-MM-SS)
year #年份(YYYY)
datetime #时间(YYYY-MM-DD HH:MM:SS)

二进制(不常用)

tinyblob
blob
mediumblob
longblob

其他

create table td2(sex enum('man','woman')); #枚举,就是在该选项选出一个
2.2.2 约束条件
auto_increment #自增长,只能有一个,如果有自增长,则必须有索引,即primary key
primary key #主键,可约束(不能重复且不能为空),可加速查找(即索引作用)
not null #标识该字段不能为空
unique key #标识该字段唯一
default #为该字段设置默认值

2.3 插入数据

insert into db1(id,name) values(1,'chancey'),(2,'waller') #指定列插入,可一次性插入多条数据
insert into db1(id,name) select id,name from db2; #复制其它表

2.4 删除数据

drop table t1 #删除整张表(不完全删除)

truncate from t1 #清空表内容(更快速,且ID也随之清空)

delete from t1 #清空表内容

delete from t1 where id>6; #指定删除数据(>,<,=,!=)可以用or和and

2.5 修改数据

update t1 set age=18; #批量修改数据
update t1 set age=18 where age=17; #指定条件修改

2.5 查询数据

2.5.1 简单查询
select * from t1; #查询整张表所有内容
select count(name) from t1; #统计字段出现的次数
2.5.1 条件查询
select name from t1 where age=18; #指定单一条件查询(所有判断语句皆可用)
例如:
select * from t1 where age=18 and name="chancey";
select * from t1 where age=18 or age=19;

#临时别名:
select name as "姓名" from t1 where age=18; #只加一个
select name as "姓名" , age as "年龄" from t1; #多个别名

#查询多个条件
select name from t1 where age in (18,21,25); #查询枚举列
select name from t1 where age not in (18,21,25); #查询除枚举列
2.5.2 范围查询
#查询范围区间
select name from t1 where age between 18 and 22; #查询范围内

select * from t1 where id in (select id from t2); #条件为查询的结果
2.5.3 通配符
select * from t1 where name like "cha%"; #查询name以cha开头的所有数据
select * from t1 where name like "cha_"; #查询name以cha开头且后面只有一个字符
2.5.4 限制查询
select * from t1 limit 10; #只查看前边10条记录

select * from t1 limit 1,16; #从第1条开始取16条,并非以16为结尾
以上SQL等同于以下
select 8 from t1 limit 16 offset 1; #从1开始,向后取16条
2.5.5 排序查询
select * from t1 order by id desc; #按照ID从大到小排序
select * from t1 order by id asc; #按照ID从小到大排序

select * from t1 order by id asc,age desc; #以id从小到大排序,如果id一样,则以age从大到小 

3.自增列

一张表只能有一个主键,但一个主键可以多列。

create table demo(
    id int,
    age int,
    primary key (id,age)
)engine=innodb default charset=utf8;

3.1 自增列初始值

在一张表删除一些数据之后。再次插入数据,就会发现,即使一张表里只有一条数据,它的ID也不为1

alter table demo auto_increment=1 #设置自增长从1开始

3.2 自增列步长

mysql自增长与sqlserver不同,SqlServer是基于基础表设置,也就是说固定值

3.2.1 基于会话级别

也就是说在当前登录的会话中生效,会话结束则步长清除

show session variables like 'auto_inc%'; #查看当前步长
set session auto_increment=2 #设置当前会话步长为2
set session auto_increment_offset=2 #设置起始值
3.2.2 基于全局变量

一次修改,永久使用,当前会话修改之后,其他会话也是

show global variables like 'auto_inc%' #查看全局变量
set global auto_increment=200 #设置步长为200
set global auto_increment_offset=2 #设置起始值

4. 外键

举例说明:

现公司员工有3人,2个部门,则需要创建3张表关联信息

详情表、
详情表(userinfo)

ID NAME SEX AGE DEPART_ID
1 chancey man 18 1
2 waller man 20 1
3 mary woman 15 3

部门编号(depart)

ID DEPARTMENT
2 开发
3 测试

外键:用来关联两张或者多张表的字段

create table depart(
    id int auto_increment primary key,
    title char(15)
)engine=innodb charset=utf8;

create table userinfo(
    uid bigint auto_increment primary key,
    name char(10),
    depart_id int,
    constraint fk_user_deapr foreign key (depart_id) references depart(id) #创建外键
)engine=innodb charset=utf8;

constraint fk_user_deapr foreign key ("depart_id") references depart("id")

其中constraint声明外键,fk_user_deapr为外键的别名,foreign key为指定两个不同表里的字段,references衔接两个字段

外键的意思也就是说,userinfo中的depart_id只能是depart中的id,类似枚举,但和枚举不同。

准备如下5张表

[图片上传失败...(image-7e6894-1562760641749)]

class和student使用class_id和cid关联;

teacher和course使用tid和teach_id关联;

score 2个外键(student.sid-corse.student_id、course.cid-scors_id)

关系如下:

[图片上传失败...(image-bcdbbf-1562760641749)]

创建这5张表

set names utf8; #设置编码问题
set foreign_key_checks = 0; #取消外键约束

#创建class表
create table class (
  cid int(11) auto_increment primary key,
  caption varchar(32) not null
) engine=innodb auto_increment=5 default charset=utf8;

#创建teacher表
create table teacher (
  tid int(11) auto_increment primary key,
  tname varchar(32) not null
) engine=innodb auto_increment=6 default charset=utf8;

#创建course表
create table course (
  cid int(11) not null auto_increment primary key,
  cname varchar(32) not null,
  teacher_id int(11) not null,
  key fk_course_teacher (teach_id),
  constraint fk_course_teacher foreign key (teacher_id) references teacher (tid)
) engine=innodb auto_increment=5 default charset=utf8;

#创建student表
create table student (
  sid int(11) not null auto_increment,
  gender char(1) not null,
  class_id int(11) not null,
  sname varchar(32) not null,
  primary key (sid),
  key fk_class (class_id),
  constraint fk_class foreign key (class_id) references class (cid)
) engine=innodb default charset=utf8;

#创建score表
create table score (
  sid int(11) auto_increment primary key,
  student_id int(11) not null,
  course_id int(11) not null,
  number int(11) not null,
  constraint fk_score_course foreign key (course_id) references course (cid),
  constraint fk_score_student foreign key (student_id) references student (sid)
) engine=innodb default charset=utf8;

插入数据

insert into `class` values ('1', '三年一班'), ('2', '三年二班'), ('3', '一年三班'), ('4', '三年四班');
insert into `teacher` values ('1', '波多老师'), ('2', '小泽老师'), ('3', '泷泽老师'), ('4', '苍井老师'), ('5', '麻生老师');
insert into `course` values ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
insert into `student`(`sid`, `gender`, `class_id`, `sname`) values (1, '男', 1, '素心'),(17, '女', 2, '执念如花'),(18, '男', 2, '青灯古酒'),(19, '男', 3, '愚人欢'),(20, '女', 1, '入戏太深'),(21, '女', 3, '一尾流莺'),(22, '男', 2, '迷离'),(23, '女', 3, '亚泽'),(24, '男', 1, '幽灵'),(25, '男', 2, '归隐'),(26, '女', 1, '琴女'),(27, '男', 3, '深海处男'),(28, '男', 1, '逍遥散人'),(29, '女', 2, '少女尼斯'),(30, '女', 1, '原味口红'),(31, '男', 1, '鬼棺');
insert into `score`(`student_id`, `course_id`, `number`) values (16, 2, 57),(5, 2, 13),(14, 1, 46),(15, 3, 57),(4, 2, 60),(1, 3, 68),(9, 1, 83),(7, 4, 97),(6, 4, 72),(12, 2, 14),(10, 4, 85),(2, 4, 25),(8, 1, 70),(13, 4, 27),(11, 2, 93),(3, 3, 28);

set foreign_key_checks = 1;

5. 索引

加速查找,唯一索引

唯一索引

create table demo(
    id int,
    number int,
    li int,
    unique uql (number) #设置唯一索引
    unique uql (number,li) #设置联合索引
);

以上uql为唯一索引的名称,设置之后不允许重复的值添加,但可以为空;

联合索引为完全相同的时候不能重复

6. 表关系

表关系分三种:

  • 一对一
  • 一对多
  • 多对多

6.1 一对一

[图片上传失败...(image-69aa19-1562760641749)]

create table userinfo(
    id int auto_increment primary key,
    name varchar(32) not null,
    zoo_id int not null
)engine=innodb default charset=utf8;

INSERT INTO `userinfo` VALUES (1, '苍井空', 1);
INSERT INTO `userinfo` VALUES (2, '波多野结衣', 10);
INSERT INTO `userinfo` VALUES (3, '小泽玛利亚', 4);
INSERT INTO `userinfo` VALUES (4, '天海翼', 8);
INSERT INTO `userinfo` VALUES (5, '大桥未久', 2);
INSERT INTO `userinfo` VALUES (6, '麻生希', 7);
INSERT INTO `userinfo` VALUES (7, '美竹玲', 5);
INSERT INTO `userinfo` VALUES (8, '泷泽萝拉', 9);
INSERT INTO `userinfo` VALUES (9, '樱井莉亚', 3);
INSERT INTO `userinfo` VALUES (10, '桃谷绘里香', 6);

create table zoos(
    id int auto_increment primary key,
    zoo varchar(32),
    constraint fk_zoos_id foreign key (id) references userinfo(zoo_id) 
)engine=innodb charset=utf8;

INSERT INTO `zoos` VALUES (1, '鼠');
INSERT INTO `zoos` VALUES (2, '牛');
INSERT INTO `zoos` VALUES (3, '虎');
INSERT INTO `zoos` VALUES (4, '兔');
INSERT INTO `zoos` VALUES (5, '龙');
INSERT INTO `zoos` VALUES (6, '蛇');
INSERT INTO `zoos` VALUES (7, '马');
INSERT INTO `zoos` VALUES (8, '羊');
INSERT INTO `zoos` VALUES (9, '猴');
INSERT INTO `zoos` VALUES (10, '鸡');
INSERT INTO `zoos` VALUES (11, '狗');
INSERT INTO `zoos` VALUES (12, '猪');

6.2 一对多

[图片上传失败...(image-2214c5-1562760641749)]

create table staff(
    id int auto_increment primary key,
    name varchar(32)
)engine=innodb default charset=utf8;

insert into `department` values (1, '教师'),(2, '公交'),(3, '护士');

create table department(
    id int auto_increment primary key,
    dname varchar(32),
    depart_id int,
    constraint fk_depart_id foreign key (depart_id) references staff(id)
)engine=innodb default charset=utf8;

insert into `staff` values (1, '苍井空', 26, 1),(2, '波多野结衣', 25, 2),(3, '小泽玛利亚', 18, 1),(4, '天海翼', 24, 3),(5, '大桥未久', 30, 3),(6, '麻生希', 27, 1),(7, '美竹玲', 14, 2),(8, '泷泽萝拉', 33, 1),(9, '樱井莉亚', 47, 2),(10, '桃谷绘里香', 56, 1);

6.3 多对多

[图片上传失败...(image-305ea0-1562760641749)]

create table `course` (
  `id` int(11) not null auto_increment,
  `cname` varchar(32) not null,
  primary key (`id`)
) engine=innodb auto_increment=5 default charset=utf8;

create table `teacher` (
  `id` int(11) not null auto_increment,
  `tname` varchar(32) not null,
  `course_id` int(11) not null,
  primary key (`id`),
  key `fk_teacher_id` (`course_id`),
  constraint `fk_teacher_id` foreign key (`course_id`) references `course` (`id`)
) engine=innodb auto_increment=21 default charset=utf8;

INSERT INTO `course` (`id`, `cname`) VALUES (1, '软件开发');
INSERT INTO `course` (`id`, `cname`) VALUES (2, '计算机应用');
INSERT INTO `course` (`id`, `cname`) VALUES (3, '移动互联');

INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (1, '苍井空', 1);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (2, '波多野结衣', 2);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (3, '小泽玛利亚', 1);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (4, '天海翼', 3);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (5, '大桥未久', 3);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (6, '麻生希', 1);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (7, '美竹玲', 2);
INSERT INTO `teacher` (`id`, `tname`, `course_id`) VALUES (8, '泷泽萝拉', 1);

7. 高级查询

掺杂各种条件限制进行查询

7.1 联合查询

 select * from staff,department where department.id = staff.depart_id; #指定对应的外键
 
 select * from staff left join department on staff.depart_id = department.id;
 #显示左边的全部信息,即使空也显示null
 select * from staff right join department on staff.depart_id = department.id;
 #显示右边的全部信息,即使空也显示null
 
  select * from staff inner join department on staff.depart_id = department.id;
  #如果有null的值,则整行隐藏

连表查询如果遇到两张表的字段相同,则在select后加上其表名,即表名.字段名

7.2 分组查询

分组查询的关键字是group by

其关键是在查询到相同的条件时,取指定条件的数据(maxmin

select max(id),name from t1 group by age; #以age聚合,遇见相同的值则取id最大的那个数据
select count(id),name from t1 group by age; #统计相同name出现的ID次数

如果对于聚合查询需要进行二次筛选,则必须使用having

select count(id),name from t1 group by age having count(id) > 1;

8. 备份

mysqldump -u root 数据库名 > 名称.sql -p #备份
mysqldump -u root 数据库名 < 名称.sql -p #恢复,首先要创建数据库

你可能感兴趣的:(MySQL基础)