概念
数据库:组织,存储,管理数据的仓库
数据库的关系系统(DBMS):实现对数据有效组织,管理和存取的系统软件
数据库分类
关系型数据库和非关系型数据库:
mysql , oraclle ,postgreSQL
关系型数据库
关系型数据库存储的结构:是一张二维的表格,表里面有行和列
列:是对象,字段
行:对象的信息,字段的属性
行+列组成一张表
优点:表的结构清晰,逻辑容易整理,记录的数据比较完整
缺点:读写速度比较慢,并发量差,数据迁移比较麻烦
非关系型数据库
缓存型数据库:redis
索引型数据库:ES
文档型数据库:MongoDB
非关系型数据库是键值对形式存储的结构
优点:可以进行高并发读写,对海量数据依旧可以保持高效率的存储和访问。架构可扩展
缺点:键值对形式存储,数据逻辑比较复杂,数据是保存在缓存当中,如果意外重启所有数据都会丢失
数据库的数据类型:
char:固定长度的字符类型,用于存储固定长度的字符串
varchar:可变长度的字符类型,存储的是可变长度的字符串
int:存储的数据类型为整数
float:单精度浮点数,小数点。float(m,d) :m表示总位数,d表示小数位数
double:双精度浮点数,doublet(m,d) :m表示总位数,d表示小数位数
date:用于存储日期,YYYY-MM-DD(年-月-日)
datetime:用于存储日志和时间,格式YYYY-MM-DD HH:MM:SS(年-月-日 时:分:秒)
timestamp:和datetime类似,但是他可以自动记录当前时间
smallinit:存储小整数
bigint:存储大整数
decimal(5,2):存储精度的浮点数,5表示总位数,2表示小数位
char和varchar区别:
char定义好了长度之后,不论写的值是多少,都会占用固定长度的字节大小。保存在磁盘上都是4字节
varchar在保存字符串时,是多少就保存多少,在保存的字符串结尾默认有一个隐藏的结束符,会多占一个字节
varchar比char要节约磁盘空间
读写速度:char的读写性能要高于varchar,char是连续的磁盘空间,保存的内容是连续的
varchar在增伤改查之后,会产生一个磁盘空间的碎片文件,影响读写性能
数据库的管理:
增删改查------sql语句
sql中的名词
数据库:database
表:table
行:row
列:column
索引:index
视图:view
用户:user
权限:privilege
存储过程:procedure
存储函数:funcrion
调度器:exent
sql的语言规范
在数据库系统中,sql语句不区分大小写,但是建议用大写
sql语句可以分单行和多行,但是必须以" ; " 结尾
命令规范:库名,表明,列的名字,都必须以字母开头,后面可以数字,也可以跟上特殊符号
不要使用mysql的保留字,
数据库名,表名,用户名严格区分大小写
sql语言的分类
1、DDL:数据库定义语言:创建数据库的对象语言,库 ,表和索引
create drop
2、DML:数据库操作语言,可以对表里面的数据进行管理
select update insert插入 delete
3、DQL:数据库查询语言,数据库的查询语句
select
4、DCL:数据控制语言,控制和管理数据库用户的角色和权限
grant revoke
5、tcl:事务控制语句,用来管理数据库的事务,脚本开发,存储过程等
commit rollback savepoint
DDL:创建库和表的语句
一条数据库的语句是连贯的,以分号为结尾表示一条完整的sql
但是太长了不方便阅读和理解,可以对一条语句进行分行的写法
关键词不能跨行
语法:
create database +库名 :创建库
drop database +库名:删除库
创建表:
create table 表名 (
id 数据类型 not null,
name 数据类型 not null,
score 数据类型
);
drop database +表名 :删除表
not null 表示不能为空
示例:
1、创建库xy102:create database xy102;
2、删除库xy102:drop database xy102;
3、创建表student:
create table student (
id int(4) not null,
name char(10) not null,
score decimal(5,2)
);
含义:
create table student (
创建的表名为 student
id int(4) not null
名字是id,字符类型是int ,(4)字符长度是4,not null不能为空
name char(10) not null
名字是name,字符类型varchar, (12)字符长度是12,not null不能为空
sroce decimal(5,2)
名字是sroce,字符类型是decimal , (5,2)总长度是5,小数点后面最多2位,可以为空
4、删除表student:
drop dataase student;
desc 表名;查看表的结构, desc 表名\G;纵向查看表的结构
key:表示是否是主键或者外键
default:如果没有数据的默认展示结果
extra:提供列的附加信息。自增长等等
DML:插入数据
语法
语法1:
insert into 表名(字段1,字段2,字段3) values(1,2,3);
语法2:
insert into 表名 values(1,2,3)
修改和更新数据:update
语法:
修改
update 表名 set 列名=值 where 条件;
删除
delete from 表名 where 条件;
修改表名和修改表结构:alter
修改表名:
alter table 表名 rename 修改后的表名
给表添加一列:
alter table 表名 add 添加的列名 数据类型 default '地址不详'
修改字段的数据类型:
alter table 表名 modify column 列名 数据类型;
删除列:
alter table 表名 drop 删除的列名;
修改列名:
alter table 表名 change 列名 修改后的列名 数据类型; 数据类型可以一起修改
null和空值之间的区别:
null就是啥也没有
空值也是值,只是值为空
示例:
1、在表student中列名(id,name,score) 分别添加1,'swz',60,即id=1,name=swz,score=60
insert into student(id,name,score) values(1,'swz',60);
2、在表student中 依次添加2,'qwe',65,即id=2,name=qwe,score=65
insert into student values(2,'qwe',65);
3、将表student中name=qwe行的id改为2
update student set id=2 where name = 'qwe';
4、将表student中name=qwe行删除
delete from student where name = 'qwe';
5、修改表student为stut
alter table student rename stut;
6、给表student添加一列address,可变长度的字符类型,长度为50
alter table student add address varchar(50) default '地址不详'
7、将表student中的address列数据类型修改为固定长度的字符类型,长度为10
alter table stydent modify column address char(10);
8、删除表student中的address列:
alter table student drop address;
9、修改表student中的name列名为username
alter table student change name username char(10);
最后的数据类型一定要加,可以和列名一起修改
DQL,查询语句:
语法:
select * from 表名;(*表示所有,可以指定列名)
查看指定行:
select * from 表名 limit 2,3;
2,3表示:从第2+1行开始往下3行
去重查询:
select distinct 列名 from 表名
where语句:条件的筛选:
select * from 表名 where 条件(*表示所有,可以指定列名)
and 且
or 或
模糊查找: LIKE
select * from student where 列名 like '内容%'
以内容为开头
select * from student where 列名 like '%内容'
以内容为结尾
示例:
1、查询表student中所有列
select * from student;(*表示所有,可以指定列名)
2、查看表student中前三行:
select * from stydent limit 0,3;
3、去掉表student中name列中重复的
select distinct name from student
4、查找表student中id=1并且score=60的行
select name from student where id = 1 and score = 60;
查找表student中id=1或score=60的行
select name from student where id = 1 or score = 60;
5、查找表student中name列中以q为开头的行
select * from student where name like 'q%';
查找表student中name列中以q为结尾的行
select * from student where name like '%q'
数据库的约束方式:
主键约束:用于标识表中的主键列的值,而且这个值是全表当中唯一的,而且值不能为null
一个表只能有一个主键
外键约束:用来建立表与表之间关系,确保外键中的值与另一个表的主键匹配,保证数据引用的完整性。 外表联查,不要超过三张,超过三张表会降低查询效率
非空约束:not null,保证列中的值不含null值
唯一性约束:unique key,确保列中的所有值都是唯一的,类似主键,但一个表可以有多个唯一约束
自增约束:auto_increment,在列生成的每一行都会自动生成一个唯一标识符,通常和主键一起使用,每次插入新行时,自增列的值会自动增加
默认值约束:default,在插入表数据时,如果没有定义值,会提供一个默认值。
外键是和主表进行关联的列,不需要设置为从表的主键,但是不能为空,必须和主表的数据类型保存一致。
外键的值和主键的值要相同
先插入主表的数据,再插入从表的数据
删除表的外键不是直接删除外键的列名,要先删除外键的索引,用show create table 表名,查看表是详细信息
删除主键不需要加上主键的列名,如果有extra的额外属性,比如说自增长,要先移除属性,然后才能删除主键
删除主键的方式:alter进行修改
复制表:
create table stu_1 like student;
将表的内容复制:
insert into stu_1 select * from student;
表和表的内容一起复制:
create table stu_2 (select * from student);
创建临时表:
临时表创建完成后,在库里看不到,但是依然可以进行增删改查。重新连接数据后,临时表就会消失
create temporary table 表名
清空表:
drop删除表 (不推荐)
*如何删除表内的数据,但是保留表和表结构
1、delete from 表名 :保留表结构,一行一行的清除表数据,速度比较慢,如果有自增长字段,delete清空之后,会继续按照原来增长的序号继续递增
2、truncate table 表名 :保留表结构,清空之后,原有的记录全部抹去,自增长也从头开始,速度比较快
数据库的用户管理:
root都是相同的,
Host:可以登录的主机,
localhost指的是本地登录
%:任意主机(ip地址)
权限上:localhost > %的权限
创建用户
create user 'gfw'@'192.168.233.10' identified by '123456';
root%localhost 安装完mysql后就有了,不需要额外设置。其他的都需要人工创建 其他的用户也不设置成localhost,都是设置主机名
删除用户
drop user 'gfw'@'192.168.233.10';
设置用户权限
grant all privileges on * . * to 'swz'@'192.168.203.12' identified by '123456'
all:
*. * : 前面*表示库,后面 *表示 库里的表
information_schema:这个库的作用包含了mysql服务器中所有其他数据库,表、列、索引权限等详细的元数据的信息,可以查询数据库的结构和元信息
performance_schema:包含mysql的服务性能和资源利用情况,查询语句的执行时间和锁定信息
查看用户权限
show grants for 'gfw'@'192.168.233.10';
只给用户查的权限
grant select on xy102.* to 'gfw'@'192.168.233.10' ;
给用户多个权限
grant insert,update,alter,delete on xy102.* to 'gfw'@'192.168.233.10' ;
取消权限
revoke all privileges on *.* from 'gfw'@'192.168.233.10' ;
revoke insert,update,alter,delete on xy102.* from 'gfw'@'192.168.233.10' ;
mysql本地免密登录
vim /ect/my.cnf
添加 skip-grant-tables