数据库的由来
一个大型项目不可能所有的数据,组件都在一台机器上运行,一台机器坏了,服务就瘫痪了
如果我们将程序的各个组件分布到各台机器,但需知各组件仍然是一个整体,言外之意,所有组件的数据还是要共享的。但每台机器上的组件都只能操作本机的文件,这就导致了数据必然不一致。
于是我们想到了将数据与应用程序分离:把文件存放于一台机器,然后将多台机器通过网络去访问这台机器上的文件,即共享这台机器上的文件
数据库的概述
库:文件夹,存放很多文件
表:既文件,一行一个记录,很多行构成一个文件
字段:表头
记录:表的一行
数据:一行中的一个数据
数据库管理软件:我们平常说的数据库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
数据库操作
- 查看数据库
show databases;#查看所有的数据库
show create database db1;#查看指定的数据库
select database(); - 选择数据库
use 数据库名 - 创建数据库
create database demo; - 删除数据库
drop database 数据库名; - 修改数据库字符编码
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,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
表操作
- 切换表:use db1;
- 创建表:create table t1(id int,name char(10));后面可以加engine=innodb;指定存储引擎
- 查
- 查询所有的表:show tables;
- 查看表结构:desc t1;#仅会查看表头信息
- 查询指定的表:show create table t1;
- 查询表t1:desc t1;
-
修改表名
alert table 表名
rename 新表名; -
删除表:
truncate t1;不会删除表结构,常用于和where组合使用,删除范围
drop table t1;全部删除,删除整个表用这个 -
复制表结构+记录
create table 新表名 select * from 表名; -
只复制表结构
create table t2 like t1;
字段操作
- 修改字段类型
alter table student10
modify age int(3); - 增加字段:
alter table 表名
add 字段名 数据类型 [完整性约束条件…],
add 字段名 数据类型 [完整性约束条件…] first;alter table 表名
add 字段名 数据类型 [完整性约束条件…] after 字段名; - 删除字段
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;
- 查询学生表中男女生各有多少人
select
gender 性别,
count(1) 人数
from
student
group by
gender; - 查询物理成绩等于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
注册机谷歌搜一下
而且是中文的
还可以备份还原数据库
很方便,也很简单
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/275961.html