数据库
首页 > 数据库> > mysql

mysql

作者:互联网

数据库的由来

一个大型项目不可能所有的数据,组件都在一台机器上运行,一台机器坏了,服务就瘫痪了
如果我们将程序的各个组件分布到各台机器,但需知各组件仍然是一个整体,言外之意,所有组件的数据还是要共享的。但每台机器上的组件都只能操作本机的文件,这就导致了数据必然不一致。
于是我们想到了将数据与应用程序分离:把文件存放于一台机器,然后将多台机器通过网络去访问这台机器上的文件,即共享这台机器上的文件

数据库的概述

库:文件夹,存放很多文件
表:既文件,一行一个记录,很多行构成一个文件
字段:表头
记录:表的一行
数据:一行中的一个数据

数据库管理软件:我们平常说的数据库mysql,其实是数据库管理软件,主要学习的就是mysql
数据库服务器:运行数据库管理软件,存储数据的计算机

数据库分类

关系型数据库:上述所说的表的形式
Oracle,Microsoft SQL Server,MySQL,DB2,Microsoft Access,MariaDB(MySQL的一个分支)

非关系型数据库:字典形式,键值key,value
Redis, Amazon DynamoDB, Memcached

mysql介绍

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司

mysql常规安装

windows平台

阿里云镜像站搜mysql,选择版本,进去搜winx64,选择.zip进行下载
解压之后添加bin环境变量

linux

一行命令:yum -y install mariadb-server mariadb

启动mysql

windows

mysqld或者小皮面板

linux

systemctl start mariadb

关闭mysql

windows

taskkill /f /t /pid 进程号 或者 tskill 进程号

linux

systemctl stop mariadb

查看mysql状态

windows

tasklist |findstr mysql

linux

systemctl status mariadb

windows下将mysql做成系统服务

关闭mysql进程后
制作系统服务:管理员身份打开powershell,mysqld --install
移除命令:mysqld --remove
然后就可以打开系统服务,管理
或者是
net start mysql
net stop mysql

登陆,退出mysql

-p后面不要有空格

登陆mysql

假设密码123账号root
mysql -u root -p123

退出mysql

\q
exit
quit

修改密码

mysqladmin -u root -p123 password 456

关于重置密码的问题我有试过但是会存在一些问题,而且也不安全,所以就不写了,要我说不如sql注入查一下密码

统一字符编码,排序为utf-

修改配置文件

windows

关闭mysql
在mysql目录下创建my.ini
填入配置
重启mysqld:tasklist |findstr mysql tskill 进程号 mysqld
注意一点,如果说服务已经安装了,先卸载,重启完毕再安装,否则会出现,mysqld无法调用的情况

linux

gedit /etc.my.cnf
填入配置
重启:systemctl restart mariadb

配置

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

集成环境

推荐学习使用
phpstudy
加环境变量D:\phpstudy_pro\Extensions\MySQL5.7.26\bin
就可以命令行访问了
小皮创建的就不用统一字符编码了

系统数据库

information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
mysql: 授权库,主要存储系统用户的权限信息
test: MySQL数据库系统自动创建的测试数据库

基本语法

查看当前用户:select user();
查看字符编码,当前用户,数据库类型,版本:\s
查看一些系统特定资源的信息,例如,正在运行的线程数量:show status;
终止运算符:\c

数据库语句分类

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:

1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER

2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT

3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

数据库操作

  1. 查看数据库
    show databases;#查看所有的数据库
    show create database db1;#查看指定的数据库
    select database();
  2. 选择数据库
    use 数据库名
  3. 创建数据库
    create database demo;
  4. 删除数据库
    drop database 数据库名;
  5. 修改数据库字符编码
    alter database db1 charset utf8;

存储引擎

mysql对于不同文件应该有不同后缀,既表也应该有不同的类型
表的类型不同,会对应mysql不同的存取机制
表类型又称为存储引擎

show engines:查看所有存储引擎

设置默认存储引擎为innodb
在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
重启Mysql服务器
登录Mysql数据库,mysql>show engines 如果出现 InnoDB |DEFAULT,则表示设置InnoDB为默认引擎成功。

修改表的存储引擎
alter table service
engine=innodb;

memory,在重启mysql或者重启机器后,表内数据清空

blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

表操作

  1. 切换表:use db1;
  2. 创建表:create table t1(id int,name char(10));后面可以加engine=innodb;指定存储引擎
  1. 修改表名
    alert table 表名
    rename 新表名;

  2. 删除表:
    truncate t1;不会删除表结构,常用于和where组合使用,删除范围
    drop table t1;全部删除,删除整个表用这个

  3. 复制表结构+记录
    create table 新表名 select * from 表名;

  4. 只复制表结构
    create table t2 like t1;

字段操作

  1. 修改字段类型
    alter table student10
    modify age int(3);
  2. 增加字段:
    alter table 表名
    add 字段名 数据类型 [完整性约束条件…],
    add 字段名 数据类型 [完整性约束条件…] first;alter table 表名
    add 字段名 数据类型 [完整性约束条件…] after 字段名;
  3. 删除字段
    alter table student10
    drop sex;

数据类型

整型
浮点型

整型

不需要指定字符宽度,没用
用int

浮点型

float
double常用,精度较高
decomal精度最高,表示位数少

日期类型

year:年
data:年月日
time:时分秒
datatime:年月日时分秒

可用now()快速写入

字符类型

char:定长,不够长补空格,常用
varchar:变长,写几个是几个不补空格

枚举类型

enum:只能有一个

集合类型

set:可以有多个

约束条件

default:默认值
null:可不可以为空
key:唯一不唯一,unique
unique(name):单独为1
unique(name,age):联合为1
主键primary:innodb必须要有主键,不指定就会找一个不为空且唯一字段当做主键
主键自带约束不为空且唯一,一般id作为主键
联合主键:联合不唯一,都不可以为空
auto_increment:自增长,可自定义起始偏移量和步长,用的很少,具体谷歌
外键:foreign key
on delete cascade 同步更新
on update cascade 同步删除
实例:
foreign key(press_id) references press(id)
on delete cascade
on update cascade

表关系

多对一

实例:

create table press(
id int primary key auto_increment,
name varchar(20)
);
create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
constraint fk_book_press foreign key(press_id) references press(id)
on delete cascade
on update cascade
);

多对多

create table author(
id int primary key auto_increment,
name varchar(20)
);
#这张表就存放了author表和book表的关系,即查询二者的关系查这表就可以了
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cacade,
primary key(author_id,book_id)
);

一对一

# 创建用户表
create table user(
id int primary key auto_increment,
name varchar(20)
);
# 创建博客表
create table blog(
id int primary key auto_increment,
url varchar(100),
user_id int unique,
constraint fk_user foreign key(user_id) references user(id)
on delete cascade
on update cascade
);

记录操作

插入

直接插入
insert info 表名(字段1,字段2,字段3…字段n) values
(值1,值2,值3…值n)
(值1,值2,值3…值n)
(值1,值2,值3…值n);

插入查询结果
insert info 表名(字段1,字段2,字段3…字段n)
select 字段 from 表
where ;

修改数据

update 表名 set
字段1=值1,
字段2=值2,
where condition;
实例:
update mysql.user set
password=password(‘123’)
where user=’root’ and host=’localhost’;

删除数据

delete from 表名
where conition;
实例:
delete from mysql.user
where password=’123’;

查询数据

如果显示错位,后面加\G以列形式显示

单表查询

语法:

select 字段1,字段2... from 表名
from on #多表查询会有
where 条件
group by field
having 筛选
order by field
limit 限制条数

关键字执行顺序

from
where
group by
having
select
distinct
order by
limit
文字说明:
1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数

基本语法

查询整个表select * from t1;
避免重复distinct:select distinct post from employee;
支持四则运算:select name, salary*12 from employee;
支持起别名:select concat(年薪: ', salary*12) as annual_salary

where

1.单条件查询
select name from employee
where post='sale';
2.多条件查询
select name,salary from employee
where post='teacher' and salary>10000;
3.关键字between and
select name,salary from employee
where salary between 10000 and 20000;
select name,salary from employee
where salary not between 10000 and 20000;
4.关键字is null
判空
5.关键字in集合查询
select name,salary from employee
where salary in (3000,3500,4000,9000) ;
6.关键字like模糊查询
通配符’%’:以eg开头
select * from employee
where name like 'eg%';
通配符’_’:al后面两个字符
select * from employee
where name like 'al__';

分组

分组之前先设置sql_mode
sql_mode='strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_auto_create_user,no_engine_substitution';
实例:
select post,name from employee group by post;

聚合函数

select count(*) from employee; 数量
select max(salary) from employee; 最大
select min(salary) from employee; 最小
select avg(salary) from employee; 平均
select sum(salary) from employee; 总和

having

!!!执行优先级从高到低:where > group by > having
作用其实和where一样,但是这个是分组之后的过滤
实例:
mysql> select post,group_concat(name),count(id) from employee group by post having count(id) < 2;

排序order by

select * from employee order by salary;
select * from employee order by salary asc; 升序
select * from employee order by salary desc; 降序

限制条数

mysql> select * from employee limit 0,5;#从0开始5个

选项 说明 例子 匹配值示例
^ 匹配文本的开始字符 '^b' 匹配以字母 b 开头 的字符串 book、big、banana、 bike
$ 匹配文本的结束字符 'st$’ 匹配以 st 结尾的字 符串 test、resist、persist
. 匹配任何单个字符 'b.t’ 匹配任何 b 和 t 之间有一个字符 bit、bat、but、bite

多表查询

内链接

inner join
select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;

外链接之左链接

在内连接的基础上增加左边有右边没有的结果
left join

外链接之右链接

在内连接的基础上增加右边有左边没有的结果
right join

全外连接

使用union连接左连接和右连接
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id

子查询

select name from employee
where dep_id in
(select id from department where name='技术');

exist存在

exists字键字表示存在。在使用exists关键字时,查询语句不返回查询的记录。
而是返回一个真假值,true或false
实例:
select * from employee
where exists
(select id from department where id=200);

查询练习题

1.查询所有的课程的名称以及对应的任课老师姓名
select
course.cname,
teacher.tname
from
course
inner join teacher on course.teacher_id = teacher.tid;

  1. 查询学生表中男女生各有多少人
    select
    gender 性别,
    count(1) 人数
    from
    student
    group by
    gender;
  2. 查询物理成绩等于100的学生的姓名
    select
    student.sname
    from
    student
    where
    sid in (
    select
    student_id
    from
    score
    inner join course on score.course_id = course.cid
    where
    course.cname = '物理'
    and score.num = 100
    );

详见https://www.cnblogs.com/linhaifeng/articles/7895711.html

权限管理

权限管理
1、创建账号
本地账号
create user 'egon1'@'localhost' identified by '123'; # mysql -uegon1 -p123 本地账号可以,或者127.0.0.1
远程帐号
create user 'egon2'@'192.168.31.10' identified by '123'; # mysql -uegon2 -p123 -h 服务端ip 指定ip可以登陆
create user 'egon3'@'192.168.31.%' identified by '123'; # mysql -uegon3 -p123 -h 服务端ip 31网段可以登陆
create user 'egon3'@'%' identified by '123'; # mysql -uegon3 -p123 -h 服务端ip 所有网段都可以登陆
2、授权
查询授权:去看mysql下的四张表columns_priv,tables_priv,db,user
select * from 表名

user:*.*
db:db1.*
tables_priv:db1.t1
columns_priv:id,name

赋予权限:grant
回收权限:revoke
grant all on *.* to 'egon1'@'localhost';
grant select on *.* to 'egon1'@'localhost';
revoke select on *.* from 'egon1'@'localhost';
grant select on db1.* to 'egon1'@'localhost';
revoke select on db1.* from 'egon1'@'localhost';
grant select on db1.t2 to 'egon1'@'localhost';
revoke select on db1.t2 from 'egon1'@'localhost';
grant select(id,name),update(age) on db1.t2 to 'egon1'@'localhost';
revoke select (id,name),update(age) from db1.t2 to 'egon1'@'localhost';

图形化工具

navicat
注册机谷歌搜一下
而且是中文的
还可以备份还原数据库
很方便,也很简单

标签:数据库,mysql,employee,where,id,select
来源: https://www.cnblogs.com/dabaitunb/p/16503665.html